refactor iosxr_config module to remove old diff functions

this replaces the old diff functions with the netcfg lib for handling
configuration diffs between running and candidate configurations
This commit is contained in:
Peter Sprygada 2016-04-04 16:13:20 -04:00
parent 86f9c672f0
commit 0f724f625d

View file

@ -20,7 +20,7 @@ DOCUMENTATION = """
---
module: iosxr_config
version_added: "2.1"
author: "Peter sprygada (@privateip)"
author: "Peter Sprygada (@privateip)"
short_description: Manage Cisco IOS XR configuration sections
description:
- Cisco IOS XR configurations use a simple block indent file sytanx
@ -139,8 +139,6 @@ responses:
type: list
sample: ['...', '...']
"""
import re
import itertools
def get_config(module):
config = module.params['config'] or dict()
@ -148,35 +146,6 @@ def get_config(module):
config = module.config
return config
def build_candidate(lines, parents, config, strategy):
candidate = list()
if strategy == 'strict':
for index, cmd in enumerate(lines):
try:
if cmd != config[index]:
candidate.append(cmd)
except IndexError:
candidate.append(cmd)
elif strategy == 'exact':
if len(lines) != len(config):
candidate = list(lines)
else:
for cmd, cfg in itertools.izip(lines, config):
if cmd != cfg:
candidate = list(lines)
break
else:
for cmd in lines:
if cmd not in config:
candidate.append(cmd)
return candidate
def main():
argument_spec = dict(
@ -205,44 +174,36 @@ def main():
contents = get_config(module)
config = module.parse_config(contents)
if parents:
for parent in parents:
for item in config:
if item.text == parent:
config = item
if not module.params['force']:
contents = get_config(module)
config = NetworkConfig(contents=contents, indent=1)
try:
children = [c.text for c in config.children]
except AttributeError:
children = [c.text for c in config]
candidate = NetworkConfig(indent=1)
candidate.add(lines, parents=parents)
commands = candidate.difference(config, path=parents, match=match, replace=replace)
else:
children = [c.text for c in config if not c.parents]
commands = parents
commands.extend(lines)
result = dict(changed=False)
candidate = build_candidate(lines, parents, children, match)
if candidate:
if replace == 'line':
candidate[:0] = parents
else:
candidate = list(parents)
candidate.extend(lines)
if commands:
if before:
candidate[:0] = before
commands[:0] = before
if after:
candidate.extend(after)
commands.extend(after)
if not module.check_mode:
response = module.configure(candidate)
commands = [str(c).strip() for c in commands]
response = module.configure(commands)
result['responses'] = response
result['changed'] = True
result['updates'] = candidate
return module.exit_json(**result)
result['updates'] = commands
module.exit_json(**result)
from ansible.module_utils.basic import *
from ansible.module_utils.shell import *