diff --git a/awx/main/management/commands/run_dispatcher.py b/awx/main/management/commands/run_dispatcher.py index 13c7d21369..77e1eefe58 100644 --- a/awx/main/management/commands/run_dispatcher.py +++ b/awx/main/management/commands/run_dispatcher.py @@ -1,13 +1,11 @@ # Copyright (c) 2015 Ansible, Inc. # All Rights Reserved. -import os import logging -from multiprocessing import Process from django.conf import settings from django.core.cache import cache as django_cache from django.core.management.base import BaseCommand -from django.db import connection as django_connection, connections +from django.db import connection as django_connection from kombu import Exchange, Queue from awx.main.utils.handlers import AWXProxyHandler diff --git a/awx/main/scheduler/dag_workflow.py b/awx/main/scheduler/dag_workflow.py index a06c620c9a..739b1b95e6 100644 --- a/awx/main/scheduler/dag_workflow.py +++ b/awx/main/scheduler/dag_workflow.py @@ -83,8 +83,8 @@ class WorkflowDAG(SimpleDAG): elif p.job and p.job.status == "failed": status = "failure_nodes" #check that the nodes status matches either a pathway of the same status or is an always path. - if (p not in [node['node_object'] for node in self.get_parents(obj, status)] - and p not in [node['node_object'] for node in self.get_parents(obj, "always_nodes")]): + if (p not in [node['node_object'] for node in self.get_parents(obj, status)] and + p not in [node['node_object'] for node in self.get_parents(obj, "always_nodes")]): return False return True @@ -102,13 +102,13 @@ class WorkflowDAG(SimpleDAG): elif obj.job: if obj.job.status in ['failed', 'error', 'canceled']: nodes.extend(self.get_children(obj, 'failure_nodes') + - self.get_children(obj, 'always_nodes')) + self.get_children(obj, 'always_nodes')) elif obj.job.status == 'successful': nodes.extend(self.get_children(obj, 'success_nodes') + - self.get_children(obj, 'always_nodes')) + self.get_children(obj, 'always_nodes')) elif obj.unified_job_template is None: nodes.extend(self.get_children(obj, 'failure_nodes') + - self.get_children(obj, 'always_nodes')) + self.get_children(obj, 'always_nodes')) else: # This catches root nodes or ANY convergence nodes if not obj.all_parents_must_converge and self._are_relevant_parents_finished(n): @@ -231,9 +231,9 @@ class WorkflowDAG(SimpleDAG): r''' - determine if the current node is a convergence node by checking if all the - parents are finished then checking to see if all parents meet the needed - path criteria to run the convergence child. + determine if the current node is a convergence node by checking if all the + parents are finished then checking to see if all parents meet the needed + path criteria to run the convergence child. (i.e. parent must fail, parent must succeed, etc. to proceed) Return a list object diff --git a/awx/main/tests/unit/scheduler/test_dag_workflow.py b/awx/main/tests/unit/scheduler/test_dag_workflow.py index 9542fed23e..8bc0d8e841 100644 --- a/awx/main/tests/unit/scheduler/test_dag_workflow.py +++ b/awx/main/tests/unit/scheduler/test_dag_workflow.py @@ -133,6 +133,7 @@ class TestDNR(): assert 1 == len(do_not_run_nodes) assert nodes[3] == do_not_run_nodes[0] + class TestAllWorkflowNodes(): # test workflow convergence is functioning as expected @pytest.fixture @@ -150,9 +151,9 @@ class TestAllWorkflowNodes(): 1 2 \ / F \ / S - \/ + \/ 3 - + ''' g.add_edge(nodes[0], nodes[1], "success_nodes") g.add_edge(nodes[0], nodes[2], "success_nodes") @@ -186,7 +187,7 @@ class TestAllWorkflowNodes(): S| 1 | / |/ A - 2 + 2 ''' g.add_edge(nodes[0], nodes[1], "failure_nodes") g.add_edge(nodes[0], nodes[2], "success_nodes") @@ -222,7 +223,7 @@ class TestAllWorkflowNodes(): F| 1 | / |/ A - 2 + 2 ''' g.add_edge(nodes[0], nodes[1], "success_nodes") g.add_edge(nodes[0], nodes[2], "failure_nodes") @@ -341,7 +342,7 @@ class TestAllWorkflowNodes(): g.add_node(n) r''' 0 1 2 - \ | / + \ | / S \ S| / F \ | / \|/ @@ -349,7 +350,7 @@ class TestAllWorkflowNodes(): 3 /\ S / \ S - / \ + / \ 4| | 5 \ / S \ / S