mirror of
https://github.com/ansible/awx.git
synced 2026-05-20 07:17:40 -02:30
workflows-in-workflows add docs and tests
This commit is contained in:
committed by
Marliana Lara
parent
5169fe3484
commit
e225489f43
@@ -514,19 +514,21 @@ class WorkflowJob(UnifiedJob, WorkflowJobOptions, SurveyJobMixin, JobNotificatio
|
||||
return 0
|
||||
|
||||
def get_ancestor_workflows(self):
|
||||
"""Returns a list of WFJTs that are indirect parents of this workflow job
|
||||
say WFJTs are set up to spawn in order of A->B->C, and this workflow job
|
||||
came from C, then C is the parent and [B, A] will be returned from this.
|
||||
"""
|
||||
ancestors = []
|
||||
wj = self
|
||||
wj_ids = set([])
|
||||
while True:
|
||||
wj_ids.add(wj.id)
|
||||
wj = wj.get_workflow_job()
|
||||
if wj.id in wj_ids:
|
||||
wj_ids = set([self.pk])
|
||||
wj = self.get_workflow_job()
|
||||
while wj and wj.workflow_job_template_id:
|
||||
if wj.pk in wj_ids:
|
||||
logger.critical('Cycles detected in the workflow jobs graph, '
|
||||
'this is not normal and suggests task manager degeneracy.')
|
||||
break
|
||||
if (not wj) or (not wj.workflow_job_template_id):
|
||||
break
|
||||
wj_ids.add(wj.pk)
|
||||
ancestors.append(wj.workflow_job_template_id)
|
||||
wj = wj.get_workflow_job()
|
||||
return ancestors
|
||||
|
||||
def get_notification_templates(self):
|
||||
|
||||
@@ -215,3 +215,55 @@ class TestWorkflowJobTemplate:
|
||||
wfjt2.validate_unique()
|
||||
wfjt2 = WorkflowJobTemplate(name='foo', organization=None)
|
||||
wfjt2.validate_unique()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_workflow_ancestors(organization):
|
||||
# Spawn order of templates grandparent -> parent -> child
|
||||
# create child WFJT and workflow job
|
||||
child = WorkflowJobTemplate.objects.create(organization=organization, name='child')
|
||||
child_job = WorkflowJob.objects.create(
|
||||
workflow_job_template=child,
|
||||
launch_type='workflow'
|
||||
)
|
||||
# create parent WFJT and workflow job, and link it up
|
||||
parent = WorkflowJobTemplate.objects.create(organization=organization, name='parent')
|
||||
parent_job = WorkflowJob.objects.create(
|
||||
workflow_job_template=parent,
|
||||
launch_type='workflow'
|
||||
)
|
||||
WorkflowJobNode.objects.create(
|
||||
workflow_job=parent_job,
|
||||
unified_job_template=child,
|
||||
job=child_job
|
||||
)
|
||||
# create grandparent WFJT and workflow job and link it up
|
||||
grandparent = WorkflowJobTemplate.objects.create(organization=organization, name='grandparent')
|
||||
grandparent_job = WorkflowJob.objects.create(
|
||||
workflow_job_template=grandparent,
|
||||
launch_type='schedule'
|
||||
)
|
||||
WorkflowJobNode.objects.create(
|
||||
workflow_job=grandparent_job,
|
||||
unified_job_template=parent,
|
||||
job=parent_job
|
||||
)
|
||||
# ancestors method gives a list of WFJT ids
|
||||
assert child_job.get_ancestor_workflows() == [parent.pk, grandparent.pk]
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_workflow_ancestors_recursion_prevention(organization):
|
||||
# This is toxic database data, this tests that it doesn't create an infinite loop
|
||||
wfjt = WorkflowJobTemplate.objects.create(organization=organization, name='child')
|
||||
wfj = WorkflowJob.objects.create(
|
||||
workflow_job_template=wfjt,
|
||||
launch_type='workflow'
|
||||
)
|
||||
WorkflowJobNode.objects.create(
|
||||
workflow_job=wfj,
|
||||
unified_job_template=wfjt,
|
||||
job=wfj # well, this is a problem
|
||||
)
|
||||
# mostly, we just care that this assertion finishes in finite time
|
||||
assert wfj.get_ancestor_workflows() == []
|
||||
|
||||
Reference in New Issue
Block a user