From 343b83041e11d48239315bd843f339e7d0c2b789 Mon Sep 17 00:00:00 2001 From: Trishna Guha Date: Thu, 1 Jun 2017 08:58:35 +0530 Subject: [PATCH] nxos_feature fix and unit test (#25200) * nxos_feature fix Signed-off-by: Trishna Guha * nxos_feature unit test Signed-off-by: Trishna Guha * remove from pep8/legacy-file Signed-off-by: Trishna Guha --- .../modules/network/nxos/nxos_feature.py | 77 ++++++++----------- test/sanity/pep8/legacy-files.txt | 1 - .../fixtures/nxos_feature/show_feature.txt | 4 + .../modules/network/nxos/test_nxos_feature.py | 71 +++++++++++++++++ 4 files changed, 109 insertions(+), 44 deletions(-) create mode 100644 test/units/modules/network/nxos/fixtures/nxos_feature/show_feature.txt create mode 100644 test/units/modules/network/nxos/test_nxos_feature.py diff --git a/lib/ansible/modules/network/nxos/nxos_feature.py b/lib/ansible/modules/network/nxos/nxos_feature.py index 5c870d6ec32..2c0211afb7d 100644 --- a/lib/ansible/modules/network/nxos/nxos_feature.py +++ b/lib/ansible/modules/network/nxos/nxos_feature.py @@ -16,10 +16,11 @@ # along with Ansible. If not, see . # -ANSIBLE_METADATA = {'metadata_version': '1.0', - 'status': ['preview'], - 'supported_by': 'community'} - +ANSIBLE_METADATA = { + 'metadata_version': '1.0', + 'status': ['preview'], + 'supported_by': 'community' +} DOCUMENTATION = ''' --- @@ -28,21 +29,21 @@ extends_documentation_fragment: nxos version_added: "2.1" short_description: Manage features in NX-OS switches. description: - - Offers ability to enable and disable features in NX-OS. + - Offers ability to enable and disable features in NX-OS. author: - - Jason Edelman (@jedelman8) - - Gabriele Gerbino (@GGabriele) + - Jason Edelman (@jedelman8) + - Gabriele Gerbino (@GGabriele) options: - feature: - description: - - Name of feature. - required: true - state: - description: - - Desired state of the feature. - required: false - default: 'enabled' - choices: ['enabled','disabled'] + feature: + description: + - Name of feature. + required: true + state: + description: + - Desired state of the feature. + required: false + default: 'enabled' + choices: ['enabled','disabled'] ''' EXAMPLES = ''' @@ -50,20 +51,16 @@ EXAMPLES = ''' nxos_feature: feature: lacp state: enabled - host: "{{ inventory_hostname }}" - name: Ensure ospf is disabled nxos_feature: feature: ospf state: disabled - host: "{{ inventory_hostname }}" - name: Ensure vpc is enabled nxos_feature: feature: vpc state: enabled - host: "{{ inventory_hostname }}" - ''' RETURN = ''' @@ -73,6 +70,7 @@ commands: type: list sample: ['nv overlay evpn'] ''' + import re from ansible.module_utils.basic import AnsibleModule @@ -80,6 +78,7 @@ from ansible.module_utils.nxos import load_config, run_commands from ansible.module_utils.nxos import nxos_argument_spec from ansible.module_utils.nxos import check_args as nxos_check_args + def check_args(module, warnings): nxos_check_args(module, warnings) @@ -91,12 +90,13 @@ def check_args(module, warnings): def get_available_features(feature, module): available_features = {} feature_regex = '(?P\S+)\s+\d+\s+(?P.*)' - command = 'show feature' + command = {'command': 'show feature', 'output': 'text'} - command = {'command': command, 'output': 'text'} - - body = run_commands(module, [command]) - split_body = body[0].splitlines() + try: + body = run_commands(module, [command])[0] + split_body = body.splitlines() + except (KeyError, IndexError): + return {} for line in split_body: try: @@ -115,14 +115,12 @@ def get_available_features(feature, module): if feature not in available_features: available_features[feature] = state else: - if (available_features[feature] == 'disabled' and - state == 'enabled'): + if available_features[feature] == 'disabled' and state == 'enabled': available_features[feature] = state return available_features - def get_commands(proposed, existing, state, module): feature = validate_feature(module, mode='config') commands = [] @@ -159,7 +157,7 @@ def validate_feature(module, mode='show'): 'telnet': 'telnetServer', 'ethernet-link-oam': 'elo', 'port-security': 'eth_port_sec' - }, + }, 'config': { 'nve': 'nv overlay', 'vnseg_vlan': 'vn-segment-vlan-based', @@ -174,8 +172,8 @@ def validate_feature(module, mode='show'): 'telnetServer': 'telnet', 'elo': 'ethernet-link-oam', 'eth_port_sec': 'port-security' - } } + } if feature in feature_to_be_mapped[mode]: feature = feature_to_be_mapped[mode][feature] @@ -196,11 +194,11 @@ def main(): argument_spec.update(nxos_argument_spec) - module = AnsibleModule(argument_spec=argument_spec, - supports_check_mode=True) + module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) warnings = list() check_args(module, warnings) + results = dict(changed=False, warnings=warnings) feature = validate_feature(module) state = module.params['state'].lower() @@ -216,25 +214,18 @@ def main(): existing = dict(state=existstate) proposed = dict(state=state) - changed = False - end_state = existing + results['changed'] = False cmds = get_commands(proposed, existing, state, module) if cmds: if not module.check_mode: load_config(module, cmds) - changed = True - - results = { - 'commands': cmds, - 'changed': changed, - 'warnings': warnings - } + results['changed'] = True + results['commands'] = cmds module.exit_json(**results) if __name__ == '__main__': main() - diff --git a/test/sanity/pep8/legacy-files.txt b/test/sanity/pep8/legacy-files.txt index 09c2b127eac..018ba9f2eb0 100644 --- a/test/sanity/pep8/legacy-files.txt +++ b/test/sanity/pep8/legacy-files.txt @@ -435,7 +435,6 @@ lib/ansible/modules/network/nxos/nxos_aaa_server_host.py lib/ansible/modules/network/nxos/nxos_command.py lib/ansible/modules/network/nxos/nxos_config.py lib/ansible/modules/network/nxos/nxos_facts.py -lib/ansible/modules/network/nxos/nxos_feature.py lib/ansible/modules/network/nxos/nxos_gir.py lib/ansible/modules/network/nxos/nxos_gir_profile_management.py lib/ansible/modules/network/nxos/nxos_igmp.py diff --git a/test/units/modules/network/nxos/fixtures/nxos_feature/show_feature.txt b/test/units/modules/network/nxos/fixtures/nxos_feature/show_feature.txt new file mode 100644 index 00000000000..cf6dbdbde81 --- /dev/null +++ b/test/units/modules/network/nxos/fixtures/nxos_feature/show_feature.txt @@ -0,0 +1,4 @@ +Feature Name Instance State +-------------------- -------- ----- +nve 1 disabled +ospf 1 enabled diff --git a/test/units/modules/network/nxos/test_nxos_feature.py b/test/units/modules/network/nxos/test_nxos_feature.py new file mode 100644 index 00000000000..c39f1d9c071 --- /dev/null +++ b/test/units/modules/network/nxos/test_nxos_feature.py @@ -0,0 +1,71 @@ +# (c) 2016 Red Hat Inc. +# +# 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 . + +# Make coding more python3-ish +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +import json + +from ansible.compat.tests.mock import patch +from ansible.modules.network.nxos import nxos_feature +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosFeatureModule(TestNxosModule): + + module = nxos_feature + + def setUp(self): + self.mock_run_commands = patch('ansible.modules.network.nxos.nxos_feature.run_commands') + self.run_commands = self.mock_run_commands.start() + + self.mock_load_config = patch('ansible.modules.network.nxos.nxos_feature.load_config') + self.load_config = self.mock_load_config.start() + + def tearDown(self): + self.mock_run_commands.stop() + self.mock_load_config.stop() + + def load_fixtures(self, commands=None): + def load_from_file(*args, **kwargs): + module, commands = args + output = list() + + for item in commands: + try: + obj = json.loads(item['command']) + command = obj['command'] + except ValueError: + command = item['command'] + filename = str(command).replace(' ', '_') + filename = 'nxos_feature/%s.txt' % filename + output.append(load_fixture(filename)) + return output + + self.run_commands.side_effect = load_from_file + self.load_config.return_value = None + + def test_nxos_feature_enable(self): + set_module_args(dict(feature='nve', state='enabled')) + result = self.execute_module(changed=True) + self.assertEqual(result['commands'], ['feature nv overlay']) + + def test_nxos_feature_disable(self): + set_module_args(dict(feature='ospf', state='disabled')) + result = self.execute_module(changed=True) + self.assertEqual(result['commands'], ['no feature ospf'])