summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjessicamack <jmack@redhat.com>2024-12-16 17:05:21 +0100
committerGitHub <noreply@github.com>2024-12-16 17:05:21 +0100
commitc1f0a831ffd36ba1288db0959825c7b50ddb27a7 (patch)
tree06c05d1d2a6d268d2c5aaad02e7043587fe9eba7
parentDo not fast forward rrule if count is set (#15696) (diff)
downloadawx-c1f0a831ffd36ba1288db0959825c7b50ddb27a7.tar.xz
awx-c1f0a831ffd36ba1288db0959825c7b50ddb27a7.zip
Pull the correct collection plugin for the product (#15658)
* pull the correct collection plugin for the product * remove unused import and logging line * refactor code to load entry points * reformat method * lint fix * renames for clarity and a lint fix * move function to utils * move the rest of the code into load_inventory_plugins * temp - confirm that tests will pass * revert change caught in merge * change back requirement the related PR has been merged
-rw-r--r--awx/main/apps.py16
-rw-r--r--awx/main/models/inventory.py5
-rw-r--r--awx/main/tests/functional/test_inventory_source_injectors.py3
-rw-r--r--awx/main/utils/common.py5
4 files changed, 20 insertions, 9 deletions
diff --git a/awx/main/apps.py b/awx/main/apps.py
index 8853a2f50d..3d98963747 100644
--- a/awx/main/apps.py
+++ b/awx/main/apps.py
@@ -2,11 +2,13 @@ import os
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
-from awx.main.utils.common import bypass_in_test
+from awx.main.utils.common import bypass_in_test, load_all_entry_points_for
from awx.main.utils.migration import is_database_synchronized
from awx.main.utils.named_url_graph import _customize_graph, generate_graph
from awx.conf import register, fields
+from awx_plugins.interfaces._temporary_private_licensing_api import detect_server_product_name
+
class MainConfig(AppConfig):
name = 'awx.main'
@@ -60,6 +62,17 @@ class MainConfig(AppConfig):
def load_credential_types_feature(self):
return self._load_credential_types_feature()
+ def load_inventory_plugins(self):
+ from awx.main.models.inventory import InventorySourceOptions
+
+ is_awx = detect_server_product_name() == 'AWX'
+ extra_entry_point_groups = () if is_awx else ('inventory.supported',)
+ entry_points = load_all_entry_points_for(['inventory', *extra_entry_point_groups])
+
+ for entry_point_name, entry_point in entry_points.items():
+ cls = entry_point.load()
+ InventorySourceOptions.injectors[entry_point_name] = cls
+
def ready(self):
super().ready()
@@ -71,3 +84,4 @@ class MainConfig(AppConfig):
if not os.environ.get('AWX_SKIP_CREDENTIAL_TYPES_DISCOVER', None):
self.load_credential_types_feature()
self.load_named_url_feature()
+ self.load_inventory_plugins()
diff --git a/awx/main/models/inventory.py b/awx/main/models/inventory.py
index d14e81543d..7c8758f40b 100644
--- a/awx/main/models/inventory.py
+++ b/awx/main/models/inventory.py
@@ -24,7 +24,6 @@ from django.db.models import Q
from rest_framework.exceptions import ParseError
from ansible_base.lib.utils.models import prevent_search
-from awx_plugins.inventory.plugins import PluginFileInjector
# AWX
from awx.api.versioning import reverse
@@ -1402,7 +1401,3 @@ class CustomInventoryScript(CommonModelNameNotUnique):
def get_absolute_url(self, request=None):
return reverse('api:inventory_script_detail', kwargs={'pk': self.pk}, request=request)
-
-
-for cls in PluginFileInjector.__subclasses__():
- InventorySourceOptions.injectors[cls.__name__] = cls
diff --git a/awx/main/tests/functional/test_inventory_source_injectors.py b/awx/main/tests/functional/test_inventory_source_injectors.py
index c7ab3d440c..4c01c0a4fb 100644
--- a/awx/main/tests/functional/test_inventory_source_injectors.py
+++ b/awx/main/tests/functional/test_inventory_source_injectors.py
@@ -196,9 +196,6 @@ def create_reference_data(source_dir, env, content):
@pytest.mark.django_db
@pytest.mark.parametrize('this_kind', discover_available_cloud_provider_plugin_names())
def test_inventory_update_injected_content(product_name, this_kind, inventory, fake_credential_factory, mock_me):
- if this_kind.endswith('_supported'):
- this_kind = this_kind[:-10]
-
ExecutionEnvironment.objects.create(name='Control Plane EE', managed=True)
ExecutionEnvironment.objects.create(name='Default Job EE', managed=False)
diff --git a/awx/main/utils/common.py b/awx/main/utils/common.py
index 2e517952e5..2f45bb7c8f 100644
--- a/awx/main/utils/common.py
+++ b/awx/main/utils/common.py
@@ -18,6 +18,7 @@ import contextlib
import tempfile
import functools
from importlib.metadata import version as _get_version
+from importlib.metadata import entry_points, EntryPoint
# Django
from django.core.exceptions import ObjectDoesNotExist, FieldDoesNotExist
@@ -1215,3 +1216,7 @@ def cleanup_new_process(func):
def unified_job_class_to_event_table_name(job_class):
return f'main_{job_class().event_class.__name__.lower()}'
+
+
+def load_all_entry_points_for(entry_point_subsections: list[str], /) -> dict[str, EntryPoint]:
+ return {ep.name: ep for entry_point_category in entry_point_subsections for ep in entry_points(group=f'awx_plugins.{entry_point_category}')}