From c7305393a368cc0d84c4a2cd7195ca8e69441f26 Mon Sep 17 00:00:00 2001 From: saichint Date: Thu, 8 Feb 2018 23:32:41 -0800 Subject: [PATCH] fix nxos_evpn_vni issues (#35930) --- .../modules/network/nxos/nxos_evpn_vni.py | 36 ++++++---------- .../nxos_evpn_vni/tests/common/sanity.yaml | 42 ++++++++++++++++++- .../network/nxos/test_nxos_evpn_vni.py | 3 +- 3 files changed, 56 insertions(+), 25 deletions(-) diff --git a/lib/ansible/modules/network/nxos/nxos_evpn_vni.py b/lib/ansible/modules/network/nxos/nxos_evpn_vni.py index 5337cb03179..bb5fa6aa306 100644 --- a/lib/ansible/modules/network/nxos/nxos_evpn_vni.py +++ b/lib/ansible/modules/network/nxos/nxos_evpn_vni.py @@ -71,7 +71,7 @@ options: default: null route_target_export: description: - - Sets the route-target 'import' extended communities. + - Sets the route-target 'export' extended communities. required: false default: null state: @@ -104,7 +104,6 @@ commands: ''' import re -import time from ansible.module_utils.network.nxos.nxos import get_config, load_config, run_commands from ansible.module_utils.network.nxos.nxos import nxos_argument_spec, check_args from ansible.module_utils.basic import AnsibleModule @@ -158,11 +157,11 @@ def get_existing(module, args): existing[arg] = get_route_target_value(arg, config, module) existing_fix = dict((k, v) for k, v in existing.items() if v) - if existing_fix: - existing['vni'] = module.params['vni'] - else: + if not existing_fix: existing = existing_fix + existing['vni'] = module.params['vni'] + return existing @@ -205,12 +204,21 @@ def state_present(module, existing, proposed): commands.append('no {0} {1}'.format(key, target)) elif not isinstance(value, list): value = [value] + for target in value: + if target == 'default': + continue if existing: if target not in existing.get(key.replace('-', '_').replace(' ', '_')): commands.append('{0} {1}'.format(key, target)) else: commands.append('{0} {1}'.format(key, target)) + + if existing.get(key.replace('-', '_').replace(' ', '_')): + for exi in existing.get(key.replace('-', '_').replace(' ', '_')): + if exi not in value: + commands.append('no {0} {1}'.format(key, exi)) + elif value == 'default': existing_value = existing_commands.get(key) if existing_value: @@ -273,24 +281,6 @@ def main(): commands, parents = state_absent(module, existing, proposed) if commands: - if (existing.get('route_distinguisher') and - proposed.get('route_distinguisher')): - if (existing['route_distinguisher'] != proposed['route_distinguisher'] and - proposed['route_distinguisher'] != 'default'): - warnings.append('EVPN RD {0} was automatically removed. ' - 'It is highly recommended to use a task ' - '(with default as value) to explicitly ' - 'unconfigure it.'.format(existing['route_distinguisher'])) - remove_commands = ['no rd {0}'.format(existing['route_distinguisher'])] - - candidate = CustomNetworkConfig(indent=3) - candidate.add(remove_commands, parents=parents) - load_config(module, candidate) - results['changed'] = True - results['commands'] = candidate.items_text() - time.sleep(30) - - else: candidate = CustomNetworkConfig(indent=3) candidate.add(commands, parents=parents) candidate = candidate.items_text() diff --git a/test/integration/targets/nxos_evpn_vni/tests/common/sanity.yaml b/test/integration/targets/nxos_evpn_vni/tests/common/sanity.yaml index 36c691d2ddc..56817310862 100644 --- a/test/integration/targets/nxos_evpn_vni/tests/common/sanity.yaml +++ b/test/integration/targets/nxos_evpn_vni/tests/common/sanity.yaml @@ -28,9 +28,13 @@ vni: 6000 route_distinguisher: "60:10" route_target_import: + - auto - "5000:10" - "4100:100" - route_target_export: auto + route_target_export: + - auto + - "5000:10" + - "1.1.1.1:43" provider: "{{ connection }}" register: result @@ -46,6 +50,40 @@ that: - "result.changed == false" + - name: "Configure nxos_evpn_vni" + nxos_evpn_vni: &evpn_vni1 + vni: 6000 + route_distinguisher: "50:20" + route_target_import: auto + route_target_export: auto + provider: "{{ connection }}" + register: result + + - assert: *true + + - name: "Check Idempotence" + nxos_evpn_vni: *evpn_vni1 + register: result + + - assert: *false + + - name: "Configure nxos_evpn_vni" + nxos_evpn_vni: &evpn_vni_def + vni: 6000 + route_distinguisher: default + route_target_import: default + route_target_export: default + provider: "{{ connection }}" + register: result + + - assert: *true + + - name: "Check Idempotence" + nxos_evpn_vni: *evpn_vni_def + register: result + + - assert: *false + - name: "remove nxos_evpn_vni" nxos_evpn_vni: &rvni vni: 6000 @@ -61,6 +99,8 @@ - assert: *false + when: not (platform is search('N3K')) and not (platform is match('N35')) + always: - name: "Remove nv overlay evpn" nxos_config: *remove_evpn diff --git a/test/units/modules/network/nxos/test_nxos_evpn_vni.py b/test/units/modules/network/nxos/test_nxos_evpn_vni.py index 28707fcbfcc..db5c37a1c05 100644 --- a/test/units/modules/network/nxos/test_nxos_evpn_vni.py +++ b/test/units/modules/network/nxos/test_nxos_evpn_vni.py @@ -57,7 +57,8 @@ class TestNxosEvpnVniModule(TestNxosModule): result = self.execute_module(changed=True) self.assertEqual(result['commands'], ['evpn', 'vni 6000 l2', - 'route-target import 5000:10']) + 'route-target import 5000:10', + 'no route-target import auto']) def test_nxos_evpn_vni_absent_not_existing(self): set_module_args(dict(vni='12000', state='absent'))