fix nxos_evpn_vni issues (#35930)

This commit is contained in:
saichint 2018-02-08 23:32:41 -08:00 committed by Trishna Guha
parent 54e0327e5d
commit c7305393a3
3 changed files with 56 additions and 25 deletions

View file

@ -71,7 +71,7 @@ options:
default: null default: null
route_target_export: route_target_export:
description: description:
- Sets the route-target 'import' extended communities. - Sets the route-target 'export' extended communities.
required: false required: false
default: null default: null
state: state:
@ -104,7 +104,6 @@ commands:
''' '''
import re 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 get_config, load_config, run_commands
from ansible.module_utils.network.nxos.nxos import nxos_argument_spec, check_args from ansible.module_utils.network.nxos.nxos import nxos_argument_spec, check_args
from ansible.module_utils.basic import AnsibleModule 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[arg] = get_route_target_value(arg, config, module)
existing_fix = dict((k, v) for k, v in existing.items() if v) existing_fix = dict((k, v) for k, v in existing.items() if v)
if existing_fix: if not existing_fix:
existing['vni'] = module.params['vni']
else:
existing = existing_fix existing = existing_fix
existing['vni'] = module.params['vni']
return existing return existing
@ -205,12 +204,21 @@ def state_present(module, existing, proposed):
commands.append('no {0} {1}'.format(key, target)) commands.append('no {0} {1}'.format(key, target))
elif not isinstance(value, list): elif not isinstance(value, list):
value = [value] value = [value]
for target in value: for target in value:
if target == 'default':
continue
if existing: if existing:
if target not in existing.get(key.replace('-', '_').replace(' ', '_')): if target not in existing.get(key.replace('-', '_').replace(' ', '_')):
commands.append('{0} {1}'.format(key, target)) commands.append('{0} {1}'.format(key, target))
else: else:
commands.append('{0} {1}'.format(key, target)) 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': elif value == 'default':
existing_value = existing_commands.get(key) existing_value = existing_commands.get(key)
if existing_value: if existing_value:
@ -273,24 +281,6 @@ def main():
commands, parents = state_absent(module, existing, proposed) commands, parents = state_absent(module, existing, proposed)
if commands: 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 = CustomNetworkConfig(indent=3)
candidate.add(commands, parents=parents) candidate.add(commands, parents=parents)
candidate = candidate.items_text() candidate = candidate.items_text()

View file

@ -28,9 +28,13 @@
vni: 6000 vni: 6000
route_distinguisher: "60:10" route_distinguisher: "60:10"
route_target_import: route_target_import:
- auto
- "5000:10" - "5000:10"
- "4100:100" - "4100:100"
route_target_export: auto route_target_export:
- auto
- "5000:10"
- "1.1.1.1:43"
provider: "{{ connection }}" provider: "{{ connection }}"
register: result register: result
@ -46,6 +50,40 @@
that: that:
- "result.changed == false" - "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" - name: "remove nxos_evpn_vni"
nxos_evpn_vni: &rvni nxos_evpn_vni: &rvni
vni: 6000 vni: 6000
@ -61,6 +99,8 @@
- assert: *false - assert: *false
when: not (platform is search('N3K')) and not (platform is match('N35'))
always: always:
- name: "Remove nv overlay evpn" - name: "Remove nv overlay evpn"
nxos_config: *remove_evpn nxos_config: *remove_evpn

View file

@ -57,7 +57,8 @@ class TestNxosEvpnVniModule(TestNxosModule):
result = self.execute_module(changed=True) result = self.execute_module(changed=True)
self.assertEqual(result['commands'], ['evpn', self.assertEqual(result['commands'], ['evpn',
'vni 6000 l2', '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): def test_nxos_evpn_vni_absent_not_existing(self):
set_module_args(dict(vni='12000', state='absent')) set_module_args(dict(vni='12000', state='absent'))