diff options
author | Peter Sprygada <privateip@users.noreply.github.com> | 2016-09-18 22:26:20 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-09-18 22:26:20 -0400 |
commit | ff52e01a11eb431525fb842346615d0981eb23d8 (patch) | |
tree | d63f7cd5923bfbe65c05205e9ef361e58d8f96ce | |
parent | 8f8eb84ebf214bf3f71f76691867fbf366a8f87f (diff) | |
parent | 463349c0d1c7269bc031ce36ea207207540af26f (diff) | |
download | ansible-ff52e01a11eb431525fb842346615d0981eb23d8.tar.gz |
Merge pull request #17625 from skg-net/dellos6_template
Added support for template module for Dell Networking OS6 devices
-rw-r--r-- | CHANGELOG.md | 1 | ||||
-rw-r--r-- | lib/ansible/module_utils/dellos6.py | 99 | ||||
-rw-r--r-- | lib/ansible/plugins/action/dellos6_template.py | 28 |
3 files changed, 121 insertions, 7 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f0ae74ea1..773a22fe00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -70,6 +70,7 @@ Ansible Changes By Release * dellos6_command * dellos6_config * dellos6_facts + * dellos6_template - dellos9 * dellos9_command * dellos9_config diff --git a/lib/ansible/module_utils/dellos6.py b/lib/ansible/module_utils/dellos6.py index 1351feddfc..420855e022 100644 --- a/lib/ansible/module_utils/dellos6.py +++ b/lib/ansible/module_utils/dellos6.py @@ -33,15 +33,101 @@ import re from ansible.module_utils.shell import CliBase from ansible.module_utils.network import Command, register_transport, to_list -from ansible.module_utils.netcfg import NetworkConfig +from ansible.module_utils.netcfg import NetworkConfig, ConfigLine, ignore_line, DEFAULT_COMMENT_TOKENS + def get_config(module): - contents = module.params['running_config'] + contents = module.params['config'] + if not contents: - contents = module.cli('show running-config all')[0] - module.params['running_config'] = contents + contents = module.config.get_config() + module.params['config'] = contents + + return Dellos6NetworkConfig(indent=0, contents=contents[0]) + + +def get_sublevel_config(running_config, module): + contents = list() + current_config_contents = list() + sublevel_config = Dellos6NetworkConfig(indent=0) + + obj = running_config.get_object(module.params['parents']) + if obj: + contents = obj.children + + for c in contents: + if isinstance(c, ConfigLine): + current_config_contents.append(c.raw) + sublevel_config.add(current_config_contents, module.params['parents']) + + return sublevel_config + + +def os6_parse(lines, indent=None, comment_tokens=None): + sublevel_cmds = [ + re.compile(r'^vlan.*$'), + re.compile(r'^stack.*$'), + re.compile(r'^interface.*$'), + re.compile(r'line [(console)|(telnet)|(ssh)].*$'), + re.compile(r'ip ssh !(server).*$'), + re.compile(r'ip address .*$'), + re.compile(r'ip access-list .*$'), + re.compile(r'banner motd.*$'), + re.compile(r'radius-server host auth.*$')] + + childline = re.compile(r'^exit$') + + config = list() + inSubLevel = False + parent = None + children = list() + subcommandcount = 0 - return NetworkConfig(indent=1, contents=contents) + for line in str(lines).split('\n'): + text = str(re.sub(r'([{};])', '', line)).strip() + + cfg = ConfigLine(text) + cfg.raw = line + + if not text or ignore_line(text, comment_tokens): + parent = None + children = list() + inSubLevel = False + continue + + if inSubLevel is False: + for pr in sublevel_cmds: + if pr.match(line): + parent = cfg + config.append(parent) + inSubLevel = True + continue + if parent is None: + config.append(cfg) + + # handle sub level commands + elif inSubLevel and childline.match(line): + parent.children = children + inSubLevel = False + children = list() + parent = None + + # handle top level commands + elif inSubLevel: + children.append(cfg) + cfg.parents = [parent] + config.append(cfg) + + else: # global level + config.append(cfg) + + return config + + +class Dellos6NetworkConfig(NetworkConfig): + + def load(self, contents): + self._config = os6_parse(contents, self.indent, DEFAULT_COMMENT_TOKENS) class Cli(CliBase): @@ -60,8 +146,7 @@ class Cli(CliBase): re.compile(r"(?:incomplete|ambiguous) command", re.I), re.compile(r"connection timed out", re.I), re.compile(r"[^\r\n]+ not found", re.I), - re.compile(r"'[^']' +returned error code: ?\d+"), - ] + re.compile(r"'[^']' +returned error code: ?\d+")] def connect(self, params, **kwargs): diff --git a/lib/ansible/plugins/action/dellos6_template.py b/lib/ansible/plugins/action/dellos6_template.py new file mode 100644 index 0000000000..5334b644d3 --- /dev/null +++ b/lib/ansible/plugins/action/dellos6_template.py @@ -0,0 +1,28 @@ +# +# Copyright 2015 Peter Sprygada <psprygada@ansible.com> +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see <http://www.gnu.org/licenses/>. +# +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +from ansible.plugins.action import ActionBase +from ansible.plugins.action.net_template import ActionModule as NetActionModule + +class ActionModule(NetActionModule, ActionBase): + pass + + |