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:
Deepak Agrawal 2018-05-08 11:34:53 +05:30 committed by GitHub
parent 4b979742fa
commit 54a229adb9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 71 additions and 0 deletions

View file

@ -0,0 +1,2 @@
bugfixes:
- iosxr_config - handle configuration block with mis-indented sublevel command

View file

@ -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)

View file

@ -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

View file

@ -0,0 +1,3 @@
prefix-set ebpg_filter
192.168.0.0/16 ge 17 le 30
end-set

View file

@ -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 }}"