diff options
author | GomathiselviS <gomathiselvi@gmail.com> | 2020-03-02 17:17:56 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-02 14:17:56 -0800 |
commit | 48bfa3e906da4ce85b55e15ac6ed8a470193d723 (patch) | |
tree | 61bb8f81890e8268f853bd5e4de7171fd10ed269 | |
parent | 7cac554222185e0a316b84931ba5312b19d2250a (diff) | |
download | ansible-48bfa3e906da4ce85b55e15ac6ed8a470193d723.tar.gz |
Fix to - eos_vlans using state parameter replaced is giving odd behavior (#67346)
* backport PR 67318
* added changelog file
* Added missing fixture file
5 files changed, 182 insertions, 4 deletions
diff --git a/changelogs/fragments/67318-eos_vlans_replaced.yml b/changelogs/fragments/67318-eos_vlans_replaced.yml new file mode 100644 index 0000000000..4601df5214 --- /dev/null +++ b/changelogs/fragments/67318-eos_vlans_replaced.yml @@ -0,0 +1,2 @@ +bugfixes: + - fixes the eos_vlans repalced state behavior to configure the 'name' parameter(https://github.com/ansible/ansible/pull/67318) diff --git a/lib/ansible/module_utils/network/eos/config/vlans/vlans.py b/lib/ansible/module_utils/network/eos/config/vlans/vlans.py index 99cb37cd07..c2a701637d 100644 --- a/lib/ansible/module_utils/network/eos/config/vlans/vlans.py +++ b/lib/ansible/module_utils/network/eos/config/vlans/vlans.py @@ -208,16 +208,17 @@ def generate_commands(vlan_id, to_set, to_remove): if "vlan_id" in to_remove: return ["no vlan {0}".format(vlan_id)] + for key in to_remove: + if key in to_set.keys(): + continue + commands.append("no {0}".format(key)) + for key, value in to_set.items(): if key == "vlan_id" or value is None: continue commands.append("{0} {1}".format(key, value)) - for key in to_remove: - commands.append("no {0}".format(key)) - if commands: commands.insert(0, "vlan {0}".format(vlan_id)) - return commands diff --git a/test/integration/targets/eos_vlans/tests/cli/replaced.yaml b/test/integration/targets/eos_vlans/tests/cli/replaced.yaml index ca502ff156..13d68274d2 100644 --- a/test/integration/targets/eos_vlans/tests/cli/replaced.yaml +++ b/test/integration/targets/eos_vlans/tests/cli/replaced.yaml @@ -5,6 +5,7 @@ config: - vlan_id: 20 state: suspend + name: twentyreplaced other_config: - vlan_id: 10 name: ten diff --git a/test/units/modules/network/eos/fixtures/eos_vlan_config.cfg b/test/units/modules/network/eos/fixtures/eos_vlan_config.cfg new file mode 100644 index 0000000000..25d26a3602 --- /dev/null +++ b/test/units/modules/network/eos/fixtures/eos_vlan_config.cfg @@ -0,0 +1,2 @@ +vlan_id 10 + name ten diff --git a/test/units/modules/network/eos/test_eos_vlans.py b/test/units/modules/network/eos/test_eos_vlans.py new file mode 100644 index 0000000000..63f4d38d14 --- /dev/null +++ b/test/units/modules/network/eos/test_eos_vlans.py @@ -0,0 +1,172 @@ +# +# (c) 2019, Ansible by Red Hat, inc +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +# + +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +from units.compat.mock import patch +from ansible.modules.network.eos import eos_vlans +from units.modules.utils import set_module_args +from .eos_module import TestEosModule, load_fixture + + +class TestEosVlansModule(TestEosModule): + module = eos_vlans + + def setUp(self): + super(TestEosVlansModule, self).setUp() + + self.mock_get_config = patch('ansible.module_utils.network.common.network.Config.get_config') + self.get_config = self.mock_get_config.start() + + self.mock_load_config = patch('ansible.module_utils.network.common.network.Config.load_config') + self.load_config = self.mock_load_config.start() + + self.mock_get_resource_connection_config = patch('ansible.module_utils.network.common.cfg.base.get_resource_connection') + self.get_resource_connection_config = self.mock_get_resource_connection_config.start() + + self.mock_get_resource_connection_facts = patch('ansible.module_utils.network.common.facts.facts.get_resource_connection') + self.get_resource_connection_facts = self.mock_get_resource_connection_facts.start() + + self.mock_edit_config = patch('ansible.module_utils.network.eos.providers.providers.CliProvider.edit_config') + self.edit_config = self.mock_edit_config.start() + + self.mock_execute_show_command = patch('ansible.module_utils.network.eos.config.vlans.vlans.Vlans.get_vlans_facts') + self.execute_show_command = self.mock_execute_show_command.start() + + def tearDown(self): + super(TestEosVlansModule, self).tearDown() + self.mock_get_resource_connection_config.stop() + self.mock_get_resource_connection_facts.stop() + self.mock_edit_config.stop() + self.mock_get_config.stop() + self.mock_load_config.stop() + self.mock_execute_show_command.stop() + + def load_fixtures(self, commands=None, transport='cli'): + file_cmd = load_fixture('eos_vlan_config.cfg').split() + file_cmd_dict = {} + for i in range(0, len(file_cmd), 2): + if file_cmd[i] == 'vlan_id': + y = int(file_cmd[i + 1]) + else: + y = file_cmd[i + 1] + file_cmd_dict.update({file_cmd[i]: y}) + self.execute_show_command.return_value = [file_cmd_dict] + + def test_eos_vlan_default(self): + self.execute_show_command.return_value = [] + set_module_args(dict( + config=[dict( + vlan_id=30, + name="thirty" + )] + )) + commands = ['vlan 30', 'name thirty'] + self.execute_module(changed=True, commands=commands) + + def test_eos_vlan_default_idempotent(self): + self.execute_show_command.return_value = load_fixture('eos_vlan_config.cfg') + set_module_args(dict( + config=[dict( + vlan_id=10, + name="ten" + )] + )) + self.execute_module(changed=False, commands=[]) + + def test_eos_vlan_merged(self): + self.execute_show_command.return_value = [] + set_module_args(dict( + config=[dict( + vlan_id=30, + name="thirty" + )], state="merged" + )) + commands = ['vlan 30', 'name thirty'] + self.execute_module(changed=True, commands=commands) + + def test_eos_vlan_merged_idempotent(self): + self.execute_show_command.return_value = load_fixture('eos_vlan_config.cfg') + set_module_args(dict( + config=[dict( + vlan_id=10, + name="ten" + )], state="merged" + )) + self.execute_module(changed=False, commands=[]) + + def test_eos_vlan_replaced(self): + self.execute_show_command.return_value = [] + set_module_args(dict( + config=[dict( + vlan_id=10, + name="tenreplaced", + state="suspend" + )], state="replaced" + )) + commands = ['vlan 10', 'name tenreplaced', 'state suspend'] + self.execute_module(changed=True, commands=commands) + + def test_eos_vlan_replaced_idempotent(self): + self.execute_show_command.return_value = load_fixture('eos_vlan_config.cfg') + set_module_args(dict( + config=[dict( + vlan_id=10, + name="ten" + )], state="replaced" + )) + self.execute_module(changed=False, commands=[]) + + def test_eos_vlan_overridden(self): + self.execute_show_command.return_value = [] + set_module_args(dict( + config=[dict( + vlan_id=30, + name="thirty", + state="suspend" + )], state="overridden" + )) + commands = ['no vlan 10', 'vlan 30', 'name thirty', 'state suspend'] + self.execute_module(changed=True, commands=commands) + + def test_eos_vlan_overridden_idempotent(self): + self.execute_show_command.return_value = load_fixture('eos_vlan_config.cfg') + set_module_args(dict( + config=[dict( + vlan_id=10, + name="ten" + )], state="overridden" + )) + self.execute_module(changed=False, commands=[]) + + def test_eos_vlan_deleted(self): + set_module_args(dict( + config=[dict( + vlan_id=10, + name="ten", + )], state="deleted" + )) + commands = ['no vlan 10'] + self.execute_module(changed=True, commands=commands) + + def test_eos_vlan_id_datatype(self): + set_module_args(dict( + config=[dict( + vlan_id="thirty" + )] + )) + result = self.execute_module(failed=True) + self.assertIn("we were unable to convert to int", result['msg']) + + def test_eos_vlan_state_datatype(self): + set_module_args(dict( + config=[dict( + vlan_id=30, + state=10 + )] + )) + result = self.execute_module(failed=True) + self.assertIn("value of state must be one of: active, suspend", result['msg']) |