Fix vrf parsing in eos_vrf and eos_eapi module (#35791)

* Fix vrf parsing in eos_vrf and eos_eapi module

Fixes #30250

Fix logic to parse vrf when interface value in `show vrf`
command output spans on multiple lines

* Add idempotent test case
This commit is contained in:
Ganesh Nalawade 2018-02-12 12:33:22 +05:30 committed by GitHub
commit 6a223d5576
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 103 additions and 26 deletions

View file

@ -213,7 +213,15 @@ def validate_local_http_port(value, module):
def validate_vrf(value, module):
out = run_commands(module, ['show vrf'])
configured_vrfs = re.findall(r'^\s+(\w+)(?=\s)', out[0], re.M)
configured_vrfs = []
lines = out[0].strip().splitlines()[3:]
for l in lines:
if not l:
continue
splitted_line = re.split(r'\s{2,}', l.strip())
if len(splitted_line) > 2:
configured_vrfs.append(splitted_line[0])
configured_vrfs.append('default')
if value not in configured_vrfs:
module.fail_json(msg='vrf `%s` is not configured on the system' % value)

View file

@ -184,29 +184,44 @@ def map_obj_to_commands(updates, module):
def map_config_to_obj(module):
objs = []
output = run_commands(module, ['show vrf'])
lines = output[0].strip().splitlines()[2:]
for l in lines:
if not l:
lines = output[0].strip().splitlines()[3:]
out_len = len(lines)
index = 0
while out_len > index:
line = lines[index]
if not line:
continue
splitted_line = re.split(r'\s{2,}', l.strip())
splitted_line = re.split(r'\s{2,}', line.strip())
if len(splitted_line) == 1:
index += 1
continue
else:
obj = {}
obj = dict()
obj['name'] = splitted_line[0]
obj['rd'] = splitted_line[1]
obj['interfaces'] = []
if len(splitted_line) > 4:
obj['interfaces'] = []
interfaces = splitted_line[4]
if interfaces.endswith(','):
while interfaces.endswith(','):
# gather all comma separated interfaces
if out_len <= index:
break
index += 1
line = lines[index]
vrf_line = re.split(r'\s{2,}', line.strip())
interfaces += vrf_line[-1]
for i in splitted_line[4].split(','):
for i in interfaces.split(','):
obj['interfaces'].append(i.strip().lower())
objs.append(obj)
index += 1
objs.append(obj)
return objs
@ -308,5 +323,6 @@ def main():
module.exit_json(**result)
if __name__ == '__main__':
main()