diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 76c7bc6712..3f07657f84 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -2290,7 +2290,7 @@ class WorkflowJobTemplateNodeSerializer(WorkflowNodeBaseSerializer): def extract_char_prompts(self, data): char_prompts = {} - for fd in ['job_type', 'job_tags', 'skip_tags', 'limit', 'skip_tags']: + for fd in ['job_type', 'job_tags', 'skip_tags', 'limit']: if data.get(fd, None): char_prompts[fd] = data[fd] return char_prompts diff --git a/awx/main/models/workflow.py b/awx/main/models/workflow.py index cc89046815..240e5f2841 100644 --- a/awx/main/models/workflow.py +++ b/awx/main/models/workflow.py @@ -27,7 +27,7 @@ import json __all__ = ['WorkflowJobTemplate', 'WorkflowJob', 'WorkflowJobOptions', 'WorkflowJobNode', 'WorkflowJobTemplateNode',] -CHAR_PROMPTS_LIST = ['job_type', 'job_tags', 'skip_tags', 'limit', 'skip_tags'] +CHAR_PROMPTS_LIST = ['job_type', 'job_tags', 'skip_tags', 'limit'] class WorkflowNodeBase(CreatedModifiedModel): class Meta: @@ -173,7 +173,7 @@ class WorkflowJobNode(WorkflowNodeBase): WJ_json_extra_vars = yaml.safe_load(self.workflow_job.extra_vars) except yaml.YAMLError: WJ_json_extra_vars = {} - extra_vars.update(WJ_json_extra_vars) + extra_vars.update(WJ_json_extra_vars) # TODO: merge artifacts, add ancestor_artifacts to kwargs if extra_vars: data['extra_vars'] = extra_vars diff --git a/awx/main/tests/unit/models/test_workflow_unit.py b/awx/main/tests/unit/models/test_workflow_unit.py index 58ea591299..e9b5fab280 100644 --- a/awx/main/tests/unit/models/test_workflow_unit.py +++ b/awx/main/tests/unit/models/test_workflow_unit.py @@ -1,7 +1,12 @@ import pytest from awx.main.models.jobs import JobTemplate -from awx.main.models.workflow import WorkflowJobTemplateNode, WorkflowJobInheritNodesMixin, WorkflowJobNode +from awx.main.models.inventory import Inventory +from awx.main.models.credential import Credential +from awx.main.models.workflow import ( + WorkflowJobTemplateNode, WorkflowJobInheritNodesMixin, + WorkflowJob, WorkflowJobNode +) class TestWorkflowJobInheritNodesMixin(): class TestCreateWorkflowJobNodes(): @@ -79,3 +84,37 @@ class TestWorkflowJobInheritNodesMixin(): job_nodes[i].success_nodes.add.assert_any_call(job_nodes[i + 1]) +class TestWorkflowJobHelperMethods: + + @pytest.fixture + def workflow_job_unit(self): + return WorkflowJob(name='workflow', status='new') + + @pytest.fixture + def workflow_job_node_unit(self, workflow_job_unit, job_template_factory): + # note: factory sets ask_inventory_on_launch to true when not provided + jt = job_template_factory(name='example-jt', persisted=False).job_template + return WorkflowJobNode(workflow_job=workflow_job_unit, unified_job_template=jt) + + def test_null_kwargs(self, workflow_job_node_unit): + assert workflow_job_node_unit.get_job_kwargs() == {} + + def test_inherit_workflow_job_extra_vars(self, workflow_job_node_unit): + workflow_job = workflow_job_node_unit.workflow_job + workflow_job.extra_vars = '{"a": 84}' + assert workflow_job_node_unit.get_job_kwargs() == {'extra_vars': {'a': 84}} + + def test_char_prompts_and_res_node_prompts(self, workflow_job_node_unit): + barnyard_kwargs = dict( + job_type='scan', + job_tags='quack', + limit='duck', + skip_tags='oink' + ) + workflow_job_node_unit.char_prompts = barnyard_kwargs + inv = Inventory(name='example-inv') + cred = Credential(name='example-inv', kind='ssh', username='asdf', password='asdf') + workflow_job_node_unit.inventory = inv + workflow_job_node_unit.credential = cred + assert workflow_job_node_unit.get_job_kwargs() == dict( + inventory=inv, credential=cred, **barnyard_kwargs)