Handling of configurations blocks with end-* at the end of the block (#39843)
* 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
(cherry picked from commit ef577b71cc
)
* changelog entry
This commit is contained in:
parent
4b979742fa
commit
54a229adb9
5 changed files with 71 additions and 0 deletions
2
changelogs/fragments/iosxr_config_crash.yaml
Normal file
2
changelogs/fragments/iosxr_config_crash.yaml
Normal file
|
@ -0,0 +1,2 @@
|
|||
bugfixes:
|
||||
- iosxr_config - handle configuration block with mis-indented sublevel command
|
|
@ -193,6 +193,8 @@ backup_path:
|
|||
type: string
|
||||
sample: /playbooks/ansible/backup/iosxr01.2016-07-16@22:28:34
|
||||
"""
|
||||
import re
|
||||
|
||||
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 iosxr_argument_spec, copy_file
|
||||
|
@ -200,6 +202,10 @@ from ansible.module_utils.network.common.config import NetworkConfig, dumps
|
|||
|
||||
DEFAULT_COMMIT_COMMENT = 'configured by iosxr_config'
|
||||
|
||||
CONFIG_MISPLACED_CHILDREN = [
|
||||
re.compile(r'end-\s*(.+)$')
|
||||
]
|
||||
|
||||
|
||||
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.
|
||||
|
@ -242,6 +248,29 @@ def get_candidate(module):
|
|||
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):
|
||||
match = module.params['match']
|
||||
replace = module.params['replace']
|
||||
|
@ -254,6 +283,9 @@ def run(module, result):
|
|||
candidate_config = get_candidate(module)
|
||||
running_config = get_running_config(module)
|
||||
|
||||
sanitize_candidate_config(candidate_config.items)
|
||||
sanitize_running_config(running_config.items)
|
||||
|
||||
commands = None
|
||||
if match != 'none' and replace != 'config':
|
||||
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