From 4bbcb34ae308385d2a27c24f7e1a8e0c57d6af9a Mon Sep 17 00:00:00 2001 From: Lila Yasin Date: Mon, 25 Nov 2024 09:20:22 -0500 Subject: [PATCH] Add descriptions for plugin names (#15643) * Add descriptions for plugin names * Update serializers to display plugin and plugin description * Add function to extract plugin name descriptions * Add description for scm * Conditionalize scm and file descriptions --- awx/api/serializers.py | 5 ++++- awx/main/utils/plugins.py | 30 +++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/awx/api/serializers.py b/awx/api/serializers.py index ef4d1cfd36..a5b5f87eab 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -2325,8 +2325,11 @@ class InventorySourceOptionsSerializer(BaseSerializer): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + if 'source' in self.fields: - self.fields['source'].choices = load_combined_inventory_source_options() + source_options = load_combined_inventory_source_options() + + self.fields['source'].choices = [(plugin, description) for plugin, description in source_options.items()] def get_related(self, obj): res = super(InventorySourceOptionsSerializer, self).get_related(obj) diff --git a/awx/main/utils/plugins.py b/awx/main/utils/plugins.py index fd891a474a..31fb2d3963 100644 --- a/awx/main/utils/plugins.py +++ b/awx/main/utils/plugins.py @@ -43,6 +43,24 @@ def compute_cloud_inventory_sources() -> dict[str, str]: return dict(zip(plugins, plugins), scm='scm', constructed='constructed') +@cache +def discover_available_cloud_provider_descriptions() -> dict[str, str]: + """ + Return a dictionary of cloud provider plugin descriptions + available. + + :returns: Dictionary of plugin cloud descriptions. + :rtype: dict[str, str] + """ + from awx.main.models.inventory import InventorySourceOptions + + plugin_description_list = [(plugin_name, plugin.plugin_description) for plugin_name, plugin in InventorySourceOptions.injectors.items()] + + plugin_description = dict(plugin_description_list) + + return plugin_description + + @cache def load_combined_inventory_source_options() -> dict[str, str]: """ @@ -56,4 +74,14 @@ def load_combined_inventory_source_options() -> dict[str, str]: plugins = compute_cloud_inventory_sources() - return dict(zip(plugins, plugins), file='file') + plugin_description = discover_available_cloud_provider_descriptions() + + if 'scm' in plugins: + plugin_description['scm'] = 'Sourced from a Project' + + if 'file' in plugins: + plugin_description['file'] = 'File-based inventory source' + + result = {plugin: plugin_description.get(plugin, plugin) for plugin in plugins} + + return result