diff --git a/awx/api/views/__init__.py b/awx/api/views/__init__.py index 663c3892a9..d566dfd477 100644 --- a/awx/api/views/__init__.py +++ b/awx/api/views/__init__.py @@ -2957,6 +2957,8 @@ class WorkflowJobTemplateNodeChildrenBaseList(WorkflowsEnforcementMixin, Enforce if parent.id == sub.id: return {"Error": _("Cycle detected.")} + if parent.id == sub.id + if WorkflowJobTemplateNode.objects.filter(Q(pk=parent.id) & Q(success_nodes__in=[sub.id]) | Q(failure_nodes__in=[sub.id]) | diff --git a/awx/main/tests/functional/api/test_workflow_node.py b/awx/main/tests/functional/api/test_workflow_node.py index d902d3546b..003beea9bf 100644 --- a/awx/main/tests/functional/api/test_workflow_node.py +++ b/awx/main/tests/functional/api/test_workflow_node.py @@ -110,6 +110,17 @@ class TestExclusivePathEnforcement(): if index != 0: assert {'Error': 'Relationship not allowed.'} == json.loads(r.content) + @pytest.mark.parametrize("relationship", ['success', 'failure', 'always']): + def test_existing_relationship_allowed(self, post, admin_user, n1, n2, relationship): + r = post(self.generate_url(path, n1.id), + data={'associate': True, 'id': n2.id}, + user=admin_user, + expect=204) + r = post(self.generate_url(path, n1.id), + data={'associate': True, 'id': n2.id}, + user=admin_user, + expect=200) + @pytest.mark.django_db class TestNodeCredentials: