diff --git a/awx/main/models/workflow.py b/awx/main/models/workflow.py index af97b9b2c8..0e00e26e8c 100644 --- a/awx/main/models/workflow.py +++ b/awx/main/models/workflow.py @@ -143,7 +143,7 @@ class WorkflowJobTemplate(UnifiedJobTemplate, WorkflowJobOptions): #def create_workflow_job(self, **kwargs): #workflow_job = self.create_unified_job(**kwargs) workflow_job = super(WorkflowJobTemplate, self).create_unified_job(**kwargs) - workflow_job.inherit_jt_workflow_nodes() + workflow_job.inherit_job_template_workflow_nodes() return workflow_job class WorkflowJobInheritNodesMixin(object): @@ -152,21 +152,33 @@ class WorkflowJobInheritNodesMixin(object): new_node_type_mgr = getattr(new_node, node_type) for old_related_node in old_related_nodes: - new_related_node_id = node_ids_map[old_related_node.id] - new_related_node = WorkflowJobNode.objects.get(id=new_related_node_id) + new_related_node = self._get_workflowJob_node_by_id(node_ids_map[old_related_node.id]) new_node_type_mgr.add(new_related_node) - def inherit_jt_workflow_nodes(self): - new_nodes = [] - old_nodes = self.workflow_job_template.workflow_job_template_nodes.all() + ''' + Create a WorkflowJobNode for each WorkflowJobTemplateNode + ''' + def _create_workflow_job_nodes(self, old_nodes): + return [WorkflowJobNode.objects.create(workflow_job=self, unified_job_template=old_node.unified_job_template) for old_node in old_nodes] + def _map_workflow_job_nodes(self, old_nodes, new_nodes): node_ids_map = {} - for old_node in old_nodes: - new_node = WorkflowJobNode.objects.create(workflow_job=self, unified_job_template=old_node.unified_job_template) - new_nodes.append(new_node) + for i, old_node in enumerate(old_nodes): + node_ids_map[old_node.id] = new_nodes[i].id - node_ids_map[old_node.id] = new_node.id + return node_ids_map + + def _get_workflow_job_template_nodes(self): + return self.workflow_job_template.workflow_job_template_nodes.all() + + def _get_workflowJob_node_by_id(self, id): + return WorkflowJobNode.objects.get(id=id) + + def inherit_job_template_workflow_nodes(self): + old_nodes = self._get_workflow_job_template_nodes() + new_nodes = self._create_workflow_job_nodes(old_nodes) + node_ids_map = self._map_workflow_job_nodes(old_nodes, new_nodes) for index, old_node in enumerate(old_nodes): new_node = new_nodes[index] diff --git a/awx/main/tests/factories/fixtures.py b/awx/main/tests/factories/fixtures.py index 809e71b1bb..c51c29e83c 100644 --- a/awx/main/tests/factories/fixtures.py +++ b/awx/main/tests/factories/fixtures.py @@ -14,7 +14,9 @@ from awx.main.models import ( Inventory, Label, WorkflowJobTemplate, - WorkflowNode, + WorkflowJob, + WorkflowJobNode, + WorkflowJobTemplateNode, ) # mk methods should create only a single object of a single type. @@ -155,7 +157,20 @@ def mk_job_template(name, job_type='run', jt.save() return jt +def mk_workflow_job(status='new', workflow_job_template=None, extra_vars={}, + persisted=True): + job = WorkflowJob(status=status, extra_vars=json.dumps(extra_vars)) + + job.workflow_job_template = workflow_job_template + + if persisted: + job.save() + return job + def mk_workflow_job_template(name, extra_vars='', spec=None, persisted=True): + if extra_vars: + extra_vars = json.dumps(extra_vars) + wfjt = WorkflowJobTemplate(name=name, extra_vars=extra_vars) wfjt.survey_spec = spec @@ -166,15 +181,35 @@ def mk_workflow_job_template(name, extra_vars='', spec=None, persisted=True): wfjt.save() return wfjt -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=unified_job_template, - success_nodes=success_nodes, - failure_nodes=failure_nodes, - always_nodes=always_nodes, - job=job) +def mk_workflow_job_template_node(workflow_job_template=None, + unified_job_template=None, + success_nodes=None, + failure_nodes=None, + always_nodes=None, + persisted=True): + workflow_node = WorkflowJobTemplateNode(workflow_job_template=workflow_job_template, + unified_job_template=unified_job_template, + success_nodes=success_nodes, + failure_nodes=failure_nodes, + always_nodes=always_nodes) if persisted: workflow_node.save() return workflow_node + +def mk_workflow_job_node(unified_job_template=None, + success_nodes=None, + failure_nodes=None, + always_nodes=None, + workflow_job=None, + job=None, + persisted=True): + workflow_node = WorkflowJobNode(unified_job_template=unified_job_template, + success_nodes=success_nodes, + failure_nodes=failure_nodes, + always_nodes=always_nodes, + workflow_job=workflow_job, + job=job) + if persisted: + workflow_node.save() + return workflow_node + diff --git a/awx/main/tests/factories/tower.py b/awx/main/tests/factories/tower.py index d7c45e73e2..6bbb2b0e36 100644 --- a/awx/main/tests/factories/tower.py +++ b/awx/main/tests/factories/tower.py @@ -29,6 +29,7 @@ from .fixtures import ( mk_label, mk_notification_template, mk_workflow_job_template, + #mk_workflow_job_template_node, ) @@ -344,8 +345,16 @@ def create_notification_template(name, roles=None, persisted=True, **kwargs): users=_Mapped(users), superusers=_Mapped(superusers), teams=teams) +''' +def generate_workflow_job_template_nodes(workflow_job_template, + unified_job_template, + persisted=True, + **kwargs): +''' -def create_workflow_job_template(name, persisted=True, **kwargs): +# TODO: Implement survey +''' +def create_workflow_job(name, persisted=True, **kwargs): Objects = generate_objects(["workflow_job_template", "survey",], kwargs) @@ -353,13 +362,27 @@ def create_workflow_job_template(name, persisted=True, **kwargs): jobs = None extra_vars = kwargs.get('extra_vars', '') +''' + + +# TODO: Implement survey +def create_workflow_job_template(name, persisted=True, **kwargs): + Objects = generate_objects(["workflow_job_template", + "survey",], kwargs) + + spec = None + #jobs = None + + extra_vars = kwargs.get('extra_vars', '') if 'survey' in kwargs: spec = create_survey_spec(kwargs['survey']) wfjt = mk_workflow_job_template(name, spec=spec, extra_vars=extra_vars, persisted=persisted) + #workflow_nodes = generate_workflow_job_template_nodes(wfjt, persisted, workflow_nodes=kwargs.get('workflow_nodes')) + ''' if 'jobs' in kwargs: for i in kwargs['jobs']: if type(i) is Job: @@ -367,8 +390,8 @@ def create_workflow_job_template(name, persisted=True, **kwargs): else: # TODO: Create the job raise RuntimeError("Currently, only already created jobs are supported") - + ''' return Objects(workflow_job_template=wfjt, - jobs=jobs, + #jobs=jobs, survey=spec,)