From 1ab38c3a45a647993f902e5feb81bfe845ec67ef Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Fri, 1 Nov 2024 09:38:13 -0700 Subject: [PATCH] 7848 Add Background Tasks (RQ) to API --- netbox/core/api/serializers.py | 1 + netbox/core/api/serializers_/tasks.py | 20 ++++++++++++++++++++ netbox/core/api/urls.py | 1 + netbox/core/api/views.py | 23 ++++++++++++++++++++++- 4 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 netbox/core/api/serializers_/tasks.py diff --git a/netbox/core/api/serializers.py b/netbox/core/api/serializers.py index 2dde6be9f..9a6d4d726 100644 --- a/netbox/core/api/serializers.py +++ b/netbox/core/api/serializers.py @@ -1,3 +1,4 @@ from .serializers_.change_logging import * from .serializers_.data import * from .serializers_.jobs import * +from .serializers_.tasks import * diff --git a/netbox/core/api/serializers_/tasks.py b/netbox/core/api/serializers_/tasks.py new file mode 100644 index 000000000..5f99bdaba --- /dev/null +++ b/netbox/core/api/serializers_/tasks.py @@ -0,0 +1,20 @@ +from rest_framework import serializers + +__all__ = ( + 'BackgroundQueueSerializer', +) + + +class BackgroundQueueSerializer(serializers.Serializer): + name = serializers.CharField() + jobs = serializers.IntegerField() + oldest_job_timestamp = serializers.CharField() + index = serializers.IntegerField() + connection_kwargs = serializers.DictField() + scheduler_pid = serializers.CharField() + workers = serializers.IntegerField() + finished_jobs = serializers.IntegerField() + started_jobs = serializers.IntegerField() + deferred_jobs = serializers.IntegerField() + failed_jobs = serializers.IntegerField() + scheduled_jobs = serializers.IntegerField() diff --git a/netbox/core/api/urls.py b/netbox/core/api/urls.py index 95ee1896e..c75da9625 100644 --- a/netbox/core/api/urls.py +++ b/netbox/core/api/urls.py @@ -9,6 +9,7 @@ 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-queues', views.BackgroundQueueViewSet, basename='RQ') app_name = 'core-api' urlpatterns = router.urls diff --git a/netbox/core/api/views.py b/netbox/core/api/views.py index b3a024c02..b05325ea5 100644 --- a/netbox/core/api/views.py +++ b/netbox/core/api/views.py @@ -1,17 +1,21 @@ from django.shortcuts import get_object_or_404 from django.utils.translation import gettext_lazy as _ +from drf_spectacular.types import OpenApiTypes +from drf_spectacular.utils import extend_schema 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 +from rest_framework.viewsets import ReadOnlyModelViewSet, ViewSet from core import filtersets from core.choices import DataSourceStatusChoices from core.jobs import SyncDataSourceJob from core.models import * +from django_rq.utils import get_statistics from netbox.api.metadata import ContentTypeMetadata from netbox.api.viewsets import NetBoxModelViewSet, NetBoxReadOnlyModelViewSet +from rest_framework.permissions import IsAdminUser from . import serializers @@ -71,3 +75,20 @@ class ObjectChangeViewSet(ReadOnlyModelViewSet): queryset = ObjectChange.objects.valid_models() serializer_class = serializers.ObjectChangeSerializer filterset_class = filtersets.ObjectChangeFilterSet + + +class BackgroundQueueViewSet(ViewSet): + serializer_class = serializers.BackgroundQueueSerializer + permission_classes = [IsAdminUser] + + def get_view_name(self): + return "RQ" + + @extend_schema(responses={200: OpenApiTypes.OBJECT}) + def list(self, request): + """ + Return the UserConfig for the currently authenticated User. + """ + data = get_statistics(run_maintenance_tasks=True)["queues"] + serializer = serializers.BackgroundQueueSerializer(data, many=True) + return Response(serializer.data)