diff --git a/awx/main/models/unified_jobs.py b/awx/main/models/unified_jobs.py index 1617014540..2719d59c32 100644 --- a/awx/main/models/unified_jobs.py +++ b/awx/main/models/unified_jobs.py @@ -698,6 +698,12 @@ class UnifiedJob(PolymorphicModel, PasswordFieldsModel, CommonModelNameNotUnique 'Credential', related_name='%(class)ss', ) + # convergence_behavior = models.TextField( + # blank=True, + # default='AND', + # editable=True, + # help_text=_('The behavior by a convergence node') + # ) def get_absolute_url(self, request=None): RealClass = self.get_real_instance_class() @@ -1445,3 +1451,4 @@ class UnifiedJob(PolymorphicModel, PasswordFieldsModel, CommonModelNameNotUnique @property def is_containerized(self): return False + diff --git a/awx/main/models/workflow.py b/awx/main/models/workflow.py index 100ba1c323..3326356f72 100644 --- a/awx/main/models/workflow.py +++ b/awx/main/models/workflow.py @@ -129,7 +129,7 @@ class WorkflowNodeBase(CreatedModifiedModel, LaunchTimeConfig): class WorkflowJobTemplateNode(WorkflowNodeBase): FIELDS_TO_PRESERVE_AT_COPY = [ 'unified_job_template', 'workflow_job_template', 'success_nodes', 'failure_nodes', - 'always_nodes', 'credentials', 'inventory', 'extra_data', 'survey_passwords', + 'always_nodes', 'parent_nodes', 'credentials', 'inventory', 'extra_data', 'survey_passwords', 'char_prompts' ] REENCRYPTION_BLACKLIST_AT_COPY = ['extra_data', 'survey_passwords'] diff --git a/awx/main/scheduler/dag_simple.py b/awx/main/scheduler/dag_simple.py index 71f1ff73c2..b2741e3538 100644 --- a/awx/main/scheduler/dag_simple.py +++ b/awx/main/scheduler/dag_simple.py @@ -89,8 +89,8 @@ class SimpleDAG(object): run_status(n['node_object']), color ) - for label, edges in self.node_from_edges_by_label.iteritems(): - for from_node, to_nodes in edges.iteritems(): + for label, edges in self.node_from_edges_by_label.items(): + for from_node, to_nodes in edges.items(): for to_node in to_nodes: doc += "%s -> %s [ label=\"%s\" ];\n" % ( run_status(self.nodes[from_node]['node_object']), diff --git a/awx/main/scheduler/dag_workflow.py b/awx/main/scheduler/dag_workflow.py index 8676630247..e4b926c853 100644 --- a/awx/main/scheduler/dag_workflow.py +++ b/awx/main/scheduler/dag_workflow.py @@ -96,6 +96,7 @@ class WorkflowDAG(SimpleDAG): else: if self._are_relevant_parents_finished(n): nodes_found.append(n) + #BECCAH TODO somewhere around here add in ANY and ALL logic return [n['node_object'] for n in nodes_found] def cancel_node_jobs(self): @@ -185,6 +186,7 @@ class WorkflowDAG(SimpleDAG): Return a boolean ''' def _should_mark_node_dnr(self, node, parent_nodes): + #BECCAH TODO Gonna have to update this too for p in parent_nodes: if p.do_not_run is True: pass diff --git a/awxkit/awxkit/api/pages/workflow_job_template_nodes.py b/awxkit/awxkit/api/pages/workflow_job_template_nodes.py index 4a36968f54..f33987ca3a 100644 --- a/awxkit/awxkit/api/pages/workflow_job_template_nodes.py +++ b/awxkit/awxkit/api/pages/workflow_job_template_nodes.py @@ -83,11 +83,17 @@ class WorkflowJobTemplateNode(HasCreate, base.Base): def add_always_node(self, unified_job_template): return self._add_node(self.related.always_nodes, unified_job_template) - def add_failure_node(self, unified_job_template): + def add_any_successes_node(self, unified_job_template): + return self._add_node(self.related.success_nodes, unified_job_template) + + def add_all_successes_node(self, unified_job_template): + return self._add_node(self.related.success_nodes, unified_job_template) + + def add_any_failure_node(self, unified_job_template): return self._add_node(self.related.failure_nodes, unified_job_template) - def add_success_node(self, unified_job_template): - return self._add_node(self.related.success_nodes, unified_job_template) + def add_all_failures_node(self, unified_job_template): + return self._add_node(self.related.failure_nodes, unified_job_template) def add_credential(self, credential): with suppress(exc.NoContent):