From a75cbe683c46f377578c56160334ca25aa33a564 Mon Sep 17 00:00:00 2001 From: sean-m-ssullivan Date: Thu, 22 Apr 2021 22:45:40 -0500 Subject: [PATCH] project update fix --- .../plugins/modules/tower_project.py | 23 +- .../targets/tower_project/tasks/main.yml | 408 +++++++++--------- 2 files changed, 222 insertions(+), 209 deletions(-) diff --git a/awx_collection/plugins/modules/tower_project.py b/awx_collection/plugins/modules/tower_project.py index f4f740897e..3ac36c7c30 100644 --- a/awx_collection/plugins/modules/tower_project.py +++ b/awx_collection/plugins/modules/tower_project.py @@ -204,6 +204,7 @@ def wait_for_project_update(module, last_request): wait = module.params.get('wait') timeout = module.params.get('timeout') interval = module.params.get('interval') + scm_revision_original = last_request['scm_revision'] if 'current_update' in last_request['summary_fields']: running = True @@ -229,10 +230,15 @@ def wait_for_project_update(module, last_request): start = time.time() # Invoke wait function - module.wait_on_url( + result_final = module.wait_on_url( url=result['json']['url'], object_name=module.get_item_name(last_request), object_type='Project Update', timeout=timeout, interval=interval ) + # Set Changed to correct value depending on if hash changed Also output refspec comparision + module.json_output['changed'] = True + if result_final['json']['scm_revision'] == scm_revision_original: + module.json_output['changed'] = False + module.exit_json(**module.json_output) @@ -380,10 +386,21 @@ def main(): on_change = wait_for_project_update # If the state was present and we can let the module build or update the existing project, this will return on its own - module.create_or_update_if_needed( - project, project_fields, endpoint='projects', item_type='project', associations=association_fields, on_create=on_change, on_update=on_change + response = module.create_or_update_if_needed( + project, + project_fields, + endpoint='projects', + item_type='project', + associations=association_fields, + on_create=on_change, + on_update=on_change, + auto_exit=not update_project, ) + if update_project: + wait_for_project_update(module, response) + module.exit_json(**module.json_output) + if __name__ == '__main__': main() diff --git a/awx_collection/tests/integration/targets/tower_project/tasks/main.yml b/awx_collection/tests/integration/targets/tower_project/tasks/main.yml index 95d66c1c51..b3fa53c34c 100644 --- a/awx_collection/tests/integration/targets/tower_project/tasks/main.yml +++ b/awx_collection/tests/integration/targets/tower_project/tasks/main.yml @@ -9,245 +9,241 @@ org_name: "AWX-Collection-tests-tower_project-org-{{ lookup('password', '/dev/null chars=ascii_letters length=16') }}" cred_name: "AWX-Collection-tests-tower_project-cred-{{ lookup('password', '/dev/null chars=ascii_letters length=16') }}" -- name: Create an SCM Credential - tower_credential: - name: "{{ scm_cred_name }}" - organization: Default - kind: scm - register: result +- block: + - name: Create an SCM Credential + tower_credential: + name: "{{ scm_cred_name }}" + organization: Default + kind: scm + register: result -- assert: - that: - - result is changed + - assert: + that: + - result is changed -- name: Create a git project without credentials without waiting - tower_project: - name: "{{ project_name1 }}" - organization: Default - scm_type: git - scm_url: https://github.com/ansible/test-playbooks - wait: false - register: result + - name: Create a git project without credentials and wait + tower_project: + name: "{{ project_name1 }}" + organization: Default + scm_type: git + scm_url: https://github.com/ansible/test-playbooks + wait: true + register: result -- assert: - that: - - result is changed + - assert: + that: + - result is changed -- name: Recreate the project to validate not changed - tower_project: - name: "{{ project_name1 }}" - organization: Default - scm_type: git - scm_url: https://github.com/ansible/test-playbooks - wait: true - register: result + - name: Recreate the project to validate not changed + tower_project: + name: "{{ project_name1 }}" + organization: Default + scm_type: git + scm_url: https://github.com/ansible/test-playbooks + wait: false + register: result + ignore_errors: true -- assert: - that: - - result is not changed + - assert: + that: + - result is not changed -- name: Create organizations - tower_organization: - name: "{{ org_name }}" - register: result + - name: Create organizations + tower_organization: + name: "{{ org_name }}" + register: result -- assert: - that: - - result is changed + - assert: + that: + - result is changed -- name: Create credential - tower_credential: - kind: scm - name: "{{ cred_name }}" - organization: "{{ org_name }}" - register: result + - name: Create credential + tower_credential: + kind: scm + name: "{{ cred_name }}" + organization: "{{ org_name }}" + register: result -- assert: - that: - - result is changed + - assert: + that: + - result is changed -- name: Create a new test project in check_mode - tower_project: - name: "{{ project_name2 }}" - organization: "{{ org_name }}" - scm_type: git - scm_url: https://github.com/ansible/test-playbooks - scm_credential: "{{ cred_name }}" - check_mode: true + - name: Create a new test project in check_mode + tower_project: + name: "{{ project_name2 }}" + organization: "{{ org_name }}" + scm_type: git + scm_url: https://github.com/ansible/test-playbooks + scm_credential: "{{ cred_name }}" + check_mode: true -- name: "Copy tower project from {{ project_name1 }}" - tower_project: - name: "{{ project_name2 }}" - copy_from: "{{ project_name1 }}" - organization: "{{ org_name }}" - scm_type: git - scm_credential: "{{ cred_name }}" - state: present - register: result + - name: "Copy tower project from {{ project_name1 }}" + tower_project: + name: "{{ project_name2 }}" + copy_from: "{{ project_name1 }}" + organization: "{{ org_name }}" + scm_type: git + scm_credential: "{{ cred_name }}" + state: present + register: result -# If this fails it may be because the check_mode task actually already created -# the project, or it could be because the module actually failed somehow -- assert: - that: - - result.copied + # If this fails it may be because the check_mode task actually already created + # the project, or it could be because the module actually failed somehow + - assert: + that: + - result.copied -- name: Check module fails with correct msg when given non-existing org as param - tower_project: - name: "{{ project_name2 }}" - organization: Non_Existing_Org - scm_type: git - scm_url: https://github.com/ansible/test-playbooks - scm_credential: "{{ cred_name }}" - register: result - ignore_errors: true + - name: Check module fails with correct msg when given non-existing org as param + tower_project: + name: "{{ project_name2 }}" + organization: Non_Existing_Org + scm_type: git + scm_url: https://github.com/ansible/test-playbooks + scm_credential: "{{ cred_name }}" + register: result + ignore_errors: true -- assert: - that: - - "result is failed" - - "result is not changed" - - "'Non_Existing_Org' in result.msg" - - "result.total_results == 0" + - assert: + that: + - "result is failed" + - "result is not changed" + - "'Non_Existing_Org' in result.msg" + - "result.total_results == 0" -- name: Check module fails with correct msg when given non-existing credential as param - tower_project: - name: "{{ project_name2 }}" - organization: "{{ org_name }}" - scm_type: git - scm_url: https://github.com/ansible/test-playbooks - scm_credential: Non_Existing_Credential - register: result - ignore_errors: true + - name: Check module fails with correct msg when given non-existing credential as param + tower_project: + name: "{{ project_name2 }}" + organization: "{{ org_name }}" + scm_type: git + scm_url: https://github.com/ansible/test-playbooks + scm_credential: Non_Existing_Credential + register: result + ignore_errors: true -- assert: - that: - - "result is failed" - - "result is not changed" - - "'Non_Existing_Credential' in result.msg" - - "result.total_results == 0" + - assert: + that: + - "result is failed" + - "result is not changed" + - "'Non_Existing_Credential' in result.msg" + - "result.total_results == 0" -- name: Create a git project without credentials without waiting - tower_project: - name: "{{ project_name3 }}" - organization: Default - scm_type: git - scm_branch: empty_branch - scm_url: https://github.com/ansible/test-playbooks - allow_override: true - register: result + - name: Create a git project without credentials without waiting + tower_project: + name: "{{ project_name3 }}" + organization: Default + scm_type: git + scm_branch: empty_branch + scm_url: https://github.com/ansible/test-playbooks + allow_override: true + register: result -- assert: - that: - - result is changed + - assert: + that: + - result is changed -- name: Update a git project, update the project and wait. - tower_project: - name: "{{ project_name3 }}" - organization: Default - scm_type: git - scm_branch: empty_branch - scm_url: https://github.com/ansible/test-playbooks - allow_override: true - wait: true - update_project: true - register: result + - name: Update the project and wait. Verify not changed as no change made to repo and refspec not changed + tower_project: + name: "{{ project_name3 }}" + organization: Default + scm_type: git + scm_branch: empty_branch + scm_url: https://github.com/ansible/test-playbooks + allow_override: true + wait: true + update_project: true + register: result -- name: Update a git project, update the project without waiting. - tower_project: - name: "{{ project_name3 }}" - organization: Default - scm_type: git - scm_branch: empty_branch - scm_url: https://github.com/ansible/test-playbooks - wait: false - update_project: true - register: result + - assert: + that: + - result is not changed -- name: Create a job template that overrides the project scm_branch - tower_job_template: - name: "{{ jt1 }}" - project: "{{ project_name3 }}" - inventory: "Demo Inventory" - scm_branch: master - playbook: debug.yml + - name: Create a job template that overrides the project scm_branch + tower_job_template: + name: "{{ jt1 }}" + project: "{{ project_name3 }}" + inventory: "Demo Inventory" + scm_branch: master + playbook: debug.yml -- name: Launch "{{ jt1 }}" - tower_job_launch: - job_template: "{{ jt1 }}" - register: result + - name: Launch "{{ jt1 }}" + tower_job_launch: + job_template: "{{ jt1 }}" + register: result -- assert: - that: - - result is changed + - assert: + that: + - result is changed -- name: "wait for job {{ result.id }}" - tower_job_wait: - job_id: "{{ result.id }}" - register: job + - name: "wait for job {{ result.id }}" + tower_job_wait: + job_id: "{{ result.id }}" + register: job -- assert: - that: - - job is successful + - assert: + that: + - job is successful -- name: Delete the test job_template - tower_job_template: - name: "{{ jt1 }}" - project: "{{ project_name3 }}" - inventory: "Demo Inventory" - state: absent + always: + - name: Delete the test job_template + tower_job_template: + name: "{{ jt1 }}" + project: "{{ project_name3 }}" + inventory: "Demo Inventory" + state: absent -- name: Delete the test project 3 - tower_project: - name: "{{ project_name3 }}" - organization: Default - state: absent + - name: Delete the test project 3 + tower_project: + name: "{{ project_name3 }}" + organization: Default + state: absent -- name: Delete the test project 2 - tower_project: - name: "{{ project_name2 }}" - organization: "{{ org_name }}" - state: absent + - name: Delete the test project 2 + tower_project: + name: "{{ project_name2 }}" + organization: "{{ org_name }}" + state: absent -- name: Delete the SCM Credential - tower_credential: - name: "{{ scm_cred_name }}" - organization: Default - kind: scm - state: absent - register: result + - name: Delete the SCM Credential + tower_credential: + name: "{{ scm_cred_name }}" + organization: Default + kind: scm + state: absent + register: result -- assert: - that: - - result is changed + - assert: + that: + - result is changed -- name: Delete the test project 1 - tower_project: - name: "{{ project_name1 }}" - organization: Default - state: absent - register: result + - name: Delete the test project 1 + tower_project: + name: "{{ project_name1 }}" + organization: Default + state: absent + register: result -- assert: - that: - - result is changed + - assert: + that: + - result is changed -- name: Delete credential - tower_credential: - kind: scm - name: "{{ cred_name }}" - organization: "{{ org_name }}" - state: absent - register: result + - name: Delete credential + tower_credential: + kind: scm + name: "{{ cred_name }}" + organization: "{{ org_name }}" + state: absent + register: result -- assert: - that: - - result is changed + - assert: + that: + - result is changed -- name: Delete the organization - tower_organization: - name: "{{ org_name }}" - state: absent - register: result + - name: Delete the organization + tower_organization: + name: "{{ org_name }}" + state: absent + register: result -- assert: - that: - - result is changed + - assert: + that: + - result is changed