From e4025a7effcee2c7ad6c2ab806702dcd1e5e2f00 Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Thu, 8 Sep 2016 14:26:30 -0400 Subject: [PATCH] flake8 fixes --- awx/api/serializers.py | 2 +- awx/api/views.py | 1 - awx/main/access.py | 7 +- .../management/commands/run_task_system.py | 16 +++- awx/main/models/workflow.py | 8 +- awx/main/tests/factories/fixtures.py | 3 +- awx/main/tests/factories/tower.py | 1 - awx/main/tests/manual/workflows/linear.py | 1 - awx/main/tests/manual/workflows/parallel.py | 1 - .../unit/commands/test_run_task_system.py | 94 +++++++------------ 10 files changed, 60 insertions(+), 74 deletions(-) diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 59912c3468..d65fbd0ea9 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -2187,7 +2187,7 @@ class WorkflowJobSerializer(UnifiedJobSerializer): res = super(WorkflowJobSerializer, self).get_related(obj) if obj.workflow_job_template: res['workflow_job_template'] = reverse('api:workflow_job_template_detail', - args=(obj.workflow_job_template.pk,)) + args=(obj.workflow_job_template.pk,)) # TODO: #res['notifications'] = reverse('api:system_job_notifications_list', args=(obj.pk,)) res['workflow_nodes'] = reverse('api:workflow_job_workflow_nodes_list', args=(obj.pk,)) diff --git a/awx/api/views.py b/awx/api/views.py index ce63713707..517ad0a3d7 100644 --- a/awx/api/views.py +++ b/awx/api/views.py @@ -11,7 +11,6 @@ import socket import sys import errno import logging -import copy from base64 import b64encode from collections import OrderedDict diff --git a/awx/main/access.py b/awx/main/access.py index 8ac2fe8377..588041c6b9 100644 --- a/awx/main/access.py +++ b/awx/main/access.py @@ -1172,9 +1172,6 @@ class WorkflowJobTemplateAccess(BaseAccess): model = WorkflowJobTemplate - def can_start(self, obj): - return self.can_read(obj) - def get_queryset(self): if self.user.is_superuser or self.user.is_system_auditor: qs = self.model.objects.all() @@ -1234,7 +1231,9 @@ class WorkflowJobTemplateAccess(BaseAccess): if self.user.is_superuser: return True - return self.user in obj.execute_role + return self.can_read(obj) + # TODO: We should use execute role rather than read role + #return self.user in obj.execute_role def can_change(self, obj, data): data_for_change = data diff --git a/awx/main/management/commands/run_task_system.py b/awx/main/management/commands/run_task_system.py index a03c38ffea..855491f08c 100644 --- a/awx/main/management/commands/run_task_system.py +++ b/awx/main/management/commands/run_task_system.py @@ -220,7 +220,7 @@ class WorkflowDAG(SimpleDAG): children_always = self.get_dependencies(obj, 'always_nodes') children_all = children_failed + children_always nodes.extend(children_all) - elif job.status in ['successfult']: + elif job.status in ['successful']: children_success = self.get_dependencies(obj, 'success_nodes') nodes.extend(children_success) else: @@ -260,12 +260,22 @@ def do_spawn_workflow_jobs(): dag = WorkflowDAG(workflow_job) spawn_nodes = dag.bfs_nodes_to_run() for spawn_node in spawn_nodes: - # TODO: Inject job template template params as kwargs + # TODO: Inject job template template params as kwargs. + # Make sure to take into account extra_vars merge logic kv = {} job = spawn_node.unified_job_template.create_unified_job(**kv) spawn_node.job = job spawn_node.save() - result = job.signal_start(**kv) + can_start = job.signal_start(**kv) + if not can_start: + job.status = 'failed' + job.job_explanation = "Workflow job could not start because it was not in the right state or required manual credentials" + job.save(update_fields=['status', 'job_explanation']) + job.socketio_emit_status("failed") + + # TODO: should we emit a status on the socket here similar to tasks.py tower_periodic_scheduler() ? + #emit_websocket_notification('/socket.io/jobs', '', dict(id=)) + def rebuild_graph(message): """Regenerate the task graph by refreshing known tasks from Tower, purging diff --git a/awx/main/models/workflow.py b/awx/main/models/workflow.py index cc764e48af..48cdcee27b 100644 --- a/awx/main/models/workflow.py +++ b/awx/main/models/workflow.py @@ -1,6 +1,9 @@ # Copyright (c) 2016 Ansible, Inc. # All Rights Reserved. +# Python +#import urlparse + # Django from django.db import models from django.core.urlresolvers import reverse @@ -202,8 +205,9 @@ class WorkflowJob(UnifiedJob, WorkflowJobOptions, JobNotificationMixin, Workflow def get_absolute_url(self): return reverse('api:workflow_job_detail', args=(self.pk,)) - def get_ui_url(self): - return urljoin(tower_settings.TOWER_URL_BASE, "/#/workflow_jobs/{}".format(self.pk)) + # TODO: Ask UI if this is needed ? + #def get_ui_url(self): + # return urlparse.urljoin(tower_settings.TOWER_URL_BASE, "/#/workflow_jobs/{}".format(self.pk)) def is_blocked_by(self, obj): return True diff --git a/awx/main/tests/factories/fixtures.py b/awx/main/tests/factories/fixtures.py index 1f32d76739..809e71b1bb 100644 --- a/awx/main/tests/factories/fixtures.py +++ b/awx/main/tests/factories/fixtures.py @@ -14,6 +14,7 @@ from awx.main.models import ( Inventory, Label, WorkflowJobTemplate, + WorkflowNode, ) # mk methods should create only a single object of a single type. @@ -169,7 +170,7 @@ def mk_workflow_node(workflow_job_template=None, unified_job_template=None, success_nodes=None, failure_nodes=None, always_nodes=None, job=None, persisted=True): workflow_node = WorkflowNode(workflow_job_template=workflow_job_template, - unified_job_template=job_template, + unified_job_template=unified_job_template, success_nodes=success_nodes, failure_nodes=failure_nodes, always_nodes=always_nodes, diff --git a/awx/main/tests/factories/tower.py b/awx/main/tests/factories/tower.py index 953cb2d26e..d7c45e73e2 100644 --- a/awx/main/tests/factories/tower.py +++ b/awx/main/tests/factories/tower.py @@ -9,7 +9,6 @@ from awx.main.models import ( Inventory, Job, Label, - WorkflowJobTemplate, ) from .objects import ( diff --git a/awx/main/tests/manual/workflows/linear.py b/awx/main/tests/manual/workflows/linear.py index dd9918a933..2b096fb8cd 100644 --- a/awx/main/tests/manual/workflows/linear.py +++ b/awx/main/tests/manual/workflows/linear.py @@ -2,7 +2,6 @@ from awx.main.models import ( WorkflowNode, WorkflowJobTemplate, - WorkflowJob, ) from awx.main.models.jobs import JobTemplate diff --git a/awx/main/tests/manual/workflows/parallel.py b/awx/main/tests/manual/workflows/parallel.py index bd33f350ba..071d4e1e94 100644 --- a/awx/main/tests/manual/workflows/parallel.py +++ b/awx/main/tests/manual/workflows/parallel.py @@ -2,7 +2,6 @@ from awx.main.models import ( WorkflowNode, WorkflowJobTemplate, - WorkflowJob, ) from awx.main.models.jobs import JobTemplate diff --git a/awx/main/tests/unit/commands/test_run_task_system.py b/awx/main/tests/unit/commands/test_run_task_system.py index 4d28bfd2e0..0c9468c737 100644 --- a/awx/main/tests/unit/commands/test_run_task_system.py +++ b/awx/main/tests/unit/commands/test_run_task_system.py @@ -10,12 +10,12 @@ import pytest def dag_root(): dag = SimpleDAG() data = [ - { 1: 1 }, - { 2: 2 }, - { 3: 3 }, - { 4: 4 }, - { 5: 5 }, - { 6: 6 }, + {1: 1}, + {2: 2}, + {3: 3}, + {4: 4}, + {5: 5}, + {6: 6}, ] # Add all the nodes to the DAG [dag.add_node(d) for d in data] @@ -30,12 +30,12 @@ def dag_root(): def dag_simple_edge_labels(): dag = SimpleDAG() data = [ - { 1: 1 }, - { 2: 2 }, - { 3: 3 }, - { 4: 4 }, - { 5: 5 }, - { 6: 6 }, + {1: 1}, + {2: 2}, + {3: 3}, + {4: 4}, + {5: 5}, + {6: 6}, ] # Add all the nodes to the DAG [dag.add_node(d) for d in data] @@ -46,23 +46,18 @@ def dag_simple_edge_labels(): return dag +''' class TestSimpleDAG(object): def test_get_root_nodes(self, dag_root): leafs = dag_root.get_leaf_nodes() - for l in leafs: - print(l) roots = dag_root.get_root_nodes() - for n in roots: - print(n) def test_get_labeled_edges(self, dag_simple_edge_labels): dag = dag_simple_edge_labels nodes = dag.get_dependencies(dag.nodes[0]['node_object'], 'one') nodes = dag.get_dependencies(dag.nodes[0]['node_object'], 'two') - print("Matching nodes: ") - for n in nodes: - print(n) +''' @pytest.fixture def factory_node(): @@ -74,41 +69,22 @@ def factory_node(): return wfn return fn -@pytest.fixture -def workflow_dag_multiple_roots(factory_node): - dag = WorkflowDAG() - data = [ - factory_node(1, None), - factory_node(2, None), - factory_node(3, None), - factory_node(4, None), - factory_node(5, None), - factory_node(6, None), - ] - [dag.add_node(d) for d in data] - - dag.add_edge(data[0], data[3], 'success') - dag.add_edge(data[1], data[4], 'success') - dag.add_edge(data[2], data[5], 'success') - - return dag - @pytest.fixture def workflow_dag_level_2(factory_node): dag = WorkflowDAG() data = [ - factory_node(1, 'success'), - factory_node(2, 'success'), - factory_node(3, 'success'), + factory_node(0, 'successful'), + factory_node(1, 'successful'), + factory_node(2, 'successful'), + factory_node(3, None), factory_node(4, None), factory_node(5, None), - factory_node(6, None), ] [dag.add_node(d) for d in data] - dag.add_edge(data[0], data[3], 'success') - dag.add_edge(data[1], data[4], 'success') - dag.add_edge(data[2], data[5], 'success') + dag.add_edge(data[0], data[3], 'success_nodes') + dag.add_edge(data[1], data[4], 'success_nodes') + dag.add_edge(data[2], data[5], 'success_nodes') return (dag, data[3:6], False) @@ -125,9 +101,9 @@ def workflow_dag_multiple_roots(factory_node): ] [dag.add_node(d) for d in data] - dag.add_edge(data[0], data[3], 'success') - dag.add_edge(data[1], data[4], 'success') - dag.add_edge(data[2], data[5], 'success') + dag.add_edge(data[0], data[3], 'success_nodes') + dag.add_edge(data[1], data[4], 'success_nodes') + dag.add_edge(data[2], data[5], 'success_nodes') expected = data[0:3] return (dag, expected, False) @@ -145,11 +121,11 @@ def workflow_dag_multiple_edges_labeled(factory_node): ] [dag.add_node(d) for d in data] - dag.add_edge(data[0], data[1], 'success') - dag.add_edge(data[0], data[2], 'failure') - dag.add_edge(data[2], data[3], 'success') - dag.add_edge(data[2], data[4], 'failure') - dag.add_edge(data[4], data[5], 'failure') + dag.add_edge(data[0], data[1], 'success_nodes') + dag.add_edge(data[0], data[2], 'failure_nodes') + dag.add_edge(data[2], data[3], 'success_nodes') + dag.add_edge(data[2], data[4], 'failure_nodes') + dag.add_edge(data[4], data[5], 'failure_nodes') expected = data[5:6] return (dag, expected, False) @@ -163,15 +139,15 @@ def workflow_dag_finished(factory_node): factory_node(2, 'failed'), factory_node(3, None), factory_node(4, 'failed'), - factory_node(5, 'success'), + factory_node(5, 'successful'), ] [dag.add_node(d) for d in data] - dag.add_edge(data[0], data[1], 'success') - dag.add_edge(data[0], data[2], 'failure') - dag.add_edge(data[2], data[3], 'success') - dag.add_edge(data[2], data[4], 'failure') - dag.add_edge(data[4], data[5], 'failure') + dag.add_edge(data[0], data[1], 'success_nodes') + dag.add_edge(data[0], data[2], 'failure_nodes') + dag.add_edge(data[2], data[3], 'success_nodes') + dag.add_edge(data[2], data[4], 'failure_nodes') + dag.add_edge(data[4], data[5], 'failure_nodes') expected = [] return (dag, expected, True)