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
reviewable/pr18780/r1
Peter Sprygada 9 years ago
parent 86f9c672f0
commit 0f724f625d

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

Loading…
Cancel
Save