diff options
-rw-r--r-- | awx/main/models/inventory.py | 17 | ||||
-rw-r--r-- | awx/main/tests/functional/api/test_inventory.py | 5 | ||||
-rw-r--r-- | awx/main/tests/functional/models/test_inventory.py | 3 | ||||
-rw-r--r-- | awx/main/tests/unit/models/test_inventory.py | 8 |
4 files changed, 26 insertions, 7 deletions
diff --git a/awx/main/models/inventory.py b/awx/main/models/inventory.py index 1240f58909..4b841d204f 100644 --- a/awx/main/models/inventory.py +++ b/awx/main/models/inventory.py @@ -16,6 +16,7 @@ from django.utils.translation import ugettext_lazy as _ from django.db import transaction from django.core.exceptions import ValidationError from django.utils.timezone import now +from django.db.models import Q # AWX from awx.api.versioning import reverse @@ -1396,12 +1397,20 @@ class InventorySource(UnifiedJobTemplate, InventorySourceOptions): if self.update_on_project_update is True and \ self.source == 'scm' and \ InventorySource.objects.filter( - inventory=self.inventory, - update_on_project_update=True, source='scm').exists(): - raise ValidationError(_("Cannot update SCM-based inventory source on launch if set to update on project update. " - "Instead, configure the corresponding source project to update on launch.")) + Q(inventory=self.inventory, + update_on_project_update=True, source='scm') & + ~Q(id=self.id)).exists(): + raise ValidationError(_("More than one SCM-based inventory source with update on project update on per-inventory not allowed.")) return self.update_on_project_update + def clean_update_on_launch(self): + if self.update_on_project_update is True and \ + self.source == 'scm' and \ + self.update_on_launch is True: + raise ValidationError(_("Cannot update SCM-based inventory source on launch if set to update on project update. " + "Instead, configure the corresponding source project to update on launch.")) + return self.update_on_launch + def clean_overwrite_vars(self): if self.source == 'scm' and not self.overwrite_vars: raise ValidationError(_("SCM type sources must set `overwrite_vars` to `true`.")) diff --git a/awx/main/tests/functional/api/test_inventory.py b/awx/main/tests/functional/api/test_inventory.py index 9a66a53ab1..f6029c0e50 100644 --- a/awx/main/tests/functional/api/test_inventory.py +++ b/awx/main/tests/functional/api/test_inventory.py @@ -404,9 +404,8 @@ class TestControlledBySCM: {'update_on_project_update': True,}, admin_user, expect=400) content = json.loads(res.content) - assert content['update_on_project_update'] == ["Cannot update SCM-based inventory source on launch if set to update on " - "project update. Instead, configure the corresponding source project to " - "update on launch."] + assert content['update_on_project_update'] == ["More than one SCM-based inventory source with update on project update " + "on per-inventory not allowed."] def test_adding_inv_src_without_proj_access_prohibited(self, post, project, inventory, rando): inventory.admin_role.members.add(rando) diff --git a/awx/main/tests/functional/models/test_inventory.py b/awx/main/tests/functional/models/test_inventory.py index b342056739..fd31e50315 100644 --- a/awx/main/tests/functional/models/test_inventory.py +++ b/awx/main/tests/functional/models/test_inventory.py @@ -58,6 +58,9 @@ class TestSCMClean: inv_src1.clean_update_on_project_update() inv_src1.save() + inv_src1.source_vars = '---\nhello: world' + inv_src1.clean_update_on_project_update() + inv_src2 = InventorySource(inventory=inventory, update_on_project_update=True, source='scm') diff --git a/awx/main/tests/unit/models/test_inventory.py b/awx/main/tests/unit/models/test_inventory.py index ad3018bd11..41fa27644c 100644 --- a/awx/main/tests/unit/models/test_inventory.py +++ b/awx/main/tests/unit/models/test_inventory.py @@ -108,3 +108,11 @@ class TestControlledBySCM(): with pytest.raises(ValidationError): inv_src.clean_source_path() + def test_clean_update_on_launch_update_on_project_update(self): + inv_src = InventorySource(update_on_project_update=True, + update_on_launch=True, + source='scm') + + with pytest.raises(ValidationError): + inv_src.clean_update_on_launch() + |