From fb9af72b487bde387a6bcd7db11ac0372a828bb7 Mon Sep 17 00:00:00 2001 From: Dag Wieers Date: Tue, 20 Feb 2018 03:04:17 +0100 Subject: [PATCH] aci_aep: Add missing integration tests (#36414) This PR includes: - Add missing aci_aep integration tests - Fix small aci_rest issue --- lib/ansible/modules/network/aci/aci_aep.py | 16 +- .../integration/targets/aci_aep/tasks/aliases | 0 .../targets/aci_aep/tasks/main.yml | 261 ++++++++++++++++++ .../targets/aci_rest/tasks/error_handling.yml | 2 +- 4 files changed, 270 insertions(+), 9 deletions(-) create mode 100644 test/integration/targets/aci_aep/tasks/aliases create mode 100644 test/integration/targets/aci_aep/tasks/main.yml diff --git a/lib/ansible/modules/network/aci/aci_aep.py b/lib/ansible/modules/network/aci/aci_aep.py index f251fc5fe6..5a68d08f86 100644 --- a/lib/ansible/modules/network/aci/aci_aep.py +++ b/lib/ansible/modules/network/aci/aci_aep.py @@ -70,20 +70,20 @@ EXAMPLES = r''' aep: ACI-AEP state: absent -- name: Query an AEP - aci_aep: - host: apic - username: admin - password: SomeSecretPassword - aep: ACI-AEP - state: query - - name: Query all AEPs aci_aep: host: apic username: admin password: SomeSecretPassword state: query + +- name: Query a specific AEP + aci_aep: + host: apic + username: admin + password: SomeSecretPassword + aep: ACI-AEP + state: query ''' RETURN = r''' diff --git a/test/integration/targets/aci_aep/tasks/aliases b/test/integration/targets/aci_aep/tasks/aliases new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/integration/targets/aci_aep/tasks/main.yml b/test/integration/targets/aci_aep/tasks/main.yml new file mode 100644 index 0000000000..5db6227189 --- /dev/null +++ b/test/integration/targets/aci_aep/tasks/main.yml @@ -0,0 +1,261 @@ +# Test code for the ACI modules +# Copyright: (c) 2018, Dag Wieers (@dagwieers) + +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +- name: Test that we have an ACI APIC host, ACI username and ACI password + fail: + msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.' + when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined + + +# CLEAN ENVIRONMENT +- name: Remove AEP + aci_aep: &aep_absent + host: '{{ aci_hostname }}' + username: '{{ aci_username }}' + password: '{{ aci_password }}' + validate_certs: '{{ aci_validate_certs | default(false) }}' + use_ssl: '{{ aci_use_ssl | default(true) }}' + use_proxy: '{{ aci_use_proxy | default(true) }}' + output_level: info + aep: ansible_test + state: absent + + +# ADD AEP +- name: Add AEP (check_mode) + aci_aep: &aep_present + host: '{{ aci_hostname }}' + username: '{{ aci_username }}' + password: '{{ aci_password }}' + validate_certs: '{{ aci_validate_certs | default(false) }}' + use_ssl: '{{ aci_use_ssl | default(true) }}' + use_proxy: '{{ aci_use_proxy | default(true) }}' + output_level: info + aep: ansible_test + state: present + check_mode: yes + register: cm_add_aep + +- name: Add AEP (normal mode) + aci_aep: *aep_present + register: nm_add_aep + +- name: Verify add_aep + assert: + that: + - cm_add_aep.changed == nm_add_aep.changed == true + - nm_add_aep.previous == nm_add_aep.previous == cm_add_aep.current == [] + - 'nm_add_aep.current == [{"infraAttEntityP": {"attributes": {"descr": "", "dn": "uni/infra/attentp-ansible_test", "name": "ansible_test", "nameAlias": "", "ownerKey": "", "ownerTag": ""}}}]' + - 'cm_add_aep.proposed == nm_add_aep.proposed == cm_add_aep.sent == nm_add_aep.sent == {"infraAttEntityP": {"attributes": {"name": "ansible_test"}}}' + +- name: Add AEP again (check_mode) + aci_aep: *aep_present + check_mode: yes + register: cm_add_aep_again + +- name: Add AEP again (normal mode) + aci_aep: *aep_present + register: nm_add_aep_again + +- name: Verify add_aep_again + assert: + that: + - cm_add_aep_again.changed == nm_add_aep_again.changed == false + - 'nm_add_aep_again.previous == nm_add_aep_again.previous == cm_add_aep_again.current == nm_add_aep_again.current == [{"infraAttEntityP": {"attributes": {"descr": "", "dn": "uni/infra/attentp-ansible_test", "name": "ansible_test", "nameAlias": "", "ownerKey": "", "ownerTag": ""}}}]' + - 'cm_add_aep_again.proposed == nm_add_aep_again.proposed == {"infraAttEntityP": {"attributes": {"name": "ansible_test"}}}' + - cm_add_aep_again.sent == nm_add_aep_again.sent == {} + + +# CHANGE AEP +- name: Change description of AEP (check_mode) + aci_aep: + <<: *aep_present + description: Ansible test AEP + check_mode: yes + register: cm_add_aep_descr + +- name: Change description of AEP (normal mode) + aci_aep: + <<: *aep_present + description: Ansible test AEP + register: nm_add_aep_descr + +- name: Verify add_aep_descr + assert: + that: + - cm_add_aep_descr.changed == nm_add_aep_descr.changed == true + - 'cm_add_aep_descr.proposed == nm_add_aep_descr.proposed == {"infraAttEntityP": {"attributes": {"descr": "Ansible test AEP", "name": "ansible_test"}}}' + - 'cm_add_aep_descr.sent == nm_add_aep_descr.sent == {"infraAttEntityP": {"attributes": {"descr": "Ansible test AEP"}}}' + - 'cm_add_aep_descr.previous == nm_add_aep_descr.previous == cm_add_aep_descr.current == [{"infraAttEntityP": {"attributes": {"descr": "", "dn": "uni/infra/attentp-ansible_test", "name": "ansible_test", "nameAlias": "", "ownerKey": "", "ownerTag": ""}}}]' + - 'nm_add_aep_descr.current == [{"infraAttEntityP": {"attributes": {"descr": "Ansible test AEP", "dn": "uni/infra/attentp-ansible_test", "name": "ansible_test", "nameAlias": "", "ownerKey": "", "ownerTag": ""}}}]' + +- name: Change description of AEP again (check_mode) + aci_aep: + <<: *aep_present + description: Ansible test AEP + check_mode: yes + register: cm_add_aep_descr_again + +- name: Change description of AEP again (normal mode) + aci_aep: + <<: *aep_present + description: Ansible test AEP + register: nm_add_aep_descr_again + +- name: Verify add_aep_descr_again + assert: + that: + - cm_add_aep_descr_again.changed == nm_add_aep_descr_again.changed == false + - 'cm_add_aep_descr_again.proposed == nm_add_aep_descr_again.proposed == {"infraAttEntityP": {"attributes": {"descr": "Ansible test AEP", "name": "ansible_test"}}}' + - 'cm_add_aep_descr_again.sent == nm_add_aep_descr_again.sent == {}' + - 'cm_add_aep_descr_again.previous == nm_add_aep_descr_again.previous == cm_add_aep_descr_again.current == nm_add_aep_descr_again.current == [{"infraAttEntityP": {"attributes": {"descr": "Ansible test AEP", "dn": "uni/infra/attentp-ansible_test", "name": "ansible_test", "nameAlias": "", "ownerKey": "", "ownerTag": ""}}}]' + + +# ADD AEP AGAIN +- name: Add AEP again with no description (check_mode) + aci_aep: *aep_present + check_mode: yes + register: cm_add_aep_again_no_descr + +- name: Add AEP again with no description (normal mode) + aci_aep: *aep_present + register: nm_add_aep_again_no_descr + +- name: Verify add_aep_again_no_descr + assert: + that: + - cm_add_aep_again_no_descr.changed == nm_add_aep_again_no_descr.changed == false + - 'cm_add_aep_again_no_descr.proposed == nm_add_aep_again_no_descr.proposed == {"infraAttEntityP": {"attributes": {"name": "ansible_test"}}}' + - cm_add_aep_again_no_descr.sent == nm_add_aep_again_no_descr.sent == {} + - 'cm_add_aep_again_no_descr.previous == nm_add_aep_again_no_descr.previous == cm_add_aep_again_no_descr.current == nm_add_aep_again_no_descr.current == [{"infraAttEntityP": {"attributes": {"descr": "Ansible test AEP", "dn": "uni/infra/attentp-ansible_test", "name": "ansible_test", "nameAlias": "", "ownerKey": "", "ownerTag": ""}}}]' + + +# QUERY ALL AEPS +- name: Query all AEPs (check_mode) + aci_aep: &aep_query + host: '{{ aci_hostname }}' + username: '{{ aci_username }}' + password: '{{ aci_password }}' + validate_certs: '{{ aci_validate_certs | default(false) }}' + use_ssl: '{{ aci_use_ssl | default(true) }}' + use_proxy: '{{ aci_use_proxy | default(true) }}' + state: query + check_mode: yes + register: cm_query_all_aeps + +- name: Query all AEPs (normal mode) + aci_aep: *aep_query + register: nm_query_all_aeps + +- name: Verify query_all_aeps + assert: + that: + - cm_query_all_aeps.changed == nm_query_all_aeps.changed == false + - cm_query_all_aeps == nm_query_all_aeps + - nm_query_all_aeps.current|length >= 1 + + +# QUERY A AEP +- name: Query our AEP + aci_aep: + <<: *aep_query + aep: ansible_test + check_mode: yes + register: cm_query_aep + +- name: Query our AEP + aci_aep: + <<: *aep_query + aep: ansible_test + register: nm_query_aep + +- name: Verify query_aep + assert: + that: + - cm_query_aep.changed == nm_query_aep.changed == false + - cm_query_aep == nm_query_aep + - nm_query_aep.current.0.infraAttEntityP.attributes.descr == "Ansible test AEP" + - nm_query_aep.current.0.infraAttEntityP.attributes.dn == "uni/infra/attentp-ansible_test" + - nm_query_aep.current.0.infraAttEntityP.attributes.name == "ansible_test" + + +# REMOVE AEP +- name: Remove AEP (check_mode) + aci_aep: *aep_absent + check_mode: yes + register: cm_remove_aep + +- name: Remove AEP (normal mode) + aci_aep: *aep_absent + register: nm_remove_aep + +- name: Verify remove_aep + assert: + that: + - cm_remove_aep.changed == nm_remove_aep.changed == true + - cm_remove_aep.proposed == nm_remove_aep.proposed == {} + - cm_remove_aep.sent == nm_remove_aep.sent == {} + - 'cm_remove_aep.previous == nm_remove_aep.previous == cm_remove_aep.current == [{"infraAttEntityP": {"attributes": {"descr": "Ansible test AEP", "dn": "uni/infra/attentp-ansible_test", "name": "ansible_test", "nameAlias": "", "ownerKey": "", "ownerTag": ""}}}]' + - nm_remove_aep.current == [] + +- name: Remove AEP again (check_mode) + aci_aep: *aep_absent + check_mode: yes + register: cm_remove_aep_again + +- name: Remove AEP again (normal mode) + aci_aep: *aep_absent + register: nm_remove_aep_again + +- name: Verify remove_aep_again + assert: + that: + - cm_remove_aep_again.changed == nm_remove_aep_again.changed == false + - cm_remove_aep_again.proposed == nm_remove_aep_again.proposed == {} + - cm_remove_aep_again.sent == nm_remove_aep_again.sent == {} + - cm_remove_aep_again.previous == nm_remove_aep_again.previous == cm_remove_aep_again.current == nm_remove_aep_again.current == [] + + +# QUERY NON-EXISTING AEP +- name: Query non-existing AEP (check_mode) + aci_aep: + <<: *aep_query + aep: ansible_test + check_mode: yes + register: cm_query_non_aep + +- name: Query non-existing AEP (normal mode) + aci_aep: + <<: *aep_query + aep: ansible_test + register: nm_query_non_aep + +- name: Verify query_non_aep + assert: + that: + - cm_query_non_aep.changed == nm_query_non_aep.changed == false + - cm_query_non_aep == nm_query_non_aep + - cm_query_non_aep.current == nm_query_non_aep.current == [] + + +# PROVOKE ERRORS +- name: Error when required parameter is missing + aci_aep: + host: '{{ aci_hostname }}' + username: '{{ aci_username }}' + password: '{{ aci_password }}' + validate_certs: '{{ aci_validate_certs | default(false) }}' + use_ssl: '{{ aci_use_ssl | default(true) }}' + use_proxy: '{{ aci_use_proxy | default(true) }}' + output_level: info + state: present + ignore_errors: yes + register: error_on_missing_required_param + +- name: Verify error_on_missing_required_param + assert: + that: + - error_on_missing_required_param.failed == true + - 'error_on_missing_required_param.msg == "state is present but all of the following are missing: aep"' diff --git a/test/integration/targets/aci_rest/tasks/error_handling.yml b/test/integration/targets/aci_rest/tasks/error_handling.yml index 551b17dda2..05c55221b7 100644 --- a/test/integration/targets/aci_rest/tasks/error_handling.yml +++ b/test/integration/targets/aci_rest/tasks/error_handling.yml @@ -117,7 +117,7 @@ that: - error_on_input_validation.failed == true - error_on_input_validation.method == 'POST' - - "error_on_input_validation.msg == 'APIC Error 801: property descr of uni/tn-ansible_test failed validation for value \\'This is an [invalid] description\\''" + - "error_on_input_validation.msg == 'APIC Error 801: property descr of tn-ansible_test failed validation for value \\'This is an [invalid] description\\''" - 'error_on_input_validation.response == "HTTP Error 400: Bad Request"' - error_on_input_validation.status == 400 - "'current' not in error_on_input_validation"