diff options
Diffstat (limited to 'ansible_collections/dellemc/os6/tests/unit')
17 files changed, 748 insertions, 0 deletions
diff --git a/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/__init__.py b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/__init__.py diff --git a/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/os6_config_config.cfg b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/os6_config_config.cfg new file mode 100644 index 00000000..a8ed721c --- /dev/null +++ b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/os6_config_config.cfg @@ -0,0 +1,16 @@ +! +hostname router +exit +! +interface Te1/0/1 +description "test_string" +exit +! +interface Te1/0/2 +no shutdown +exit +! +interface Te1/0/9 +switchport access vlan 2 +exit + diff --git a/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/os6_config_src.cfg b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/os6_config_src.cfg new file mode 100644 index 00000000..70d5f665 --- /dev/null +++ b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/os6_config_src.cfg @@ -0,0 +1,7 @@ +! +hostname foo +exit +! +interface Te1/0/2 +shutdown +exit diff --git a/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_interfaces b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_interfaces new file mode 100644 index 00000000..f6aede90 --- /dev/null +++ b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_interfaces @@ -0,0 +1,41 @@ +Interface Name................................. Te1/0/1 +SOC Hardware Info.............................. BCM56842_A1 +Link Status.................................... Up /None +Keepalive Enabled.............................. FALSE +Err-disable Cause.............................. None +VLAN Membership Mode........................... Trunk Mode +VLAN Membership................................ (1),2-4096 +MTU Size....................................... 1518 +Port Mode [Duplex]............................. Full +Port Speed..................................... 1000 +Link Debounce Flaps............................ 0 +Auto-Negotation Status......................... Auto +Burned MAC Address............................. F8B1.565B.615E +L3 MAC Address................................. F8B1.565B.615F +Sample Load Interval........................... 300 +Received Input Rate Bits/Sec................... 0 +Received Input Rate Packets/Sec................ 0 +Transmitted Input Rate Bits/Sec................ 440 +Transmitted Input Rate Packets/Sec : .......... 0 +Total Packets Received Without Errors.......... 0 +Unicast Packets Received....................... 0 +Multicast Packets Received..................... 0 +Broadcast Packets Received..................... 0 +Total Packets Received with MAC Errors......... 0 +Jabbers Received............................... 0 +Fragments/Undersize Received................... 0 +Alignment Errors............................... 0 +FCS Errors..................................... 0 +Overruns....................................... 0 +Total Received Packets Not Forwarded........... 0 +Total Packets Transmitted Successfully......... 381302 +Unicast Packets Transmitted.................... 1 +Multicast Packets Transmitted.................. 351645 +Broadcast Packets Transmitted.................. 29656 +Transmit Packets Discarded..................... 0 +Total Transmit Errors.......................... 0 +Total Transmit Packets Discarded............... 0 +Single Collision Frames........................ 0 +Multiple Collision Frames...................... 0 +Excessive Collision Frames..................... 0 + diff --git a/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_interfaces_status b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_interfaces_status new file mode 100644 index 00000000..28defda6 --- /dev/null +++ b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_interfaces_status @@ -0,0 +1,48 @@ +Port Description Duplex Speed Neg Link Flow M VLAN + State Ctrl +--------- --------------- ------ ------- ---- ------ ----- -- ------------------- +Te1/0/1 connected to sp Full 1000 Auto Up Off T (1),2-4096 +Te1/0/2 to_NIC_1 Full 1000 Auto Up Off A 99 +Te1/0/3 N/A Unknown Auto Down Off A 1 +Te1/0/4 N/A Unknown Auto Down Off A 1 +Te1/0/5 N/A Unknown Auto Down Off A 1 +Te1/0/6 N/A Unknown Auto Down Off A 1 +Te1/0/7 N/A Unknown Auto Down Off A 1 +Te1/0/8 N/A Unknown Auto Down Off A 1 +Te1/0/9 N/A Unknown Auto Down Off A 2 +Te1/0/10 N/A Unknown Auto Down Off A 1 +Te1/0/11 N/A Unknown Auto Down Off A 1 +Te1/0/12 N/A Unknown Auto Down Off A 1 +Te1/0/13 N/A Unknown Auto Down Off A 1 +Te1/0/14 N/A Unknown Auto Down Off A 1 +Te1/0/15 N/A Unknown Auto Down Off A 1 +Te1/0/16 N/A Unknown Auto Down Off A 1 +Te1/0/17 N/A Unknown Auto Down Off A 1 +Te1/0/18 N/A Unknown Auto Down Off A 1 +Te1/0/19 N/A Unknown Auto Down Off A 1 +Te1/0/20 N/A Unknown Auto Down Off A 1 +Te1/0/21 N/A Unknown Auto Down Off A 1 +Te1/0/22 N/A Unknown Auto Down Off A 100 +Te1/0/23 N/A Unknown Auto Down Off A 1 +Te1/0/24 N/A Unknown Auto Down Off A 1 +Fo1/1/1 N/A N/A N/A Detach N/A +Fo1/1/2 Full 40000 Off Down Off A 1 +Te1/1/1 N/A N/A N/A Detach N/A +Te1/1/2 N/A N/A N/A Detach N/A +Te1/1/3 N/A N/A N/A Detach N/A +Te1/1/4 N/A N/A N/A Detach N/A +Te1/1/5 N/A N/A N/A Detach N/A +Te1/1/6 N/A N/A N/A Detach N/A +Te1/1/7 N/A N/A N/A Detach N/A +Te1/1/8 N/A N/A N/A Detach N/A + +Oob Type Link + State +--- ------------------------------ ----- +oob Out-Of-Band Up + + +Port Description Link M VLAN +Channel State +------- ------------------------------ ------- -- ------------------- + diff --git a/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_interfaces_transceiver_properties b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_interfaces_transceiver_properties new file mode 100644 index 00000000..976f45a8 --- /dev/null +++ b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_interfaces_transceiver_properties @@ -0,0 +1,6 @@ +Yes: Dell Qualified No: Not Qualified +N/A : Not Applicable +Port Type Media Serial Number Dell Qualified +--------- ------- --------------------- --------------------- -------------- + + diff --git a/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_ip_int b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_ip_int new file mode 100644 index 00000000..043ee2cc --- /dev/null +++ b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_ip_int @@ -0,0 +1,15 @@ +Default Gateway................................ 0.0.0.0 +L3 MAC Address................................. F8B1.565B.615F + +Routing Interfaces: + +Interface State IP Address IP Mask Method +---------- ----- --------------- --------------- ------- +Vl1 Down 0.0.0.0 0.0.0.0 None +Vl2 Up 0.0.0.0 0.0.0.0 DHCP +Vl99 Up 10.99.1.2 255.255.0.0 Manual +Vl100 Up 3.3.3.3 255.255.255.0 Manual +Vl999 Up 10.250.1.2 255.255.255.0 Manual +Vl1010 Up 10.1.1.1 255.255.255.0 Manual +Vl1681 Up 192.168.100.1 255.255.255.0 Manual + diff --git a/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_lldp b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_lldp new file mode 100644 index 00000000..be89c415 --- /dev/null +++ b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_lldp @@ -0,0 +1,11 @@ +LLDP Global Configuration + + +Transmit Interval............................ 30 seconds + +Transmit Hold Multiplier..................... 4 + +Reinit Delay................................. 2 seconds + +Notification Interval........................ 5 seconds + diff --git a/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_lldp_remote-device_all b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_lldp_remote-device_all new file mode 100644 index 00000000..2a22f444 --- /dev/null +++ b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_lldp_remote-device_all @@ -0,0 +1,10 @@ +LLDP Remote Device Summary + +Local +Interface RemID Chassis ID Port ID System Name +--------- ------- ------------------- ----------------- ----------------- +Te1/0/5 14 F8:B1:56:70:49:38 Gi1/0/5 MAA-N2048-6884 +Te1/0/6 15 F8:B1:56:70:49:38 Gi1/0/6 MAA-N2048-6884 + + + diff --git a/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_memory_cpu b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_memory_cpu new file mode 100644 index 00000000..42657693 --- /dev/null +++ b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_memory_cpu @@ -0,0 +1,3 @@ +Total Memory................................... 1723232 KBytes +Available Memory Space......................... 638144 KBytes + diff --git a/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_running-config b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_running-config new file mode 100644 index 00000000..b589c296 --- /dev/null +++ b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_running-config @@ -0,0 +1,124 @@ +!Current Configuration: +!System Description "Dell Networking N4064F, 6.3.3.10, Linux 3.7.10-e54850e7" +!System Software Version 6.3.3.10 +!Cut-through mode is configured as disabled +! +configure +hostname "os6" +slot 1/0 5 ! Dell Networking N4064F +slot 1/1 8 ! Dell 10GBase-T Card +stack +member 1 4 ! N4064F +exit +interface out-of-band +ip address 10.16.148.73 255.255.0.0 10.16.144.254 +exit +no logging console +interface vlan 1 +ip address dhcp +exit +no passwords min-length +username "admin" password 21232f297a57a5a743894a0e4a801fc3 privilege 1 encrypted +line telnet +exec-timeout 0 +exit +ip ssh server +application install SupportAssist auto-restart start-on-boot +! +interface Te1/0/1 +no switchport port-security violation protect +exit +! +interface Te1/0/2 +no switchport port-security violation protect +exit +! +interface Te1/0/3 +no switchport port-security violation protect +exit +! +interface Te1/0/4 +no switchport port-security violation protect +exit +! +interface Te1/0/5 +no switchport port-security violation protect +exit +! +interface Te1/0/6 +no switchport port-security violation protect +exit +! +interface Te1/0/7 +no switchport port-security violation protect +exit +! +interface Te1/0/8 +no switchport port-security violation protect +exit +! +interface Te1/0/9 +no switchport port-security violation protect +exit +! +interface Te1/0/10 +no switchport port-security violation protect +exit +! +interface Te1/0/11 +no switchport port-security violation protect +exit +! +interface port-channel 1 +no switchport port-security violation protect +exit +! +interface port-channel 2 +no switchport port-security violation protect +exit +! +interface port-channel 3 +no switchport port-security violation protect +exit +! +interface port-channel 4 +no switchport port-security violation protect +exit +! +interface port-channel 5 +no switchport port-security violation protect +exit +! +snmp-server enable traps dvmrp +snmp-server enable traps pim +no snmp-server enable traps vrrp +no snmp-server enable traps acl +snmp-server enable traps captive-portal +snmp-server enable traps captive-portal client-auth-failure +snmp-server enable traps captive-portal client-connect +snmp-server enable traps captive-portal client-db-full +snmp-server enable traps captive-portal client-disconnect +router bgp 11 +bgp router-id 1.1.1.1 +maximum-paths 2 +maximum-paths ibgp 2 +network 101.1.2.0 mask 255.255.255.0 +template peer MUX_HNV_ACCESS +remote-as 64918 +exit +neighbor 10.10.234.16 remote-as 64818 +neighbor 10.10.234.16 default-originate +neighbor 10.10.234.16 timers 2 5 +neighbor 2001:4898:5808:ffa2::1 remote-as 64818 +neighbor 2001:4898:5808:ffa2::1 default-originate +neighbor 2001:4898:5808:ffa2::1 timers 2 4 +address-family ipv6 +network 2001:4898:5808:ffa0::/126 +redistribute connected +exit +exit +enable password c4f25f005187e9a85ad6480d3507a541 encrypted +openflow +exit +eula-consent support-assist reject +exit diff --git a/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_running-config__include_hostname b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_running-config__include_hostname new file mode 100644 index 00000000..2015aaf9 --- /dev/null +++ b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_running-config__include_hostname @@ -0,0 +1,3 @@ +hostname "os6_sw1" + + diff --git a/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_version b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_version new file mode 100644 index 00000000..37c58e8b --- /dev/null +++ b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/fixtures/show_version @@ -0,0 +1,17 @@ +Machine Description............... Dell Networking Switch +System Model ID................... N4032 +Machine Type...................... Dell Networking N4032 +Serial Number..................... CN04G4FP282984AI0097A01 +Manufacturer...................... 0xbc00 +Burned In MAC Address............. F8B1.565B.615C +System Object ID.................. 1.3.6.1.4.1.674.10895.3042 +CPU Version....................... XLP308H-B2 +SOC Version....................... BCM56842_A1 +HW Version........................ 3 +CPLD Version...................... 17 + +unit active backup current-active next-active +---- ----------- ----------- -------------- -------------- +1 6.3.3.7 6.3.2.7 6.3.3.7 6.3.3.7 + + diff --git a/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/os6_module.py b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/os6_module.py new file mode 100644 index 00000000..4f8cb8c9 --- /dev/null +++ b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/os6_module.py @@ -0,0 +1,88 @@ +# (c) 2020 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 <http://www.gnu.org/licenses/>. + +# Make coding more python3-ish +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +import os +import json + +from units.modules.utils import AnsibleExitJson, AnsibleFailJson, ModuleTestCase + + +fixture_path = os.path.join(os.path.dirname(__file__), 'fixtures') +fixture_data = {} + + +def load_fixture(name): + path = os.path.join(fixture_path, name) + + if path in fixture_data: + return fixture_data[path] + + with open(path) as f: + data = f.read() + + try: + data = json.loads(data) + except Exception: + pass + + fixture_data[path] = data + return data + + +class TestDellos6Module(ModuleTestCase): + + def execute_module(self, failed=False, changed=False, commands=None, sort=True, defaults=False): + + self.load_fixtures(commands) + + if failed: + result = self.failed() + self.assertTrue(result['failed'], result) + else: + result = self.changed(changed) + self.assertEqual(result['changed'], changed, result) + + if commands is not None: + if sort: + self.assertEqual(sorted(commands), sorted(result['updates']), result['updates']) + else: + self.assertEqual(commands, result['updates'], result['updates']) + + return result + + def failed(self): + with self.assertRaises(AnsibleFailJson) as exc: + self.module.main() + + result = exc.exception.args[0] + self.assertTrue(result['failed'], result) + return result + + def changed(self, changed=False): + with self.assertRaises(AnsibleExitJson) as exc: + self.module.main() + + result = exc.exception.args[0] + self.assertEqual(result['changed'], changed, result) + return result + + def load_fixtures(self, commands=None): + pass diff --git a/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/test_os6_command.py b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/test_os6_command.py new file mode 100644 index 00000000..b1f3f23f --- /dev/null +++ b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/test_os6_command.py @@ -0,0 +1,108 @@ +# (c) 2020 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 <http://www.gnu.org/licenses/>. + +# 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_collections.dellemc.os6.plugins.modules import os6_command +from units.modules.utils import set_module_args +from .os6_module import TestDellos6Module, load_fixture + + +class TestDellos6CommandModule(TestDellos6Module): + + module = os6_command + + def setUp(self): + super(TestDellos6CommandModule, self).setUp() + + self.mock_run_commands = patch('ansible.modules.network.os6.os6_command.run_commands') + self.run_commands = self.mock_run_commands.start() + + def tearDown(self): + super(TestDellos6CommandModule, self).tearDown() + self.mock_run_commands.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(' ', '_') + output.append(load_fixture(filename)) + return output + + self.run_commands.side_effect = load_from_file + + def test_os6_command_simple(self): + set_module_args(dict(commands=['show version'])) + result = self.execute_module() + self.assertEqual(len(result['stdout']), 1) + self.assertTrue(result['stdout'][0].startswith('Machine Description')) + + def test_os6_command_multiple(self): + set_module_args(dict(commands=['show version', 'show version'])) + result = self.execute_module() + self.assertEqual(len(result['stdout']), 2) + self.assertTrue(result['stdout'][0].startswith('Machine Description')) + + def test_os6_command_wait_for(self): + wait_for = 'result[0] contains "Machine Description"' + set_module_args(dict(commands=['show version'], wait_for=wait_for)) + self.execute_module() + + def test_os6_command_wait_for_fails(self): + wait_for = 'result[0] contains "test string"' + set_module_args(dict(commands=['show version'], wait_for=wait_for)) + self.execute_module(failed=True) + self.assertEqual(self.run_commands.call_count, 10) + + def test_os6_command_retries(self): + wait_for = 'result[0] contains "test string"' + set_module_args(dict(commands=['show version'], wait_for=wait_for, retries=2)) + self.execute_module(failed=True) + self.assertEqual(self.run_commands.call_count, 2) + + def test_os6_command_match_any(self): + wait_for = ['result[0] contains "Machine Description"', + 'result[0] contains "test string"'] + set_module_args(dict(commands=['show version'], wait_for=wait_for, match='any')) + self.execute_module() + + def test_os6_command_match_all(self): + wait_for = ['result[0] contains "Machine Description"', + 'result[0] contains "Dell Networking"'] + set_module_args(dict(commands=['show version'], wait_for=wait_for, match='all')) + self.execute_module() + + def test_os6_command_match_all_failure(self): + wait_for = ['result[0] contains "Machine Description"', + 'result[0] contains "test string"'] + commands = ['show version', 'show version'] + set_module_args(dict(commands=commands, wait_for=wait_for, match='all')) + self.execute_module(failed=True) diff --git a/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/test_os6_config.py b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/test_os6_config.py new file mode 100644 index 00000000..1d2f60eb --- /dev/null +++ b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/test_os6_config.py @@ -0,0 +1,146 @@ +# +# (c) 2020 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 <http://www.gnu.org/licenses/>. + +# Make coding more python3-ish +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +from ansible.compat.tests.mock import patch +from ansible_collections.dellemc.os6.plugins.modules import os6_config +from units.modules.utils import set_module_args +from .os6_module import TestDellos6Module, load_fixture + + +class TestDellos6ConfigModule(TestDellos6Module): + + module = os6_config + + def setUp(self): + super(TestDellos6ConfigModule, self).setUp() + + self.mock_get_config = patch('ansible.modules.network.os6.os6_config.get_config') + self.get_config = self.mock_get_config.start() + + self.mock_load_config = patch('ansible.modules.network.os6.os6_config.load_config') + self.load_config = self.mock_load_config.start() + + self.mock_run_commands = patch('ansible.modules.network.os6.os6_config.run_commands') + self.run_commands = self.mock_run_commands.start() + + def tearDown(self): + super(TestDellos6ConfigModule, self).tearDown() + self.mock_get_config.stop() + self.mock_load_config.stop() + self.mock_run_commands.stop() + + def load_fixtures(self, commands=None): + config_file = 'os6_config_config.cfg' + self.get_config.return_value = load_fixture(config_file) + self.load_config.return_value = None + + def test_os6_config_unchanged(self): + src = load_fixture('os6_config_config.cfg') + set_module_args(dict(src=src)) + self.execute_module() + + def test_os6_config_src(self): + src = load_fixture('os6_config_src.cfg') + set_module_args(dict(src=src)) + commands = ['hostname foo', 'exit', 'interface Te1/0/2', 'shutdown', 'exit'] + self.execute_module(changed=True, commands=commands) + + def test_os6_config_backup(self): + set_module_args(dict(backup=True)) + result = self.execute_module() + self.assertIn('__backup__', result) + + def test_os6_config_save(self): + set_module_args(dict(save=True)) + self.execute_module(changed=True) + self.assertEqual(self.run_commands.call_count, 1) + self.assertEqual(self.get_config.call_count, 0) + self.assertEqual(self.load_config.call_count, 0) + args = self.run_commands.call_args[0][1] + self.assertDictContainsSubset({'command': 'copy running-config startup-config'}, args[0]) +# self.assertIn('copy running-config startup-config\r', args) + + def test_os6_config_lines_wo_parents(self): + set_module_args(dict(lines=['hostname foo'])) + commands = ['hostname foo'] + self.execute_module(changed=True, commands=commands) + + def test_os6_config_lines_w_parents(self): + set_module_args(dict(lines=['description "teest"', 'exit'], parents=['interface Te1/0/2'])) + commands = ['interface Te1/0/2', 'description "teest"', 'exit'] + self.execute_module(changed=True, commands=commands) + + def test_os6_config_before(self): + set_module_args(dict(lines=['hostname foo'], before=['snmp-server contact bar'])) + commands = ['snmp-server contact bar', 'hostname foo'] + self.execute_module(changed=True, commands=commands, sort=False) + + def test_os6_config_after(self): + set_module_args(dict(lines=['hostname foo'], after=['snmp-server contact bar'])) + commands = ['hostname foo', 'snmp-server contact bar'] + self.execute_module(changed=True, commands=commands, sort=False) + + def test_os6_config_before_after_no_change(self): + set_module_args(dict(lines=['hostname router'], + before=['snmp-server contact bar'], + after=['snmp-server location chennai'])) + self.execute_module() + + def test_os6_config_config(self): + config = 'hostname localhost' + set_module_args(dict(lines=['hostname router'], config=config)) + commands = ['hostname router'] + self.execute_module(changed=True, commands=commands) + + def test_os6_config_replace_block(self): + lines = ['description test string', 'shutdown'] + parents = ['interface Te1/0/2'] + set_module_args(dict(lines=lines, replace='block', parents=parents)) + commands = parents + lines + self.execute_module(changed=True, commands=commands) + + def test_os6_config_match_none(self): + lines = ['hostname router'] + set_module_args(dict(lines=lines, match='none')) + self.execute_module(changed=True, commands=lines) + + def test_os6_config_match_none(self): + lines = ['description test string', 'shutdown'] + parents = ['interface Te1/0/2'] + set_module_args(dict(lines=lines, parents=parents, match='none')) + commands = parents + lines + self.execute_module(changed=True, commands=commands, sort=False) + + def test_os6_config_match_strict(self): + lines = ['description "test_string"', + 'shutdown'] + parents = ['interface Te1/0/1'] + set_module_args(dict(lines=lines, parents=parents, match='strict')) + commands = parents + ['shutdown'] + self.execute_module(changed=True, commands=commands, sort=False) + + def test_os6_config_match_exact(self): + lines = ['description test_string', 'shutdown'] + parents = ['interface Te1/0/1'] + set_module_args(dict(lines=lines, parents=parents, match='exact')) + commands = parents + lines + self.execute_module(changed=True, commands=commands, sort=False) diff --git a/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/test_os6_facts.py b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/test_os6_facts.py new file mode 100644 index 00000000..ace3a8a8 --- /dev/null +++ b/ansible_collections/dellemc/os6/tests/unit/modules/network/os6/test_os6_facts.py @@ -0,0 +1,105 @@ +# (c) 2020 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 <http://www.gnu.org/licenses/>. + +# 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 units.modules.utils import set_module_args +from .os6_module import TestDellos6Module, load_fixture +from ansible_collections.dellemc.os6.plugins.modules import os6_facts + + +class TestDellos6Facts(TestDellos6Module): + + module = os6_facts + + def setUp(self): + super(TestDellos6Facts, self).setUp() + + self.mock_run_command = patch( + 'ansible.modules.network.os6.os6_facts.run_commands') + self.run_command = self.mock_run_command.start() + + def tearDown(self): + super(TestDellos6Facts, self).tearDown() + + self.mock_run_command.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 = obj['command'] + except ValueError: + command = item + if '|' in command: + command = str(command).replace('|', '') + filename = str(command).replace(' ', '_') + filename = filename.replace('/', '7') + output.append(load_fixture(filename)) + return output + + self.run_command.side_effect = load_from_file + + def test_os6_facts_gather_subset_default(self): + set_module_args(dict()) + result = self.execute_module() + ansible_facts = result['ansible_facts'] + self.assertIn('hardware', ansible_facts['ansible_net_gather_subset']) + self.assertIn('default', ansible_facts['ansible_net_gather_subset']) + self.assertIn('interfaces', ansible_facts['ansible_net_gather_subset']) + self.assertEquals('"os6_sw1"', ansible_facts['ansible_net_hostname']) + self.assertIn('Te1/0/1', ansible_facts['ansible_net_interfaces'].keys()) + self.assertEquals(1682, ansible_facts['ansible_net_memtotal_mb']) + self.assertEquals(623, ansible_facts['ansible_net_memfree_mb']) + + def test_os6_facts_gather_subset_config(self): + set_module_args({'gather_subset': 'config'}) + result = self.execute_module() + ansible_facts = result['ansible_facts'] + self.assertIn('default', ansible_facts['ansible_net_gather_subset']) + self.assertIn('config', ansible_facts['ansible_net_gather_subset']) + self.assertEquals('"os6_sw1"', ansible_facts['ansible_net_hostname']) + self.assertIn('ansible_net_config', ansible_facts) + + def test_os6_facts_gather_subset_hardware(self): + set_module_args({'gather_subset': 'hardware'}) + result = self.execute_module() + ansible_facts = result['ansible_facts'] + self.assertIn('default', ansible_facts['ansible_net_gather_subset']) + self.assertIn('hardware', ansible_facts['ansible_net_gather_subset']) + self.assertEquals(1682, ansible_facts['ansible_net_memtotal_mb']) + self.assertEquals(623, ansible_facts['ansible_net_memfree_mb']) + + def test_os6_facts_gather_subset_interfaces(self): + set_module_args({'gather_subset': 'interfaces'}) + result = self.execute_module() + ansible_facts = result['ansible_facts'] + self.assertIn('default', ansible_facts['ansible_net_gather_subset']) + self.assertIn('interfaces', ansible_facts['ansible_net_gather_subset']) + self.assertIn('Te1/0/1', ansible_facts['ansible_net_interfaces'].keys()) + self.assertEquals(['Te1/0/5', 'Te1/0/6'], ansible_facts['ansible_net_neighbors'].keys()) + self.assertIn('ansible_net_interfaces', ansible_facts) |