Handling of configurations blocks with end-* at the end of the block (#39673)
* handle end-policy issue * revert changes in iosxr cliconf * fix trailing parents not included in difference * Moving fix to platform specific fix * pep 8 issues
This commit is contained in:
parent
09e3b5c92b
commit
ef577b71cc
4 changed files with 69 additions and 0 deletions
|
@ -176,6 +176,8 @@ backup_path:
|
||||||
type: string
|
type: string
|
||||||
sample: /playbooks/ansible/backup/iosxr01.2016-07-16@22:28:34
|
sample: /playbooks/ansible/backup/iosxr01.2016-07-16@22:28:34
|
||||||
"""
|
"""
|
||||||
|
import re
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule
|
from ansible.module_utils.basic import AnsibleModule
|
||||||
from ansible.module_utils.network.iosxr.iosxr import load_config, get_config
|
from ansible.module_utils.network.iosxr.iosxr import load_config, get_config
|
||||||
from ansible.module_utils.network.iosxr.iosxr import iosxr_argument_spec, copy_file
|
from ansible.module_utils.network.iosxr.iosxr import iosxr_argument_spec, copy_file
|
||||||
|
@ -183,6 +185,10 @@ from ansible.module_utils.network.common.config import NetworkConfig, dumps
|
||||||
|
|
||||||
DEFAULT_COMMIT_COMMENT = 'configured by iosxr_config'
|
DEFAULT_COMMIT_COMMENT = 'configured by iosxr_config'
|
||||||
|
|
||||||
|
CONFIG_MISPLACED_CHILDREN = [
|
||||||
|
re.compile(r'end-\s*(.+)$')
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
def copy_file_to_node(module):
|
def copy_file_to_node(module):
|
||||||
""" Copy config file to IOS-XR node. We use SFTP because older IOS-XR versions don't handle SCP very well.
|
""" Copy config file to IOS-XR node. We use SFTP because older IOS-XR versions don't handle SCP very well.
|
||||||
|
@ -225,6 +231,29 @@ def get_candidate(module):
|
||||||
return candidate
|
return candidate
|
||||||
|
|
||||||
|
|
||||||
|
def sanitize_candidate_config(config):
|
||||||
|
last_parents = None
|
||||||
|
for regex in CONFIG_MISPLACED_CHILDREN:
|
||||||
|
for index, line in enumerate(config):
|
||||||
|
if line._parents:
|
||||||
|
last_parents = line._parents
|
||||||
|
m = regex.search(line.text)
|
||||||
|
if m and m.group(0):
|
||||||
|
config[index]._parents = last_parents
|
||||||
|
|
||||||
|
|
||||||
|
def sanitize_running_config(config):
|
||||||
|
last_parents = None
|
||||||
|
for regex in CONFIG_MISPLACED_CHILDREN:
|
||||||
|
for index, line in enumerate(config):
|
||||||
|
if line._parents:
|
||||||
|
last_parents = line._parents
|
||||||
|
m = regex.search(line.text)
|
||||||
|
if m and m.group(0):
|
||||||
|
config[index].text = ' ' + m.group(0)
|
||||||
|
config[index]._parents = last_parents
|
||||||
|
|
||||||
|
|
||||||
def run(module, result):
|
def run(module, result):
|
||||||
match = module.params['match']
|
match = module.params['match']
|
||||||
replace = module.params['replace']
|
replace = module.params['replace']
|
||||||
|
@ -237,6 +266,9 @@ def run(module, result):
|
||||||
candidate_config = get_candidate(module)
|
candidate_config = get_candidate(module)
|
||||||
running_config = get_running_config(module)
|
running_config = get_running_config(module)
|
||||||
|
|
||||||
|
sanitize_candidate_config(candidate_config.items)
|
||||||
|
sanitize_running_config(running_config.items)
|
||||||
|
|
||||||
commands = None
|
commands = None
|
||||||
if match != 'none' and replace != 'config':
|
if match != 'none' and replace != 'config':
|
||||||
commands = candidate_config.difference(running_config, path=path, match=match, replace=replace)
|
commands = candidate_config.difference(running_config, path=path, match=match, replace=replace)
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
prefix-set ebpg_filter
|
||||||
|
192.168.0.0/16 ge 15 le 30
|
||||||
|
end-set
|
||||||
|
|
||||||
|
interface Loopback999
|
||||||
|
description this is a test interface for prefix-set
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
prefix-set ebpg_filter
|
||||||
|
192.168.0.0/16 ge 17 le 30
|
||||||
|
end-set
|
|
@ -0,0 +1,27 @@
|
||||||
|
---
|
||||||
|
- debug: msg="START cli/misplaced_sublevel.yaml on connection={{ ansible_connection }}"
|
||||||
|
|
||||||
|
- name: setup
|
||||||
|
iosxr_config:
|
||||||
|
src: basic/init_prefix_set.j2
|
||||||
|
ignore_errors: yes
|
||||||
|
|
||||||
|
- name: Change prefix-set and new command after prefix-set
|
||||||
|
iosxr_config:
|
||||||
|
src: basic/change_prefix_set.j2
|
||||||
|
register: result
|
||||||
|
|
||||||
|
- assert:
|
||||||
|
that:
|
||||||
|
- "result.changed == true"
|
||||||
|
|
||||||
|
- name: Play same config again to verify no diff in prefix-set also works
|
||||||
|
iosxr_config:
|
||||||
|
src: basic/change_prefix_set.j2
|
||||||
|
register: result
|
||||||
|
|
||||||
|
- assert:
|
||||||
|
that:
|
||||||
|
- "result.changed == true"
|
||||||
|
|
||||||
|
- debug: msg="END cli/misplaced_sublevel.yaml on connection={{ ansible_connection }}"
|
Loading…
Reference in a new issue