mirror of
https://github.com/ansible/awx.git
synced 2026-05-09 10:27:37 -02:30
remove fail_on_job_failure from the workflow status PR
This commit is contained in:
@@ -2249,15 +2249,11 @@ class WorkflowNodeBaseSerializer(BaseSerializer):
|
|||||||
success_nodes = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
|
success_nodes = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
|
||||||
failure_nodes = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
|
failure_nodes = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
|
||||||
always_nodes = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
|
always_nodes = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
|
||||||
fail_on_job_failure = serializers.BooleanField(
|
|
||||||
help_text=('If set to true, and if the job runs and fails, '
|
|
||||||
'the workflow is marked as failed.'),
|
|
||||||
default=True)
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
fields = ('*', '-name', '-description', 'id', 'url', 'related',
|
fields = ('*', '-name', '-description', 'id', 'url', 'related',
|
||||||
'unified_job_template', 'success_nodes', 'failure_nodes', 'always_nodes',
|
'unified_job_template', 'success_nodes', 'failure_nodes', 'always_nodes',
|
||||||
'inventory', 'credential', 'job_type', 'job_tags', 'skip_tags', 'limit', 'skip_tags', 'fail_on_job_failure')
|
'inventory', 'credential', 'job_type', 'job_tags', 'skip_tags', 'limit', 'skip_tags')
|
||||||
|
|
||||||
def get_related(self, obj):
|
def get_related(self, obj):
|
||||||
res = super(WorkflowNodeBaseSerializer, self).get_related(obj)
|
res = super(WorkflowNodeBaseSerializer, self).get_related(obj)
|
||||||
|
|||||||
@@ -7,8 +7,9 @@ the subsequent actions are to:
|
|||||||
- run nodes contained in "failure_nodes" or "always_nodes" if job failed
|
- run nodes contained in "failure_nodes" or "always_nodes" if job failed
|
||||||
- run nodes contained in "success_nodes" or "always_nodes" if job succeeded
|
- run nodes contained in "success_nodes" or "always_nodes" if job succeeded
|
||||||
|
|
||||||
The workflow is marked as failed if any jobs run as part of that workflow fail
|
The workflow job is marked as `successful` if all of the jobs running as
|
||||||
and have the field `fail_on_job_failure` set to true. If not, the workflow
|
a part of the workflow job have completed, and the workflow job has not
|
||||||
job is marked as successful.
|
been canceled. Even if a job within the workflow has failed, the workflow
|
||||||
|
job will not be marked as failed.
|
||||||
|
|
||||||
{% include "api/sub_list_create_api_view.md" %}
|
{% include "api/sub_list_create_api_view.md" %}
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('main', '0044_v310_project_playbook_files'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='workflowjobnode',
|
|
||||||
name='fail_on_job_failure',
|
|
||||||
field=models.BooleanField(default=True),
|
|
||||||
),
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='workflowjobtemplatenode',
|
|
||||||
name='fail_on_job_failure',
|
|
||||||
field=models.BooleanField(default=True),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@@ -60,10 +60,6 @@ class WorkflowNodeBase(CreatedModifiedModel):
|
|||||||
default=None,
|
default=None,
|
||||||
on_delete=models.SET_NULL,
|
on_delete=models.SET_NULL,
|
||||||
)
|
)
|
||||||
fail_on_job_failure = models.BooleanField(
|
|
||||||
blank=True,
|
|
||||||
default=True,
|
|
||||||
)
|
|
||||||
# Prompting-related fields
|
# Prompting-related fields
|
||||||
inventory = models.ForeignKey(
|
inventory = models.ForeignKey(
|
||||||
'Inventory',
|
'Inventory',
|
||||||
@@ -157,7 +153,7 @@ class WorkflowNodeBase(CreatedModifiedModel):
|
|||||||
Return field names that should be copied from template node to job node.
|
Return field names that should be copied from template node to job node.
|
||||||
'''
|
'''
|
||||||
return ['workflow_job', 'unified_job_template',
|
return ['workflow_job', 'unified_job_template',
|
||||||
'inventory', 'credential', 'char_prompts', 'fail_on_job_failure']
|
'inventory', 'credential', 'char_prompts']
|
||||||
|
|
||||||
class WorkflowJobTemplateNode(WorkflowNodeBase):
|
class WorkflowJobTemplateNode(WorkflowNodeBase):
|
||||||
# TODO: Ensure the API forces workflow_job_template being set
|
# TODO: Ensure the API forces workflow_job_template being set
|
||||||
@@ -404,7 +400,7 @@ class WorkflowJob(UnifiedJob, WorkflowJobOptions, JobNotificationMixin, Workflow
|
|||||||
return RunWorkflowJob
|
return RunWorkflowJob
|
||||||
|
|
||||||
def _has_failed(self):
|
def _has_failed(self):
|
||||||
return self.workflow_job_nodes.filter(job__status='failed', fail_on_job_failure=True).exists()
|
return False
|
||||||
|
|
||||||
def socketio_emit_data(self):
|
def socketio_emit_data(self):
|
||||||
return {}
|
return {}
|
||||||
|
|||||||
@@ -92,20 +92,14 @@ class TestWorkflowJobTemplate:
|
|||||||
|
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
class TestWorkflowJobFailure:
|
class TestWorkflowJobFailure:
|
||||||
|
"""
|
||||||
|
Tests to re-implement if workflow failure status is introduced in
|
||||||
|
a future Tower version.
|
||||||
|
"""
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def wfj(self):
|
def wfj(self):
|
||||||
return WorkflowJob.objects.create(name='test-wf-job')
|
return WorkflowJob.objects.create(name='test-wf-job')
|
||||||
|
|
||||||
def test_workflow_has_failed(self, wfj):
|
|
||||||
"""
|
|
||||||
Test that a single failed node with fail_on_job_failure = true
|
|
||||||
leads to the entire WF being marked as failed
|
|
||||||
"""
|
|
||||||
job = Job.objects.create(name='test-job', status='failed')
|
|
||||||
# Node has a failed job connected
|
|
||||||
WorkflowJobNode.objects.create(workflow_job=wfj, job=job)
|
|
||||||
assert wfj._has_failed()
|
|
||||||
|
|
||||||
def test_workflow_not_failed_unran_job(self, wfj):
|
def test_workflow_not_failed_unran_job(self, wfj):
|
||||||
"""
|
"""
|
||||||
Test that an un-ran node will not mark workflow job as failed
|
Test that an un-ran node will not mark workflow job as failed
|
||||||
@@ -124,8 +118,7 @@ class TestWorkflowJobFailure:
|
|||||||
def test_workflow_not_failed_failed_job_but_okay(self, wfj):
|
def test_workflow_not_failed_failed_job_but_okay(self, wfj):
|
||||||
"""
|
"""
|
||||||
Test that a failed node will not mark workflow job as failed
|
Test that a failed node will not mark workflow job as failed
|
||||||
if the fail_on_job_failure is set to false
|
|
||||||
"""
|
"""
|
||||||
job = Job.objects.create(name='test-job', status='failed')
|
job = Job.objects.create(name='test-job', status='failed')
|
||||||
WorkflowJobNode.objects.create(workflow_job=wfj, job=job, fail_on_job_failure=False)
|
WorkflowJobNode.objects.create(workflow_job=wfj, job=job)
|
||||||
assert not wfj._has_failed()
|
assert not wfj._has_failed()
|
||||||
|
|||||||
@@ -139,7 +139,6 @@ class TestWorkflowJobCreate:
|
|||||||
char_prompts=wfjt_node_no_prompts.char_prompts,
|
char_prompts=wfjt_node_no_prompts.char_prompts,
|
||||||
inventory=None, credential=None,
|
inventory=None, credential=None,
|
||||||
unified_job_template=wfjt_node_no_prompts.unified_job_template,
|
unified_job_template=wfjt_node_no_prompts.unified_job_template,
|
||||||
fail_on_job_failure=True,
|
|
||||||
workflow_job=workflow_job_unit)
|
workflow_job=workflow_job_unit)
|
||||||
|
|
||||||
def test_create_with_prompts(self, wfjt_node_with_prompts, workflow_job_unit, mocker):
|
def test_create_with_prompts(self, wfjt_node_with_prompts, workflow_job_unit, mocker):
|
||||||
@@ -151,7 +150,6 @@ class TestWorkflowJobCreate:
|
|||||||
inventory=wfjt_node_with_prompts.inventory,
|
inventory=wfjt_node_with_prompts.inventory,
|
||||||
credential=wfjt_node_with_prompts.credential,
|
credential=wfjt_node_with_prompts.credential,
|
||||||
unified_job_template=wfjt_node_with_prompts.unified_job_template,
|
unified_job_template=wfjt_node_with_prompts.unified_job_template,
|
||||||
fail_on_job_failure=True,
|
|
||||||
workflow_job=workflow_job_unit)
|
workflow_job=workflow_job_unit)
|
||||||
|
|
||||||
@mock.patch('awx.main.models.workflow.WorkflowNodeBase.get_parent_nodes', lambda self: [])
|
@mock.patch('awx.main.models.workflow.WorkflowNodeBase.get_parent_nodes', lambda self: [])
|
||||||
|
|||||||
Reference in New Issue
Block a user