diff --git a/netbox/core/api/urls.py b/netbox/core/api/urls.py index 19b7f4978..955205c12 100644 --- a/netbox/core/api/urls.py +++ b/netbox/core/api/urls.py @@ -1,6 +1,9 @@ +from django.urls import path, include + from netbox.api.routers import NetBoxRouter from . import views +app_name = 'core-api' router = NetBoxRouter() router.APIRootView = views.CoreRootView @@ -9,15 +12,32 @@ router.register('data-sources', views.DataSourceViewSet) router.register('data-files', views.DataFileViewSet) router.register('jobs', views.JobViewSet) router.register('object-changes', views.ObjectChangeViewSet) -router.register('background-workers', views.BackgroundWorkerViewSet, basename='BackgroundWorkers') -router.register('background-queues', views.BackgroundQueueViewSet, basename='BackgroundQueues') -router.register('background-tasks/(?P[\w-]+)', views.BackgroundTaskViewSet, basename='BackgroundTasks') -router.register('background-tasks/(?P[\w-]+)/deferred', views.BackgroundTaskDeferredViewSet, basename='BackgroundTaskDeferred') -router.register('background-tasks/(?P[\w-]+)/failed', views.BackgroundTaskFailedViewSet, basename='BackgroundTaskFailed') -router.register('background-tasks/(?P[\w-]+)/finished', views.BackgroundTaskFinishedViewSet, basename='BackgroundTaskFinished') -router.register('background-tasks/(?P[\w-]+)/started', views.BackgroundTaskStartedViewSet, basename='BackgroundTaskStarted') -router.register('background-tasks/(?P[\w-]+)/queued', views.BackgroundTaskQueuedViewSet, basename='BackgroundTaskQueued') -router.register('background-tasks/(?P[\w-]+)/workers', views.BackgroundTaskWorkerViewSet, basename='BackgroundTaskWorkers') -app_name = 'core-api' -urlpatterns = router.urls + +# Background Tasks +""" +router.register('background-queues/', views.BackgroundQueueListView.as_view(), name='background_queue_list'), +router.register('background-queues///', views.BackgroundTaskListView.as_view(), name='background_task_list'), +router.register('background-tasks//', views.BackgroundTaskView.as_view(), name='background_task'), +router.register('background-tasks//delete/', views.BackgroundTaskDeleteView.as_view(), name='background_task_delete'), +router.register('background-tasks//requeue/', views.BackgroundTaskRequeueView.as_view(), name='background_task_requeue'), +router.register('background-tasks//enqueue/', views.BackgroundTaskEnqueueView.as_view(), name='background_task_enqueue'), +router.register('background-tasks//stop/', views.BackgroundTaskStopView.as_view(), name='background_task_stop'), +router.register('background-workers//', views.WorkerListView.as_view(), name='worker_list'), +router.register('background-workers//', views.WorkerView.as_view(), name='worker'), +""" + +urlpatterns = ( + path('background-queues/', views.QueueListView.as_view()), + path('background-workers/', views.WorkerListView.as_view()), + # path('background-workers//', views.WorkerView.as_view()), + path('background-tasks//', views.TaskListView.as_view()), + path('background-tasks//deferred/', views.DeferredTaskListView.as_view()), + path('background-tasks//failed/', views.FailedTaskListView.as_view()), + path('background-tasks//finished/', views.FinishedTaskListView.as_view()), + path('background-tasks//started/', views.StartedTaskListView.as_view()), + path('background-tasks//queued/', views.QueuedTaskListView.as_view()), + # path('background-tasks//workers', views.BackgroundWorkerListView.as_view()), + + path('', include(router.urls)), +) diff --git a/netbox/core/api/views.py b/netbox/core/api/views.py index a67ce1946..f9c06fb78 100644 --- a/netbox/core/api/views.py +++ b/netbox/core/api/views.py @@ -6,7 +6,8 @@ from rest_framework.decorators import action from rest_framework.exceptions import PermissionDenied from rest_framework.response import Response from rest_framework.routers import APIRootView -from rest_framework.viewsets import ReadOnlyModelViewSet, ViewSet +from rest_framework.views import APIView +from rest_framework.viewsets import ReadOnlyModelViewSet from core import filtersets from core.choices import DataSourceStatusChoices @@ -20,7 +21,6 @@ from netbox.api.metadata import ContentTypeMetadata from netbox.api.viewsets import NetBoxModelViewSet, NetBoxReadOnlyModelViewSet from rest_framework.permissions import IsAdminUser from rq.worker import Worker -from rq.worker_registration import clean_worker_registry from . import serializers @@ -82,21 +82,20 @@ class ObjectChangeViewSet(ReadOnlyModelViewSet): filterset_class = filtersets.ObjectChangeFilterSet -class BackgroundQueueViewSet(ViewSet): - serializer_class = serializers.BackgroundQueueSerializer +class QueueListView(APIView): permission_classes = [IsAdminUser] def get_view_name(self): - return "BackgroundQueueViewSet" + return "Background Queues" @extend_schema(responses={200: OpenApiTypes.OBJECT}) - def list(self, request): + def get(self, request, format=None): data = get_statistics(run_maintenance_tasks=True)["queues"] serializer = serializers.BackgroundQueueSerializer(data, many=True) return Response(serializer.data) -class BackgroundWorkerViewSet(ViewSet): +class WorkerListView(APIView): serializer_class = serializers.BackgroundQueueSerializer permission_classes = [IsAdminUser] @@ -104,7 +103,7 @@ class BackgroundWorkerViewSet(ViewSet): return "Background Workers" @extend_schema(responses={200: OpenApiTypes.OBJECT}) - def list(self, request): + def get(self, request, format=None): # all the RQ queues should use the same connection config = QUEUES_LIST[0] workers = Worker.all(get_redis_connection(config['connection_config'])) @@ -112,15 +111,15 @@ class BackgroundWorkerViewSet(ViewSet): return Response(serializer.data) -class BackgroundTaskViewSet(ViewSet): +class TaskListView(APIView): serializer_class = serializers.BackgroundTaskSerializer permission_classes = [IsAdminUser] def get_view_name(self): - return "BackgroundTaskViewSet" + return "Background Tasks" @extend_schema(responses={200: OpenApiTypes.OBJECT}) - def list(self, request, queue_name): + def get(self, request, format=None): """ Return the UserConfig for the currently authenticated User. """ @@ -130,7 +129,7 @@ class BackgroundTaskViewSet(ViewSet): return Response(serializer.data) -class BaseBackgroundTaskViewSet(ViewSet): +class BaseTaskView(APIView): serializer_class = serializers.BackgroundTaskSerializer permission_classes = [IsAdminUser] registry = None @@ -139,46 +138,46 @@ class BaseBackgroundTaskViewSet(ViewSet): return "Background Tasks" @extend_schema(responses={200: OpenApiTypes.OBJECT}) - def list(self, request, queue_name): + def get(self, request, queue_name, format=None): queue = get_queue(queue_name) data = get_rq_jobs_from_status(queue, self.registry) serializer = serializers.BackgroundTaskSerializer(data, many=True) return Response(serializer.data) -class BackgroundTaskDeferredViewSet(BaseBackgroundTaskViewSet): +class DeferredTaskListView(BaseTaskView): registry = "deferred" def get_view_name(self): return "Deferred Tasks" -class BackgroundTaskFailedViewSet(BaseBackgroundTaskViewSet): +class FailedTaskListView(BaseTaskView): registry = "failed" def get_view_name(self): return "Failed Tasks" -class BackgroundTaskFinishedViewSet(BaseBackgroundTaskViewSet): +class FinishedTaskListView(BaseTaskView): registry = "finished" def get_view_name(self): return "Finished Tasks" -class BackgroundTaskStartedViewSet(BaseBackgroundTaskViewSet): +class StartedTaskListView(BaseTaskView): registry = "started" def get_view_name(self): return "Started Tasks" -class BackgroundTaskQueuedViewSet(BaseBackgroundTaskViewSet): +class QueuedTaskListView(BaseTaskView): registry = "queued" @extend_schema(responses={200: OpenApiTypes.OBJECT}) - def list(self, request, queue_name): + def get(self, request, format=None): """ Return the UserConfig for the currently authenticated User. """ @@ -186,20 +185,3 @@ class BackgroundTaskQueuedViewSet(BaseBackgroundTaskViewSet): data = queue.get_jobs() serializer = serializers.BackgroundTaskSerializer(data, many=True) return Response(serializer.data) - - -class BackgroundTaskWorkerViewSet(ViewSet): - serializer_class = serializers.BackgroundQueueSerializer - permission_classes = [IsAdminUser] - - def get_view_name(self): - return "Background Workers" - - @extend_schema(responses={200: OpenApiTypes.OBJECT}) - def list(self, request, queue_name): - queue = get_queue(queue_name) - clean_worker_registry(queue) - all_workers = Worker.all(queue.connection) - workers = [worker for worker in all_workers if queue.name in worker.queue_names()] - serializer = serializers.BackgroundWorkerSerializer(workers, many=True) - return Response(serializer.data)