Skip to content

Commit

Permalink
fix nxos_vlan issues (ansible#38008)
Browse files Browse the repository at this point in the history
(cherry picked from commit 6f2cb28)
  • Loading branch information
saichint authored and trishnaguha committed Mar 29, 2018
1 parent 5430ad9 commit 2d2a217
Show file tree
Hide file tree
Showing 3 changed files with 187 additions and 34 deletions.
90 changes: 60 additions & 30 deletions lib/ansible/modules/network/nxos/nxos_vlan.py
Expand Up @@ -45,9 +45,10 @@
- Name of VLAN.
required: false
default: null
- Name of VLAN or keyword 'default'.
interfaces:
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"
associated_interfaces:
description:
Expand Down Expand Up @@ -79,10 +80,8 @@
state:
description:
- Manage the state of the resource.
Active and Suspend will assume the vlan is present.
required: false
default: present
choices: ['present','absent', 'active', 'suspend']
choices: ['present','absent']
mode:
description:
- Set VLAN mode to classical ethernet or fabricpath.
Expand Down Expand Up @@ -173,19 +172,28 @@ def search_obj_in_list(vlan_id, lst):

def get_diff(w, obj):
c = deepcopy(w)
entries = ('interfaces', 'associated_interfaces', 'name', 'delay', 'vlan_range')
entries = ('interfaces', 'associated_interfaces', 'delay', 'vlan_range')
for key in entries:
if key in c:
del c[key]

o = deepcopy(obj)
del o['interfaces']
del o['name']
if o['vlan_id'] == w['vlan_id']:
diff_dict = dict(set(c.items()) - set(o.items()))
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):
commands = list()
want, have = updates
Expand Down Expand Up @@ -219,29 +227,60 @@ def map_obj_to_commands(updates, module, os_platform):
if not obj_in_have:
commands.append('vlan {0}'.format(vlan_id))

if name:
if name and name != 'default':
commands.append('name {0}'.format(name))
if mode:
commands.append('mode {0}'.format(mode))
if 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))
if admin_state == 'up':
commands.append('no shutdown')
if admin_state == 'down':
commands.append('shutdown')
commands.append('exit')

if interfaces:
if interfaces and interfaces[0] != 'default':
for i in interfaces:
commands.append('interface {0}'.format(i))
commands.append('switchport')
commands.append('switchport mode access')
commands.append('switchport access vlan {0}'.format(vlan_id))

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']:
for i in interfaces:
commands.append('vlan {0}'.format(vlan_id))
Expand Down Expand Up @@ -270,24 +309,15 @@ def map_obj_to_commands(updates, module, os_platform):
commands.append('switchport mode access')
commands.append('no switchport access vlan {0}'.format(vlan_id))

else:
diff = get_diff(w, obj_in_have)
if diff:
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')
elif interfaces and interfaces[0] == 'default':
if obj_in_have['interfaces']:
for i in obj_in_have['interfaces']:
commands.append('vlan {0}'.format(vlan_id))
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

Expand Down Expand Up @@ -504,9 +534,9 @@ def main():
interfaces=dict(type='list'),
associated_interfaces=dict(type='list'),
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'),
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'),
mode=dict(choices=['ce', 'fabricpath'], required=False, default='ce'),
)
Expand Down
Expand Up @@ -7,6 +7,7 @@
lines:
- no vlan 100
provider: "{{ connection }}"
ignore_errors: yes

- name: setup - remove vlan from interfaces used in test(part1)
nxos_config:
Expand Down
130 changes: 126 additions & 4 deletions test/integration/targets/nxos_vlan/tests/common/sanity.yaml
Expand Up @@ -3,6 +3,9 @@
- debug: msg="Using provider={{ connection.transport }}"
when: ansible_connection == "local"

- set_fact: testint1="{{ nxos_int1 }}"
- set_fact: testint2="{{ nxos_int2 }}"

- block:
- name: "Enable feature vn segment"
nxos_config:
Expand Down Expand Up @@ -44,16 +47,38 @@
- assert: *true
when: platform is search('N9K')

- name: "web Idempotence"
- name: "web1 Idempotence"
nxos_vlan: *web1
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
- name: change name and vni to default
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_state: suspend
admin_state: down
Expand All @@ -65,14 +90,74 @@
- assert: *true
when: platform is search('N3K|N7K')

- name: "web Idempotence"
nxos_vlan: *web2
- name: "web3 Idempotence"
nxos_vlan: *web3
register: result
when: platform is search('N3K|N7K')

- assert: *false
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
nxos_vlan: &no_vlan
vlan_id: 50
Expand All @@ -88,7 +173,44 @@

- 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:
- name: Remove int from vlan
nxos_vlan: *remint
ignore_errors: yes

- name: remove vlans
nxos_vlan:
vlan_range: "2-10,20,50,55-60,100-150"
Expand Down

0 comments on commit 2d2a217

Please sign in to comment.