From 9351a69ed11a58be40251bbe2322b5fa1f95efa9 Mon Sep 17 00:00:00 2001
From: Adar Nimrod <nimrod@shore.co.il>
Date: Sun, 23 Feb 2020 13:54:43 +0200
Subject: [PATCH] Add worker, simplify structrue.

---
 Dockerfile          |  2 +-
 docker-compose.yml  | 14 +++++++++++++-
 requirements.txt    |  2 +-
 server.py           | 19 +++++++++++++++++++
 tasks.py            | 14 ++++++++++++++
 waldorf/__init__.py |  0
 waldorf/server.py   | 10 ----------
 7 files changed, 48 insertions(+), 13 deletions(-)
 create mode 100644 server.py
 create mode 100644 tasks.py
 delete mode 100644 waldorf/__init__.py
 delete mode 100644 waldorf/server.py

diff --git a/Dockerfile b/Dockerfile
index d235be9..461b558 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -2,5 +2,5 @@ FROM python:3.8
 WORKDIR /opt/waldorf
 COPY requirements.txt ./
 RUN pip install --no-cache-dir -r requirements.txt
-COPY waldorf ./waldorf
+COPY *.py ./
 USER nobody
diff --git a/docker-compose.yml b/docker-compose.yml
index 242dc2b..b824a31 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -18,9 +18,21 @@ services:
     build:
       context: ./
     command: ["flask", "run", "--port", "8080", "--host", "0.0.0.0"]
+    depends_on:
+      - rabbitmq
     environment:
-      FLASK_APP: waldorf/server
+      FLASK_APP: server
     healthcheck:
       test: ["CMD-SHELL", "wget http://localhost:8080/ping || exit 1"]
     ports:
       - 8080:8080
+  worker:
+    build:
+      context: ./
+    command: ["celery", "worker", "--app", "tasks", "--loglevel", "info"]
+    depends_on:
+      - rabbitmq
+    environment:
+      BROKER_URL: amqp://waldorf:pass@rabbitmq/waldorf
+    healthcheck:
+      test: ["CMD-SHELL", "pgrep python || exit 1"]
diff --git a/requirements.txt b/requirements.txt
index 468914a..e91b62f 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,2 +1,2 @@
-celery[librabbitmq]>=4.4
+celery[py-amqp]>=4.4
 flask>=1.1
diff --git a/server.py b/server.py
new file mode 100644
index 0000000..78617eb
--- /dev/null
+++ b/server.py
@@ -0,0 +1,19 @@
+"""Dummy web server using Flask."""
+from flask import Flask, request, jsonify
+import tasks
+
+app = Flask(__name__)  # pylint: disable=invalid-name
+
+
+@app.route("/ping")
+def ping():
+    """Healthcheck."""
+    return "pong"
+
+
+@app.route("/log", methods=["POST"])
+def log():
+    """Async log."""
+    data = request.get_json()
+    tasks.log.apply_async(args=(data,))
+    return jsonify(data)
diff --git a/tasks.py b/tasks.py
new file mode 100644
index 0000000..3a73d5c
--- /dev/null
+++ b/tasks.py
@@ -0,0 +1,14 @@
+"""Celery worker."""
+import logging
+import os
+from celery import Celery
+
+
+BROKER_URL = os.getenv("BROKER_URL")
+app = Celery("tasks", broker=BROKER_URL)  # pylint: disable=invalid-name
+
+
+@app.task
+def log(message):
+    """Log message."""
+    logging.info(f"Message: %s", message)
diff --git a/waldorf/__init__.py b/waldorf/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/waldorf/server.py b/waldorf/server.py
deleted file mode 100644
index ee41f97..0000000
--- a/waldorf/server.py
+++ /dev/null
@@ -1,10 +0,0 @@
-"""Dummy web server using Flask."""
-from flask import Flask
-
-app = Flask(__name__)  # pylint: disable=invalid-name
-
-
-@app.route("/ping")
-def ping():
-    """Healthcheck."""
-    return "pong"
-- 
GitLab