From 57e0567310655a2fe87fccf6e714714f5f6733b4 Mon Sep 17 00:00:00 2001 From: Trishna Guha Date: Wed, 8 May 2019 11:19:15 +0530 Subject: fix nxos_vlan mode idempotence bug (#55144) * fix nxos_vlan mode idempotence bug Signed-off-by: Trishna Guha * Fix CI failure Signed-off-by: Trishna Guha --- lib/ansible/modules/network/nxos/nxos_vlan.py | 12 +++++++++--- lib/ansible/plugins/httpapi/nxos.py | 2 +- .../targets/nxos_vlan/tests/common/sanity.yaml | 18 +++++++++++------- test/units/modules/network/nxos/test_nxos_vlan.py | 5 +++++ 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/lib/ansible/modules/network/nxos/nxos_vlan.py b/lib/ansible/modules/network/nxos/nxos_vlan.py index 12693d1ce8..eb5335bb25 100644 --- a/lib/ansible/modules/network/nxos/nxos_vlan.py +++ b/lib/ansible/modules/network/nxos/nxos_vlan.py @@ -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) diff --git a/lib/ansible/plugins/httpapi/nxos.py b/lib/ansible/plugins/httpapi/nxos.py index f7c23c55d6..013cc4a67e 100644 --- a/lib/ansible/plugins/httpapi/nxos.py +++ b/lib/ansible/plugins/httpapi/nxos.py @@ -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) diff --git a/test/integration/targets/nxos_vlan/tests/common/sanity.yaml b/test/integration/targets/nxos_vlan/tests/common/sanity.yaml index 01b208e001..a4d134de8f 100644 --- a/test/integration/targets/nxos_vlan/tests/common/sanity.yaml +++ b/test/integration/targets/nxos_vlan/tests/common/sanity.yaml @@ -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 diff --git a/test/units/modules/network/nxos/test_nxos_vlan.py b/test/units/modules/network/nxos/test_nxos_vlan.py index 1f0b546b68..eee544e8b9 100644 --- a/test/units/modules/network/nxos/test_nxos_vlan.py +++ b/test/units/modules/network/nxos/test_nxos_vlan.py @@ -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): -- cgit v1.2.1