From 86aef06ed8c8527a1da52144d4269e63ced45541 Mon Sep 17 00:00:00 2001 From: targuan Date: Thu, 25 Oct 2018 20:45:11 +0000 Subject: [PATCH 01/17] ansible_network_os --- napalm_ansible/plugins/action/napalm.py | 3 +++ .../connection_ansible_network_os.yaml | 13 +++++++++++++ tests/napalm_connection/hosts | 2 +- tests/run_tests.sh | 1 + 4 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 tests/napalm_connection/connection_ansible_network_os.yaml diff --git a/napalm_ansible/plugins/action/napalm.py b/napalm_ansible/plugins/action/napalm.py index acd8466..ac37522 100644 --- a/napalm_ansible/plugins/action/napalm.py +++ b/napalm_ansible/plugins/action/napalm.py @@ -18,6 +18,9 @@ def run(self, tmp=None, task_vars=None): # Timeout can't be passed via command-line as Ansible defaults to a 10 second timeout provider['timeout'] = provider.get('timeout', 60) + if hasattr(pc, 'network_os'): + provider['dev_os'] = provider.get('dev_os', pc.network_os) + self._task.args['provider'] = provider result = super(ActionModule, self).run(tmp, task_vars) diff --git a/tests/napalm_connection/connection_ansible_network_os.yaml b/tests/napalm_connection/connection_ansible_network_os.yaml new file mode 100644 index 0000000..2c59824 --- /dev/null +++ b/tests/napalm_connection/connection_ansible_network_os.yaml @@ -0,0 +1,13 @@ +--- +- name: Get facts + hosts: all + connection: local # code is run locally + gather_facts: no # don't gather facts + tasks: + - block: + - name: get facts from device + napalm_get_facts: # NAPALM plugin + optional_args: + path: "{{ playbook_dir }}/mocked" + profile: "{{ profile }}" + filter: ['facts'] diff --git a/tests/napalm_connection/hosts b/tests/napalm_connection/hosts index 44150c8..763864f 100644 --- a/tests/napalm_connection/hosts +++ b/tests/napalm_connection/hosts @@ -1,5 +1,5 @@ [all] -dummy os=mock profile=[eos] password=vagrant +dummy os=mock profile=[eos] password=vagrant ansible_network_os=mock [all:vars] ansible_python_interpreter="/usr/bin/env python" diff --git a/tests/run_tests.sh b/tests/run_tests.sh index d070a33..61e7e7e 100755 --- a/tests/run_tests.sh +++ b/tests/run_tests.sh @@ -4,6 +4,7 @@ set -e ansible-playbook -i napalm_connection/hosts napalm_connection/connection_info_missing.yaml ansible-playbook -i napalm_connection/hosts napalm_connection/connection_info_in_vars.yaml ansible-playbook -i napalm_connection/hosts napalm_connection/connection_info_in_args.yaml -u vagrant +ansible-playbook -i napalm_connection/hosts napalm_connection/connection_ansible_network_os.yaml -u vagrant ANSIBLE_REMOTE_USER=vagrant ansible-playbook -i napalm_connection/hosts napalm_connection/connection_info_in_env.yaml ansible-playbook -i napalm_install_config/hosts -l "*.dry_run.*" napalm_install_config/config.yaml -C From ddd812685b64c753c834088e80518b1ba0c7f2c5 Mon Sep 17 00:00:00 2001 From: targuan Date: Thu, 25 Oct 2018 21:43:37 +0000 Subject: [PATCH 02/17] Update CHANGELOG for ansible_network_os --- CHANGELOG.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index ed2a6b6..4611b89 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,6 +1,8 @@ develop ===== + - Add support for ansible_network_os + 0.10.0 ===== From 5e031d79f755f94a56ae917e283b8db71410b93b Mon Sep 17 00:00:00 2001 From: Aaron Johnson Date: Mon, 14 Jan 2019 13:20:38 -0800 Subject: [PATCH 03/17] Update README.md Fix speling --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8a1d43d..ab5a211 100644 --- a/README.md +++ b/README.md @@ -105,7 +105,7 @@ Example to get compliance report validation_file: validate.yml ``` -Example to use default connection paramters: +Example to use default connection parameters: ``` - name: get facts from device napalm_get_facts: From 17d7b3277b3f7507167e418e6475f61d8cfa8410 Mon Sep 17 00:00:00 2001 From: Aaron Johnson Date: Tue, 15 Jan 2019 13:08:54 -0800 Subject: [PATCH 04/17] Update CHANGELOG.rst Reflects change made to README.md --- CHANGELOG.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 4611b89..a0a8074 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -2,6 +2,7 @@ develop ===== - Add support for ansible_network_os + - Fix spelling for parameters in README.md 0.10.0 ===== From 8902928668ba326c9e649b1999b7b30c07128739 Mon Sep 17 00:00:00 2001 From: Vincent Bernat Date: Wed, 6 Mar 2019 18:31:09 +0100 Subject: [PATCH 05/17] Expand filenames for *_file parameters In Ansible, most filenames are passed through expanduser/expandvars. This way, a user can use something like `~/batman/{{ host }}.conf`. Do the same in napalm-ansible. --- CHANGELOG.rst | 1 + napalm_ansible/modules/napalm_install_config.py | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index a0a8074..817db84 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -3,6 +3,7 @@ develop - Add support for ansible_network_os - Fix spelling for parameters in README.md + - Expand filenames for `*_file` parameters 0.10.0 ===== diff --git a/napalm_ansible/modules/napalm_install_config.py b/napalm_ansible/modules/napalm_install_config.py index 38c4b37..1afc747 100644 --- a/napalm_ansible/modules/napalm_install_config.py +++ b/napalm_ansible/modules/napalm_install_config.py @@ -18,6 +18,7 @@ along with Ansible. If not, see . """ from __future__ import unicode_literals, print_function +import os.path from ansible.module_utils.basic import AnsibleModule, return_values @@ -236,6 +237,14 @@ def main(): get_diffs = module.params['get_diffs'] archive_file = module.params['archive_file'] candidate_file = module.params['candidate_file'] + if config_file: + config_file = os.path.expanduser(os.path.expandvars(config_file)) + if diff_file: + diff_file = os.path.expanduser(os.path.expandvars(diff_file)) + if archive_file: + archive_file = os.path.expanduser(os.path.expandvars(archive_file)) + if candidate_file: + candidate_file = os.path.expanduser(os.path.expandvars(candidate_file)) argument_check = {'hostname': hostname, 'username': username, 'dev_os': dev_os} for key, val in argument_check.items(): From bef3e9f34861c0130a91b8be50fe5855db1172ac Mon Sep 17 00:00:00 2001 From: Kirk Byers Date: Tue, 21 May 2019 14:17:05 -0700 Subject: [PATCH 06/17] Testing Ansible 2.8 --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3af0261..56b5612 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,10 +6,10 @@ python: - 3.6 env: - - ANSIBLE_VERSION=2.3 - - ANSIBLE_VERSION=2.4 - ANSIBLE_VERSION=2.5 - ANSIBLE_VERSION=2.6 + - ANSIBLE_VERSION=2.7 + - ANSIBLE_VERSION=2.8 install: - pip install pylama From 78b20a3bccb413480d1c20e3b76fecda4e564d01 Mon Sep 17 00:00:00 2001 From: Kirk Byers Date: Sun, 26 May 2019 12:18:26 -0700 Subject: [PATCH 07/17] Fixing Ansible 2.8 backwards incompatible changes --- napalm_ansible/modules/napalm_cli.py | 5 +++-- napalm_ansible/modules/napalm_get_facts.py | 3 ++- napalm_ansible/modules/napalm_install_config.py | 3 ++- napalm_ansible/modules/napalm_parse_yang.py | 3 ++- napalm_ansible/modules/napalm_ping.py | 5 +++-- napalm_ansible/modules/napalm_validate.py | 3 ++- tests/napalm_cli/multiple_commands.yaml | 4 ++-- 7 files changed, 16 insertions(+), 10 deletions(-) diff --git a/napalm_ansible/modules/napalm_cli.py b/napalm_ansible/modules/napalm_cli.py index 7827c81..b838a8c 100644 --- a/napalm_ansible/modules/napalm_cli.py +++ b/napalm_ansible/modules/napalm_cli.py @@ -1,5 +1,6 @@ from __future__ import unicode_literals, print_function -from ansible.module_utils.basic import AnsibleModule, return_values +from ansible.module_utils.basic import AnsibleModule +from ansible.module_utils.common.parameters import _return_datastructure_name as return_values DOCUMENTATION = ''' @@ -175,7 +176,7 @@ def main(): except Exception as e: module.fail_json(msg="cannot close device connection: " + str(e)) - module.exit_json(changed=False, results=cli_response) + module.exit_json(changed=False, cli_results=cli_response) if __name__ == '__main__': diff --git a/napalm_ansible/modules/napalm_get_facts.py b/napalm_ansible/modules/napalm_get_facts.py index 3fae938..f507b95 100644 --- a/napalm_ansible/modules/napalm_get_facts.py +++ b/napalm_ansible/modules/napalm_get_facts.py @@ -17,7 +17,8 @@ along with Ansible. If not, see . """ from __future__ import unicode_literals, print_function -from ansible.module_utils.basic import AnsibleModule, return_values +from ansible.module_utils.basic import AnsibleModule +from ansible.module_utils.common.parameters import _return_datastructure_name as return_values DOCUMENTATION = ''' diff --git a/napalm_ansible/modules/napalm_install_config.py b/napalm_ansible/modules/napalm_install_config.py index 1afc747..1e997d8 100644 --- a/napalm_ansible/modules/napalm_install_config.py +++ b/napalm_ansible/modules/napalm_install_config.py @@ -19,7 +19,8 @@ """ from __future__ import unicode_literals, print_function import os.path -from ansible.module_utils.basic import AnsibleModule, return_values +from ansible.module_utils.basic import AnsibleModule +from ansible.module_utils.common.parameters import _return_datastructure_name as return_values DOCUMENTATION = ''' diff --git a/napalm_ansible/modules/napalm_parse_yang.py b/napalm_ansible/modules/napalm_parse_yang.py index 6a2b7fc..f306aa3 100644 --- a/napalm_ansible/modules/napalm_parse_yang.py +++ b/napalm_ansible/modules/napalm_parse_yang.py @@ -17,7 +17,8 @@ along with Ansible. If not, see . """ from __future__ import unicode_literals, print_function -from ansible.module_utils.basic import AnsibleModule, return_values +from ansible.module_utils.basic import AnsibleModule +from ansible.module_utils.common.parameters import _return_datastructure_name as return_values import json napalm_found = False diff --git a/napalm_ansible/modules/napalm_ping.py b/napalm_ansible/modules/napalm_ping.py index d3eeb32..8ef017a 100644 --- a/napalm_ansible/modules/napalm_ping.py +++ b/napalm_ansible/modules/napalm_ping.py @@ -14,7 +14,8 @@ along with Ansible. If not, see . """ from __future__ import unicode_literals, print_function -from ansible.module_utils.basic import AnsibleModule, return_values +from ansible.module_utils.basic import AnsibleModule +from ansible.module_utils.common.parameters import _return_datastructure_name as return_values DOCUMENTATION = ''' @@ -236,7 +237,7 @@ def main(): except Exception as e: module.fail_json(msg="cannot close device connection: " + str(e)) - module.exit_json(changed=False, results=ping_response) + module.exit_json(changed=False, ping_results=ping_response) if __name__ == '__main__': diff --git a/napalm_ansible/modules/napalm_validate.py b/napalm_ansible/modules/napalm_validate.py index 7d48c39..2047bcd 100644 --- a/napalm_ansible/modules/napalm_validate.py +++ b/napalm_ansible/modules/napalm_validate.py @@ -1,5 +1,6 @@ from __future__ import unicode_literals, print_function -from ansible.module_utils.basic import AnsibleModule, return_values +from ansible.module_utils.basic import AnsibleModule +from ansible.module_utils.common.parameters import _return_datastructure_name as return_values napalm_found = False try: diff --git a/tests/napalm_cli/multiple_commands.yaml b/tests/napalm_cli/multiple_commands.yaml index 97ad04e..16e68ee 100644 --- a/tests/napalm_cli/multiple_commands.yaml +++ b/tests/napalm_cli/multiple_commands.yaml @@ -19,5 +19,5 @@ register: result - assert: that: - - "{{ result.results['show version']|length > 10 }}" - - "{{ result.results['show interfaces']|length > 10 }}" + - "{{ result.cli_results['show version']|length > 10 }}" + - "{{ result.cli_results['show interfaces']|length > 10 }}" From 481d08d8df996c2c427526f67660857398237596 Mon Sep 17 00:00:00 2001 From: Kirk Byers Date: Sun, 26 May 2019 13:59:43 -0700 Subject: [PATCH 08/17] Fix so ansible works both pre 2.8 and post 2.8; remove old references to napalm_base --- napalm_ansible/modules/napalm_cli.py | 14 ++++---------- napalm_ansible/modules/napalm_get_facts.py | 16 ++++++---------- napalm_ansible/modules/napalm_install_config.py | 16 ++++++---------- napalm_ansible/modules/napalm_parse_yang.py | 16 ++++++---------- napalm_ansible/modules/napalm_ping.py | 16 ++++++---------- napalm_ansible/modules/napalm_validate.py | 16 ++++++---------- 6 files changed, 34 insertions(+), 60 deletions(-) diff --git a/napalm_ansible/modules/napalm_cli.py b/napalm_ansible/modules/napalm_cli.py index b838a8c..1ed1588 100644 --- a/napalm_ansible/modules/napalm_cli.py +++ b/napalm_ansible/modules/napalm_cli.py @@ -1,6 +1,9 @@ from __future__ import unicode_literals, print_function from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.common.parameters import _return_datastructure_name as return_values +try: + from ansible.module_utils.basic import return_values +except ImportError: + from ansible.module_utils.common.parameters import _return_datastructure_name as return_values DOCUMENTATION = ''' @@ -88,15 +91,6 @@ except ImportError: pass -# Legacy for pre-reunification napalm (remove in future) -if not napalm_found: - try: - from napalm_base import get_network_driver # noqa - from napalm_base import ModuleImportError # noqa - napalm_found = True - except ImportError: - pass - def main(): module = AnsibleModule( diff --git a/napalm_ansible/modules/napalm_get_facts.py b/napalm_ansible/modules/napalm_get_facts.py index f507b95..7a52b86 100644 --- a/napalm_ansible/modules/napalm_get_facts.py +++ b/napalm_ansible/modules/napalm_get_facts.py @@ -18,7 +18,12 @@ """ from __future__ import unicode_literals, print_function from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.common.parameters import _return_datastructure_name as return_values +try: + # Before Ansible 2.8 + from ansible.module_utils.basic import return_values +except ImportError: + # After Ansible 2.8 + from ansible.module_utils.common.parameters import _return_datastructure_name as return_values DOCUMENTATION = ''' @@ -146,15 +151,6 @@ except ImportError: pass -# Legacy for pre-reunification napalm (remove in future) -if not napalm_found: - try: - from napalm_base import get_network_driver # noqa - from napalm_base import ModuleImportError # noqa - napalm_found = True - except ImportError: - pass - def main(): module = AnsibleModule( diff --git a/napalm_ansible/modules/napalm_install_config.py b/napalm_ansible/modules/napalm_install_config.py index 1e997d8..44325e6 100644 --- a/napalm_ansible/modules/napalm_install_config.py +++ b/napalm_ansible/modules/napalm_install_config.py @@ -20,7 +20,12 @@ from __future__ import unicode_literals, print_function import os.path from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.common.parameters import _return_datastructure_name as return_values +try: + # < Ansible 2.8 + from ansible.module_utils.basic import return_values +except ImportError: + # >= Ansible 2.8 + from ansible.module_utils.common.parameters import _return_datastructure_name as return_values DOCUMENTATION = ''' @@ -167,15 +172,6 @@ except ImportError: pass -# Legacy for pre-reunification napalm (remove in future) -if not napalm_found: - try: - from napalm_base import get_network_driver # noqa - from napalm_base import ModuleImportError # noqa - napalm_found = True - except ImportError: - pass - def save_to_file(content, filename): with open(filename, 'w') as f: diff --git a/napalm_ansible/modules/napalm_parse_yang.py b/napalm_ansible/modules/napalm_parse_yang.py index f306aa3..7fcba5b 100644 --- a/napalm_ansible/modules/napalm_parse_yang.py +++ b/napalm_ansible/modules/napalm_parse_yang.py @@ -18,7 +18,12 @@ """ from __future__ import unicode_literals, print_function from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.common.parameters import _return_datastructure_name as return_values +try: + # < Ansible 2.8 + from ansible.module_utils.basic import return_values +except ImportError: + # >= Ansible 2.8 + from ansible.module_utils.common.parameters import _return_datastructure_name as return_values import json napalm_found = False @@ -29,15 +34,6 @@ except ImportError: pass -# Legacy for pre-reunification napalm (remove in future) -if not napalm_found: - try: - from napalm_base import get_network_driver # noqa - from napalm_base import ModuleImportError # noqa - napalm_found = True - except ImportError: - pass - try: import napalm_yang except ImportError: diff --git a/napalm_ansible/modules/napalm_ping.py b/napalm_ansible/modules/napalm_ping.py index 8ef017a..308f830 100644 --- a/napalm_ansible/modules/napalm_ping.py +++ b/napalm_ansible/modules/napalm_ping.py @@ -15,7 +15,12 @@ """ from __future__ import unicode_literals, print_function from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.common.parameters import _return_datastructure_name as return_values +try: + # < Ansible 2.8 + from ansible.module_utils.basic import return_values +except ImportError: + # >= Ansible 2.8 + from ansible.module_utils.common.parameters import _return_datastructure_name as return_values DOCUMENTATION = ''' @@ -137,15 +142,6 @@ except ImportError: pass -# Legacy for pre-reunification napalm (remove in future) -if not napalm_found: - try: - from napalm_base import get_network_driver # noqa - from napalm_base import ModuleImportError # noqa - napalm_found = True - except ImportError: - pass - def main(): module = AnsibleModule( diff --git a/napalm_ansible/modules/napalm_validate.py b/napalm_ansible/modules/napalm_validate.py index 2047bcd..c4812c4 100644 --- a/napalm_ansible/modules/napalm_validate.py +++ b/napalm_ansible/modules/napalm_validate.py @@ -1,6 +1,11 @@ from __future__ import unicode_literals, print_function from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.common.parameters import _return_datastructure_name as return_values +try: + # < Ansible 2.8 + from ansible.module_utils.basic import return_values +except ImportError: + # >= Ansible 2.8 + from ansible.module_utils.common.parameters import _return_datastructure_name as return_values napalm_found = False try: @@ -10,15 +15,6 @@ except ImportError: pass -# Legacy for pre-reunification napalm (remove in future) -if not napalm_found: - try: - from napalm_base import get_network_driver # noqa - from napalm_base import ModuleImportError # noqa - napalm_found = True - except ImportError: - pass - try: import napalm_yang except ImportError: From 918abfdf2e15ba5ecd82c6b15ad642f94ae5f3d9 Mon Sep 17 00:00:00 2001 From: Kirk Byers Date: Sun, 26 May 2019 14:12:09 -0700 Subject: [PATCH 09/17] Use YAML safe_load; update CHANGELOG --- CHANGELOG.rst | 4 ++++ tests/test_documentation.py | 12 ++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 817db84..f9ec6ae 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -4,6 +4,10 @@ develop - Add support for ansible_network_os - Fix spelling for parameters in README.md - Expand filenames for `*_file` parameters + - Fixing Ansible 2.8 backwards incompatible changes + - Removing support of legacy napalm_ansible + - Changing napalm_cli to cli_results; napalm_ping to ping_results (ansible 2.8 forced change) + - Use yaml safe_load for tests 0.10.0 ===== diff --git a/tests/test_documentation.py b/tests/test_documentation.py index 6f838ec..30418cd 100644 --- a/tests/test_documentation.py +++ b/tests/test_documentation.py @@ -24,7 +24,7 @@ def test_module_documentation_exists(ansible_module): def test_module_documentation_format(ansible_module): module = import_module(ansible_module) - docs = yaml.load(module.DOCUMENTATION) + docs = yaml.safe_load(module.DOCUMENTATION) assert 'author' in docs.keys() assert 'description' in docs.keys() assert 'short_description' in docs.keys() @@ -37,8 +37,8 @@ def test_module_documentation_format(ansible_module): def test_module_examples_format(ansible_module): module = import_module(ansible_module) module_name = ansible_module.replace('napalm_ansible.', '') - examples = yaml.load(module.EXAMPLES) - params = yaml.load(module.DOCUMENTATION)['options'].keys() + examples = yaml.safe_load(module.EXAMPLES) + params = yaml.safe_load(module.DOCUMENTATION)['options'].keys() for example in examples: if module_name in example.keys(): for param in example[module_name]: @@ -47,7 +47,7 @@ def test_module_examples_format(ansible_module): def test_module_return_format(ansible_module): module = import_module(ansible_module) - yaml.load(module.RETURN) + yaml.safe_load(module.RETURN) def test_build_docs(ansible_module): @@ -58,10 +58,10 @@ def test_build_docs(ansible_module): module = import_module(ansible_module) content = {} - content['doc'] = yaml.load(module.DOCUMENTATION) + content['doc'] = yaml.safe_load(module.DOCUMENTATION) content['examples'] = module.EXAMPLES content['example_lines'] = module.EXAMPLES.split('\n') - content['return_values'] = yaml.load(module.RETURN) + content['return_values'] = yaml.safe_load(module.RETURN) module_name = ansible_module.replace('napalm_ansible.', '').split('.')[-1] with open('module_docs/{0}.json'.format(module_name), 'w') as f: From 7f2fa0aae7065b6264e256652c98f59599eaac32 Mon Sep 17 00:00:00 2001 From: Kirk Byers Date: Mon, 27 May 2019 15:14:41 -0700 Subject: [PATCH 10/17] Try again to fix ansible library break across Ansible versions --- napalm_ansible/modules/napalm_cli.py | 39 ++++++++++++++-- napalm_ansible/modules/napalm_get_facts.py | 45 +++++++++++++++---- .../modules/napalm_install_config.py | 41 ++++++++++++++--- napalm_ansible/modules/napalm_parse_yang.py | 42 ++++++++++++++--- napalm_ansible/modules/napalm_ping.py | 41 ++++++++++++++--- napalm_ansible/modules/napalm_validate.py | 41 ++++++++++++++--- requirements.txt | 1 + 7 files changed, 214 insertions(+), 36 deletions(-) diff --git a/napalm_ansible/modules/napalm_cli.py b/napalm_ansible/modules/napalm_cli.py index 1ed1588..da51b47 100644 --- a/napalm_ansible/modules/napalm_cli.py +++ b/napalm_ansible/modules/napalm_cli.py @@ -1,9 +1,40 @@ from __future__ import unicode_literals, print_function from ansible.module_utils.basic import AnsibleModule -try: - from ansible.module_utils.basic import return_values -except ImportError: - from ansible.module_utils.common.parameters import _return_datastructure_name as return_values + +from six import ( + binary_type, + integer_types, + text_type, +) +from ansible.module_utils._text import to_native +from ansible.module_utils.common._collections_compat import Mapping +from ansible.module_utils.common.collections import is_iterable +NoneType = type(None) + + +def return_values(obj): + """ Return native stringified values from datastructures. + + For use with removing sensitive values pre-jsonification.""" + if isinstance(obj, (text_type, binary_type)): + if obj: + yield to_native(obj, errors='surrogate_or_strict') + return + elif isinstance(obj, Mapping): + for element in obj.items(): + for subelement in return_values(element[1]): + yield subelement + elif is_iterable(obj): + for element in obj: + for subelement in return_values(element): + yield subelement + elif isinstance(obj, (bool, NoneType)): + # This must come before int because bools are also ints + return + elif isinstance(obj, tuple(list(integer_types) + [float])): + yield to_native(obj, nonstring='simplerepr') + else: + raise TypeError('Unknown parameter type: %s, %s' % (type(obj), obj)) DOCUMENTATION = ''' diff --git a/napalm_ansible/modules/napalm_get_facts.py b/napalm_ansible/modules/napalm_get_facts.py index 7a52b86..709a0ef 100644 --- a/napalm_ansible/modules/napalm_get_facts.py +++ b/napalm_ansible/modules/napalm_get_facts.py @@ -3,8 +3,8 @@ 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 +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. @@ -18,12 +18,41 @@ """ from __future__ import unicode_literals, print_function from ansible.module_utils.basic import AnsibleModule -try: - # Before Ansible 2.8 - from ansible.module_utils.basic import return_values -except ImportError: - # After Ansible 2.8 - from ansible.module_utils.common.parameters import _return_datastructure_name as return_values + +from six import ( + binary_type, + integer_types, + text_type, +) +from ansible.module_utils._text import to_native +from ansible.module_utils.common._collections_compat import Mapping +from ansible.module_utils.common.collections import is_iterable +NoneType = type(None) + + +def return_values(obj): + """ Return native stringified values from datastructures. + + For use with removing sensitive values pre-jsonification.""" + if isinstance(obj, (text_type, binary_type)): + if obj: + yield to_native(obj, errors='surrogate_or_strict') + return + elif isinstance(obj, Mapping): + for element in obj.items(): + for subelement in return_values(element[1]): + yield subelement + elif is_iterable(obj): + for element in obj: + for subelement in return_values(element): + yield subelement + elif isinstance(obj, (bool, NoneType)): + # This must come before int because bools are also ints + return + elif isinstance(obj, tuple(list(integer_types) + [float])): + yield to_native(obj, nonstring='simplerepr') + else: + raise TypeError('Unknown parameter type: %s, %s' % (type(obj), obj)) DOCUMENTATION = ''' diff --git a/napalm_ansible/modules/napalm_install_config.py b/napalm_ansible/modules/napalm_install_config.py index 44325e6..e51f52a 100644 --- a/napalm_ansible/modules/napalm_install_config.py +++ b/napalm_ansible/modules/napalm_install_config.py @@ -20,12 +20,41 @@ from __future__ import unicode_literals, print_function import os.path from ansible.module_utils.basic import AnsibleModule -try: - # < Ansible 2.8 - from ansible.module_utils.basic import return_values -except ImportError: - # >= Ansible 2.8 - from ansible.module_utils.common.parameters import _return_datastructure_name as return_values + +from six import ( + binary_type, + integer_types, + text_type, +) +from ansible.module_utils._text import to_native +from ansible.module_utils.common._collections_compat import Mapping +from ansible.module_utils.common.collections import is_iterable +NoneType = type(None) + + +def return_values(obj): + """ Return native stringified values from datastructures. + + For use with removing sensitive values pre-jsonification.""" + if isinstance(obj, (text_type, binary_type)): + if obj: + yield to_native(obj, errors='surrogate_or_strict') + return + elif isinstance(obj, Mapping): + for element in obj.items(): + for subelement in return_values(element[1]): + yield subelement + elif is_iterable(obj): + for element in obj: + for subelement in return_values(element): + yield subelement + elif isinstance(obj, (bool, NoneType)): + # This must come before int because bools are also ints + return + elif isinstance(obj, tuple(list(integer_types) + [float])): + yield to_native(obj, nonstring='simplerepr') + else: + raise TypeError('Unknown parameter type: %s, %s' % (type(obj), obj)) DOCUMENTATION = ''' diff --git a/napalm_ansible/modules/napalm_parse_yang.py b/napalm_ansible/modules/napalm_parse_yang.py index 7fcba5b..c657745 100644 --- a/napalm_ansible/modules/napalm_parse_yang.py +++ b/napalm_ansible/modules/napalm_parse_yang.py @@ -18,14 +18,44 @@ """ from __future__ import unicode_literals, print_function from ansible.module_utils.basic import AnsibleModule -try: - # < Ansible 2.8 - from ansible.module_utils.basic import return_values -except ImportError: - # >= Ansible 2.8 - from ansible.module_utils.common.parameters import _return_datastructure_name as return_values import json +from six import ( + binary_type, + integer_types, + text_type, +) +from ansible.module_utils._text import to_native +from ansible.module_utils.common._collections_compat import Mapping +from ansible.module_utils.common.collections import is_iterable +NoneType = type(None) + + +def return_values(obj): + """ Return native stringified values from datastructures. + + For use with removing sensitive values pre-jsonification.""" + if isinstance(obj, (text_type, binary_type)): + if obj: + yield to_native(obj, errors='surrogate_or_strict') + return + elif isinstance(obj, Mapping): + for element in obj.items(): + for subelement in return_values(element[1]): + yield subelement + elif is_iterable(obj): + for element in obj: + for subelement in return_values(element): + yield subelement + elif isinstance(obj, (bool, NoneType)): + # This must come before int because bools are also ints + return + elif isinstance(obj, tuple(list(integer_types) + [float])): + yield to_native(obj, nonstring='simplerepr') + else: + raise TypeError('Unknown parameter type: %s, %s' % (type(obj), obj)) + + napalm_found = False try: from napalm import get_network_driver diff --git a/napalm_ansible/modules/napalm_ping.py b/napalm_ansible/modules/napalm_ping.py index 308f830..c2ef05c 100644 --- a/napalm_ansible/modules/napalm_ping.py +++ b/napalm_ansible/modules/napalm_ping.py @@ -15,12 +15,41 @@ """ from __future__ import unicode_literals, print_function from ansible.module_utils.basic import AnsibleModule -try: - # < Ansible 2.8 - from ansible.module_utils.basic import return_values -except ImportError: - # >= Ansible 2.8 - from ansible.module_utils.common.parameters import _return_datastructure_name as return_values + +from six import ( + binary_type, + integer_types, + text_type, +) +from ansible.module_utils._text import to_native +from ansible.module_utils.common._collections_compat import Mapping +from ansible.module_utils.common.collections import is_iterable +NoneType = type(None) + + +def return_values(obj): + """ Return native stringified values from datastructures. + + For use with removing sensitive values pre-jsonification.""" + if isinstance(obj, (text_type, binary_type)): + if obj: + yield to_native(obj, errors='surrogate_or_strict') + return + elif isinstance(obj, Mapping): + for element in obj.items(): + for subelement in return_values(element[1]): + yield subelement + elif is_iterable(obj): + for element in obj: + for subelement in return_values(element): + yield subelement + elif isinstance(obj, (bool, NoneType)): + # This must come before int because bools are also ints + return + elif isinstance(obj, tuple(list(integer_types) + [float])): + yield to_native(obj, nonstring='simplerepr') + else: + raise TypeError('Unknown parameter type: %s, %s' % (type(obj), obj)) DOCUMENTATION = ''' diff --git a/napalm_ansible/modules/napalm_validate.py b/napalm_ansible/modules/napalm_validate.py index c4812c4..e55a7af 100644 --- a/napalm_ansible/modules/napalm_validate.py +++ b/napalm_ansible/modules/napalm_validate.py @@ -1,11 +1,40 @@ from __future__ import unicode_literals, print_function from ansible.module_utils.basic import AnsibleModule -try: - # < Ansible 2.8 - from ansible.module_utils.basic import return_values -except ImportError: - # >= Ansible 2.8 - from ansible.module_utils.common.parameters import _return_datastructure_name as return_values +from six import ( + binary_type, + integer_types, + text_type, +) +from ansible.module_utils._text import to_native +from ansible.module_utils.common._collections_compat import Mapping +from ansible.module_utils.common.collections import is_iterable +NoneType = type(None) + + +def return_values(obj): + """ Return native stringified values from datastructures. + + For use with removing sensitive values pre-jsonification.""" + if isinstance(obj, (text_type, binary_type)): + if obj: + yield to_native(obj, errors='surrogate_or_strict') + return + elif isinstance(obj, Mapping): + for element in obj.items(): + for subelement in return_values(element[1]): + yield subelement + elif is_iterable(obj): + for element in obj: + for subelement in return_values(element): + yield subelement + elif isinstance(obj, (bool, NoneType)): + # This must come before int because bools are also ints + return + elif isinstance(obj, tuple(list(integer_types) + [float])): + yield to_native(obj, nonstring='simplerepr') + else: + raise TypeError('Unknown parameter type: %s, %s' % (type(obj), obj)) + napalm_found = False try: diff --git a/requirements.txt b/requirements.txt index a98b396..d59b294 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ napalm +six From cdbe03952a340707332419609fea0c517e49f2fc Mon Sep 17 00:00:00 2001 From: Kirk Byers Date: Mon, 27 May 2019 15:31:21 -0700 Subject: [PATCH 11/17] Fix issue with ncclient released package --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index d59b294..1f111a8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ +ncclient==0.6.4 napalm six From 7d3496ff42b69ae97cf5190c239795ae37b7da84 Mon Sep 17 00:00:00 2001 From: Kirk Byers Date: Mon, 27 May 2019 15:36:16 -0700 Subject: [PATCH 12/17] Fixing ncclient issue --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 56b5612..a3bc78a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,7 +13,7 @@ env: install: - pip install pylama - - pip install napalm + - pip install -r requirements.txt - pip install "ansible>=$ANSIBLE_VERSION.0,<$ANSIBLE_VERSION.99" - pip install -r requirements-dev.txt - pip install -e . From 7ef818392bbdda482ade7620542181fcad26bec6 Mon Sep 17 00:00:00 2001 From: Kirk Byers Date: Mon, 27 May 2019 16:08:57 -0700 Subject: [PATCH 13/17] Fix additional issues --- napalm_ansible/modules/napalm_cli.py | 13 +++++++++++-- napalm_ansible/modules/napalm_get_facts.py | 13 +++++++++++-- napalm_ansible/modules/napalm_install_config.py | 13 +++++++++++-- napalm_ansible/modules/napalm_parse_yang.py | 13 +++++++++++-- napalm_ansible/modules/napalm_ping.py | 13 +++++++++++-- napalm_ansible/modules/napalm_validate.py | 13 +++++++++++-- 6 files changed, 66 insertions(+), 12 deletions(-) diff --git a/napalm_ansible/modules/napalm_cli.py b/napalm_ansible/modules/napalm_cli.py index da51b47..d418578 100644 --- a/napalm_ansible/modules/napalm_cli.py +++ b/napalm_ansible/modules/napalm_cli.py @@ -6,11 +6,20 @@ integer_types, text_type, ) +from collections import Mapping from ansible.module_utils._text import to_native -from ansible.module_utils.common._collections_compat import Mapping -from ansible.module_utils.common.collections import is_iterable NoneType = type(None) +def is_iterable(seq, include_strings=False): + """Identify whether the input is an iterable.""" + if not include_strings and is_string(seq): + return False + + try: + iter(seq) + return True + except TypeError: + return False def return_values(obj): """ Return native stringified values from datastructures. diff --git a/napalm_ansible/modules/napalm_get_facts.py b/napalm_ansible/modules/napalm_get_facts.py index 709a0ef..3cd8157 100644 --- a/napalm_ansible/modules/napalm_get_facts.py +++ b/napalm_ansible/modules/napalm_get_facts.py @@ -24,11 +24,20 @@ integer_types, text_type, ) +from collections import Mapping from ansible.module_utils._text import to_native -from ansible.module_utils.common._collections_compat import Mapping -from ansible.module_utils.common.collections import is_iterable NoneType = type(None) +def is_iterable(seq, include_strings=False): + """Identify whether the input is an iterable.""" + if not include_strings and is_string(seq): + return False + + try: + iter(seq) + return True + except TypeError: + return False def return_values(obj): """ Return native stringified values from datastructures. diff --git a/napalm_ansible/modules/napalm_install_config.py b/napalm_ansible/modules/napalm_install_config.py index e51f52a..7c15b28 100644 --- a/napalm_ansible/modules/napalm_install_config.py +++ b/napalm_ansible/modules/napalm_install_config.py @@ -26,11 +26,20 @@ integer_types, text_type, ) +from collections import Mapping from ansible.module_utils._text import to_native -from ansible.module_utils.common._collections_compat import Mapping -from ansible.module_utils.common.collections import is_iterable NoneType = type(None) +def is_iterable(seq, include_strings=False): + """Identify whether the input is an iterable.""" + if not include_strings and is_string(seq): + return False + + try: + iter(seq) + return True + except TypeError: + return False def return_values(obj): """ Return native stringified values from datastructures. diff --git a/napalm_ansible/modules/napalm_parse_yang.py b/napalm_ansible/modules/napalm_parse_yang.py index c657745..9d71493 100644 --- a/napalm_ansible/modules/napalm_parse_yang.py +++ b/napalm_ansible/modules/napalm_parse_yang.py @@ -25,11 +25,20 @@ integer_types, text_type, ) +from collections import Mapping from ansible.module_utils._text import to_native -from ansible.module_utils.common._collections_compat import Mapping -from ansible.module_utils.common.collections import is_iterable NoneType = type(None) +def is_iterable(seq, include_strings=False): + """Identify whether the input is an iterable.""" + if not include_strings and is_string(seq): + return False + + try: + iter(seq) + return True + except TypeError: + return False def return_values(obj): """ Return native stringified values from datastructures. diff --git a/napalm_ansible/modules/napalm_ping.py b/napalm_ansible/modules/napalm_ping.py index c2ef05c..567a065 100644 --- a/napalm_ansible/modules/napalm_ping.py +++ b/napalm_ansible/modules/napalm_ping.py @@ -21,11 +21,20 @@ integer_types, text_type, ) +from collections import Mapping from ansible.module_utils._text import to_native -from ansible.module_utils.common._collections_compat import Mapping -from ansible.module_utils.common.collections import is_iterable NoneType = type(None) +def is_iterable(seq, include_strings=False): + """Identify whether the input is an iterable.""" + if not include_strings and is_string(seq): + return False + + try: + iter(seq) + return True + except TypeError: + return False def return_values(obj): """ Return native stringified values from datastructures. diff --git a/napalm_ansible/modules/napalm_validate.py b/napalm_ansible/modules/napalm_validate.py index e55a7af..dc8496b 100644 --- a/napalm_ansible/modules/napalm_validate.py +++ b/napalm_ansible/modules/napalm_validate.py @@ -5,11 +5,20 @@ integer_types, text_type, ) +from collections import Mapping from ansible.module_utils._text import to_native -from ansible.module_utils.common._collections_compat import Mapping -from ansible.module_utils.common.collections import is_iterable NoneType = type(None) +def is_iterable(seq, include_strings=False): + """Identify whether the input is an iterable.""" + if not include_strings and is_string(seq): + return False + + try: + iter(seq) + return True + except TypeError: + return False def return_values(obj): """ Return native stringified values from datastructures. From 8f3ed2688b10d3d692f6b13c183f487ea5b485a4 Mon Sep 17 00:00:00 2001 From: Kirk Byers Date: Mon, 27 May 2019 16:24:38 -0700 Subject: [PATCH 14/17] Ansible fixes --- napalm_ansible/modules/napalm_cli.py | 29 ----------- napalm_ansible/modules/napalm_get_facts.py | 28 ----------- .../modules/napalm_install_config.py | 28 ----------- napalm_ansible/modules/napalm_parse_yang.py | 49 ++++--------------- napalm_ansible/modules/napalm_ping.py | 28 ----------- napalm_ansible/modules/napalm_validate.py | 29 +---------- 6 files changed, 11 insertions(+), 180 deletions(-) diff --git a/napalm_ansible/modules/napalm_cli.py b/napalm_ansible/modules/napalm_cli.py index d418578..55e664c 100644 --- a/napalm_ansible/modules/napalm_cli.py +++ b/napalm_ansible/modules/napalm_cli.py @@ -1,25 +1,11 @@ from __future__ import unicode_literals, print_function from ansible.module_utils.basic import AnsibleModule - from six import ( binary_type, - integer_types, text_type, ) -from collections import Mapping from ansible.module_utils._text import to_native -NoneType = type(None) - -def is_iterable(seq, include_strings=False): - """Identify whether the input is an iterable.""" - if not include_strings and is_string(seq): - return False - try: - iter(seq) - return True - except TypeError: - return False def return_values(obj): """ Return native stringified values from datastructures. @@ -29,21 +15,6 @@ def return_values(obj): if obj: yield to_native(obj, errors='surrogate_or_strict') return - elif isinstance(obj, Mapping): - for element in obj.items(): - for subelement in return_values(element[1]): - yield subelement - elif is_iterable(obj): - for element in obj: - for subelement in return_values(element): - yield subelement - elif isinstance(obj, (bool, NoneType)): - # This must come before int because bools are also ints - return - elif isinstance(obj, tuple(list(integer_types) + [float])): - yield to_native(obj, nonstring='simplerepr') - else: - raise TypeError('Unknown parameter type: %s, %s' % (type(obj), obj)) DOCUMENTATION = ''' diff --git a/napalm_ansible/modules/napalm_get_facts.py b/napalm_ansible/modules/napalm_get_facts.py index 3cd8157..3471a46 100644 --- a/napalm_ansible/modules/napalm_get_facts.py +++ b/napalm_ansible/modules/napalm_get_facts.py @@ -21,23 +21,10 @@ from six import ( binary_type, - integer_types, text_type, ) -from collections import Mapping from ansible.module_utils._text import to_native -NoneType = type(None) -def is_iterable(seq, include_strings=False): - """Identify whether the input is an iterable.""" - if not include_strings and is_string(seq): - return False - - try: - iter(seq) - return True - except TypeError: - return False def return_values(obj): """ Return native stringified values from datastructures. @@ -47,21 +34,6 @@ def return_values(obj): if obj: yield to_native(obj, errors='surrogate_or_strict') return - elif isinstance(obj, Mapping): - for element in obj.items(): - for subelement in return_values(element[1]): - yield subelement - elif is_iterable(obj): - for element in obj: - for subelement in return_values(element): - yield subelement - elif isinstance(obj, (bool, NoneType)): - # This must come before int because bools are also ints - return - elif isinstance(obj, tuple(list(integer_types) + [float])): - yield to_native(obj, nonstring='simplerepr') - else: - raise TypeError('Unknown parameter type: %s, %s' % (type(obj), obj)) DOCUMENTATION = ''' diff --git a/napalm_ansible/modules/napalm_install_config.py b/napalm_ansible/modules/napalm_install_config.py index 7c15b28..d6411d8 100644 --- a/napalm_ansible/modules/napalm_install_config.py +++ b/napalm_ansible/modules/napalm_install_config.py @@ -23,23 +23,10 @@ from six import ( binary_type, - integer_types, text_type, ) -from collections import Mapping from ansible.module_utils._text import to_native -NoneType = type(None) -def is_iterable(seq, include_strings=False): - """Identify whether the input is an iterable.""" - if not include_strings and is_string(seq): - return False - - try: - iter(seq) - return True - except TypeError: - return False def return_values(obj): """ Return native stringified values from datastructures. @@ -49,21 +36,6 @@ def return_values(obj): if obj: yield to_native(obj, errors='surrogate_or_strict') return - elif isinstance(obj, Mapping): - for element in obj.items(): - for subelement in return_values(element[1]): - yield subelement - elif is_iterable(obj): - for element in obj: - for subelement in return_values(element): - yield subelement - elif isinstance(obj, (bool, NoneType)): - # This must come before int because bools are also ints - return - elif isinstance(obj, tuple(list(integer_types) + [float])): - yield to_native(obj, nonstring='simplerepr') - else: - raise TypeError('Unknown parameter type: %s, %s' % (type(obj), obj)) DOCUMENTATION = ''' diff --git a/napalm_ansible/modules/napalm_parse_yang.py b/napalm_ansible/modules/napalm_parse_yang.py index 9d71493..556ae50 100644 --- a/napalm_ansible/modules/napalm_parse_yang.py +++ b/napalm_ansible/modules/napalm_parse_yang.py @@ -22,48 +22,9 @@ from six import ( binary_type, - integer_types, text_type, ) -from collections import Mapping from ansible.module_utils._text import to_native -NoneType = type(None) - -def is_iterable(seq, include_strings=False): - """Identify whether the input is an iterable.""" - if not include_strings and is_string(seq): - return False - - try: - iter(seq) - return True - except TypeError: - return False - -def return_values(obj): - """ Return native stringified values from datastructures. - - For use with removing sensitive values pre-jsonification.""" - if isinstance(obj, (text_type, binary_type)): - if obj: - yield to_native(obj, errors='surrogate_or_strict') - return - elif isinstance(obj, Mapping): - for element in obj.items(): - for subelement in return_values(element[1]): - yield subelement - elif is_iterable(obj): - for element in obj: - for subelement in return_values(element): - yield subelement - elif isinstance(obj, (bool, NoneType)): - # This must come before int because bools are also ints - return - elif isinstance(obj, tuple(list(integer_types) + [float])): - yield to_native(obj, nonstring='simplerepr') - else: - raise TypeError('Unknown parameter type: %s, %s' % (type(obj), obj)) - napalm_found = False try: @@ -79,6 +40,16 @@ def return_values(obj): napalm_yang = None +def return_values(obj): + """ Return native stringified values from datastructures. + + For use with removing sensitive values pre-jsonification.""" + if isinstance(obj, (text_type, binary_type)): + if obj: + yield to_native(obj, errors='surrogate_or_strict') + return + + DOCUMENTATION = ''' --- module: napalm_parse_yang diff --git a/napalm_ansible/modules/napalm_ping.py b/napalm_ansible/modules/napalm_ping.py index 567a065..9077d02 100644 --- a/napalm_ansible/modules/napalm_ping.py +++ b/napalm_ansible/modules/napalm_ping.py @@ -18,23 +18,10 @@ from six import ( binary_type, - integer_types, text_type, ) -from collections import Mapping from ansible.module_utils._text import to_native -NoneType = type(None) -def is_iterable(seq, include_strings=False): - """Identify whether the input is an iterable.""" - if not include_strings and is_string(seq): - return False - - try: - iter(seq) - return True - except TypeError: - return False def return_values(obj): """ Return native stringified values from datastructures. @@ -44,21 +31,6 @@ def return_values(obj): if obj: yield to_native(obj, errors='surrogate_or_strict') return - elif isinstance(obj, Mapping): - for element in obj.items(): - for subelement in return_values(element[1]): - yield subelement - elif is_iterable(obj): - for element in obj: - for subelement in return_values(element): - yield subelement - elif isinstance(obj, (bool, NoneType)): - # This must come before int because bools are also ints - return - elif isinstance(obj, tuple(list(integer_types) + [float])): - yield to_native(obj, nonstring='simplerepr') - else: - raise TypeError('Unknown parameter type: %s, %s' % (type(obj), obj)) DOCUMENTATION = ''' diff --git a/napalm_ansible/modules/napalm_validate.py b/napalm_ansible/modules/napalm_validate.py index dc8496b..6530ab8 100644 --- a/napalm_ansible/modules/napalm_validate.py +++ b/napalm_ansible/modules/napalm_validate.py @@ -1,24 +1,12 @@ from __future__ import unicode_literals, print_function from ansible.module_utils.basic import AnsibleModule + from six import ( binary_type, - integer_types, text_type, ) -from collections import Mapping from ansible.module_utils._text import to_native -NoneType = type(None) - -def is_iterable(seq, include_strings=False): - """Identify whether the input is an iterable.""" - if not include_strings and is_string(seq): - return False - try: - iter(seq) - return True - except TypeError: - return False def return_values(obj): """ Return native stringified values from datastructures. @@ -28,21 +16,6 @@ def return_values(obj): if obj: yield to_native(obj, errors='surrogate_or_strict') return - elif isinstance(obj, Mapping): - for element in obj.items(): - for subelement in return_values(element[1]): - yield subelement - elif is_iterable(obj): - for element in obj: - for subelement in return_values(element): - yield subelement - elif isinstance(obj, (bool, NoneType)): - # This must come before int because bools are also ints - return - elif isinstance(obj, tuple(list(integer_types) + [float])): - yield to_native(obj, nonstring='simplerepr') - else: - raise TypeError('Unknown parameter type: %s, %s' % (type(obj), obj)) napalm_found = False From 39f4147df52516eb3ef4058d24f829c58b2dd38b Mon Sep 17 00:00:00 2001 From: Kirk Byers Date: Mon, 27 May 2019 16:58:25 -0700 Subject: [PATCH 15/17] Simplifying solution --- napalm_ansible/modules/napalm_cli.py | 12 +++------ napalm_ansible/modules/napalm_get_facts.py | 13 +++------- .../modules/napalm_install_config.py | 13 +++------- napalm_ansible/modules/napalm_parse_yang.py | 13 +++------- napalm_ansible/modules/napalm_ping.py | 13 +++------- napalm_ansible/modules/napalm_validate.py | 26 +++++++------------ 6 files changed, 24 insertions(+), 66 deletions(-) diff --git a/napalm_ansible/modules/napalm_cli.py b/napalm_ansible/modules/napalm_cli.py index 55e664c..6097bd7 100644 --- a/napalm_ansible/modules/napalm_cli.py +++ b/napalm_ansible/modules/napalm_cli.py @@ -1,20 +1,14 @@ from __future__ import unicode_literals, print_function from ansible.module_utils.basic import AnsibleModule -from six import ( - binary_type, - text_type, -) -from ansible.module_utils._text import to_native +# FIX for Ansible 2.8 moving this function and making it private +# greatly simplified for napalm-ansible's use def return_values(obj): """ Return native stringified values from datastructures. For use with removing sensitive values pre-jsonification.""" - if isinstance(obj, (text_type, binary_type)): - if obj: - yield to_native(obj, errors='surrogate_or_strict') - return + yield str(obj) DOCUMENTATION = ''' diff --git a/napalm_ansible/modules/napalm_get_facts.py b/napalm_ansible/modules/napalm_get_facts.py index 3471a46..d58ddc2 100644 --- a/napalm_ansible/modules/napalm_get_facts.py +++ b/napalm_ansible/modules/napalm_get_facts.py @@ -19,21 +19,14 @@ from __future__ import unicode_literals, print_function from ansible.module_utils.basic import AnsibleModule -from six import ( - binary_type, - text_type, -) -from ansible.module_utils._text import to_native - +# FIX for Ansible 2.8 moving this function and making it private +# greatly simplified for napalm-ansible's use def return_values(obj): """ Return native stringified values from datastructures. For use with removing sensitive values pre-jsonification.""" - if isinstance(obj, (text_type, binary_type)): - if obj: - yield to_native(obj, errors='surrogate_or_strict') - return + yield str(obj) DOCUMENTATION = ''' diff --git a/napalm_ansible/modules/napalm_install_config.py b/napalm_ansible/modules/napalm_install_config.py index d6411d8..bfa9cef 100644 --- a/napalm_ansible/modules/napalm_install_config.py +++ b/napalm_ansible/modules/napalm_install_config.py @@ -21,21 +21,14 @@ import os.path from ansible.module_utils.basic import AnsibleModule -from six import ( - binary_type, - text_type, -) -from ansible.module_utils._text import to_native - +# FIX for Ansible 2.8 moving this function and making it private +# greatly simplified for napalm-ansible's use def return_values(obj): """ Return native stringified values from datastructures. For use with removing sensitive values pre-jsonification.""" - if isinstance(obj, (text_type, binary_type)): - if obj: - yield to_native(obj, errors='surrogate_or_strict') - return + yield str(obj) DOCUMENTATION = ''' diff --git a/napalm_ansible/modules/napalm_parse_yang.py b/napalm_ansible/modules/napalm_parse_yang.py index 556ae50..9ba84c9 100644 --- a/napalm_ansible/modules/napalm_parse_yang.py +++ b/napalm_ansible/modules/napalm_parse_yang.py @@ -20,12 +20,6 @@ from ansible.module_utils.basic import AnsibleModule import json -from six import ( - binary_type, - text_type, -) -from ansible.module_utils._text import to_native - napalm_found = False try: from napalm import get_network_driver @@ -40,14 +34,13 @@ napalm_yang = None +# FIX for Ansible 2.8 moving this function and making it private +# greatly simplified for napalm-ansible's use def return_values(obj): """ Return native stringified values from datastructures. For use with removing sensitive values pre-jsonification.""" - if isinstance(obj, (text_type, binary_type)): - if obj: - yield to_native(obj, errors='surrogate_or_strict') - return + yield str(obj) DOCUMENTATION = ''' diff --git a/napalm_ansible/modules/napalm_ping.py b/napalm_ansible/modules/napalm_ping.py index 9077d02..182a32f 100644 --- a/napalm_ansible/modules/napalm_ping.py +++ b/napalm_ansible/modules/napalm_ping.py @@ -16,21 +16,14 @@ from __future__ import unicode_literals, print_function from ansible.module_utils.basic import AnsibleModule -from six import ( - binary_type, - text_type, -) -from ansible.module_utils._text import to_native - +# FIX for Ansible 2.8 moving this function and making it private +# greatly simplified for napalm-ansible's use def return_values(obj): """ Return native stringified values from datastructures. For use with removing sensitive values pre-jsonification.""" - if isinstance(obj, (text_type, binary_type)): - if obj: - yield to_native(obj, errors='surrogate_or_strict') - return + yield str(obj) DOCUMENTATION = ''' diff --git a/napalm_ansible/modules/napalm_validate.py b/napalm_ansible/modules/napalm_validate.py index 6530ab8..ae138e5 100644 --- a/napalm_ansible/modules/napalm_validate.py +++ b/napalm_ansible/modules/napalm_validate.py @@ -1,23 +1,6 @@ from __future__ import unicode_literals, print_function from ansible.module_utils.basic import AnsibleModule -from six import ( - binary_type, - text_type, -) -from ansible.module_utils._text import to_native - - -def return_values(obj): - """ Return native stringified values from datastructures. - - For use with removing sensitive values pre-jsonification.""" - if isinstance(obj, (text_type, binary_type)): - if obj: - yield to_native(obj, errors='surrogate_or_strict') - return - - napalm_found = False try: from napalm import get_network_driver @@ -32,6 +15,15 @@ def return_values(obj): napalm_yang = None +# FIX for Ansible 2.8 moving this function and making it private +# greatly simplified for napalm-ansible's use +def return_values(obj): + """ Return native stringified values from datastructures. + + For use with removing sensitive values pre-jsonification.""" + yield str(obj) + + DOCUMENTATION = ''' --- module: napalm_validate From 4f98a7322b9a72169c7d267656f73978633a8fbd Mon Sep 17 00:00:00 2001 From: Kirk Byers Date: Mon, 3 Jun 2019 09:10:26 -0700 Subject: [PATCH 16/17] Remove ncclient temp fix --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 1f111a8..d59b294 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,2 @@ -ncclient==0.6.4 napalm six From 853fd94e7396b7118da83aed35dad205769a87e7 Mon Sep 17 00:00:00 2001 From: Kirk Byers Date: Mon, 3 Jun 2019 09:30:42 -0700 Subject: [PATCH 17/17] Release 1.0.0 --- CHANGELOG.rst | 10 +++++----- setup.py | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index f9ec6ae..49103a9 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,12 +1,12 @@ -develop +1.0.0 ===== - Add support for ansible_network_os - - Fix spelling for parameters in README.md + - Fix minor documentation errors - Expand filenames for `*_file` parameters - - Fixing Ansible 2.8 backwards incompatible changes - - Removing support of legacy napalm_ansible - - Changing napalm_cli to cli_results; napalm_ping to ping_results (ansible 2.8 forced change) + - Fix Ansible 2.8 backwards incompatible changes + - Removing support of legacy napalm_base + - Changing napalm_cli to cli_results; napalm_ping to ping_results - Use yaml safe_load for tests 0.10.0 diff --git a/setup.py b/setup.py index 100afde..8c3abce 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ setup( name="napalm-ansible", - version='0.10.0', + version='1.0.0', packages=find_packages(exclude=("test*", "library")), author="David Barroso, Kirk Byers, Mircea Ulinic", author_email="dbarrosop@dravetech.com, ktbyers@twb-tech.com",