diff --git a/awx/main/models/ad_hoc_commands.py b/awx/main/models/ad_hoc_commands.py index 7543162080..dfb5993e3a 100644 --- a/awx/main/models/ad_hoc_commands.py +++ b/awx/main/models/ad_hoc_commands.py @@ -228,15 +228,14 @@ class AdHocCommand(UnifiedJob, JobNotificationMixin): @property def preferred_instance_groups(self): - if self.inventory is not None and self.inventory.organization is not None: - organization_groups = [x for x in self.inventory.organization.instance_groups.all()] - else: - organization_groups = [] + selected_groups = [] if self.inventory is not None: - inventory_groups = [x for x in self.inventory.instance_groups.all()] - else: - inventory_groups = [] - selected_groups = inventory_groups + organization_groups + for instance_group in self.inventory.instance_groups.all(): + selected_groups.append(instance_group) + if not getattr(self.inventory, 'prevent_instance_group_fallback', False) and self.inventory.organization is not None: + for instance_group in self.inventory.organization.instance_groups.all(): + selected_groups.append(instance_group) + if not selected_groups: return self.global_instance_groups return selected_groups diff --git a/awx/main/models/inventory.py b/awx/main/models/inventory.py index 30e50db1ea..f56bd17f4f 100644 --- a/awx/main/models/inventory.py +++ b/awx/main/models/inventory.py @@ -1278,15 +1278,19 @@ class InventoryUpdate(UnifiedJob, InventorySourceOptions, JobNotificationMixin, @property def preferred_instance_groups(self): - if self.inventory_source.inventory is not None and self.inventory_source.inventory.organization is not None: - organization_groups = [x for x in self.inventory_source.inventory.organization.instance_groups.all()] - else: - organization_groups = [] + selected_groups = [] if self.inventory_source.inventory is not None: - inventory_groups = [x for x in self.inventory_source.inventory.instance_groups.all()] - else: - inventory_groups = [] - selected_groups = inventory_groups + organization_groups + # Add the inventory sources IG to the selected IGs first + for instance_group in self.inventory_source.inventory.instance_groups.all(): + selected_groups.append(instance_group) + # If the inventory allows for fallback and we have an organization then also append the orgs IGs to the end of the list + if ( + not getattr(self.inventory_source.inventory, 'prevent_instance_group_fallback', False) + and self.inventory_source.inventory.organization is not None + ): + for instance_group in self.inventory_source.inventory.organization.instance_groups.all(): + selected_groups.append(instance_group) + if not selected_groups: return self.global_instance_groups return selected_groups diff --git a/awx/main/tests/functional/test_instances.py b/awx/main/tests/functional/test_instances.py index e704de8971..8ce6524d38 100644 --- a/awx/main/tests/functional/test_instances.py +++ b/awx/main/tests/functional/test_instances.py @@ -391,6 +391,8 @@ class TestInstanceGroupOrdering: assert ad_hoc.preferred_instance_groups == [ig_org] inventory.instance_groups.add(ig_inv) assert ad_hoc.preferred_instance_groups == [ig_inv, ig_org] + inventory.prevent_instance_group_fallback = True + assert ad_hoc.preferred_instance_groups == [ig_inv] def test_inventory_update_instance_groups(self, instance_group_factory, inventory_source, default_instance_group): iu = InventoryUpdate.objects.create(inventory_source=inventory_source, source=inventory_source.source) @@ -404,6 +406,8 @@ class TestInstanceGroupOrdering: inventory_source.instance_groups.add(ig_tmp) # API does not allow setting IGs on inventory source, so ignore those assert iu.preferred_instance_groups == [ig_inv, ig_org] + inventory_source.inventory.prevent_instance_group_fallback = True + assert iu.preferred_instance_groups == [ig_inv] def test_job_instance_groups(self, instance_group_factory, inventory, project, default_instance_group): jt = JobTemplate.objects.create(inventory=inventory, project=project)