From 0f724f625dd2ff1da9b9949a775e0611ff5c5e89 Mon Sep 17 00:00:00 2001 From: Peter Sprygada Date: Mon, 4 Apr 2016 16:13:20 -0400 Subject: [PATCH] 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 --- network/iosxr/iosxr_config.py | 73 ++++++++--------------------------- 1 file changed, 17 insertions(+), 56 deletions(-) diff --git a/network/iosxr/iosxr_config.py b/network/iosxr/iosxr_config.py index b86e1763318..d1474fc0c11 100644 --- a/network/iosxr/iosxr_config.py +++ b/network/iosxr/iosxr_config.py @@ -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 *