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_gtm_datacenter 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 state='present', 53 contact='foo', 54 description='bar', 55 location='baz', 56 name='datacenter' 57 ) 58 p = ModuleParameters(params=args) 59 assert p.state == 'present' 60 61 def test_api_parameters(self): 62 args = load_fixture('load_gtm_datacenter_default.json') 63 p = ApiParameters(params=args) 64 assert p.name == 'asd' 65 66 def test_module_parameters_state_present(self): 67 args = dict( 68 state='present' 69 ) 70 p = ModuleParameters(params=args) 71 assert p.state == 'present' 72 assert p.enabled is True 73 74 def test_module_parameters_state_absent(self): 75 args = dict( 76 state='absent' 77 ) 78 p = ModuleParameters(params=args) 79 assert p.state == 'absent' 80 81 def test_module_parameters_state_enabled(self): 82 args = dict( 83 state='enabled' 84 ) 85 p = ModuleParameters(params=args) 86 assert p.state == 'enabled' 87 assert p.enabled is True 88 assert p.disabled is None 89 90 def test_module_parameters_state_disabled(self): 91 args = dict( 92 state='disabled' 93 ) 94 p = ModuleParameters(params=args) 95 assert p.state == 'disabled' 96 assert p.enabled is None 97 assert p.disabled is True 98 99 100class TestManager(unittest.TestCase): 101 102 def setUp(self): 103 self.spec = ArgumentSpec() 104 self.p1 = patch('ansible_collections.f5networks.f5_modules.plugins.modules.bigip_gtm_datacenter.module_provisioned') 105 self.m1 = self.p1.start() 106 self.m1.return_value = True 107 self.p2 = patch('ansible_collections.f5networks.f5_modules.plugins.modules.bigip_gtm_datacenter.tmos_version') 108 self.p3 = patch('ansible_collections.f5networks.f5_modules.plugins.modules.bigip_gtm_datacenter.send_teem') 109 self.m2 = self.p2.start() 110 self.m2.return_value = '14.1.0' 111 self.m3 = self.p3.start() 112 self.m3.return_value = True 113 114 def tearDown(self): 115 self.p1.stop() 116 self.p2.stop() 117 self.p3.stop() 118 119 def test_create_datacenter(self, *args): 120 set_module_args(dict( 121 name='foo', 122 state='present', 123 provider=dict( 124 server='localhost', 125 password='password', 126 user='admin' 127 ) 128 )) 129 130 module = AnsibleModule( 131 argument_spec=self.spec.argument_spec, 132 supports_check_mode=self.spec.supports_check_mode 133 ) 134 mm = ModuleManager(module=module) 135 136 # Override methods to force specific logic in the module to happen 137 mm.exists = Mock(side_effect=[False, True]) 138 mm.create_on_device = Mock(return_value=True) 139 mm.module_provisioned = Mock(return_value=True) 140 141 results = mm.exec_module() 142 assert results['changed'] is True 143 assert results['state'] == 'present' 144 145 def test_create_disabled_datacenter(self, *args): 146 set_module_args(dict( 147 name='foo', 148 state='disabled', 149 provider=dict( 150 server='localhost', 151 password='password', 152 user='admin' 153 ) 154 155 )) 156 157 module = AnsibleModule( 158 argument_spec=self.spec.argument_spec, 159 supports_check_mode=self.spec.supports_check_mode 160 ) 161 mm = ModuleManager(module=module) 162 163 # Override methods to force specific logic in the module to happen 164 mm.exists = Mock(side_effect=[False, True]) 165 mm.create_on_device = Mock(return_value=True) 166 mm.module_provisioned = Mock(return_value=True) 167 168 results = mm.exec_module() 169 assert results['changed'] is True 170 assert results['enabled'] is False 171 assert results['disabled'] is True 172 173 def test_create_enabled_datacenter(self, *args): 174 set_module_args(dict( 175 name='foo', 176 state='enabled', 177 provider=dict( 178 server='localhost', 179 password='password', 180 user='admin' 181 ) 182 183 )) 184 185 module = AnsibleModule( 186 argument_spec=self.spec.argument_spec, 187 supports_check_mode=self.spec.supports_check_mode 188 ) 189 mm = ModuleManager(module=module) 190 191 # Override methods to force specific logic in the module to happen 192 mm.exists = Mock(side_effect=[False, True]) 193 mm.create_on_device = Mock(return_value=True) 194 mm.module_provisioned = Mock(return_value=True) 195 196 results = mm.exec_module() 197 assert results['changed'] is True 198 assert results['enabled'] is True 199 assert results['disabled'] is False 200 201 def test_idempotent_disable_datacenter(self, *args): 202 set_module_args(dict( 203 name='foo', 204 state='disabled', 205 provider=dict( 206 server='localhost', 207 password='password', 208 user='admin' 209 ) 210 211 )) 212 213 module = AnsibleModule( 214 argument_spec=self.spec.argument_spec, 215 supports_check_mode=self.spec.supports_check_mode 216 ) 217 218 current = ApiParameters(params=load_fixture('load_gtm_datacenter_disabled.json')) 219 220 mm = ModuleManager(module=module) 221 222 # Override methods to force specific logic in the module to happen 223 mm.exists = Mock(return_value=True) 224 mm.update_on_device = Mock(return_value=True) 225 mm.read_current_from_device = Mock(return_value=current) 226 mm.module_provisioned = Mock(return_value=True) 227 228 results = mm.exec_module() 229 assert results['changed'] is False 230