From ad04015c9f17d35b441764c16eaee8f665ecb352 Mon Sep 17 00:00:00 2001 From: Aaron Tan Date: Tue, 25 Oct 2016 18:53:31 -0400 Subject: [PATCH] Multi-ancestor detector added. --- awx/api/views.py | 6 ++++-- awx/main/scheduler/dag_simple.py | 13 +++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/awx/api/views.py b/awx/api/views.py index 90621155c5..a5a85f2fdf 100644 --- a/awx/api/views.py +++ b/awx/api/views.py @@ -71,7 +71,6 @@ from awx.api.metadata import RoleMetadata from awx.main.consumers import emit_channel_notification from awx.main.scheduler.dag_simple import SimpleDAG - logger = logging.getLogger('awx.api.views') def api_exception_handler(exc, context): @@ -2677,7 +2676,10 @@ class WorkflowJobTemplateNodeChildrenBaseList(EnforceParentRelationshipMixin, Su graph.add_edge(parent, sub, self.relationship) if graph.cycle_detected(): - return {"Error": "cycle detected!"} + return {"Error": "Cycle detected!"} + + if graph.multi_ancestor_detected(): + return {"Error": "Multiple ancestor detected!"} return None diff --git a/awx/main/scheduler/dag_simple.py b/awx/main/scheduler/dag_simple.py index f28ad83184..e629eccd98 100644 --- a/awx/main/scheduler/dag_simple.py +++ b/awx/main/scheduler/dag_simple.py @@ -174,3 +174,16 @@ class SimpleDAG(object): self._clean_meta() return False + + def multi_ancestor_detected(self): + for node in self.nodes: + node['metadata'] = {"ancestor": None} + for edge in self.edges: + if self.nodes[edge[1]]['metadata']['ancestor'] is None: + self.nodes[edge[1]]['metadata']['ancestor'] = self.nodes[edge[0]] + else: + self._clean_meta() + return True + + self._clean_meta() + return False