Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .env
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ TASK_TIMEOUT_LIMIT = 3600
DJANGO_DB_USER_CONTEXT = SYSTEM
DJANGO_DB_BULK_CREATE_BATCH_SIZE = 1000
CELERY_CONCURRENCY = 4
CELERY_AV_CONCURRENCY = 2

# Email
MAILGUN_API_URL = <MG_API_URL>
Expand Down
10 changes: 10 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,13 @@ redeploy-swarm:
$(MAKE) swarm-push ENV_FILE=$(ENV_FILE)
$(MAKE) start-swarm-nodb ENV_FILE=$(ENV_FILE)

redeploy-swarm-local:
$(MAKE) stop-swarm
@echo "Waiting 15s for overlay network cleanup..."
sleep 15
$(MAKE) swarm-push ENV_FILE=$(ENV_FILE)
$(MAKE) start-swarm-local ENV_FILE=$(ENV_FILE)

redeploy-frontend: rebuild-frontend
docker tag buildingsmart/validationsvc-frontend $(REGISTRY)/validationsvc-frontend
docker push $(REGISTRY)/validationsvc-frontend
Expand Down Expand Up @@ -140,6 +147,7 @@ rebuild-frontend:
rebuild-backend:
docker stop backend || true
docker stop worker || true
docker stop av_worker || true
docker stop scheduler || true
docker rmi --force $$(docker images -q 'buildingsmart/validationsvc-backend:latest' | uniq) || true
docker compose build \
Expand All @@ -149,6 +157,7 @@ rebuild-backend:
clean:
docker stop backend || true
docker stop worker || true
docker stop av_worker || true
docker stop scheduler || true
docker stop frontend || true
docker rmi --force $$(docker images -q 'buildingsmart/validationsvc-frontend:latest' | uniq) || true
Expand All @@ -159,6 +168,7 @@ clean:
clean-all:
docker stop backend || true
docker stop worker || true
docker stop av_worker || true
docker stop scheduler || true
docker stop frontend || true
docker rmi --force $$(docker images -q 'buildingsmart/validationsvc-frontend' | uniq) || true
Expand Down
10 changes: 5 additions & 5 deletions backend/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -47,19 +47,19 @@ start-backend:
$(PYTHON) manage.py runserver

start-worker:
$(PYTHON) -m celery --app=core worker --loglevel=DEBUG --concurrency 2 --task-events --hostname=worker@%n
$(PYTHON) -m celery --app=core worker -Q celery,antivirus --loglevel=DEBUG --concurrency 2 --task-events --hostname=worker@%n

start-worker-with-scheduler:
$(PYTHON) -m celery --app=core worker --loglevel=DEBUG --concurrency 2 --task-events --hostname=worker@%n --beat --scheduler django_celery_beat.schedulers:DatabaseScheduler
$(PYTHON) -m celery --app=core worker -Q celery,antivirus--loglevel=DEBUG --concurrency 2 --task-events --hostname=worker@%n --beat --scheduler django_celery_beat.schedulers:DatabaseScheduler

start-worker2:
$(PYTHON) -m celery --app=core worker --loglevel=DEBUG --concurrency 2 --task-events --hostname=worker2@%n
$(PYTHON) -m celery --app=core worker -Q celery,antivirus--loglevel=DEBUG --concurrency 2 --task-events --hostname=worker2@%n

start-worker3:
$(PYTHON) -m celery --app=core worker --loglevel=DEBUG --concurrency 2 --task-events --hostname=worker3@%n
$(PYTHON) -m celery --app=core worker -Q celery,antivirus--loglevel=DEBUG --concurrency 2 --task-events --hostname=worker3@%n

start-worker4:
$(PYTHON) -m celery --app=core worker --loglevel=DEBUG --concurrency 2 --task-events --hostname=worker4@%n
$(PYTHON) -m celery --app=core worker -Q celery,antivirus--loglevel=DEBUG --concurrency 2 --task-events --hostname=worker4@%n

.PHONY: stop-worker
stop-worker:
Expand Down
2 changes: 1 addition & 1 deletion backend/apps/ifc_validation/tasks/check_programs.py
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ def check_magic_and_clamav(context:TaskContext):
# logger.warning(f'File {context.file_path} has been removed.')

context.result = {
"success": 'warn' not in result,
"success": 'warn' not in result and 'error' not in result,
"valid": 'invalid' not in result,
'output': next(iter(result.values())),
}
Expand Down
6 changes: 3 additions & 3 deletions backend/apps/ifc_validation/tasks/task_runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -165,10 +165,10 @@ def on_workflow_failed(self, *args, **kwargs):
send_failure_admin_email_task.delay(id=id, file_name=request.file_name)


def task_factory(task_type):
def task_factory(task_type, queue='celery'):
config = task_registry[task_type]

@shared_task(bind=True, name=config.celery_task_name, max_retries=None)
@shared_task(bind=True, name=config.celery_task_name, max_retries=None, queue=queue)
@with_user_task_lock(task_name=config.celery_task_name)
@log_execution
@requires_django_user_context
Expand Down Expand Up @@ -301,4 +301,4 @@ def ifc_file_validation_task(self, id, file_name, *args, **kwargs):

industry_practices_subtask = task_factory(ValidationTask.Type.INDUSTRY_PRACTICES)

magic_clamav_subtask = task_factory(ValidationTask.Type.MAGIC_AND_CLAMAV)
magic_clamav_subtask = task_factory(ValidationTask.Type.MAGIC_AND_CLAMAV, queue='antivirus')
6 changes: 6 additions & 0 deletions backend/core/celery.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from celery.worker.request import Request
from celery.exceptions import Ignore
from celery.utils.log import get_task_logger
from kombu import Queue

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "core.settings")

Expand Down Expand Up @@ -74,3 +75,8 @@ def update_task_status(self, state, reason, is_final=True):
app = Celery("core", task_cls=BaseTask)
app.config_from_object("django.conf:settings", namespace="CELERY") # prefix 'CELERY_'
app.autodiscover_tasks()

app.conf.task_queues = (
Queue('celery'), # default queue for general tasks
Queue('antivirus'), # queue for antivirus task
)
42 changes: 41 additions & 1 deletion docker-compose.full.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ services:
- static_data:/app/backend/django_static
depends_on:
- backend
- worker
- av_worker
- scheduler

# Backend - Django (x2)
backend:
Expand Down Expand Up @@ -112,6 +115,42 @@ services:
- db
- redis

# Worker - antivirus
av_worker:
image: buildingsmart/validationsvc-backend
build:
context: .
dockerfile: ./docker/backend/Dockerfile
target: run
entrypoint: /app/backend/worker-clamav-entrypoint.sh
restart: unless-stopped
container_name: av_worker
volumes:
- files_data:/files_storage
- ./docker/backend/clamav/clamd.conf:/etc/clamav/clamd.conf:ro
- ./docker/backend/clamav/freshclam.conf:/etc/clamav/freshclam.conf:ro
- clamav_data:/var/lib/clamav # persist database
environment:
ENV: ${ENV}
DEBUG: ${DEBUG}
CELERY_BROKER_URL: ${CELERY_BROKER_URL}
CELERY_RESULT_BACKEND: "django-db"
CELERY_RESULT_BACKEND_DB: "db+postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db/${POSTGRES_NAME}"
CELERY_TASK_SOFT_TIME_LIMIT: ${CELERY_TASK_SOFT_TIME_LIMIT}
CELERY_TASK_TIME_LIMIT: ${CELERY_TASK_TIME_LIMIT}
TASK_TIMEOUT_LIMIT: ${TASK_TIMEOUT_LIMIT}
CELERY_AV_CONCURRENCY: ${CELERY_AV_CONCURRENCY}
DJANGO_DB: ${DJANGO_DB}
DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY}
POSTGRES_HOST: ${POSTGRES_HOST}
POSTGRES_PORT: ${POSTGRES_PORT}
POSTGRES_NAME: ${POSTGRES_NAME}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
depends_on:
- db
- redis

# Worker - Celery worker (x1) + beat
scheduler:
image: buildingsmart/validationsvc-backend
Expand Down Expand Up @@ -228,4 +267,5 @@ volumes:
otel_data:
prometheus_data:
grafana_data:
gherkin_rules_log_data:
gherkin_rules_log_data:
clamav_data:
41 changes: 40 additions & 1 deletion docker-compose.load_balanced.nodb.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ services:
- static_data:/app/backend/django_static
depends_on:
- backend
- worker
- av_worker
- scheduler

# Backend - Django (x2)
backend:
Expand Down Expand Up @@ -113,6 +116,41 @@ services:
depends_on:
- redis

# Worker - antivirus
av_worker:
image: buildingsmart/validationsvc-backend
build:
context: .
dockerfile: ./docker/backend/Dockerfile
target: run
entrypoint: /app/backend/worker-clamav-entrypoint.sh
restart: unless-stopped
container_name: av_worker
volumes:
- files_data:/files_storage
- ./docker/backend/clamav/clamd.conf:/etc/clamav/clamd.conf:ro
- ./docker/backend/clamav/freshclam.conf:/etc/clamav/freshclam.conf:ro
- clamav_data:/var/lib/clamav # persist database
environment:
ENV: ${ENV}
DEBUG: ${DEBUG}
CELERY_BROKER_URL: ${CELERY_BROKER_URL}
CELERY_RESULT_BACKEND: "django-db"
CELERY_RESULT_BACKEND_DB: "db+postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db/${POSTGRES_NAME}"
CELERY_TASK_SOFT_TIME_LIMIT: ${CELERY_TASK_SOFT_TIME_LIMIT}
CELERY_TASK_TIME_LIMIT: ${CELERY_TASK_TIME_LIMIT}
TASK_TIMEOUT_LIMIT: ${TASK_TIMEOUT_LIMIT}
CELERY_AV_CONCURRENCY: ${CELERY_AV_CONCURRENCY}
DJANGO_DB: ${DJANGO_DB}
DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY}
POSTGRES_HOST: ${POSTGRES_HOST}
POSTGRES_PORT: ${POSTGRES_PORT}
POSTGRES_NAME: ${POSTGRES_NAME}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
depends_on:
- redis

# Worker - Celery worker (x1) + beat
scheduler:
image: buildingsmart/validationsvc-backend
Expand Down Expand Up @@ -168,4 +206,5 @@ volumes:
static_data:
files_data:
redis_data:
gherkin_rules_log_data:
gherkin_rules_log_data:
clamav_data:
42 changes: 41 additions & 1 deletion docker-compose.load_balanced.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ services:
- static_data:/app/backend/django_static
depends_on:
- backend
- worker
- av_worker
- scheduler

# Backend - Django (x2)
backend:
Expand Down Expand Up @@ -115,6 +118,42 @@ services:
- db
- redis

# Worker - antivirus
av_worker:
image: buildingsmart/validationsvc-backend
build:
context: .
dockerfile: ./docker/backend/Dockerfile
target: run
entrypoint: /app/backend/worker-clamav-entrypoint.sh
restart: unless-stopped
container_name: av_worker
volumes:
- files_data:/files_storage
- ./docker/backend/clamav/clamd.conf:/etc/clamav/clamd.conf:ro
- ./docker/backend/clamav/freshclam.conf:/etc/clamav/freshclam.conf:ro
- clamav_data:/var/lib/clamav # persist database
environment:
ENV: ${ENV}
DEBUG: ${DEBUG}
CELERY_BROKER_URL: ${CELERY_BROKER_URL}
CELERY_RESULT_BACKEND: "django-db"
CELERY_RESULT_BACKEND_DB: "db+postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db/${POSTGRES_NAME}"
CELERY_TASK_SOFT_TIME_LIMIT: ${CELERY_TASK_SOFT_TIME_LIMIT}
CELERY_TASK_TIME_LIMIT: ${CELERY_TASK_TIME_LIMIT}
TASK_TIMEOUT_LIMIT: ${TASK_TIMEOUT_LIMIT}
CELERY_AV_CONCURRENCY: ${CELERY_AV_CONCURRENCY}
DJANGO_DB: ${DJANGO_DB}
DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY}
POSTGRES_HOST: ${POSTGRES_HOST}
POSTGRES_PORT: ${POSTGRES_PORT}
POSTGRES_NAME: ${POSTGRES_NAME}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
depends_on:
- db
- redis

# Worker - Celery worker (x1) + beat
scheduler:
image: buildingsmart/validationsvc-backend
Expand Down Expand Up @@ -186,4 +225,5 @@ volumes:
files_data:
postgres_data:
redis_data:
gherkin_rules_log_data:
gherkin_rules_log_data:
clamav_data:
40 changes: 39 additions & 1 deletion docker-compose.nodb.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ services:
- static_data:/app/backend/django_static
depends_on:
- backend
- worker
- av_worker

# Backend - Django
backend:
Expand Down Expand Up @@ -103,6 +105,41 @@ services:
depends_on:
- redis

# Worker - antivirus
av_worker:
image: buildingsmart/validationsvc-backend
build:
context: .
dockerfile: ./docker/backend/Dockerfile
target: run
entrypoint: /app/backend/worker-clamav-entrypoint.sh
restart: unless-stopped
container_name: av_worker
volumes:
- files_data:/files_storage
- ./docker/backend/clamav/clamd.conf:/etc/clamav/clamd.conf:ro
- ./docker/backend/clamav/freshclam.conf:/etc/clamav/freshclam.conf:ro
- clamav_data:/var/lib/clamav # persist database
environment:
ENV: ${ENV}
DEBUG: ${DEBUG}
CELERY_BROKER_URL: ${CELERY_BROKER_URL}
CELERY_RESULT_BACKEND: "django-db"
CELERY_RESULT_BACKEND_DB: "db+postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db/${POSTGRES_NAME}"
CELERY_TASK_SOFT_TIME_LIMIT: ${CELERY_TASK_SOFT_TIME_LIMIT}
CELERY_TASK_TIME_LIMIT: ${CELERY_TASK_TIME_LIMIT}
TASK_TIMEOUT_LIMIT: ${TASK_TIMEOUT_LIMIT}
CELERY_AV_CONCURRENCY: ${CELERY_AV_CONCURRENCY}
DJANGO_DB: ${DJANGO_DB}
DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY}
POSTGRES_HOST: ${POSTGRES_HOST}
POSTGRES_PORT: ${POSTGRES_PORT}
POSTGRES_NAME: ${POSTGRES_NAME}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
depends_on:
- redis

# Redis
redis:
image: redis:8.4-alpine
Expand All @@ -117,4 +154,5 @@ volumes:
static_data:
files_data:
redis_data:
gherkin_rules_log_data:
gherkin_rules_log_data:
clamav_data:
Loading
Loading