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:
Deepak Agrawal 2018-05-08 10:02:50 +05:30 committed by GitHub
parent 09e3b5c92b
commit ef577b71cc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 69 additions and 0 deletions

View file

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

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