diff --git a/awx_collection/README.md b/awx_collection/README.md index 09b73e424f..df4508cf60 100644 --- a/awx_collection/README.md +++ b/awx_collection/README.md @@ -50,7 +50,7 @@ The following notes are changes that may require changes to playbooks: - `tower_group` used to also service inventory sources, but this functionality has been removed from this module; use `tower_inventory_source` instead. - Specified `tower_config` file used to handle `k=v` pairs on a single line; this is no longer supported. Please use a file formatted as `yaml`, `json` or `ini` only. - Some return values (e.g., `credential_type`) have been removed. Use of `id` is recommended. - - tower_job_template no longer supports the deprecated extra_vars_path parameter, please use extra_vars with the lookup plugin to replace this functionality. + - `tower_job_template` no longer supports the deprecated `extra_vars_path` parameter, please use `extra_vars` with the lookup plugin to replace this functionality. ## Running Unit Tests diff --git a/awx_collection/plugins/modules/tower_job_template.py b/awx_collection/plugins/modules/tower_job_template.py index 88c3d83b2b..0581c3ba6a 100644 --- a/awx_collection/plugins/modules/tower_job_template.py +++ b/awx_collection/plugins/modules/tower_job_template.py @@ -303,6 +303,7 @@ EXAMPLES = ''' ''' from ..module_utils.tower_api import TowerModule +import json def update_survey(module, last_request): @@ -399,7 +400,7 @@ def main(): new_fields = {} new_fields['name'] = new_name if new_name else name for field_name in ( - 'description', 'job_type', 'playbook', 'scm_branch', 'forks', 'limit', 'verbosity', 'extra_vars', + 'description', 'job_type', 'playbook', 'scm_branch', 'forks', 'limit', 'verbosity', 'job_tags', 'force_handlers', 'skip_tags', 'start_at_task', 'timeout', 'use_fact_cache', 'host_config_key', 'ask_scm_branch_on_launch', 'ask_diff_mode_on_launch', 'ask_variables_on_launch', 'ask_limit_on_launch', 'ask_tags_on_launch', 'ask_skip_tags_on_launch', 'ask_job_type_on_launch', @@ -410,6 +411,11 @@ def main(): if field_val: new_fields[field_name] = field_val + # Special treatment of extra_vars parameter + extra_vars = module.params.get('extra_vars') + if extra_vars is not None: + new_fields['extra_vars'] = json.dumps(extra_vars) + # Attempt to look up the related items the user specified (these will fail the module if not found) inventory = module.params.get('inventory') project = module.params.get('project') diff --git a/awx_collection/test/awx/test_job_template.py b/awx_collection/test/awx/test_job_template.py index 3a5e04460e..57d85af2b4 100644 --- a/awx_collection/test/awx/test_job_template.py +++ b/awx_collection/test/awx/test_job_template.py @@ -3,7 +3,7 @@ __metaclass__ = type import pytest -from awx.main.models import JobTemplate, Job +from awx.main.models import ActivityStream, JobTemplate, Job @pytest.mark.django_db @@ -23,8 +23,7 @@ def test_create_job_template(run_module, admin_user, project, inventory): assert jt.extra_vars == '{"foo": "bar"}' assert result == { - "job_template": "foo", - "state": "present", + "name": "foo", "id": jt.id, "changed": True, "invocation": { @@ -64,61 +63,70 @@ def test_job_launch_with_prompting(run_module, admin_user, project, inventory, m @pytest.mark.django_db -def test_create_job_template_with_old_credentials( +def test_job_template_with_new_credentials( run_module, admin_user, project, inventory, machine_credential, vault_credential): - - module_args = { - 'name': 'foo', 'playbook': 'helloworld.yml', - 'project': project.name, 'inventory': inventory.name, - 'credential': machine_credential.name, - 'vault_credential': vault_credential.name, - 'job_type': 'run', - 'state': 'present' - } - - result = run_module('tower_job_template', module_args, admin_user) - - jt = JobTemplate.objects.get(name='foo') - - assert result == { - "job_template": "foo", - "state": "present", - "id": jt.id, - "changed": True, - "invocation": { - "module_args": module_args - } - } - - assert set([machine_credential.id, vault_credential.id]) == set([ - cred.pk for cred in jt.credentials.all()]) - - -@pytest.mark.django_db -def test_create_job_template_with_new_credentials( - run_module, admin_user, project, inventory, - machine_credential, vault_credential): - jt = JobTemplate.objects.create( - name='foo', - playbook='helloworld.yml', - inventory=inventory, - project=project - ) result = run_module('tower_job_template', dict( name='foo', playbook='helloworld.yml', project=project.name, + inventory=inventory.name, credentials=[machine_credential.name, vault_credential.name] ), admin_user) - assert result.pop('changed', None), result - - result.pop('invocation') - assert result == { - "job_template": "foo", - "state": "present", - "id": jt.id - } + assert not result.get('failed', False), result.get('msg', result) + assert result.get('changed', False), result + jt = JobTemplate.objects.get(pk=result['id']) assert set([machine_credential.id, vault_credential.id]) == set([ cred.pk for cred in jt.credentials.all()]) + + prior_ct = ActivityStream.objects.count() + result = run_module('tower_job_template', dict( + name='foo', + playbook='helloworld.yml', + project=project.name, + inventory=inventory.name, + credentials=[machine_credential.name, vault_credential.name] + ), admin_user) + assert not result.get('failed', False), result.get('msg', result) + assert not result.get('changed', True), result + jt.refresh_from_db() + assert result['id'] == jt.id + + assert set([machine_credential.id, vault_credential.id]) == set([ + cred.pk for cred in jt.credentials.all()]) + assert ActivityStream.objects.count() == prior_ct + + +@pytest.mark.django_db +def test_job_template_with_survey_spec(run_module, admin_user, project, inventory, survey_spec): + result = run_module('tower_job_template', dict( + name='foo', + playbook='helloworld.yml', + project=project.name, + inventory=inventory.name, + survey_spec=survey_spec, + survey_enabled=True + ), admin_user) + assert not result.get('failed', False), result.get('msg', result) + assert result.get('changed', False), result + jt = JobTemplate.objects.get(pk=result['id']) + + # assert jt.survey_spec == survey_spec + + prior_ct = ActivityStream.objects.count() + result = run_module('tower_job_template', dict( + name='foo', + playbook='helloworld.yml', + project=project.name, + inventory=inventory.name, + survey_spec=survey_spec, + survey_enabled=True + ), admin_user) + assert not result.get('failed', False), result.get('msg', result) + assert not result.get('changed', True), result + jt.refresh_from_db() + assert result['id'] == jt.id + + assert jt.survey_spec == survey_spec + assert ActivityStream.objects.count() == prior_ct