Commit 3d133a7f authored by Daniel Dehennin's avatar Daniel Dehennin

Import sources from all-in-one zephir repository

parent 451de3b6
####
#### Temporary layer to prepare installation
####
FROM ubuntu:bionic AS build
# Packages required to build
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update -y && apt-get install -y \
curl \
git
ARG CONTAINERPILOT_VERSION=3.4.3
ARG CONTAINERPILOT_CHECKSUM=e8258ed166bcb3de3e06638936dcc2cae32c7c58
RUN curl -Lso /tmp/containerpilot.tar.gz \
"https://github.com/joyent/containerpilot/releases/download/${CONTAINERPILOT_VERSION}/containerpilot-${CONTAINERPILOT_VERSION}.tar.gz" \
&& echo "${CONTAINERPILOT_CHECKSUM} /tmp/containerpilot.tar.gz" | sha1sum -c \
&& tar zxf /tmp/containerpilot.tar.gz -C /tmp
ARG CONSULTEMPLATE_VERSION=0.19.3
ARG CONSULTEMPLATE_CHECKSUM=6467b442d8fd68ca0a1eba35f42edb6f3b9941e10b6d58688edc3506fca0bb19
RUN curl -Lso /tmp/consul-template.tar.gz \
"https://releases.hashicorp.com/consul-template/${CONSULTEMPLATE_VERSION}/consul-template_${CONSULTEMPLATE_VERSION}_linux_amd64.tgz" \
&& echo "${CONSULTEMPLATE_CHECKSUM} /tmp/consul-template.tar.gz" | sha256sum -c \
&& tar zxf /tmp/consul-template.tar.gz -C /tmp
# Orcherstration using containerpilot
# Configuration using consul-template
# Use dev-eole repository since gitlab is not public
ARG CONTAINERPILOT_REPO_URL=https://dev-eole.ac-dijon.fr/git/zephir-orchestrate-containerpilot.git
ARG CONTAINERPILOT_REPO_REF=223dafd3d093702c8717292247e65d0c55ffb513
RUN git clone "${CONTAINERPILOT_REPO_URL}" "/tmp/orchestrate" \
&& cd /tmp/orchestrate \
&& git checkout "${CONTAINERPILOT_REPO_REF}"
# API messages description
# Use dev-eole repository since gitlab is not public
ARG MESSAGES_API_REPO_URL=https://dev-eole.ac-dijon.fr/git/zephir-messages-api.git
ARG MESSAGES_API_REPO_REF=e10c743b3a7d1e84ed13bd49a46e7361fd403ccc
RUN git clone "${MESSAGES_API_REPO_URL}" "/tmp/messages-api" \
&& cd /tmp/messages-api \
&& git checkout "${MESSAGES_API_REPO_REF}"
# Common python Zéphir library
# Use dev-eole repository since gitlab is not public
ARG PYTHON_ZEPHIR_REPO_URL=https://dev-eole.ac-dijon.fr/git/python-zephir.git
ARG PYTHON_ZEPHIR_REPO_REF=bc098b33494c7ef7ae010e130bb773507e196b72
RUN git clone "${PYTHON_ZEPHIR_REPO_URL}" "/tmp/python-zephir" \
&& cd /tmp/python-zephir \
&& git checkout "${PYTHON_ZEPHIR_REPO_REF}"
####
#### Target layer
####
FROM ubuntu:bionic
MAINTAINER Pôle EOLE <eole@ac-dijon.fr>
# Packages required for working service
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update -y && apt-get install -y \
gnupg \
jq \
locales \
openssl \
python3 \
python3-aiohttp \
python3-autobahn \
python3-dev \
python3-jwt \
python3-psycopg2 \
python3-requests \
python3-yaml \
sqitch \
tzdata
# For debug only
RUN apt-get update -y && apt-get install -y \
curl \
iproute2 \
iputils-ping \
vim
# Force french locale
RUN locale-gen fr_FR.UTF-8
ENV LANG fr_FR.UTF-8
ENV LC_ALL fr_FR.UTF-8
# Force timezone
RUN ln -fs /usr/share/zoneinfo/Europe/Paris /etc/localtime
RUN dpkg-reconfigure --frontend noninteractive tzdata
# Sqitch
RUN sqitch config --user user.name 'Equipe EOLE'\
&& sqitch config --user user.email 'eole@ac-dijon.fr'
# Install tools from build layer
COPY --from=build /tmp/containerpilot /usr/local/bin
COPY --from=build /tmp/consul-template /usr/local/bin
# consul-template wrapper to generate /etc/zephir-services.conf
COPY --from=build /tmp/orchestrate/update-service-conf /usr/local/bin/
RUN chmod +x /usr/local/bin/*
# Service template for consul-template
ENV services_conf_filename=zephir-services.conf
ARG services_conf=/etc/zephir-services.conf
ENV services_conf=$services_conf
COPY --from=build /tmp/orchestrate/${services_conf_filename}.ctmpl ${services_conf}.ctmpl
# Install libraries required by service
COPY --from=build /tmp/python-zephir/zephir /usr/lib/python3/dist-packages/zephir
COPY --from=build /tmp/messages-api/messages /srv/messages
# Manage container with ContainerPilot
CMD ["/usr/local/bin/containerpilot", "-config", "/etc/containerpilot.json5"]
COPY containerpilot.json5 /etc/containerpilot.json5
##
## Service specific
##
# Controller
RUN mkdir -p /srv/bin
COPY scripts/controller /srv/bin
RUN chmod +x /srv/bin/*
FROM zephir_api-bridge:latest
RUN apt-get update -y && apt-get install -y \
python3-pytest \
python3-pytest-cov
ENTRYPOINT []
CMD ["echo", "${TEST_ENV}"]
# API Bridge
# API bridge
Transmit messages from HTTP frontend to crossbar bus message
\ No newline at end of file
Service intergiciel permettant la transformation des requêtes JSON/REST en provenance de l'API Gateway de l'application Zéphir en messages WAMP.
## Principe
Le service api-bridge permet d'émettre des messages sur le message broker WAMP de l'application Zéphir.
Il applique une transformation simple du corps JSON de la requête HTTP pour en faire un message WAMP.
### Translation URL vers topic du message
L'URL de la requête HTTP est utilisée pour générer le topic du message WAMP via le schéma suivant:
### Structuration des données
Les données sont attendues au format JSON côté serveur HTTP et doivent suivre le modèle suivant:
```json
{
"clé1": "value1"
}
```
Tous les types autorisés par le format JSON sont valides pour les valeurs du tableau `args` et les valeurs du dictionnaire `kwargs` (aucune validation n'est effectuée sur les types par le service api-bridge).
{
consul: {
address: "{{ .CONSUL_HOST }}"
},
jobs: [
{
name: "update-service-conf",
exec: ["/usr/local/bin/update-service-conf"]
},
{
name: "api-bridge",
exec: ["python3", "-u", "/srv/bin/controller"],
restarts: "unlimited",
health: {
exec: '/usr/bin/curl -o /dev/null --fail -s http://localhost:8080/ping',
interval: 10,
ttl: 20
},
port: 8080,
when: {
source: "update-service-conf",
once: "exitSuccess"
},
},
{
name: "oncrossbarchange-update-service-conf",
exec: ["/usr/local/bin/update-service-conf", "reload"],
when: {
source: "watch.crossbar",
each: "changed"
}
}
],
watches: [
{
name: "api-bridge",
interval: 10
},
{
name: "crossbar",
interval: 10
}
]
}
#!/usr/bin/python3
# -*- coding: utf-8 -*-
from json import loads, dumps
from aiohttp.web import HTTPForbidden, StreamResponse, HTTPInternalServerError, Response
from autobahn.wamp.exception import ApplicationError
from zephir.controller import ZephirCommonController, run
from zephir.http import register
from zephir.message import list_messages, get_message, is_message_defined
from zephir.i18n import _
class ApiBridgeCtrl(ZephirCommonController):
def __new__(cls, args):
for uri in list_messages():
message = get_message(uri)
if message.public:
if message.pattern == 'rpc':
func = cls.http_to_rpc
elif message.pattern == 'event':
func = cls.http_to_event
else:
continue
#raise Exception('unknown message pattern {}'.format(message.pattern))
elif message.pattern in ['rpc', 'event']:
func = cls.forbidden
else:
raise Exception('unknown message pattern {}'.format(uri))
register(uri, http_type='post', parameters_type='json', add_uri_in_response=True, allow_kwargs=True)(func)
return super().__new__(cls)
async def http_to_rpc(self, request, uri, **kwargs):
ret = await self.call(uri, **kwargs)
return {'response': ret}
async def http_to_event(self, request, uri, **kwargs):
kwargs = await self.get_kwargs(request, uri)
if DEBUG:
print('call http->rpc uri: {}, arguments: {}'.format(uri, kwargs))
self.check_params(self.message_parameters, kwargs.keys())
self.publish(uri, **kwargs)
return {'success': True}
async def forbidden(self, request, uri):
raise HTTPForbidden(reason=_('{} is a private message').format(uri))
if __name__ == "__main__":
run(ApiBridgeCtrl)
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment