chore(Celery): add basic Celery worker with broker only (#20)

* chore(Celery): add basic Celery worker with broker only

* chore(Celery): saving progress. Not able to schedule tasks

* fix(Celery): add celery app for use by django

* fix(Celery): register tasks

* fix(Docker): add celery workers to docker-compose

* chore(Celery): add django-celery-results backend

to store results using Django ORM

* fix(Celery): get app config the correct way

* fix(Docker): start connecting docker Celery workers to Valkey

not yet operational

* fix(Celery): get celery & django to work in docker-compose

* docs(Celery): document how to run Celery in development environment

includes changes to support the configuration and deployment
of Celery worker and its dependencies, Valkey and Postgres.

* fix(GHA): add valkey to CI services

* fix(GHA): add valkey to CI services

* fix(GHA): add valkey-cli ping to CI services

* fix(GHA): use right port for valkey

* fix(Views): remove debug task code

* test(Celery): start adding celery task tests

not yet working!

* fix(pyproject): rollback django upgrade

* fix(docker): updated docker runtime and env vars

based on feedback from #20

* fix(Dockerfile): include dependencies for psutil

psutil was introduced by pytest-celery

* fix(Backend): PRWLR-4013 fix celery settings structure

* fix(Celery): update celery app to work with new settings structure

* fix(Views): remove debug task code

* fix(Config): remove debug code

* fix(Celery): update celery app name when running worker

---------

Co-authored-by: Víctor Fernández Poyatos <victor@prowler.com>
This commit is contained in:
Jon YoungandVíctor Fernández Poyatos authored and GitHub committed 2024-08-09 16:47:35 +02:00
1 parent 43c9e70a65
commit a2ab216531
16 files changed
+830 -235

No files matched your search

+8
View File
@@ -0,0 +1,8 @@
from celery import Celery
celery_app = Celery("tasks")
celery_app.config_from_object("django.conf:settings", namespace="CELERY")
celery_app.autodiscover_tasks(["tasks"])
+2
View File
@@ -1,5 +1,6 @@
from config.custom_logging import LOGGING # noqa
from config.env import BASE_DIR, env # noqa
from config.settings.celery import * # noqa
SECRET_KEY = env("SECRET_KEY", default="secret")
DEBUG = env.bool("DJANGO_DEBUG", default=False)
@@ -20,6 +21,7 @@ INSTALLED_APPS = [
"drf_spectacular",
"django_guid",
"rest_framework_json_api",
"django_celery_results",
]
MIDDLEWARE = [
+3
View File
@@ -0,0 +1,3 @@
from config.celery import celery_app
__all__ = ("celery_app",)
+10
View File
@@ -0,0 +1,10 @@
from config.env import env
VALKEY_HOST = env("VALKEY_HOST", default="valkey-db")
VALKEY_PORT = env("VALKEY_PORT", default="6479")
VALKEY_DB = env("VALKEY_DB", default="0")
CELERY_BROKER_URL = f"redis://{VALKEY_HOST}:{VALKEY_PORT}/{VALKEY_DB}"
CELERY_RESULT_BACKEND = "django-db"
CELERY_BROKER_CONNECTION_RETRY_ON_STARTUP = True
+17
View File
@@ -23,3 +23,20 @@ def get_tenant():
@pytest.fixture
def tenant_header(get_tenant):
return {"X-Tenant-ID": str(get_tenant.id)}
# Put this in your conftest.py
@pytest.fixture(scope="session")
def celery_config():
return {
"broker_url": "redis://",
"result_backend": "redis://",
"broker_connection_retry_on_startup": True,
}
@pytest.fixture(scope="session")
def celery_includes():
return [
"tasks",
]
+16
View File
@@ -0,0 +1,16 @@
from celery import shared_task
from celery.utils.log import get_task_logger
# TODO: add celery metadata to CustomLogger
logger = get_task_logger(__name__)
@shared_task
def debug_task(x, y):
try:
logger.info("Hello world")
except Exception as e:
logger.error(e)
return x + y
File renamed without changes.
+3
View File
@@ -0,0 +1,3 @@
# @pytest.mark.celery
# def test_debug_task(celery_worker):
# assert debug_task.delay(1, 2).get() == 4