Skip to content

Commit

Permalink
Closes #18540: Track installed plugins in registry
Browse files Browse the repository at this point in the history
  • Loading branch information
jeremystretch committed Feb 3, 2025
1 parent 5d10707 commit 4384193
Show file tree
Hide file tree
Showing 7 changed files with 21 additions and 8 deletions.
3 changes: 2 additions & 1 deletion netbox/core/plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from django.core.cache import cache

from netbox.plugins import PluginConfig
from netbox.registry import registry
from utilities.datetime import datetime_from_timestamp

USER_AGENT_STRING = f'NetBox/{settings.RELEASE.version} {settings.RELEASE.edition}'
Expand Down Expand Up @@ -76,7 +77,7 @@ def get_local_plugins(plugins=None):
local_plugins = {}

# Gather all locally-installed plugins
for plugin_name in settings.PLUGINS:
for plugin_name in registry['plugins']['installed']:
plugin = importlib.import_module(plugin_name)
plugin_config: PluginConfig = plugin.config

Expand Down
3 changes: 2 additions & 1 deletion netbox/core/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

from core.utils import delete_rq_job, enqueue_rq_job, get_rq_jobs_from_status, requeue_rq_job, stop_rq_job
from netbox.config import get_config, PARAMS
from netbox.registry import registry
from netbox.views import generic
from netbox.views.generic.base import BaseObjectView
from netbox.views.generic.mixins import TableMixin
Expand Down Expand Up @@ -560,7 +561,7 @@ def get(self, request):
params = [param.name for param in PARAMS]
data = {
**stats,
'plugins': settings.PLUGINS,
'plugins': registry['plugins']['installed'],
'config': {
k: getattr(config, k) for k in sorted(params)
},
Expand Down
1 change: 1 addition & 0 deletions netbox/netbox/plugins/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

# Initialize plugin registry
registry['plugins'].update({
'installed': [],
'graphql_schemas': [],
'menus': [],
'menu_items': {},
Expand Down
4 changes: 2 additions & 2 deletions netbox/netbox/plugins/urls.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
from importlib import import_module

from django.apps import apps
from django.conf import settings
from django.conf.urls import include
from django.urls import path
from django.utils.module_loading import import_string, module_has_submodule

from netbox.registry import registry
from . import views

plugin_patterns = []
Expand All @@ -15,7 +15,7 @@
]

# Register base/API URL patterns for each plugin
for plugin_path in settings.PLUGINS:
for plugin_path in registry['plugins']['installed']:
plugin = import_module(plugin_path)
plugin_name = plugin_path.split('.')[-1]
app = apps.get_app_config(plugin_name)
Expand Down
4 changes: 3 additions & 1 deletion netbox/netbox/plugins/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured

from netbox.registry import registry

__all__ = (
'get_installed_plugins',
'get_plugin_config',
Expand All @@ -13,7 +15,7 @@ def get_installed_plugins():
Return a dictionary mapping the names of installed plugins to their versions.
"""
plugins = {}
for plugin_name in settings.PLUGINS:
for plugin_name in registry['plugins']['installed']:
plugin_name = plugin_name.rsplit('.', 1)[-1]
plugin_config = apps.get_app_config(plugin_name)
plugins[plugin_name] = getattr(plugin_config, 'version', None)
Expand Down
10 changes: 7 additions & 3 deletions netbox/netbox/plugins/views.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
from collections import OrderedDict

from django.apps import apps
from django.conf import settings
from django.urls.exceptions import NoReverseMatch
from drf_spectacular.utils import extend_schema
from rest_framework import permissions
from rest_framework.response import Response
from rest_framework.reverse import reverse
from rest_framework.views import APIView

from netbox.registry import registry


@extend_schema(exclude=True)
class InstalledPluginsAPIView(APIView):
Expand All @@ -34,7 +35,10 @@ def _get_plugin_data(plugin_app_config):
}

def get(self, request, format=None):
return Response([self._get_plugin_data(apps.get_app_config(plugin)) for plugin in settings.PLUGINS])
return Response([
self._get_plugin_data(apps.get_app_config(plugin))
for plugin in registry['plugins']['installed']
])


@extend_schema(exclude=True)
Expand Down Expand Up @@ -64,7 +68,7 @@ def _get_plugin_entry(plugin, app_config, request, format):
def get(self, request, format=None):

entries = []
for plugin in settings.PLUGINS:
for plugin in registry['plugins']['installed']:
app_config = apps.get_app_config(plugin)
entry = self._get_plugin_entry(plugin, app_config, request, format)
if entry is not None:
Expand Down
4 changes: 4 additions & 0 deletions netbox/netbox/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
from netbox.config import PARAMS as CONFIG_PARAMS
from netbox.constants import RQ_QUEUE_DEFAULT, RQ_QUEUE_HIGH, RQ_QUEUE_LOW
from netbox.plugins import PluginConfig
from netbox.registry import registry
from utilities.release import load_release_data
from utilities.string import trailing_slash

Expand Down Expand Up @@ -813,6 +814,9 @@ def _setting(name, default=None):
f"__init__.py file and point to the PluginConfig subclass."
)

# Register the plugin as installed successfully
registry['plugins']['installed'].append(plugin_name)

plugin_module = "{}.{}".format(plugin_config.__module__, plugin_config.__name__) # type: ignore

# Gather additional apps to load alongside this plugin
Expand Down

0 comments on commit 4384193

Please sign in to comment.