diff --git a/lib/ansible/modules/network/aci/aci_vlan_pool.py b/lib/ansible/modules/network/aci/aci_vlan_pool.py index 8a2045f8f86..fdecbb7217b 100644 --- a/lib/ansible/modules/network/aci/aci_vlan_pool.py +++ b/lib/ansible/modules/network/aci/aci_vlan_pool.py @@ -25,10 +25,10 @@ author: - Dag Wieers (@dagwieers) version_added: '2.5' options: - allocation_mode: + pool_allocation_mode: description: - The method used for allocating VLANs to resources. - aliases: [ mode ] + aliases: [ allocation_mode, mode ] choices: [ dynamic, static] description: description: @@ -54,6 +54,7 @@ EXAMPLES = r''' username: admin password: SomeSecretPassword pool: production + pool_allocation_mode: dynamic description: Production VLANs state: present @@ -63,6 +64,7 @@ EXAMPLES = r''' username: admin password: SomeSecretPassword pool: production + pool_allocation_mode: dynamic state: absent - name: Query a VLAN pool @@ -71,6 +73,7 @@ EXAMPLES = r''' username: admin password: SomeSecretPassword pool: production + pool_allocation_mode: dynamic state: query - name: Query all VLAN pools @@ -193,9 +196,9 @@ from ansible.module_utils.basic import AnsibleModule def main(): argument_spec = aci_argument_spec() argument_spec.update( - allocation_mode=dict(type='str', aliases=['mode'], choices=['dynamic', 'static']), description=dict(type='str', aliases=['descr']), pool=dict(type='str', aliases=['name', 'pool_name']), + pool_allocation_mode=dict(type='str', aliases=['allocation_mode', 'mode'], choices=['dynamic', 'static']), state=dict(type='str', default='present', choices=['absent', 'present', 'query']), ) @@ -208,19 +211,19 @@ def main(): ], ) - allocation_mode = module.params['allocation_mode'] description = module.params['description'] pool = module.params['pool'] + pool_allocation_mode = module.params['pool_allocation_mode'] state = module.params['state'] pool_name = pool # ACI Pool URL requires the allocation mode for vlan and vsan pools (ex: uni/infra/vlanns-[poolname]-static) if pool is not None: - if allocation_mode is not None: - pool_name = '[{0}]-{1}'.format(pool, allocation_mode) + if pool_allocation_mode is not None: + pool_name = '[{0}]-{1}'.format(pool, pool_allocation_mode) else: - module.fail_json(msg="ACI requires the 'allocation_mode' when 'pool' is provided") + module.fail_json(msg="ACI requires the 'pool_allocation_mode' when 'pool' is provided") aci = ACIModule(module) aci.construct_url( @@ -239,7 +242,7 @@ def main(): aci.payload( aci_class='fvnsVlanInstP', class_config=dict( - allocMode=allocation_mode, + allocMode=pool_allocation_mode, descr=description, name=pool, ) diff --git a/test/integration/targets/aci_domain_to_vlan_pool/aliases b/test/integration/targets/aci_domain_to_vlan_pool/aliases new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/integration/targets/aci_domain_to_vlan_pool/tasks/main.yml b/test/integration/targets/aci_domain_to_vlan_pool/tasks/main.yml new file mode 100644 index 00000000000..95f2b5bbdd4 --- /dev/null +++ b/test/integration/targets/aci_domain_to_vlan_pool/tasks/main.yml @@ -0,0 +1,190 @@ +# Test code for the ACI modules +# Copyright 2018, Dag Wieers (@dagwieers) + +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + + +# CLEAN ENVIRONMENT +- name: Remove domain to VLAN pool binding + aci_domain_to_vlan_pool: &binding_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 + domain: phys_dom + domain_type: phys + pool: test_pool + pool_allocation_mode: dynamic + state: absent + +- name: Remove physical domain + aci_domain: + 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) }}' + domain: phys_dom + domain_type: phys + state: absent + +- name: Create VLAN pool + aci_vlan_pool: + 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) }}' + pool: test_pool + pool_allocation_mode: dynamic + description: Test VLAN pool + state: present + + +# ADD BINDING +- name: Add domain to VLAN pool binding (check_mode) + aci_domain_to_vlan_pool: &binding_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 + domain: phys_dom + domain_type: phys + pool: test_pool + pool_allocation_mode: dynamic + state: present + check_mode: yes + register: cm_add_binding + +- name: Add domain to VLAN pool binding (normal mode) + aci_domain_to_vlan_pool: *binding_present + register: nm_add_binding + +- name: Add domain to VLAN pool binding again (check_mode) + aci_domain_to_vlan_pool: *binding_present + check_mode: yes + register: cm_add_binding_again + +- name: Add domain to VLAN pool binding again (normal mode) + aci_domain_to_vlan_pool: *binding_present + register: nm_add_binding_again + +- name: Verify add_binding + assert: + that: + - cm_add_binding.changed == nm_add_binding.changed == true + - cm_add_binding_again.changed == nm_add_binding_again.changed == false + - 'cm_add_binding.sent == nm_add_binding.sent == {"physDomP": {"attributes": {"name": "phys_dom"}, "children": [{"infraRsVlanNs": {"attributes": {"tDn": "uni/infra/vlanns-[test_pool]-dynamic"}}}]}}' + - 'cm_add_binding.proposed == nm_add_binding.proposed == {"physDomP": {"attributes": {"name": "phys_dom"}, "children": [{"infraRsVlanNs": {"attributes": {"tDn": "uni/infra/vlanns-[test_pool]-dynamic"}}}]}}' + - cm_add_binding.current == cm_add_binding.previous == nm_add_binding.previous == [] + - 'nm_add_binding.current == [{"physDomP": {"attributes": {"dn": "uni/phys-phys_dom", "name": "phys_dom", "nameAlias": "", "ownerKey": "", "ownerTag": ""}, "children": [{"infraRsVlanNs": {"attributes": {"tDn": "uni/infra/vlanns-[test_pool]-dynamic"}}}]}}]' + + +# QUERY ALL BINDINGS +- name: Query all domain to VLAN pool bindings (check_mode) + aci_domain_to_vlan_pool: &binding_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) }}' + output_level: info + domain_type: phys + pool: test_pool + pool_allocation_mode: dynamic + state: query + check_mode: yes + register: cm_query_all_bindings + +- name: Query all domain to VLAN pool bindings (normal mode) + aci_domain_to_vlan_pool: *binding_query + register: nm_query_all_bindings + +- name: Verify query_all_bindings + assert: + that: + - cm_query_all_bindings.changed == nm_query_all_bindings.changed == false + # NOTE: Order of bindings is not stable between calls + #- cm_query_all_bindings == nm_query_all_bindings + + +# QUERY A BINDING +- name: Query our domain to VLAN pool binding (check_mode) + aci_domain_to_vlan_pool: + <<: *binding_query + domain: phys_dom + pool: test_pool + pool_allocation_mode: dynamic + check_mode: yes + register: cm_query_binding + +- name: Query our domain to VLAN pool binding (normal mode) + aci_domain_to_vlan_pool: + <<: *binding_query + domain: phys_dom + register: nm_query_binding + +- name: Verify query_binding + assert: + that: + - cm_query_binding.changed == nm_query_binding.changed == false + - cm_query_binding == nm_query_binding + - nm_query_binding.current.0.physDomP.attributes.dn == 'uni/phys-phys_dom' + - nm_query_binding.current.0.physDomP.attributes.name == 'phys_dom' + - nm_query_binding.current.0.physDomP.children.0.infraRsVlanNs.attributes.tCl == 'fvnsVlanInstP' + - nm_query_binding.current.0.physDomP.children.0.infraRsVlanNs.attributes.tDn == 'uni/infra/vlanns-[test_pool]-dynamic' + + +# REMOVE BINDING +- name: Remove domain to VLAN pool binding (check_mode) + aci_domain_to_vlan_pool: *binding_absent + check_mode: yes + register: cm_remove_binding + +- name: Remove domain to VLAN pool binding (normal mode) + aci_domain_to_vlan_pool: *binding_absent + register: nm_remove_binding + +- name: Remove domain to VLAN pool binding again (check_mode) + aci_domain_to_vlan_pool: *binding_absent + check_mode: yes + register: cm_remove_binding_again + +- name: Remove domain to VLAN pool binding again (normal mode) + aci_domain_to_vlan_pool: *binding_absent + register: nm_remove_binding_again + +- name: Verify remove_binding + assert: + that: + - cm_remove_binding.changed == nm_remove_binding.changed == true + - cm_remove_binding_again.changed == nm_remove_binding_again.changed == false + - 'cm_remove_binding.current == cm_remove_binding.previous == nm_remove_binding.previous == [{"physDomP": {"attributes": {"dn": "uni/phys-phys_dom", "name": "phys_dom", "nameAlias": "", "ownerKey": "", "ownerTag": ""}, "children": [{"infraRsVlanNs": {"attributes": {"tDn": "uni/infra/vlanns-[test_pool]-dynamic"}}}]}}]' + - nm_remove_binding.current == [] + + +# QUERY NON-EXISTING BINDING +- name: Query non-existing domain to VLAN pool binding (check_mode) + aci_domain_to_vlan_pool: *binding_query + check_mode: yes + register: cm_query_non_binding + +- name: Query non-existing domain to VLAN pool binding (normal mode) + aci_domain_to_vlan_pool: *binding_query + register: nm_query_non_binding + +- name: Verify query_non_binding + assert: + that: + - cm_query_non_binding.changed == nm_query_non_binding.changed == false + - cm_query_non_binding == nm_query_non_binding + - nm_query_non_binding.current == []