mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-07-25 14:20:22 -07:00
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:
parent
7a711cf942
commit
6a223d5576
3 changed files with 103 additions and 26 deletions
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue