From 1f103eddaccbbac0e05d001edafdfa21c5607d13 Mon Sep 17 00:00:00 2001 From: Alexander Haase Date: Mon, 7 Oct 2024 14:15:39 +0200 Subject: [PATCH] Allow system jobs to be registered A new registry key allows background system jobs to be registered and automatically scheduled when rqworker starts. --- netbox/core/management/commands/rqworker.py | 13 +++++++++++++ netbox/netbox/registry.py | 1 + netbox/netbox/utils.py | 12 ++++++++++++ 3 files changed, 26 insertions(+) diff --git a/netbox/core/management/commands/rqworker.py b/netbox/core/management/commands/rqworker.py index e1fb6fd11..0e785be46 100644 --- a/netbox/core/management/commands/rqworker.py +++ b/netbox/core/management/commands/rqworker.py @@ -1,7 +1,10 @@ import logging +from django.core.management.base import CommandError from django_rq.management.commands.rqworker import Command as _Command +from netbox.registry import registry + DEFAULT_QUEUES = ('high', 'default', 'low') @@ -14,6 +17,16 @@ class Command(_Command): of only the 'default' queue). """ def handle(self, *args, **options): + # Setup system jobs. + for job in registry['system_jobs'].values(): + if getattr(job.Meta, 'enabled', True): + try: + logger.debug(f"Scheduling system job {job.name}") + job.enqueue_once(interval=getattr(job.Meta, 'interval')) + + except AttributeError as e: + raise CommandError(f"Job {job.name} is missing required attribute in Meta: {e.name}") + # Run the worker with scheduler functionality options['with_scheduler'] = True diff --git a/netbox/netbox/registry.py b/netbox/netbox/registry.py index 0920cbccf..48d7921f2 100644 --- a/netbox/netbox/registry.py +++ b/netbox/netbox/registry.py @@ -30,6 +30,7 @@ registry = Registry({ 'models': collections.defaultdict(set), 'plugins': dict(), 'search': dict(), + 'system_jobs': dict(), 'tables': collections.defaultdict(dict), 'views': collections.defaultdict(dict), 'widgets': dict(), diff --git a/netbox/netbox/utils.py b/netbox/netbox/utils.py index f27d1b5f7..60067c553 100644 --- a/netbox/netbox/utils.py +++ b/netbox/netbox/utils.py @@ -3,6 +3,7 @@ from netbox.registry import registry __all__ = ( 'get_data_backend_choices', 'register_data_backend', + 'register_system_job', ) @@ -24,3 +25,14 @@ def register_data_backend(): return cls return _wrapper + + +def register_system_job(): + """ + Decorator for registering a `JobRunner` class as system background job. + """ + def _wrapper(cls): + registry['system_jobs'][cls.name] = cls + return cls + + return _wrapper