summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTrishna Guha <trishnaguha17@gmail.com>2019-05-08 11:19:15 +0530
committerGitHub <noreply@github.com>2019-05-08 11:19:15 +0530
commit57e0567310655a2fe87fccf6e714714f5f6733b4 (patch)
tree96b109b1e5ec0c60cfb3bc83634875f891dd6fd1
parent7a957ba64ac505167e5bfb3093a40be80176084e (diff)
downloadansible-57e0567310655a2fe87fccf6e714714f5f6733b4.tar.gz
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>
-rw-r--r--lib/ansible/modules/network/nxos/nxos_vlan.py12
-rw-r--r--lib/ansible/plugins/httpapi/nxos.py2
-rw-r--r--test/integration/targets/nxos_vlan/tests/common/sanity.yaml18
-rw-r--r--test/units/modules/network/nxos/test_nxos_vlan.py5
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):