refactor to be more testable

This commit is contained in:
Chris Meyers
2016-09-12 12:19:36 -04:00
parent cea5ebadb7
commit 4dc5c33442
3 changed files with 93 additions and 23 deletions

View File

@@ -143,7 +143,7 @@ class WorkflowJobTemplate(UnifiedJobTemplate, WorkflowJobOptions):
#def create_workflow_job(self, **kwargs): #def create_workflow_job(self, **kwargs):
#workflow_job = self.create_unified_job(**kwargs) #workflow_job = self.create_unified_job(**kwargs)
workflow_job = super(WorkflowJobTemplate, 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 return workflow_job
class WorkflowJobInheritNodesMixin(object): class WorkflowJobInheritNodesMixin(object):
@@ -152,21 +152,33 @@ class WorkflowJobInheritNodesMixin(object):
new_node_type_mgr = getattr(new_node, node_type) new_node_type_mgr = getattr(new_node, node_type)
for old_related_node in old_related_nodes: for old_related_node in old_related_nodes:
new_related_node_id = node_ids_map[old_related_node.id] new_related_node = self._get_workflowJob_node_by_id(node_ids_map[old_related_node.id])
new_related_node = WorkflowJobNode.objects.get(id=new_related_node_id)
new_node_type_mgr.add(new_related_node) new_node_type_mgr.add(new_related_node)
def inherit_jt_workflow_nodes(self): '''
new_nodes = [] Create a WorkflowJobNode for each WorkflowJobTemplateNode
old_nodes = self.workflow_job_template.workflow_job_template_nodes.all() '''
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 = {} node_ids_map = {}
for old_node in old_nodes: for i, old_node in enumerate(old_nodes):
new_node = WorkflowJobNode.objects.create(workflow_job=self, unified_job_template=old_node.unified_job_template) node_ids_map[old_node.id] = new_nodes[i].id
new_nodes.append(new_node)
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): for index, old_node in enumerate(old_nodes):
new_node = new_nodes[index] new_node = new_nodes[index]

View File

@@ -14,7 +14,9 @@ from awx.main.models import (
Inventory, Inventory,
Label, Label,
WorkflowJobTemplate, WorkflowJobTemplate,
WorkflowNode, WorkflowJob,
WorkflowJobNode,
WorkflowJobTemplateNode,
) )
# mk methods should create only a single object of a single type. # 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() jt.save()
return jt 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): 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 = WorkflowJobTemplate(name=name, extra_vars=extra_vars)
wfjt.survey_spec = spec wfjt.survey_spec = spec
@@ -166,15 +181,35 @@ def mk_workflow_job_template(name, extra_vars='', spec=None, persisted=True):
wfjt.save() wfjt.save()
return wfjt return wfjt
def mk_workflow_node(workflow_job_template=None, unified_job_template=None, def mk_workflow_job_template_node(workflow_job_template=None,
success_nodes=None, failure_nodes=None, always_nodes=None, unified_job_template=None,
job=None, persisted=True): success_nodes=None,
workflow_node = WorkflowNode(workflow_job_template=workflow_job_template, failure_nodes=None,
unified_job_template=unified_job_template, always_nodes=None,
success_nodes=success_nodes, persisted=True):
failure_nodes=failure_nodes, workflow_node = WorkflowJobTemplateNode(workflow_job_template=workflow_job_template,
always_nodes=always_nodes, unified_job_template=unified_job_template,
job=job) success_nodes=success_nodes,
failure_nodes=failure_nodes,
always_nodes=always_nodes)
if persisted: if persisted:
workflow_node.save() workflow_node.save()
return workflow_node 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

View File

@@ -29,6 +29,7 @@ from .fixtures import (
mk_label, mk_label,
mk_notification_template, mk_notification_template,
mk_workflow_job_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), users=_Mapped(users),
superusers=_Mapped(superusers), superusers=_Mapped(superusers),
teams=teams) 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", Objects = generate_objects(["workflow_job_template",
"survey",], kwargs) "survey",], kwargs)
@@ -353,13 +362,27 @@ def create_workflow_job_template(name, persisted=True, **kwargs):
jobs = None jobs = None
extra_vars = kwargs.get('extra_vars', '') 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: if 'survey' in kwargs:
spec = create_survey_spec(kwargs['survey']) spec = create_survey_spec(kwargs['survey'])
wfjt = mk_workflow_job_template(name, spec=spec, extra_vars=extra_vars, wfjt = mk_workflow_job_template(name, spec=spec, extra_vars=extra_vars,
persisted=persisted) persisted=persisted)
#workflow_nodes = generate_workflow_job_template_nodes(wfjt, persisted, workflow_nodes=kwargs.get('workflow_nodes'))
'''
if 'jobs' in kwargs: if 'jobs' in kwargs:
for i in kwargs['jobs']: for i in kwargs['jobs']:
if type(i) is Job: if type(i) is Job:
@@ -367,8 +390,8 @@ def create_workflow_job_template(name, persisted=True, **kwargs):
else: else:
# TODO: Create the job # TODO: Create the job
raise RuntimeError("Currently, only already created jobs are supported") raise RuntimeError("Currently, only already created jobs are supported")
'''
return Objects(workflow_job_template=wfjt, return Objects(workflow_job_template=wfjt,
jobs=jobs, #jobs=jobs,
survey=spec,) survey=spec,)