mirror of
https://github.com/ansible/awx.git
synced 2026-04-14 14:39:26 -02:30
Merge pull request #6266 from AlanCoding/ig_ordering
Instance group preference order consistent with docs
This commit is contained in:
@@ -203,6 +203,19 @@ class AdHocCommand(UnifiedJob, JobNotificationMixin):
|
|||||||
update_fields.append('name')
|
update_fields.append('name')
|
||||||
super(AdHocCommand, self).save(*args, **kwargs)
|
super(AdHocCommand, self).save(*args, **kwargs)
|
||||||
|
|
||||||
|
@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 = []
|
||||||
|
if self.inventory is not None:
|
||||||
|
inventory_groups = [x for x in self.inventory.instance_groups.all()]
|
||||||
|
selected_groups = inventory_groups + organization_groups
|
||||||
|
if not selected_groups:
|
||||||
|
return self.global_instance_groups
|
||||||
|
return selected_groups
|
||||||
|
|
||||||
'''
|
'''
|
||||||
JobNotificationMixin
|
JobNotificationMixin
|
||||||
'''
|
'''
|
||||||
|
|||||||
@@ -1379,7 +1379,10 @@ class InventoryUpdate(UnifiedJob, InventorySourceOptions, JobNotificationMixin):
|
|||||||
if self.inventory_source.inventory is not None:
|
if self.inventory_source.inventory is not None:
|
||||||
inventory_groups = [x for x in self.inventory_source.inventory.instance_groups.all()]
|
inventory_groups = [x for x in self.inventory_source.inventory.instance_groups.all()]
|
||||||
template_groups = [x for x in super(InventoryUpdate, self).preferred_instance_groups]
|
template_groups = [x for x in super(InventoryUpdate, self).preferred_instance_groups]
|
||||||
return template_groups + inventory_groups + organization_groups
|
selected_groups = template_groups + inventory_groups + organization_groups
|
||||||
|
if not selected_groups:
|
||||||
|
return self.global_instance_groups
|
||||||
|
return selected_groups
|
||||||
|
|
||||||
def _build_job_explanation(self):
|
def _build_job_explanation(self):
|
||||||
if not self.job_explanation:
|
if not self.job_explanation:
|
||||||
|
|||||||
@@ -669,7 +669,7 @@ class Job(UnifiedJob, JobOptions, SurveyJobMixin, JobNotificationMixin):
|
|||||||
template_groups = []
|
template_groups = []
|
||||||
selected_groups = template_groups + inventory_groups + organization_groups
|
selected_groups = template_groups + inventory_groups + organization_groups
|
||||||
if not selected_groups:
|
if not selected_groups:
|
||||||
return super(Job, self).preferred_instance_groups
|
return self.global_instance_groups
|
||||||
return selected_groups
|
return selected_groups
|
||||||
|
|
||||||
# Job Credential required
|
# Job Credential required
|
||||||
|
|||||||
@@ -524,4 +524,7 @@ class ProjectUpdate(UnifiedJob, ProjectOptions, JobNotificationMixin):
|
|||||||
else:
|
else:
|
||||||
organization_groups = []
|
organization_groups = []
|
||||||
template_groups = [x for x in super(ProjectUpdate, self).preferred_instance_groups]
|
template_groups = [x for x in super(ProjectUpdate, self).preferred_instance_groups]
|
||||||
return template_groups + organization_groups
|
selected_groups = template_groups + organization_groups
|
||||||
|
if not selected_groups:
|
||||||
|
return self.global_instance_groups
|
||||||
|
return selected_groups
|
||||||
|
|||||||
@@ -1066,9 +1066,15 @@ class UnifiedJob(PolymorphicModel, PasswordFieldsModel, CommonModelNameNotUnique
|
|||||||
'''
|
'''
|
||||||
Return Instance/Rampart Groups preferred by this unified job templates
|
Return Instance/Rampart Groups preferred by this unified job templates
|
||||||
'''
|
'''
|
||||||
|
if not self.unified_job_template:
|
||||||
|
return []
|
||||||
|
template_groups = [x for x in self.unified_job_template.instance_groups.all()]
|
||||||
|
return template_groups
|
||||||
|
|
||||||
|
@property
|
||||||
|
def global_instance_groups(self):
|
||||||
from awx.main.models.ha import InstanceGroup
|
from awx.main.models.ha import InstanceGroup
|
||||||
default_instance_group = InstanceGroup.objects.filter(name='tower')
|
default_instance_group = InstanceGroup.objects.filter(name='tower')
|
||||||
template_groups = [x for x in self.unified_job_template.instance_groups.all()]
|
if default_instance_group.exists():
|
||||||
if not template_groups and default_instance_group.exists():
|
|
||||||
return [default_instance_group.first()]
|
return [default_instance_group.first()]
|
||||||
return template_groups
|
return []
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
from awx.main.models import AdHocCommand, InventoryUpdate, Job, JobTemplate, ProjectUpdate
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
def test_default_tower_instance_group(default_instance_group, job_factory):
|
def test_default_tower_instance_group(default_instance_group, job_factory):
|
||||||
@@ -38,3 +40,52 @@ def test_instance_group_capacity(instance_factory, instance_group_factory):
|
|||||||
assert ig_all.capacity == 300
|
assert ig_all.capacity == 300
|
||||||
ig_single = instance_group_factory("single", instances=[i1])
|
ig_single = instance_group_factory("single", instances=[i1])
|
||||||
assert ig_single.capacity == 100
|
assert ig_single.capacity == 100
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.django_db
|
||||||
|
class TestInstanceGroupOrdering:
|
||||||
|
|
||||||
|
def test_ad_hoc_instance_groups(self, instance_group_factory, inventory, default_instance_group):
|
||||||
|
ad_hoc = AdHocCommand.objects.create(inventory=inventory)
|
||||||
|
assert ad_hoc.preferred_instance_groups == [default_instance_group]
|
||||||
|
ig_org = instance_group_factory("OrgIstGrp", [default_instance_group.instances.first()])
|
||||||
|
ig_inv = instance_group_factory("InvIstGrp", [default_instance_group.instances.first()])
|
||||||
|
inventory.organization.instance_groups.add(ig_org)
|
||||||
|
assert ad_hoc.preferred_instance_groups == [ig_org]
|
||||||
|
inventory.instance_groups.add(ig_inv)
|
||||||
|
assert ad_hoc.preferred_instance_groups == [ig_inv, ig_org]
|
||||||
|
|
||||||
|
def test_inventory_update_instance_groups(self, instance_group_factory, inventory_source, default_instance_group):
|
||||||
|
iu = InventoryUpdate.objects.create(inventory_source=inventory_source)
|
||||||
|
assert iu.preferred_instance_groups == [default_instance_group]
|
||||||
|
ig_org = instance_group_factory("OrgIstGrp", [default_instance_group.instances.first()])
|
||||||
|
ig_inv = instance_group_factory("InvIstGrp", [default_instance_group.instances.first()])
|
||||||
|
ig_tmp = instance_group_factory("TmpIstGrp", [default_instance_group.instances.first()])
|
||||||
|
inventory_source.inventory.organization.instance_groups.add(ig_org)
|
||||||
|
inventory_source.inventory.instance_groups.add(ig_inv)
|
||||||
|
assert iu.preferred_instance_groups == [ig_inv, ig_org]
|
||||||
|
inventory_source.instance_groups.add(ig_tmp)
|
||||||
|
assert iu.preferred_instance_groups == [ig_tmp, ig_inv, ig_org]
|
||||||
|
|
||||||
|
def test_project_update_instance_groups(self, instance_group_factory, project, default_instance_group):
|
||||||
|
pu = ProjectUpdate.objects.create(project=project)
|
||||||
|
assert pu.preferred_instance_groups == [default_instance_group]
|
||||||
|
ig_org = instance_group_factory("OrgIstGrp", [default_instance_group.instances.first()])
|
||||||
|
ig_tmp = instance_group_factory("TmpIstGrp", [default_instance_group.instances.first()])
|
||||||
|
project.organization.instance_groups.add(ig_org)
|
||||||
|
assert pu.preferred_instance_groups == [ig_org]
|
||||||
|
project.instance_groups.add(ig_tmp)
|
||||||
|
assert pu.preferred_instance_groups == [ig_tmp, ig_org]
|
||||||
|
|
||||||
|
def test_job_instance_groups(self, instance_group_factory, inventory, project, default_instance_group):
|
||||||
|
jt = JobTemplate.objects.create(inventory=inventory, project=project)
|
||||||
|
job = Job.objects.create(inventory=inventory, job_template=jt, project=project)
|
||||||
|
assert job.preferred_instance_groups == [default_instance_group]
|
||||||
|
ig_org = instance_group_factory("OrgIstGrp", [default_instance_group.instances.first()])
|
||||||
|
ig_inv = instance_group_factory("InvIstGrp", [default_instance_group.instances.first()])
|
||||||
|
ig_tmp = instance_group_factory("TmpIstGrp", [default_instance_group.instances.first()])
|
||||||
|
project.organization.instance_groups.add(ig_org)
|
||||||
|
inventory.instance_groups.add(ig_inv)
|
||||||
|
assert job.preferred_instance_groups == [ig_inv, ig_org]
|
||||||
|
job.job_template.instance_groups.add(ig_tmp)
|
||||||
|
assert job.preferred_instance_groups == [ig_tmp, ig_inv, ig_org]
|
||||||
|
|||||||
Reference in New Issue
Block a user