summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--awx/main/models/inventory.py17
-rw-r--r--awx/main/tests/functional/api/test_inventory.py5
-rw-r--r--awx/main/tests/functional/models/test_inventory.py3
-rw-r--r--awx/main/tests/unit/models/test_inventory.py8
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()
+