refactor ios_config to use netcfg diff shared lib

Move the configuration diff code from the module to the shared lib
This commit is contained in:
Peter Sprygada 2016-04-04 06:59:40 -04:00
parent a38bdfc720
commit df32f64898

View file

@ -20,7 +20,7 @@ DOCUMENTATION = """
---
module: ios_config
version_added: "2.1"
author: "Peter sprygada (@privateip)"
author: "Peter Sprygada (@privateip)"
short_description: Manage Cisco IOS configuration sections
description:
- Cisco IOS configurations use a simple block indent file sytanx
@ -153,8 +153,6 @@ responses:
type: list
sample: ['...', '...']
"""
import re
import itertools
def get_config(module):
config = module.params['config'] or dict()
@ -162,33 +160,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():
@ -215,47 +186,35 @@ def main():
match = module.params['match']
replace = module.params['replace']
contents = get_config(module)
config = module.parse_config(contents)
if not module.params['force']:
contents = get_config(module)
config = NetworkConfig(contents=contents, indent=1)
if parents:
for parent in parents:
for item in config:
if item.text == parent:
config = item
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 *