diff --git a/lib/ansible/modules/network/nxos/nxos_switchport.py b/lib/ansible/modules/network/nxos/nxos_switchport.py index a629370d58..457224a7a0 100644 --- a/lib/ansible/modules/network/nxos/nxos_switchport.py +++ b/lib/ansible/modules/network/nxos/nxos_switchport.py @@ -307,7 +307,7 @@ def get_switchport_config_commands(interface, existing, proposed, module): commands.append(command) if proposed_mode == 'access': - av_check = existing.get('access_vlan') == proposed.get('access_vlan') + av_check = str(existing.get('access_vlan')) == str(proposed.get('access_vlan')) if not av_check: command = 'switchport access vlan {0}'.format(proposed.get('access_vlan')) commands.append(command) @@ -328,7 +328,7 @@ def get_switchport_config_commands(interface, existing, proposed, module): command = 'switchport trunk allowed vlan add {0}'.format(proposed.get('trunk_vlans')) commands.append(command) - native_check = existing.get('native_vlan') == proposed.get('native_vlan') + native_check = str(existing.get('native_vlan')) == str(proposed.get('native_vlan')) if not native_check and proposed.get('native_vlan'): command = 'switchport trunk native vlan {0}'.format(proposed.get('native_vlan')) commands.append(command) @@ -347,8 +347,8 @@ def is_switchport_default(existing): vlan 1 and trunk all and mode is access """ - c1 = existing['access_vlan'] == '1' - c2 = existing['native_vlan'] == '1' + c1 = str(existing['access_vlan']) == '1' + c2 = str(existing['native_vlan']) == '1' c3 = existing['trunk_vlans'] == '1-4094' c4 = existing['mode'] == 'access' @@ -578,5 +578,6 @@ def main(): module.exit_json(**results) + if __name__ == '__main__': main() diff --git a/lib/ansible/modules/network/nxos/nxos_vlan.py b/lib/ansible/modules/network/nxos/nxos_vlan.py index a196271e78..c7f462658d 100644 --- a/lib/ansible/modules/network/nxos/nxos_vlan.py +++ b/lib/ansible/modules/network/nxos/nxos_vlan.py @@ -370,7 +370,10 @@ def main(): if existing.get('mapped_vni'): if (existing.get('mapped_vni') != proposed.get('mapped_vni') and existing.get('mapped_vni') != '0' and proposed.get('mapped_vni') != 'default'): - commands.insert(1, 'no vn-segment') + if state == 'absent': + commands = ['vlan ' + vlan_id, 'no vn-segment', 'no vlan ' + vlan_id] + else: + commands.insert(1, 'no vn-segment') if module.check_mode: module.exit_json(changed=True, commands=commands) else: diff --git a/test/integration/nxos.yaml b/test/integration/nxos.yaml index 129428b84f..ef0b0aa4b7 100644 --- a/test/integration/nxos.yaml +++ b/test/integration/nxos.yaml @@ -213,6 +213,24 @@ failed_modules: "{{ failed_modules }} + [ 'nxos_portchannel' ]" test_failed: true + - block: + - include_role: + name: nxos_vlan + when: "limit_to in ['*', 'nxos_vlan']" + rescue: + - set_fact: + failed_modules: "{{ failed_modules }} + [ 'nxos_vlan' ]" + test_failed: true + + - block: + - include_role: + name: nxos_switchport + when: "limit_to in ['*', 'nxos_switchport']" + rescue: + - set_fact: + failed_modules: "{{ failed_modules }} + [ 'nxos_switchport' ]" + test_failed: true + - block: - include_role: name: nxos_vxlan_vtep diff --git a/test/integration/targets/nxos_switchport/defaults/main.yaml b/test/integration/targets/nxos_switchport/defaults/main.yaml new file mode 100644 index 0000000000..5f709c5aac --- /dev/null +++ b/test/integration/targets/nxos_switchport/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: "*" diff --git a/test/integration/targets/nxos_switchport/meta/main.yml b/test/integration/targets/nxos_switchport/meta/main.yml new file mode 100644 index 0000000000..ae741cbdc7 --- /dev/null +++ b/test/integration/targets/nxos_switchport/meta/main.yml @@ -0,0 +1,2 @@ +dependencies: + - prepare_nxos_tests diff --git a/test/integration/targets/nxos_switchport/tasks/cli.yaml b/test/integration/targets/nxos_switchport/tasks/cli.yaml new file mode 100644 index 0000000000..d675462dd0 --- /dev/null +++ b/test/integration/targets/nxos_switchport/tasks/cli.yaml @@ -0,0 +1,15 @@ +--- +- name: collect all cli test cases + find: + paths: "{{ role_path }}/tests/cli" + patterns: "{{ testcase }}.yaml" + register: test_cases + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test case + include: "{{ test_case_to_run }}" + with_items: "{{ test_items }}" + loop_control: + loop_var: test_case_to_run diff --git a/test/integration/targets/nxos_switchport/tasks/main.yaml b/test/integration/targets/nxos_switchport/tasks/main.yaml new file mode 100644 index 0000000000..4b0f8c64d9 --- /dev/null +++ b/test/integration/targets/nxos_switchport/tasks/main.yaml @@ -0,0 +1,3 @@ +--- +- { include: cli.yaml, tags: ['cli'] } +- { include: nxapi.yaml, tags: ['nxapi'] } diff --git a/test/integration/targets/nxos_switchport/tasks/nxapi.yaml b/test/integration/targets/nxos_switchport/tasks/nxapi.yaml new file mode 100644 index 0000000000..ea525379f7 --- /dev/null +++ b/test/integration/targets/nxos_switchport/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect all nxapi test cases + find: + paths: "{{ role_path }}/tests/nxapi" + patterns: "{{ testcase }}.yaml" + register: test_cases + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: enable nxapi + nxos_config: + lines: + - feature nxapi + - nxapi http port 80 + provider: "{{ cli }}" + +- name: run test case + include: "{{ test_case_to_run }}" + with_items: "{{ test_items }}" + loop_control: + loop_var: test_case_to_run + +- name: disable nxapi + nxos_config: + lines: + - no feature nxapi + provider: "{{ cli }}" diff --git a/test/integration/targets/nxos_switchport/tests/cli/sanity.yaml b/test/integration/targets/nxos_switchport/tests/cli/sanity.yaml new file mode 100644 index 0000000000..b1928202be --- /dev/null +++ b/test/integration/targets/nxos_switchport/tests/cli/sanity.yaml @@ -0,0 +1,4 @@ +--- +- set_fact: connection="{{ cli }}" + +- import_tasks: targets/nxos_switchport/tests/common/sanity.yaml diff --git a/test/integration/targets/nxos_switchport/tests/common/sanity.yaml b/test/integration/targets/nxos_switchport/tests/common/sanity.yaml new file mode 100644 index 0000000000..1421381fa3 --- /dev/null +++ b/test/integration/targets/nxos_switchport/tests/common/sanity.yaml @@ -0,0 +1,130 @@ +--- +- debug: msg="START TRANSPORT:{{ connection.transport }} nxos_switchport sanity test" + +# Select interface for test +- set_fact: intname="{{ nxos_int1 }}" + +- name: "Interface selected for this test" + debug: msg="{{ intname }}" + +- name: "Setup interface" + nxos_config: &default + lines: + - "default interface {{ intname }}" + provider: "{{ connection }}" + ignore_errors: yes + +- name: "Setup vlans" + nxos_vlan: + vlan_range: "5-10,20" + provider: "{{ connection }}" + +- block: + - name: Ensure interface is in L2 state + nxos_interface: + interface: "{{ intname }}" + mode: 'layer2' + provider: "{{ connection }}" + + - name: Ensure interface is in its default switchport state + nxos_switchport: &def_swi + interface: "{{ intname }}" + state: unconfigured + provider: "{{ connection }}" + + - name: Ensure interface is configured for access vlan 20 + nxos_switchport: &acc_vl + interface: "{{ intname }}" + mode: access + access_vlan: 20 + provider: "{{ connection }}" + register: result + + - assert: &true + that: + - "result.changed == true" + + - name: "access vlan Idempotence" + nxos_switchport: *acc_vl + register: result + + - assert: &false + that: + - "result.changed == false" + + - name: Ensure interface only has vlans 5-10 as trunk vlans + nxos_switchport: &tr_vl + interface: "{{ intname }}" + mode: trunk + native_vlan: 10 + trunk_allowed_vlans: 5-10 + provider: "{{ connection }}" + register: result + + - assert: *true + + - name: "trunk vlan Idempotence" + nxos_switchport: *tr_vl + register: result + + - assert: *false + + - name: Ensure interface is a trunk port and ensure 2-50 are being tagged (doesn't mean others aren't also being tagged) + nxos_switchport: &tag + interface: "{{ intname }}" + mode: trunk + native_vlan: 10 + trunk_vlans: 2-50 + provider: "{{ connection }}" + register: result + + - assert: *true + + - name: "tag vlan Idempotence" + nxos_switchport: *tag + register: result + + - assert: *false + + - name: Ensure these VLANs are not being tagged on the trunk + nxos_switchport: &no_tag + interface: "{{ intname }}" + mode: trunk + trunk_vlans: 30-4094 + state: absent + provider: "{{ connection }}" + register: result + + - assert: *true + + - name: "no tag vlan Idempotence" + nxos_switchport: *no_tag + register: result + + - assert: *false + + - name: put interface default state + nxos_switchport: *def_swi + register: result + + - assert: *true + + - name: "default state idempotence" + nxos_switchport: *def_swi + register: result + + - assert: *false + + always: + - name: "remove vlans" + nxos_vlan: + vlan_range: "5-10,20" + state: absent + provider: "{{ connection }}" + ignore_errors: yes + + - name: "default interface" + nxos_config: *default + ignore_errors: yes + +- debug: msg="END TRANSPORT:{{ connection.transport }} nxos_switchport sanity test" diff --git a/test/integration/targets/nxos_switchport/tests/nxapi/sanity.yaml b/test/integration/targets/nxos_switchport/tests/nxapi/sanity.yaml new file mode 100644 index 0000000000..8899ed72b4 --- /dev/null +++ b/test/integration/targets/nxos_switchport/tests/nxapi/sanity.yaml @@ -0,0 +1,4 @@ +--- +- set_fact: connection="{{ nxapi }}" + +- import_tasks: targets/nxos_switchport/tests/common/sanity.yaml diff --git a/test/integration/targets/nxos_vlan/defaults/main.yaml b/test/integration/targets/nxos_vlan/defaults/main.yaml new file mode 100644 index 0000000000..5f709c5aac --- /dev/null +++ b/test/integration/targets/nxos_vlan/defaults/main.yaml @@ -0,0 +1,2 @@ +--- +testcase: "*" diff --git a/test/integration/targets/nxos_vlan/meta/main.yml b/test/integration/targets/nxos_vlan/meta/main.yml new file mode 100644 index 0000000000..ae741cbdc7 --- /dev/null +++ b/test/integration/targets/nxos_vlan/meta/main.yml @@ -0,0 +1,2 @@ +dependencies: + - prepare_nxos_tests diff --git a/test/integration/targets/nxos_vlan/tasks/cli.yaml b/test/integration/targets/nxos_vlan/tasks/cli.yaml new file mode 100644 index 0000000000..d675462dd0 --- /dev/null +++ b/test/integration/targets/nxos_vlan/tasks/cli.yaml @@ -0,0 +1,15 @@ +--- +- name: collect all cli test cases + find: + paths: "{{ role_path }}/tests/cli" + patterns: "{{ testcase }}.yaml" + register: test_cases + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: run test case + include: "{{ test_case_to_run }}" + with_items: "{{ test_items }}" + loop_control: + loop_var: test_case_to_run diff --git a/test/integration/targets/nxos_vlan/tasks/main.yaml b/test/integration/targets/nxos_vlan/tasks/main.yaml new file mode 100644 index 0000000000..4b0f8c64d9 --- /dev/null +++ b/test/integration/targets/nxos_vlan/tasks/main.yaml @@ -0,0 +1,3 @@ +--- +- { include: cli.yaml, tags: ['cli'] } +- { include: nxapi.yaml, tags: ['nxapi'] } diff --git a/test/integration/targets/nxos_vlan/tasks/nxapi.yaml b/test/integration/targets/nxos_vlan/tasks/nxapi.yaml new file mode 100644 index 0000000000..ea525379f7 --- /dev/null +++ b/test/integration/targets/nxos_vlan/tasks/nxapi.yaml @@ -0,0 +1,28 @@ +--- +- name: collect all nxapi test cases + find: + paths: "{{ role_path }}/tests/nxapi" + patterns: "{{ testcase }}.yaml" + register: test_cases + +- name: set test_items + set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}" + +- name: enable nxapi + nxos_config: + lines: + - feature nxapi + - nxapi http port 80 + provider: "{{ cli }}" + +- name: run test case + include: "{{ test_case_to_run }}" + with_items: "{{ test_items }}" + loop_control: + loop_var: test_case_to_run + +- name: disable nxapi + nxos_config: + lines: + - no feature nxapi + provider: "{{ cli }}" diff --git a/test/integration/targets/nxos_vlan/tests/cli/sanity.yaml b/test/integration/targets/nxos_vlan/tests/cli/sanity.yaml new file mode 100644 index 0000000000..d1bc8aa2a9 --- /dev/null +++ b/test/integration/targets/nxos_vlan/tests/cli/sanity.yaml @@ -0,0 +1,4 @@ +--- +- set_fact: connection="{{ cli }}" + +- import_tasks: targets/nxos_vlan/tests/common/sanity.yaml diff --git a/test/integration/targets/nxos_vlan/tests/common/sanity.yaml b/test/integration/targets/nxos_vlan/tests/common/sanity.yaml new file mode 100644 index 0000000000..277ee68eed --- /dev/null +++ b/test/integration/targets/nxos_vlan/tests/common/sanity.yaml @@ -0,0 +1,105 @@ +--- +- debug: msg="START TRANSPORT:{{ connection.transport }} nxos_vlan sanity test" + +- block: + - name: "Enable feature vn segment" + nxos_config: + commands: + - feature vn-segment-vlan-based + provider: "{{ connection }}" + match: none + when: platform | search('N9K') + + - name: Ensure a range of VLANs are present on the switch + nxos_vlan: &conf_vlan + vlan_range: "2-10,20,50,55-60,100-150" + provider: "{{ connection }}" + register: result + + - assert: &true + that: + - "result.changed == true" + + - name: "Vlan Idempotence" + nxos_vlan: *conf_vlan + register: result + + - assert: &false + that: + - "result.changed == false" + + - name: Ensure VLAN 50 exists with the name WEB and is in the shutdown state + nxos_vlan: &web1 + vlan_id: 50 + vlan_state: suspend + admin_state: down + name: WEB + mapped_vni: 5555 + provider: "{{ connection }}" + register: result + when: platform | search('N9K') + + - assert: *true + when: platform | search('N9K') + + - name: "web Idempotence" + nxos_vlan: *web1 + register: result + when: platform | search('N9K') + + - assert: *false + when: platform | search('N9K') + + - name: Ensure VLAN 50 exists with the name WEB and is in the shutdown state + nxos_vlan: &web2 + vlan_id: 50 + vlan_state: suspend + admin_state: down + name: WEB + provider: "{{ connection }}" + register: result + when: platform | search('N3K|N7K') + + - assert: *true + when: platform | search('N3K|N7K') + + - name: "web Idempotence" + nxos_vlan: *web2 + register: result + when: platform | search('N3K|N7K') + + - assert: *false + when: platform | search('N3K|N7K') + + - name: Ensure VLAN is NOT on the device + nxos_vlan: &no_vlan + vlan_id: 50 + state: absent + provider: "{{ connection }}" + register: result + + - assert: *true + + - name: "no vlan Idempotence" + nxos_vlan: *no_vlan + register: result + + - assert: *false + + always: + - name: remove vlans + nxos_vlan: + vlan_range: "2-10,20,50,55-60,100-150" + state: absent + provider: "{{ connection }}" + ignore_errors: yes + + - name: "Disable feature vn segement" + nxos_feature: + feature: vn-segment-vlan-based + state: disabled + provider: "{{ connection }}" + ignore_errors: yes + when: platform | search('N9K') + +- debug: msg="END TRANSPORT:{{ connection.transport }} nxos_vlan sanity test" diff --git a/test/integration/targets/nxos_vlan/tests/nxapi/sanity.yaml b/test/integration/targets/nxos_vlan/tests/nxapi/sanity.yaml new file mode 100644 index 0000000000..1613c28ce8 --- /dev/null +++ b/test/integration/targets/nxos_vlan/tests/nxapi/sanity.yaml @@ -0,0 +1,4 @@ +--- +- set_fact: connection="{{ nxapi }}" + +- import_tasks: targets/nxos_vlan/tests/common/sanity.yaml