diff --git a/apps/ops/api/celery.py b/apps/ops/api/celery.py index 5fa8c902b..61d13db17 100644 --- a/apps/ops/api/celery.py +++ b/apps/ops/api/celery.py @@ -4,7 +4,7 @@ import os import re -from celery import current_app +from django.shortcuts import get_object_or_404 from django.utils.translation import ugettext as _ from rest_framework import viewsets from celery.result import AsyncResult @@ -98,13 +98,20 @@ class CeleryPeriodTaskViewSet(CommonApiMixin, viewsets.ModelViewSet): return queryset -class CeleryTaskViewSet(CommonApiMixin, viewsets.ModelViewSet): +class CeleryTaskViewSet(CommonApiMixin, viewsets.ReadOnlyModelViewSet): queryset = CeleryTask.objects.all() serializer_class = CeleryTaskSerializer - http_method_names = ('get',) + http_method_names = ('get', 'head', 'options',) -class CeleryTaskExecutionViewSet(CommonApiMixin, viewsets.ModelViewSet): - queryset = CeleryTaskExecution.objects.all() +class CeleryTaskExecutionViewSet(CommonApiMixin, viewsets.ReadOnlyModelViewSet): serializer_class = CeleryTaskExecutionSerializer - http_method_names = ('get',) + http_method_names = ('get', 'head', 'options',) + + def get_queryset(self): + task_id = self.kwargs.get("task_pk") + if task_id: + task = CeleryTask.objects.get(pk=task_id) + return CeleryTaskExecution.objects.filter(name=task.name) + else: + return CeleryTaskExecution.objects.none() diff --git a/apps/ops/serializers/celery.py b/apps/ops/serializers/celery.py index 8122ed636..b2aa6eb7a 100644 --- a/apps/ops/serializers/celery.py +++ b/apps/ops/serializers/celery.py @@ -31,7 +31,7 @@ class CeleryTaskSerializer(serializers.ModelSerializer): class Meta: model = CeleryTask fields = [ - 'name', 'verbose_name', 'description', + 'id', 'name', 'verbose_name', 'description', ] @@ -39,5 +39,5 @@ class CeleryTaskExecutionSerializer(serializers.ModelSerializer): class Meta: model = CeleryTaskExecution fields = [ - "name", "args", "kwargs", "state", "is_finished", "date_published", "date_start", "date_finished" + "id", "name", "args", "kwargs", "state", "is_finished", "date_published", "date_start", "date_finished" ] diff --git a/apps/ops/signal_handlers.py b/apps/ops/signal_handlers.py index 5882a10e8..3cb9b3f70 100644 --- a/apps/ops/signal_handlers.py +++ b/apps/ops/signal_handlers.py @@ -20,9 +20,16 @@ TASK_LANG_CACHE_TTL = 1800 @receiver(django_ready) def sync_registered_tasks(*args, **kwargs): with transaction.atomic(): - CeleryTask.objects.all().delete() - for key in app.tasks: - CeleryTask(name=key).save() + db_tasks = CeleryTask.objects.all() + celery_task_names = [key for key in app.tasks] + db_task_names = [task.name for task in db_tasks] + + for task in db_tasks: + if task.name not in celery_task_names: + task.delete() + for task in celery_task_names: + if task not in db_task_names: + CeleryTask(name=task).save() @signals.before_task_publish.connect diff --git a/apps/ops/urls/api_urls.py b/apps/ops/urls/api_urls.py index bc263c184..1edbd16e7 100644 --- a/apps/ops/urls/api_urls.py +++ b/apps/ops/urls/api_urls.py @@ -4,6 +4,8 @@ from __future__ import unicode_literals from django.urls import path from rest_framework.routers import DefaultRouter from rest_framework_bulk.routes import BulkRouter +from rest_framework_nested import routers + from .. import api app_name = "ops" @@ -14,15 +16,20 @@ bulk_router = BulkRouter() router.register(r'adhoc', api.AdHocViewSet, 'adhoc') router.register(r'adhoc-executions', api.AdHocExecutionViewSet, 'execution') router.register(r'celery/period-tasks', api.CeleryPeriodTaskViewSet, 'celery-period-task') -router.register(r'celery/tasks', api.CeleryTaskViewSet, 'celery-task') -router.register(r'celery/task-executions', api.CeleryTaskExecutionViewSet, 'task-execution') + +router.register(r'tasks', api.CeleryTaskViewSet, 'task') + +task_router = routers.NestedDefaultRouter(router, r'tasks', lookup='task') +task_router.register(r'executions', api.CeleryTaskExecutionViewSet, 'task-execution') urlpatterns = [ - path('celery/task//log/', api.CeleryTaskExecutionLogApi.as_view(), name='celery-task-log'), - path('celery/task//result/', api.CeleryResultApi.as_view(), name='celery-result'), - path('ansible/task//log/', api.AnsibleTaskLogApi.as_view(), name='ansible-task-log'), + path('celery/task//task-execution//log/', api.CeleryTaskExecutionLogApi.as_view(), + name='celery-task-execution-log'), + path('celery/task//task-execution//result/', api.CeleryResultApi.as_view(), + name='celery-task-execution-result'), + + path('ansible/task-execution//log/', api.AnsibleTaskLogApi.as_view(), name='ansible-task-log'), ] -urlpatterns += router.urls -urlpatterns += bulk_router.urls +urlpatterns += (router.urls + bulk_router.urls + task_router.urls)