1# -*- coding: utf-8 -*- 2# 3# Copyright: (c) 2017, 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_device_license import ( 20 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 license_key='xxxx-yyyy-zzzz', 53 license_server='foo-license.f5.com', 54 state='latest', 55 accept_eula=True 56 ) 57 58 p = ModuleParameters(params=args) 59 assert p.license_key == 'xxxx-yyyy-zzzz' 60 assert p.license_server == 'foo-license.f5.com' 61 assert p.state == 'latest' 62 assert p.accept_eula is True 63 64 65class TestModuleManager(unittest.TestCase): 66 67 def setUp(self): 68 self.spec = ArgumentSpec() 69 self.patcher1 = patch('time.sleep') 70 self.patcher1.start() 71 self.p2 = patch('ansible_collections.f5networks.f5_modules.plugins.modules.bigip_device_license.send_teem') 72 self.m2 = self.p2.start() 73 self.m2.return_value = True 74 75 def tearDown(self): 76 self.patcher1.stop() 77 self.p2.stop() 78 79 def test_create(self, *args): 80 set_module_args( 81 dict( 82 license_key='xxxx-yyyy-zzzz', 83 license_server='foo-license.f5.com', 84 accept_eula=True, 85 state='latest', 86 provider=dict( 87 server='localhost', 88 password='password', 89 user='admin' 90 ) 91 ) 92 ) 93 94 module = AnsibleModule( 95 argument_spec=self.spec.argument_spec, 96 supports_check_mode=self.spec.supports_check_mode, 97 required_if=self.spec.required_if 98 ) 99 mm = ModuleManager(module=module) 100 101 # Override methods to force specific logic in the module to happen 102 mm.exists = Mock(side_effect=[False, True]) 103 mm.read_dossier_from_device = Mock(return_value=True) 104 mm.generate_license_from_remote = Mock(return_value=True) 105 mm.upload_license_to_device = Mock(return_value=True) 106 mm.upload_eula_to_device = Mock(return_value=True) 107 mm.reload_license = Mock(return_value=True) 108 mm._is_mcpd_ready_on_device = Mock(return_value=True) 109 110 results = mm.exec_module() 111 assert results['changed'] is True 112 113 def test_renewal(self, *args): 114 set_module_args( 115 dict( 116 license_key='xxxx-yyyy-zzzz', 117 license_server='foo-license.f5.com', 118 accept_eula=True, 119 state='latest', 120 provider=dict( 121 server='localhost', 122 password='password', 123 user='admin' 124 ) 125 ) 126 ) 127 128 module = AnsibleModule( 129 argument_spec=self.spec.argument_spec, 130 supports_check_mode=self.spec.supports_check_mode, 131 required_if=self.spec.required_if 132 ) 133 mm = ModuleManager(module=module) 134 135 # Override methods to force specific logic in the module to happen 136 mm.exists = Mock(side_effect=[True, True]) 137 mm.is_revoked = Mock(return_value=False) 138 mm.license_valid = Mock(return_value=False) 139 mm.read_dossier_from_device = Mock(return_value=True) 140 mm.generate_license_from_remote = Mock(return_value=True) 141 mm.upload_license_to_device = Mock(return_value=True) 142 mm.upload_eula_to_device = Mock(return_value=True) 143 mm.reload_license = Mock(return_value=True) 144 mm._is_mcpd_ready_on_device = Mock(return_value=True) 145 146 results = mm.exec_module() 147 assert results['changed'] is True 148 149 def test_no_renewal(self, *args): 150 set_module_args( 151 dict( 152 license_key='xxxx-yyyy-zzzz', 153 license_server='foo-license.f5.com', 154 accept_eula=True, 155 state='latest', 156 provider=dict( 157 server='localhost', 158 password='password', 159 user='admin' 160 ) 161 ) 162 ) 163 164 module = AnsibleModule( 165 argument_spec=self.spec.argument_spec, 166 supports_check_mode=self.spec.supports_check_mode, 167 required_if=self.spec.required_if 168 ) 169 mm = ModuleManager(module=module) 170 171 # Override methods to force specific logic in the module to happen 172 mm.exists = Mock(side_effect=[True, True]) 173 mm.is_revoked = Mock(return_value=False) 174 mm.license_valid = Mock(return_value=True) 175 mm.read_dossier_from_device = Mock(return_value=True) 176 mm.generate_license_from_remote = Mock(return_value=True) 177 mm.upload_license_to_device = Mock(return_value=True) 178 mm.upload_eula_to_device = Mock(return_value=True) 179 mm.reload_license = Mock(return_value=True) 180 mm._is_mcpd_ready_on_device = Mock(return_value=True) 181 182 results = mm.exec_module() 183 assert results['changed'] is False 184 185 def test_force_renewal(self, *args): 186 set_module_args( 187 dict( 188 license_key='xxxx-yyyy-zzzz', 189 license_server='foo-license.f5.com', 190 accept_eula=True, 191 state='latest', 192 force=True, 193 provider=dict( 194 server='localhost', 195 password='password', 196 user='admin' 197 ) 198 ) 199 ) 200 201 module = AnsibleModule( 202 argument_spec=self.spec.argument_spec, 203 supports_check_mode=self.spec.supports_check_mode, 204 required_if=self.spec.required_if 205 ) 206 mm = ModuleManager(module=module) 207 208 # Override methods to force specific logic in the module to happen 209 mm.exists = Mock(side_effect=[True, True]) 210 mm.is_revoked = Mock(return_value=False) 211 mm.license_valid = Mock(return_value=True) 212 mm.read_dossier_from_device = Mock(return_value=True) 213 mm.generate_license_from_remote = Mock(return_value=True) 214 mm.upload_license_to_device = Mock(return_value=True) 215 mm.upload_eula_to_device = Mock(return_value=True) 216 mm.reload_license = Mock(return_value=True) 217 mm._is_mcpd_ready_on_device = Mock(return_value=True) 218 219 results = mm.exec_module() 220 assert results['changed'] is True 221