From cf56066944a8f0826c664b35b8b06ccf8a6141be Mon Sep 17 00:00:00 2001 From: Arthur Date: Mon, 22 Jan 2024 11:52:24 -0800 Subject: [PATCH] 14729 worker list --- netbox/core/tables/tasks.py | 20 ++++++++++++++++++-- netbox/core/urls.py | 1 + netbox/core/views.py | 21 +++++++++++++++++++++ 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/netbox/core/tables/tasks.py b/netbox/core/tables/tasks.py index 71a657790..61655b9b5 100644 --- a/netbox/core/tables/tasks.py +++ b/netbox/core/tables/tasks.py @@ -17,7 +17,7 @@ class BackgroundQueueTable(BaseTable): finished_jobs = tables.LinkColumn("core:background_task_list", args=[A("index"), "finished"], verbose_name=_("Finished")) failed_jobs = tables.LinkColumn("core:background_task_list", args=[A("index"), "failed"], verbose_name=_("Failed")) scheduled_jobs = tables.LinkColumn("core:background_task_list", args=[A("index"), "scheduled"], verbose_name=_("Scheduled")) - workers = tables.Column(verbose_name=_("Workers")) + workers = tables.LinkColumn("core:worker_list", args=[A("index")], verbose_name=_("Workers")) host = tables.Column(accessor="connection_kwargs__host", verbose_name=_("Host")) port = tables.Column(accessor="connection_kwargs__port", verbose_name=_("Port")) db = tables.Column(accessor="connection_kwargs__db", verbose_name=_("DB")) @@ -29,7 +29,7 @@ class BackgroundQueueTable(BaseTable): 'name', 'jobs', 'oldest_job_timestamp', 'started_jobs', 'deferred_jobs', 'finished_jobs', 'failed_jobs', 'scheduled_jobs', 'workers', 'host', 'port', 'db', 'pid', ) default_columns = ( - 'name', 'jobs', 'started_jobs', 'deferred_jobs', 'finished_jobs', 'failed_jobs', 'scheduled_jobs', + 'name', 'jobs', 'started_jobs', 'deferred_jobs', 'finished_jobs', 'failed_jobs', 'scheduled_jobs', 'workers', ) @@ -62,3 +62,19 @@ class BackgroundTaskTable(BaseTable): def __init__(self, queue_index, *args, **kwargs): self.queue_index = queue_index super().__init__(*args, **kwargs) + + +class WorkerTable(BaseTable): + name = tables.Column(verbose_name=_("Name")) + state = tables.Column(verbose_name=_("State")) + birth_date = tables.DateTimeColumn(verbose_name=_("Birth")) + pid = tables.Column(verbose_name=_("PID")) + + class Meta(BaseTable.Meta): + empty_text = _('No workers found') + fields = ( + 'name', 'state', 'birth_date', 'pid', + ) + default_columns = ( + 'name', 'state', 'birth_date', 'pid', + ) diff --git a/netbox/core/urls.py b/netbox/core/urls.py index cae88ce66..f66d6a653 100644 --- a/netbox/core/urls.py +++ b/netbox/core/urls.py @@ -29,6 +29,7 @@ urlpatterns = ( path('background-queues/', views.BackgroundQueueListView.as_view(), name='background_queue_list'), path('background-queues///', views.BackgroundTaskListView.as_view(), name='background_task_list'), path('background-tasks//', views.BackgroundTaskDetailView.as_view(), name='background_task'), + path('background-workers//', views.WorkerListView.as_view(), name='worker_list'), # Config revisions path('config-revisions/', views.ConfigRevisionListView.as_view(), name='configrevision_list'), diff --git a/netbox/core/views.py b/netbox/core/views.py index 836818d1d..a86237531 100644 --- a/netbox/core/views.py +++ b/netbox/core/views.py @@ -23,6 +23,8 @@ from rq.registry import ( ScheduledJobRegistry, StartedJobRegistry, ) +from rq.worker import Worker +from rq.worker_registration import clean_worker_registry from utilities.utils import count_related from utilities.views import ContentTypePermissionRequiredMixin, register_model_view from . import filtersets, forms, tables @@ -318,6 +320,25 @@ class BackgroundTaskListView(UserPassesTestMixin, View): }) +class WorkerListView(UserPassesTestMixin, View): + + def test_func(self): + return self.request.user.is_staff + + def get(self, request, queue_index): + queue = get_queue_by_index(queue_index) + clean_worker_registry(queue) + all_workers = Worker.all(queue.connection) + workers = [worker for worker in all_workers if queue.name in worker.queue_names()] + + table = tables.WorkerTable(data=workers, user=request.user) + table.configure(request) + return render(request, 'core/worker_list.html', { + 'table': table, + 'queue': queue, + }) + + class BackgroundTaskDetailView(UserPassesTestMixin, View): def test_func(self):