fix nxos_vlan mode idempotence bug (#55144)

* fix nxos_vlan mode idempotence bug

Signed-off-by: Trishna Guha <trishnaguha17@gmail.com>

* Fix CI failure

Signed-off-by: Trishna Guha <trishnaguha17@gmail.com>
This commit is contained in:
Trishna Guha 2019-05-08 11:19:15 +05:30 committed by GitHub
parent 7a957ba64a
commit 57e0567310
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 26 additions and 11 deletions

View file

@ -75,6 +75,7 @@ options:
- Set VLAN mode to classical ethernet or fabricpath.
This is a valid option for Nexus 5000 and 7000 series.
choices: ['ce','fabricpath']
default: 'ce'
version_added: "2.4"
aggregate:
description: List of VLANs definitions.
@ -154,6 +155,7 @@ import time
from copy import deepcopy
from ansible.module_utils.network.nxos.nxos import get_capabilities
from ansible.module_utils.network.nxos.nxos import get_config, load_config, run_commands
from ansible.module_utils.network.nxos.nxos import normalize_interface, nxos_argument_spec
from ansible.module_utils.basic import AnsibleModule
@ -196,6 +198,8 @@ def map_obj_to_commands(updates, module):
commands = list()
purge = module.params['purge']
want, have = updates
info = get_capabilities(module).get('device_info')
os_platform = info.get('network_os_platform')
for w in want:
vlan_id = w['vlan_id']
@ -208,13 +212,15 @@ def map_obj_to_commands(updates, module):
state = w['state']
del w['state']
obj_in_have = search_obj_in_list(vlan_id, have)
obj_in_have = search_obj_in_list(vlan_id, have) or {}
if not re.match('N[567]', os_platform) or (not obj_in_have.get('mode') and mode == 'ce'):
mode = w['mode'] = None
if state == 'absent':
if obj_in_have:
commands.append('no vlan {0}'.format(vlan_id))
elif state == 'present':
elif state == 'present' and not purge:
if not obj_in_have:
commands.append('vlan {0}'.format(vlan_id))
@ -627,7 +633,7 @@ def main():
delay=dict(default=10, type='int'),
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),
mode=dict(default='ce', choices=['ce', 'fabricpath']),
)
aggregate_spec = deepcopy(element_spec)

View file

@ -138,7 +138,7 @@ class HttpApi(HttpApiBase):
device_info['network_os_image'] = match_file_name.group(1)
break
match_os_platform = re.search(r'NAME: "Chassis",\s*DESCR:.*\nPID:\s*(\S+)', platform_reply, re.M)
match_os_platform = re.search(r'NAME: (?:"Chassis"| Chassis ),\s*DESCR:.*\nPID:\s*(\S+)', platform_reply, re.M)
if match_os_platform:
device_info['network_os_platform'] = match_os_platform.group(1)

View file

@ -16,13 +16,20 @@
when: platform is search('N5K|N7K')
- name: "Enable feature vn segment"
nxos_config:
nxos_config:
commands:
- feature vn-segment-vlan-based
match: none
provider: "{{ connection }}"
when: platform is search('N9K')
- name: vlan teardown
nxos_vlan: &vlan_teardown
vlan_range: "2-200"
provider: "{{ connection }}"
state: absent
ignore_errors: yes
- 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"
@ -219,15 +226,12 @@
nxos_vlan: *remint
ignore_errors: yes
- name: remove vlans
nxos_vlan:
vlan_range: "2-10,20,50,55-60,100-150"
provider: "{{ connection }}"
state: absent
- name: vlan teardown final
nxos_vlan: *vlan_teardown
ignore_errors: yes
- name: "Disable feature vn segement"
nxos_feature:
nxos_feature:
feature: vn-segment-vlan-based
provider: "{{ connection }}"
state: disabled

View file

@ -42,11 +42,16 @@ class TestNxosVlanModule(TestNxosModule):
self.mock_get_config = patch('ansible.modules.network.nxos.nxos_vlan.get_config')
self.get_config = self.mock_get_config.start()
self.mock_get_capabilities = patch('ansible.modules.network.nxos.nxos_vlan.get_capabilities')
self.get_capabilities = self.mock_get_capabilities.start()
self.get_capabilities.return_value = {'device_info': {'network_os_platform': 'N9K-9000v'}, 'network_api': 'cliconf'}
def tearDown(self):
super(TestNxosVlanModule, self).tearDown()
self.mock_run_commands.stop()
self.mock_load_config.stop()
self.mock_get_config.stop()
self.mock_get_capabilities.stop()
def load_fixtures(self, commands=None, device=''):
def load_from_file(*args, **kwargs):