diff --git a/netbox/core/tables/tasks.py b/netbox/core/tables/tasks.py index 86562c48d..53a146297 100644 --- a/netbox/core/tables/tasks.py +++ b/netbox/core/tables/tasks.py @@ -61,7 +61,7 @@ class BackgroundTaskTable(BaseTable): class WorkerTable(BaseTable): - name = tables.Column(verbose_name=_("Name")) + name = tables.LinkColumn("core:worker", args=[A("name")], verbose_name=_("Name")) state = tables.Column(verbose_name=_("State")) birth_date = tables.DateTimeColumn(verbose_name=_("Birth")) pid = tables.Column(verbose_name=_("PID")) diff --git a/netbox/core/urls.py b/netbox/core/urls.py index f66d6a653..cab990694 100644 --- a/netbox/core/urls.py +++ b/netbox/core/urls.py @@ -30,6 +30,7 @@ urlpatterns = ( 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'), + path('background-worker//', views.WorkerDetailView.as_view(), name='worker'), # 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 0f940d05c..9989e5d75 100644 --- a/netbox/core/views.py +++ b/netbox/core/views.py @@ -418,6 +418,25 @@ class BackgroundTaskDetailView(UserPassesTestMixin, View): }) +class WorkerDetailView(UserPassesTestMixin, View): + + def test_func(self): + return self.request.user.is_staff + + def get(self, request, key): + # all the RQ queues should use the same connection + config = QUEUES_LIST[0] + worker = Worker.find_by_key('rq:worker:' + key, connection=get_redis_connection(config['connection_config'])) + # Convert microseconds to milliseconds + worker.total_working_time = worker.total_working_time / 1000 + + return render(request, 'core/worker.html', { + 'worker': worker, + 'job': worker.get_current_job(), + 'total_working_time': worker.total_working_time * 1000, + }) + + # # Plugins # diff --git a/netbox/templates/core/worker.html b/netbox/templates/core/worker.html new file mode 100644 index 000000000..1161f5871 --- /dev/null +++ b/netbox/templates/core/worker.html @@ -0,0 +1,80 @@ +{% extends 'generic/object.html' %} +{% load i18n %} +{% load helpers %} +{% load render_table from django_tables2 %} + +{% block breadcrumbs %} + + {# #} +{% endblock breadcrumbs %} + +{% block title %}{% trans "Worker Info" %} {{ job.id }}{% endblock %} + +{% block object_identifier %}{% endblock %} + +{% block controls %} +
+
+ {% block extra_controls %}{% endblock %} +
+
+{% endblock controls %} + +{% block tabs %} + +{% endblock tabs %} + +{% block content %} +
+
+
+
{% trans "Worker" %}
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{% trans "Name" %}{{ worker.name|placeholder }}
{% trans "State" %}{{ worker.get_state|placeholder }}
{% trans "Birth" %}{{ worker.birth_date|annotated_date }}
{% trans "Queues" %}{{ queue_names|annotated_date }}
{% trans "PID" %}{{ worker.pid|placeholder }}
{% trans "Curent Job" %}{{ job.func_name|placeholder }}
{% trans "Successful job count" %}{{ worker.successful_job_count|placeholder }}
{% trans "Failed job count" %}{{ worker.failed_job_count }}
{% trans "Total working time (seconds)" %}{{ total_working_time }}
+
+
+
+
+{% endblock content %}