mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
fix nxos_vlan issues (#38008)
This commit is contained in:
parent
2ad7d79985
commit
6f2cb28bb9
3 changed files with 187 additions and 35 deletions
|
@ -38,10 +38,10 @@ options:
|
||||||
- Range of VLANs such as 2-10 or 2,5,10-15, etc.
|
- Range of VLANs such as 2-10 or 2,5,10-15, etc.
|
||||||
name:
|
name:
|
||||||
description:
|
description:
|
||||||
- Name of VLAN.
|
- Name of VLAN or keyword 'default'.
|
||||||
interfaces:
|
interfaces:
|
||||||
description:
|
description:
|
||||||
- List of interfaces that should be associated to the VLAN.
|
- List of interfaces that should be associated to the VLAN or keyword 'default'.
|
||||||
version_added: "2.5"
|
version_added: "2.5"
|
||||||
associated_interfaces:
|
associated_interfaces:
|
||||||
description:
|
description:
|
||||||
|
@ -52,7 +52,6 @@ options:
|
||||||
vlan_state:
|
vlan_state:
|
||||||
description:
|
description:
|
||||||
- Manage the vlan operational state of the VLAN
|
- Manage the vlan operational state of the VLAN
|
||||||
This is being deprecated in favor of state.
|
|
||||||
default: active
|
default: active
|
||||||
choices: ['active','suspend']
|
choices: ['active','suspend']
|
||||||
admin_state:
|
admin_state:
|
||||||
|
@ -69,9 +68,8 @@ options:
|
||||||
state:
|
state:
|
||||||
description:
|
description:
|
||||||
- Manage the state of the resource.
|
- Manage the state of the resource.
|
||||||
Active and Suspend will assume the vlan is present.
|
|
||||||
default: present
|
default: present
|
||||||
choices: ['present','absent', 'active', 'suspend']
|
choices: ['present','absent']
|
||||||
mode:
|
mode:
|
||||||
description:
|
description:
|
||||||
- Set VLAN mode to classical ethernet or fabricpath.
|
- Set VLAN mode to classical ethernet or fabricpath.
|
||||||
|
@ -162,19 +160,28 @@ def search_obj_in_list(vlan_id, lst):
|
||||||
|
|
||||||
def get_diff(w, obj):
|
def get_diff(w, obj):
|
||||||
c = deepcopy(w)
|
c = deepcopy(w)
|
||||||
entries = ('interfaces', 'associated_interfaces', 'name', 'delay', 'vlan_range')
|
entries = ('interfaces', 'associated_interfaces', 'delay', 'vlan_range')
|
||||||
for key in entries:
|
for key in entries:
|
||||||
if key in c:
|
if key in c:
|
||||||
del c[key]
|
del c[key]
|
||||||
|
|
||||||
o = deepcopy(obj)
|
o = deepcopy(obj)
|
||||||
del o['interfaces']
|
del o['interfaces']
|
||||||
del o['name']
|
|
||||||
if o['vlan_id'] == w['vlan_id']:
|
if o['vlan_id'] == w['vlan_id']:
|
||||||
diff_dict = dict(set(c.items()) - set(o.items()))
|
diff_dict = dict(set(c.items()) - set(o.items()))
|
||||||
return diff_dict
|
return diff_dict
|
||||||
|
|
||||||
|
|
||||||
|
def is_default_name(obj, vlan_id):
|
||||||
|
cname = obj['name']
|
||||||
|
if ('VLAN' in cname):
|
||||||
|
vid = int(cname[4:])
|
||||||
|
if vid == int(vlan_id):
|
||||||
|
return True
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
def map_obj_to_commands(updates, module, os_platform):
|
def map_obj_to_commands(updates, module, os_platform):
|
||||||
commands = list()
|
commands = list()
|
||||||
want, have = updates
|
want, have = updates
|
||||||
|
@ -208,13 +215,13 @@ def map_obj_to_commands(updates, module, os_platform):
|
||||||
if not obj_in_have:
|
if not obj_in_have:
|
||||||
commands.append('vlan {0}'.format(vlan_id))
|
commands.append('vlan {0}'.format(vlan_id))
|
||||||
|
|
||||||
if name:
|
if name and name != 'default':
|
||||||
commands.append('name {0}'.format(name))
|
commands.append('name {0}'.format(name))
|
||||||
if mode:
|
if mode:
|
||||||
commands.append('mode {0}'.format(mode))
|
commands.append('mode {0}'.format(mode))
|
||||||
if vlan_state:
|
if vlan_state:
|
||||||
commands.append('state {0}'.format(vlan_state))
|
commands.append('state {0}'.format(vlan_state))
|
||||||
if mapped_vni != 'None':
|
if mapped_vni != 'None' and mapped_vni != 'default':
|
||||||
commands.append('vn-segment {0}'.format(mapped_vni))
|
commands.append('vn-segment {0}'.format(mapped_vni))
|
||||||
if admin_state == 'up':
|
if admin_state == 'up':
|
||||||
commands.append('no shutdown')
|
commands.append('no shutdown')
|
||||||
|
@ -222,7 +229,7 @@ def map_obj_to_commands(updates, module, os_platform):
|
||||||
commands.append('shutdown')
|
commands.append('shutdown')
|
||||||
commands.append('exit')
|
commands.append('exit')
|
||||||
|
|
||||||
if interfaces:
|
if interfaces and interfaces[0] != 'default':
|
||||||
for i in interfaces:
|
for i in interfaces:
|
||||||
commands.append('interface {0}'.format(i))
|
commands.append('interface {0}'.format(i))
|
||||||
commands.append('switchport')
|
commands.append('switchport')
|
||||||
|
@ -230,7 +237,38 @@ def map_obj_to_commands(updates, module, os_platform):
|
||||||
commands.append('switchport access vlan {0}'.format(vlan_id))
|
commands.append('switchport access vlan {0}'.format(vlan_id))
|
||||||
|
|
||||||
else:
|
else:
|
||||||
if interfaces:
|
diff = get_diff(w, obj_in_have)
|
||||||
|
if diff:
|
||||||
|
commands.append('vlan {0}'.format(vlan_id))
|
||||||
|
for key, value in diff.items():
|
||||||
|
if key == 'name':
|
||||||
|
if name != 'default':
|
||||||
|
if name is not None:
|
||||||
|
commands.append('name {0}'.format(value))
|
||||||
|
else:
|
||||||
|
if not is_default_name(obj_in_have, vlan_id):
|
||||||
|
commands.append('no name')
|
||||||
|
if key == 'vlan_state':
|
||||||
|
commands.append('state {0}'.format(value))
|
||||||
|
if key == 'mapped_vni':
|
||||||
|
if value == 'default':
|
||||||
|
if obj_in_have['mapped_vni'] != 'None':
|
||||||
|
commands.append('no vn-segment')
|
||||||
|
elif value != 'None':
|
||||||
|
commands.append('vn-segment {0}'.format(value))
|
||||||
|
if key == 'admin_state':
|
||||||
|
if value == 'up':
|
||||||
|
commands.append('no shutdown')
|
||||||
|
elif value == 'down':
|
||||||
|
commands.append('shutdown')
|
||||||
|
if key == 'mode':
|
||||||
|
commands.append('mode {0}'.format(value))
|
||||||
|
if len(commands) > 1:
|
||||||
|
commands.append('exit')
|
||||||
|
else:
|
||||||
|
del commands[:]
|
||||||
|
|
||||||
|
if interfaces and interfaces[0] != 'default':
|
||||||
if not obj_in_have['interfaces']:
|
if not obj_in_have['interfaces']:
|
||||||
for i in interfaces:
|
for i in interfaces:
|
||||||
commands.append('vlan {0}'.format(vlan_id))
|
commands.append('vlan {0}'.format(vlan_id))
|
||||||
|
@ -259,24 +297,15 @@ def map_obj_to_commands(updates, module, os_platform):
|
||||||
commands.append('switchport mode access')
|
commands.append('switchport mode access')
|
||||||
commands.append('no switchport access vlan {0}'.format(vlan_id))
|
commands.append('no switchport access vlan {0}'.format(vlan_id))
|
||||||
|
|
||||||
else:
|
elif interfaces and interfaces[0] == 'default':
|
||||||
diff = get_diff(w, obj_in_have)
|
if obj_in_have['interfaces']:
|
||||||
if diff:
|
for i in obj_in_have['interfaces']:
|
||||||
commands.append('vlan {0}'.format(vlan_id))
|
commands.append('vlan {0}'.format(vlan_id))
|
||||||
for key, value in diff.items():
|
|
||||||
if key == 'vlan_state':
|
|
||||||
commands.append('state {0}'.format(value))
|
|
||||||
if key == 'mapped_vni':
|
|
||||||
if value != 'None':
|
|
||||||
commands.append('vn-segment {0}'.format(value))
|
|
||||||
if key == 'admin_state':
|
|
||||||
if value == 'up':
|
|
||||||
commands.append('no shutdown')
|
|
||||||
elif value == 'down':
|
|
||||||
commands.append('shutdown')
|
|
||||||
if key == 'mode':
|
|
||||||
commands.append('mode {0}'.format(value))
|
|
||||||
commands.append('exit')
|
commands.append('exit')
|
||||||
|
commands.append('interface {0}'.format(i))
|
||||||
|
commands.append('switchport')
|
||||||
|
commands.append('switchport mode access')
|
||||||
|
commands.append('no switchport access vlan {0}'.format(vlan_id))
|
||||||
|
|
||||||
return commands
|
return commands
|
||||||
|
|
||||||
|
@ -493,9 +522,9 @@ def main():
|
||||||
interfaces=dict(type='list'),
|
interfaces=dict(type='list'),
|
||||||
associated_interfaces=dict(type='list'),
|
associated_interfaces=dict(type='list'),
|
||||||
vlan_state=dict(choices=['active', 'suspend'], required=False, default='active'),
|
vlan_state=dict(choices=['active', 'suspend'], required=False, default='active'),
|
||||||
mapped_vni=dict(required=False, type='int'),
|
mapped_vni=dict(required=False),
|
||||||
delay=dict(default=10, type='int'),
|
delay=dict(default=10, type='int'),
|
||||||
state=dict(choices=['present', 'absent', 'active', 'suspend'], default='present', required=False),
|
state=dict(choices=['present', 'absent'], default='present', required=False),
|
||||||
admin_state=dict(choices=['up', 'down'], required=False, default='up'),
|
admin_state=dict(choices=['up', 'down'], required=False, default='up'),
|
||||||
mode=dict(choices=['ce', 'fabricpath'], required=False, default='ce'),
|
mode=dict(choices=['ce', 'fabricpath'], required=False, default='ce'),
|
||||||
)
|
)
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
lines:
|
lines:
|
||||||
- no vlan 100
|
- no vlan 100
|
||||||
provider: "{{ connection }}"
|
provider: "{{ connection }}"
|
||||||
|
ignore_errors: yes
|
||||||
|
|
||||||
- name: setup - remove vlan from interfaces used in test(part1)
|
- name: setup - remove vlan from interfaces used in test(part1)
|
||||||
nxos_config:
|
nxos_config:
|
||||||
|
|
|
@ -3,6 +3,9 @@
|
||||||
- debug: msg="Using provider={{ connection.transport }}"
|
- debug: msg="Using provider={{ connection.transport }}"
|
||||||
when: ansible_connection == "local"
|
when: ansible_connection == "local"
|
||||||
|
|
||||||
|
- set_fact: testint1="{{ nxos_int1 }}"
|
||||||
|
- set_fact: testint2="{{ nxos_int2 }}"
|
||||||
|
|
||||||
- block:
|
- block:
|
||||||
- name: "Enable feature vn segment"
|
- name: "Enable feature vn segment"
|
||||||
nxos_config:
|
nxos_config:
|
||||||
|
@ -44,7 +47,7 @@
|
||||||
- assert: *true
|
- assert: *true
|
||||||
when: platform is search('N9K')
|
when: platform is search('N9K')
|
||||||
|
|
||||||
- name: "web Idempotence"
|
- name: "web1 Idempotence"
|
||||||
nxos_vlan: *web1
|
nxos_vlan: *web1
|
||||||
register: result
|
register: result
|
||||||
when: platform is search('N9K')
|
when: platform is search('N9K')
|
||||||
|
@ -52,8 +55,30 @@
|
||||||
- assert: *false
|
- assert: *false
|
||||||
when: platform is search('N9K')
|
when: platform is search('N9K')
|
||||||
|
|
||||||
- name: Ensure VLAN 50 exists with the name WEB and is in the shutdown state
|
- name: change name and vni to default
|
||||||
nxos_vlan: &web2
|
nxos_vlan: &web2
|
||||||
|
vlan_id: 50
|
||||||
|
vlan_state: active
|
||||||
|
admin_state: up
|
||||||
|
name: default
|
||||||
|
mapped_vni: default
|
||||||
|
provider: "{{ connection }}"
|
||||||
|
register: result
|
||||||
|
when: platform is search('N9K')
|
||||||
|
|
||||||
|
- assert: *true
|
||||||
|
when: platform is search('N9K')
|
||||||
|
|
||||||
|
- name: "web2 Idempotence"
|
||||||
|
nxos_vlan: *web2
|
||||||
|
register: result
|
||||||
|
when: platform is search('N9K')
|
||||||
|
|
||||||
|
- assert: *false
|
||||||
|
when: platform is search('N9K')
|
||||||
|
|
||||||
|
- name: Ensure VLAN 50 exists with the name WEB and is in the shutdown state
|
||||||
|
nxos_vlan: &web3
|
||||||
vlan_id: 50
|
vlan_id: 50
|
||||||
vlan_state: suspend
|
vlan_state: suspend
|
||||||
admin_state: down
|
admin_state: down
|
||||||
|
@ -65,14 +90,74 @@
|
||||||
- assert: *true
|
- assert: *true
|
||||||
when: platform is search('N3K|N7K')
|
when: platform is search('N3K|N7K')
|
||||||
|
|
||||||
- name: "web Idempotence"
|
- name: "web3 Idempotence"
|
||||||
nxos_vlan: *web2
|
nxos_vlan: *web3
|
||||||
register: result
|
register: result
|
||||||
when: platform is search('N3K|N7K')
|
when: platform is search('N3K|N7K')
|
||||||
|
|
||||||
- assert: *false
|
- assert: *false
|
||||||
when: platform is search('N3K|N7K')
|
when: platform is search('N3K|N7K')
|
||||||
|
|
||||||
|
- name: Change name to default
|
||||||
|
nxos_vlan: &web4
|
||||||
|
vlan_id: 50
|
||||||
|
vlan_state: active
|
||||||
|
admin_state: up
|
||||||
|
name: default
|
||||||
|
provider: "{{ connection }}"
|
||||||
|
register: result
|
||||||
|
when: platform is search('N3K|N7K')
|
||||||
|
|
||||||
|
- assert: *true
|
||||||
|
when: platform is search('N3K|N7K')
|
||||||
|
|
||||||
|
- name: "web4 Idempotence"
|
||||||
|
nxos_vlan: *web4
|
||||||
|
register: result
|
||||||
|
when: platform is search('N3K|N7K')
|
||||||
|
|
||||||
|
- assert: *false
|
||||||
|
when: platform is search('N3K|N7K')
|
||||||
|
|
||||||
|
# Uncomment this once the get_capabilities() work on nxapi as well
|
||||||
|
# - name: Change mode
|
||||||
|
# nxos_vlan: &mode1
|
||||||
|
# vlan_id: 50
|
||||||
|
# mode: fabricpath
|
||||||
|
# provider: "{{ connection }}"
|
||||||
|
# register: result
|
||||||
|
# when: platform is search('N5k|N7K')
|
||||||
|
#
|
||||||
|
# - assert: *true
|
||||||
|
# when: platform is search('N5k|N7K')
|
||||||
|
#
|
||||||
|
# - name: "mode1 Idempotence"
|
||||||
|
# nxos_vlan: *mode1
|
||||||
|
# register: result
|
||||||
|
# when: platform is search('N5k|N7K')
|
||||||
|
#
|
||||||
|
# - assert: *false
|
||||||
|
# when: platform is search('N5k|N7K')
|
||||||
|
#
|
||||||
|
# - name: Change mode again
|
||||||
|
# nxos_vlan: &mode2
|
||||||
|
# vlan_id: 50
|
||||||
|
# mode: ce
|
||||||
|
# provider: "{{ connection }}"
|
||||||
|
# register: result
|
||||||
|
# when: platform is search('N5k|N7K')
|
||||||
|
#
|
||||||
|
# - assert: *true
|
||||||
|
# when: platform is search('N5k|N7K')
|
||||||
|
#
|
||||||
|
# - name: "mode2 Idempotence"
|
||||||
|
# nxos_vlan: *mode2
|
||||||
|
# register: result
|
||||||
|
# when: platform is search('N5k|N7K')
|
||||||
|
#
|
||||||
|
# - assert: *false
|
||||||
|
# when: platform is search('N5k|N7K')
|
||||||
|
|
||||||
- name: Ensure VLAN is NOT on the device
|
- name: Ensure VLAN is NOT on the device
|
||||||
nxos_vlan: &no_vlan
|
nxos_vlan: &no_vlan
|
||||||
vlan_id: 50
|
vlan_id: 50
|
||||||
|
@ -88,7 +173,44 @@
|
||||||
|
|
||||||
- assert: *false
|
- assert: *false
|
||||||
|
|
||||||
|
- name: Add interfaces to vlan
|
||||||
|
nxos_vlan: &addint
|
||||||
|
vlan_id: 101
|
||||||
|
vlan_state: suspend
|
||||||
|
interfaces:
|
||||||
|
- "{{ testint1 }}"
|
||||||
|
- "{{ testint2 }}"
|
||||||
|
provider: "{{ connection }}"
|
||||||
|
register: result
|
||||||
|
|
||||||
|
- assert: *true
|
||||||
|
|
||||||
|
- name: "Addint idempotence"
|
||||||
|
nxos_vlan: *addint
|
||||||
|
register: result
|
||||||
|
|
||||||
|
- assert: *false
|
||||||
|
|
||||||
|
- name: Remove interfaces from vlan
|
||||||
|
nxos_vlan: &remint
|
||||||
|
vlan_id: 101
|
||||||
|
interfaces: default
|
||||||
|
provider: "{{ connection }}"
|
||||||
|
register: result
|
||||||
|
|
||||||
|
- assert: *true
|
||||||
|
|
||||||
|
- name: "Remint idempotence"
|
||||||
|
nxos_vlan: *remint
|
||||||
|
register: result
|
||||||
|
|
||||||
|
- assert: *false
|
||||||
|
|
||||||
always:
|
always:
|
||||||
|
- name: Remove int from vlan
|
||||||
|
nxos_vlan: *remint
|
||||||
|
ignore_errors: yes
|
||||||
|
|
||||||
- name: remove vlans
|
- name: remove vlans
|
||||||
nxos_vlan:
|
nxos_vlan:
|
||||||
vlan_range: "2-10,20,50,55-60,100-150"
|
vlan_range: "2-10,20,50,55-60,100-150"
|
||||||
|
|
Loading…
Reference in a new issue