1# -*- coding: utf-8 -*- 2# 3# Copyright: (c) 2019, F5 Networks Inc. 4# GNU General Public License v3.0 (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) 5 6from __future__ import (absolute_import, division, print_function) 7__metaclass__ = type 8 9import os 10import json 11import pytest 12import sys 13 14if sys.version_info < (2, 7): 15 pytestmark = pytest.mark.skip("F5 Ansible modules require Python >= 2.7") 16 17from ansible.module_utils.basic import AnsibleModule 18 19from ansible_collections.f5networks.f5_modules.plugins.modules.bigip_interface import ( 20 ApiParameters, ModuleParameters, ModuleManager, ArgumentSpec 21) 22from ansible_collections.f5networks.f5_modules.tests.unit.compat import unittest 23from ansible_collections.f5networks.f5_modules.tests.unit.compat.mock import Mock, patch 24from ansible_collections.f5networks.f5_modules.tests.unit.modules.utils import set_module_args 25 26 27fixture_path = os.path.join(os.path.dirname(__file__), 'fixtures') 28fixture_data = {} 29 30 31def load_fixture(name): 32 path = os.path.join(fixture_path, name) 33 34 if path in fixture_data: 35 return fixture_data[path] 36 37 with open(path) as f: 38 data = f.read() 39 40 try: 41 data = json.loads(data) 42 except Exception: 43 pass 44 45 fixture_data[path] = data 46 return data 47 48 49class TestParameters(unittest.TestCase): 50 def test_module_parameters(self): 51 args = dict( 52 description='my description', 53 enabled=False, 54 bundle='enabled', 55 bundle_speed='40G', 56 force_gigabit_fiber=False, 57 prefer_port='sfp', 58 media_fixed='40000-FD', 59 media_sfp='40000-FD', 60 flow_control='tx-rx', 61 forward_error_correction='auto', 62 port_fwd_mode='l3', 63 lldp_tlvmap=136, 64 lldp_admin='txonly', 65 stp=True, 66 stp_auto_edge_port=False, 67 stp_edge_port=True, 68 stp_link_type='p2p', 69 sflow=dict( 70 poll_interval=10, 71 poll_interval_global=False 72 ) 73 ) 74 75 p = ModuleParameters(params=args) 76 assert p.description == 'my description' 77 assert p.disabled is True 78 assert p.enabled is None 79 assert p.bundle == 'enabled' 80 assert p.bundle_speed == '40G' 81 assert p.force_gigabit_fiber == 'disabled' 82 assert p.prefer_port == 'sfp' 83 assert p.media_fixed == '40000-FD' 84 assert p.media_sfp == '40000-FD' 85 assert p.flow_control == 'tx-rx' 86 assert p.forward_error_correction == 'auto' 87 assert p.port_fwd_mode == 'l3' 88 assert p.lldp_tlvmap == 136 89 assert p.lldp_admin == 'txonly' 90 assert p.stp == 'enabled' 91 assert p.stp_auto_edge_port == 'disabled' 92 assert p.stp_edge_port == 'true' 93 assert p.stp_link_type == 'p2p' 94 assert p.sflow_interval == 10 95 assert p.sflow_global == 'no' 96 97 def test_api_parameters(self): 98 args = load_fixture('load_interface.json') 99 100 p = ApiParameters(params=args) 101 assert p.sflow_global == 'no' 102 assert p.sflow_interval == 0 103 104 105class TestManager(unittest.TestCase): 106 def setUp(self): 107 self.spec = ArgumentSpec() 108 self.p2 = patch('ansible_collections.f5networks.f5_modules.plugins.modules.bigip_interface.tmos_version') 109 self.p3 = patch('ansible_collections.f5networks.f5_modules.plugins.modules.bigip_interface.send_teem') 110 self.m2 = self.p2.start() 111 self.m2.return_value = '14.1.0' 112 self.m3 = self.p3.start() 113 self.m3.return_value = True 114 115 def tearDown(self): 116 self.p2.stop() 117 self.p3.stop() 118 119 def test_update_interface(self, *args): 120 set_module_args(dict( 121 name='1.1', 122 description='my description', 123 enabled=False, 124 bundle='enabled', 125 bundle_speed='40G', 126 prefer_port='fixed', 127 media_fixed='40000-FD', 128 media_sfp='40000-FD', 129 forward_error_correction='auto', 130 lldp_tlvmap=136, 131 lldp_admin='txrx', 132 stp_auto_edge_port=False, 133 stp_link_type='p2p', 134 sflow=dict( 135 poll_interval=10, 136 ), 137 provider=dict( 138 server='localhost', 139 password='password', 140 user='admin' 141 ) 142 )) 143 144 # Configure the parameters that would be returned by querying the 145 # remote device 146 147 module = AnsibleModule( 148 argument_spec=self.spec.argument_spec, 149 supports_check_mode=self.spec.supports_check_mode, 150 ) 151 mm = ModuleManager(module=module) 152 153 # Override methods to force specific logic in the module to happen 154 mm.exists = Mock(return_value=True) 155 mm.update_on_device = Mock(return_value=True) 156 mm.read_current_from_device = Mock(return_value=ApiParameters(params=load_fixture('load_interface.json'))) 157 158 results = mm.exec_module() 159 160 assert results['changed'] is True 161 assert results['description'] == 'my description' 162 assert results['enabled'] == 'no' 163 assert results['bundle'] == 'enabled' 164 assert results['bundle_speed'] == '40G' 165 assert results['prefer_port'] == 'fixed' 166 assert results['media_fixed'] == '40000-FD' 167 assert results['media_sfp'] == '40000-FD' 168 assert results['forward_error_correction'] == 'auto' 169 assert results['lldp_tlvmap'] == 136 170 assert results['lldp_admin'] == 'txrx' 171 assert results['stp_auto_edge_port'] == 'no' 172 assert results['stp_link_type'] == 'p2p' 173 assert results['sflow']['poll_interval'] == 10 174