mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
fix nxos_vlan and nxos_switchport issues (#27505)
This commit is contained in:
parent
a52a4332fd
commit
37392318a6
19 changed files with 378 additions and 5 deletions
|
@ -307,7 +307,7 @@ def get_switchport_config_commands(interface, existing, proposed, module):
|
||||||
commands.append(command)
|
commands.append(command)
|
||||||
|
|
||||||
if proposed_mode == 'access':
|
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:
|
if not av_check:
|
||||||
command = 'switchport access vlan {0}'.format(proposed.get('access_vlan'))
|
command = 'switchport access vlan {0}'.format(proposed.get('access_vlan'))
|
||||||
commands.append(command)
|
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'))
|
command = 'switchport trunk allowed vlan add {0}'.format(proposed.get('trunk_vlans'))
|
||||||
commands.append(command)
|
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'):
|
if not native_check and proposed.get('native_vlan'):
|
||||||
command = 'switchport trunk native vlan {0}'.format(proposed.get('native_vlan'))
|
command = 'switchport trunk native vlan {0}'.format(proposed.get('native_vlan'))
|
||||||
commands.append(command)
|
commands.append(command)
|
||||||
|
@ -347,8 +347,8 @@ def is_switchport_default(existing):
|
||||||
vlan 1 and trunk all and mode is access
|
vlan 1 and trunk all and mode is access
|
||||||
"""
|
"""
|
||||||
|
|
||||||
c1 = existing['access_vlan'] == '1'
|
c1 = str(existing['access_vlan']) == '1'
|
||||||
c2 = existing['native_vlan'] == '1'
|
c2 = str(existing['native_vlan']) == '1'
|
||||||
c3 = existing['trunk_vlans'] == '1-4094'
|
c3 = existing['trunk_vlans'] == '1-4094'
|
||||||
c4 = existing['mode'] == 'access'
|
c4 = existing['mode'] == 'access'
|
||||||
|
|
||||||
|
@ -578,5 +578,6 @@ def main():
|
||||||
|
|
||||||
module.exit_json(**results)
|
module.exit_json(**results)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -370,6 +370,9 @@ def main():
|
||||||
if existing.get('mapped_vni'):
|
if existing.get('mapped_vni'):
|
||||||
if (existing.get('mapped_vni') != proposed.get('mapped_vni') and
|
if (existing.get('mapped_vni') != proposed.get('mapped_vni') and
|
||||||
existing.get('mapped_vni') != '0' and proposed.get('mapped_vni') != 'default'):
|
existing.get('mapped_vni') != '0' and proposed.get('mapped_vni') != 'default'):
|
||||||
|
if state == 'absent':
|
||||||
|
commands = ['vlan ' + vlan_id, 'no vn-segment', 'no vlan ' + vlan_id]
|
||||||
|
else:
|
||||||
commands.insert(1, 'no vn-segment')
|
commands.insert(1, 'no vn-segment')
|
||||||
if module.check_mode:
|
if module.check_mode:
|
||||||
module.exit_json(changed=True, commands=commands)
|
module.exit_json(changed=True, commands=commands)
|
||||||
|
|
|
@ -213,6 +213,24 @@
|
||||||
failed_modules: "{{ failed_modules }} + [ 'nxos_portchannel' ]"
|
failed_modules: "{{ failed_modules }} + [ 'nxos_portchannel' ]"
|
||||||
test_failed: true
|
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:
|
- block:
|
||||||
- include_role:
|
- include_role:
|
||||||
name: nxos_vxlan_vtep
|
name: nxos_vxlan_vtep
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
---
|
||||||
|
testcase: "*"
|
2
test/integration/targets/nxos_switchport/meta/main.yml
Normal file
2
test/integration/targets/nxos_switchport/meta/main.yml
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
dependencies:
|
||||||
|
- prepare_nxos_tests
|
15
test/integration/targets/nxos_switchport/tasks/cli.yaml
Normal file
15
test/integration/targets/nxos_switchport/tasks/cli.yaml
Normal file
|
@ -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
|
3
test/integration/targets/nxos_switchport/tasks/main.yaml
Normal file
3
test/integration/targets/nxos_switchport/tasks/main.yaml
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
---
|
||||||
|
- { include: cli.yaml, tags: ['cli'] }
|
||||||
|
- { include: nxapi.yaml, tags: ['nxapi'] }
|
28
test/integration/targets/nxos_switchport/tasks/nxapi.yaml
Normal file
28
test/integration/targets/nxos_switchport/tasks/nxapi.yaml
Normal file
|
@ -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 }}"
|
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
- set_fact: connection="{{ cli }}"
|
||||||
|
|
||||||
|
- import_tasks: 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"
|
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
- set_fact: connection="{{ nxapi }}"
|
||||||
|
|
||||||
|
- import_tasks: targets/nxos_switchport/tests/common/sanity.yaml
|
2
test/integration/targets/nxos_vlan/defaults/main.yaml
Normal file
2
test/integration/targets/nxos_vlan/defaults/main.yaml
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
---
|
||||||
|
testcase: "*"
|
2
test/integration/targets/nxos_vlan/meta/main.yml
Normal file
2
test/integration/targets/nxos_vlan/meta/main.yml
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
dependencies:
|
||||||
|
- prepare_nxos_tests
|
15
test/integration/targets/nxos_vlan/tasks/cli.yaml
Normal file
15
test/integration/targets/nxos_vlan/tasks/cli.yaml
Normal file
|
@ -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
|
3
test/integration/targets/nxos_vlan/tasks/main.yaml
Normal file
3
test/integration/targets/nxos_vlan/tasks/main.yaml
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
---
|
||||||
|
- { include: cli.yaml, tags: ['cli'] }
|
||||||
|
- { include: nxapi.yaml, tags: ['nxapi'] }
|
28
test/integration/targets/nxos_vlan/tasks/nxapi.yaml
Normal file
28
test/integration/targets/nxos_vlan/tasks/nxapi.yaml
Normal file
|
@ -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 }}"
|
4
test/integration/targets/nxos_vlan/tests/cli/sanity.yaml
Normal file
4
test/integration/targets/nxos_vlan/tests/cli/sanity.yaml
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
- set_fact: connection="{{ cli }}"
|
||||||
|
|
||||||
|
- import_tasks: targets/nxos_vlan/tests/common/sanity.yaml
|
105
test/integration/targets/nxos_vlan/tests/common/sanity.yaml
Normal file
105
test/integration/targets/nxos_vlan/tests/common/sanity.yaml
Normal file
|
@ -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"
|
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
- set_fact: connection="{{ nxapi }}"
|
||||||
|
|
||||||
|
- import_tasks: targets/nxos_vlan/tests/common/sanity.yaml
|
Loading…
Reference in a new issue