From b6653c510de2b25d6265b97258c440bab6886511 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniele=20Vigan=C3=B2?= Date: Wed, 3 Jun 2020 19:26:35 +0200 Subject: [PATCH] Add a virtual EDGE which spawns http simulators (#8) * Add dockerized python simulators * Create an EDGE gateway via dind * Fix README.md title --- docker/docker-compose.yml | 11 ++++++ docker/edge/README.md | 6 +++ docker/edge/docker-compose.yml | 19 ++++++++++ docker/simulators/Dockerfile.http | 6 +++ docker/simulators/simulator_http.py | 58 +++++++++++++++++++++++++++++ 5 files changed, 100 insertions(+) create mode 100644 docker/edge/README.md create mode 100644 docker/edge/docker-compose.yml create mode 100644 docker/simulators/Dockerfile.http create mode 100644 docker/simulators/simulator_http.py diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index d6917b8..191b27f 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -44,3 +44,14 @@ services: ports: - "15672:15672" - "5672:5672" + + edge: + <<: *service_default + image: docker:dind + privileged: true + environment: + DOCKER_TLS_CERTDIR: + networks: + - net + ports: + - "127.0.0.1:22375:2375" diff --git a/docker/edge/README.md b/docker/edge/README.md new file mode 100644 index 0000000..c7dfc98 --- /dev/null +++ b/docker/edge/README.md @@ -0,0 +1,6 @@ +# EDGE device simulator (via docker-in-docker) + +```bash +export DOCKER_HOST='127.0.0.1:22375' +docker-compose -f docker-compose.edge.yml up -d --scale device-http=4 +``` diff --git a/docker/edge/docker-compose.yml b/docker/edge/docker-compose.yml new file mode 100644 index 0000000..f54d957 --- /dev/null +++ b/docker/edge/docker-compose.yml @@ -0,0 +1,19 @@ +version: "3.7" + +networks: + localnet: + +x-op-service-default: &service_default + restart: unless-stopped + init: true + +services: + device-http: + <<: *service_default + image: daniviga/freedcs-device-http + environment: + IOT_HOST: "http://192.168.10.123:8000" + # IOT_SERIAL: "abcd1234" + # IOT_DELAY: 10 + networks: + - localnet diff --git a/docker/simulators/Dockerfile.http b/docker/simulators/Dockerfile.http new file mode 100644 index 0000000..ec666be --- /dev/null +++ b/docker/simulators/Dockerfile.http @@ -0,0 +1,6 @@ +FROM python:3.8-alpine + +RUN pip3 install urllib3 +COPY ./simulator_http.py /opt/freedcs/simulator_http.py + +ENTRYPOINT ["python3", "/opt/freedcs/simulator_http.py"] diff --git a/docker/simulators/simulator_http.py b/docker/simulators/simulator_http.py new file mode 100644 index 0000000..80a23a7 --- /dev/null +++ b/docker/simulators/simulator_http.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 + +import os +import json +import string +import random +import datetime +import urllib3 +from time import sleep + +http = urllib3.PoolManager() + + +def post_json(host, url, data): + encoded_data = json.dumps(data).encode('utf8') + + while True: + try: + retry = False + r = http.request( + 'POST', + host + url, + body=encoded_data, + headers={'content-type': 'application/json'}) + return r + except urllib3.exceptions.MaxRetryError: + pass + + +def main(): + host = os.environ.get('IOT_HOST', 'http://127.0.0.1:8000') + subscribe = '/api/subscribe/' + telemetry = '/telemetry/' + delay = int(os.environ.get('IOT_DELAY', 10)) + + serial = os.environ.get('IOT_SERIAL') + if serial is None: + serial = ''.join( + random.choices(string.ascii_lowercase + string.digits, k=8)) + + data = {'serial': serial} + post_json(host, subscribe, data) + + data = { + 'device': serial, + 'clock': int(datetime.datetime.now().timestamp()), + 'payload': { + 'data': 'sample_data' + } + } + + while True: + post_json(host, telemetry, data) + sleep(delay) + + +if __name__ == "__main__": + main()