1# (c) 2021, NetApp, Inc 2# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) 3 4''' unit tests Cloudmanager Ansible module: ''' 5 6from __future__ import (absolute_import, division, print_function) 7 8__metaclass__ = type 9 10import json 11import sys 12import pytest 13 14from ansible.module_utils import basic 15from ansible.module_utils._text import to_bytes 16from ansible_collections.netapp.cloudmanager.tests.unit.compat import unittest 17from ansible_collections.netapp.cloudmanager.tests.unit.compat.mock import patch 18 19from ansible_collections.netapp.cloudmanager.plugins.modules.na_cloudmanager_cvo_aws \ 20 import NetAppCloudManagerCVOAWS as my_module, IMPORT_EXCEPTION 21 22if IMPORT_EXCEPTION is not None and sys.version_info < (3, 5): 23 pytestmark = pytest.mark.skip('skipping as missing required imports on 2.6 and 2.7: %s' % IMPORT_EXCEPTION) 24 25 26def set_module_args(args): 27 '''prepare arguments so that they will be picked up during module creation''' 28 args = json.dumps({'ANSIBLE_MODULE_ARGS': args}) 29 basic._ANSIBLE_ARGS = to_bytes(args) # pylint: disable=protected-access 30 31 32class AnsibleExitJson(Exception): 33 '''Exception class to be raised by module.exit_json and caught by the test case''' 34 35 36class AnsibleFailJson(Exception): 37 '''Exception class to be raised by module.fail_json and caught by the test case''' 38 39 40def exit_json(*args, **kwargs): # pylint: disable=unused-argument 41 '''function to patch over exit_json; package return data into an exception''' 42 if 'changed' not in kwargs: 43 kwargs['changed'] = False 44 raise AnsibleExitJson(kwargs) 45 46 47def fail_json(*args, **kwargs): # pylint: disable=unused-argument 48 '''function to patch over fail_json; package return data into an exception''' 49 kwargs['failed'] = True 50 raise AnsibleFailJson(kwargs) 51 52 53class TestMyModule(unittest.TestCase): 54 ''' a group of related Unit Tests ''' 55 56 def setUp(self): 57 self.mock_module_helper = patch.multiple(basic.AnsibleModule, 58 exit_json=exit_json, 59 fail_json=fail_json) 60 self.mock_module_helper.start() 61 self.addCleanup(self.mock_module_helper.stop) 62 63 def set_default_args_pass_check(self): 64 return dict({ 65 'state': 'present', 66 'name': 'TestA', 67 'client_id': 'test', 68 'region': 'us-west-1', 69 'vpc_id': 'vpc-test', 70 'subnet_id': 'subnet-test', 71 'svm_password': 'password', 72 'refresh_token': 'myrefresh_token', 73 'is_ha': False 74 }) 75 76 def set_args_create_cloudmanager_cvo_aws(self): 77 return dict({ 78 'state': 'present', 79 'name': 'Dummyname', 80 'client_id': 'test', 81 'region': 'us-west-1', 82 'vpc_id': 'vpc-test', 83 'subnet_id': 'subnet-test', 84 'svm_password': 'password', 85 'refresh_token': 'myrefresh_token', 86 'is_ha': False 87 }) 88 89 def set_args_delete_cloudmanager_cvo_aws(self): 90 return dict({ 91 'state': 'absent', 92 'name': 'Dummyname', 93 'client_id': 'test', 94 'region': 'us-west-1', 95 'vpc_id': 'vpc-test', 96 'subnet_id': 'subnet-test', 97 'svm_password': 'password', 98 'refresh_token': 'myrefresh_token', 99 'is_ha': False 100 }) 101 102 def test_module_fail_when_required_args_missing(self): 103 ''' required arguments are reported as errors ''' 104 with pytest.raises(AnsibleFailJson) as exc: 105 set_module_args({}) 106 my_module() 107 print('Info: %s' % exc.value.args[0]['msg']) 108 109 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp.CloudManagerRestAPI.get_token') 110 def test_module_fail_when_required_args_present(self, get_token): 111 ''' required arguments are reported as errors ''' 112 with pytest.raises(AnsibleExitJson) as exc: 113 set_module_args(self.set_default_args_pass_check()) 114 get_token.return_value = 'test', 'test' 115 my_module() 116 exit_json(changed=True, msg="TestCase Fail when required args are present") 117 assert exc.value.args[0]['changed'] 118 119 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp.CloudManagerRestAPI.get_token') 120 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp.CloudManagerRestAPI.wait_on_completion') 121 @patch('ansible_collections.netapp.cloudmanager.plugins.modules.na_cloudmanager_cvo_aws.NetAppCloudManagerCVOAWS.get_vpc') 122 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp_module.NetAppModule.get_tenant') 123 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp_module.NetAppModule.get_nss') 124 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp_module.NetAppModule.get_working_environment_details_by_name') 125 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp.CloudManagerRestAPI.post') 126 def test_create_cloudmanager_cvo_aws_pass(self, get_post_api, get_working_environment_details_by_name, get_nss, 127 get_tenant, get_vpc, wait_on_completion, get_token): 128 set_module_args(self.set_args_create_cloudmanager_cvo_aws()) 129 get_token.return_value = 'test', 'test' 130 my_obj = my_module() 131 132 response = {'publicId': 'abcdefg12345'} 133 get_working_environment_details_by_name.return_value = None, None 134 get_post_api.return_value = response, None, None 135 get_nss.return_value = 'nss-test', None 136 get_tenant.return_value = 'test', None 137 get_vpc.return_value = 'test' 138 wait_on_completion.return_value = None 139 140 with pytest.raises(AnsibleExitJson) as exc: 141 my_obj.apply() 142 print('Info: test_create_cloudmanager_cvo_aws_pass: %s' % repr(exc.value)) 143 assert exc.value.args[0]['changed'] 144 145 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp.CloudManagerRestAPI.get_token') 146 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp.CloudManagerRestAPI.wait_on_completion') 147 @patch('ansible_collections.netapp.cloudmanager.plugins.modules.na_cloudmanager_cvo_aws.NetAppCloudManagerCVOAWS.get_vpc') 148 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp_module.NetAppModule.get_tenant') 149 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp_module.NetAppModule.get_nss') 150 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp_module.NetAppModule.get_working_environment_details_by_name') 151 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp.CloudManagerRestAPI.post') 152 def test_create_cloudmanager_cvo_aws_ha_pass(self, get_post_api, get_working_environment_details_by_name, get_nss, 153 get_tenant, get_vpc, wait_on_completion, get_token): 154 data = self.set_args_create_cloudmanager_cvo_aws() 155 data['is_ha'] = True 156 data.pop('subnet_id') 157 set_module_args(data) 158 get_token.return_value = 'test', 'test' 159 my_obj = my_module() 160 161 response = {'publicId': 'abcdefg12345'} 162 get_working_environment_details_by_name.return_value = None, None 163 get_post_api.return_value = response, None, None 164 get_nss.return_value = 'nss-test', None 165 get_tenant.return_value = 'test', None 166 get_vpc.return_value = 'test' 167 wait_on_completion.return_value = None 168 169 with pytest.raises(AnsibleExitJson) as exc: 170 my_obj.apply() 171 print('Info: test_create_cloudmanager_cvo_aws_ha_pass: %s' % repr(exc.value)) 172 assert exc.value.args[0]['changed'] 173 174 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp.CloudManagerRestAPI.get_token') 175 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp.CloudManagerRestAPI.wait_on_completion') 176 @patch('ansible_collections.netapp.cloudmanager.plugins.modules.na_cloudmanager_cvo_aws.NetAppCloudManagerCVOAWS.get_vpc') 177 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp_module.NetAppModule.get_tenant') 178 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp_module.NetAppModule.get_nss') 179 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp_module.NetAppModule.get_working_environment_details_by_name') 180 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp.CloudManagerRestAPI.post') 181 def test_create_cloudmanager_cvo_aws_capacity_license_pass(self, get_post_api, 182 get_working_environment_details_by_name, get_nss, 183 get_tenant, get_vpc, wait_on_completion, get_token): 184 data = self.set_args_create_cloudmanager_cvo_aws() 185 data['license_type'] = 'capacity-paygo' 186 data['capacity_package_name'] = 'Essential' 187 set_module_args(data) 188 get_token.return_value = 'test', 'test' 189 my_obj = my_module() 190 191 response = {'publicId': 'abcdefg12345'} 192 get_working_environment_details_by_name.return_value = None, None 193 get_post_api.return_value = response, None, None 194 get_nss.return_value = 'nss-test', None 195 get_tenant.return_value = 'test', None 196 get_vpc.return_value = 'test' 197 wait_on_completion.return_value = None 198 199 with pytest.raises(AnsibleExitJson) as exc: 200 my_obj.apply() 201 print('Info: test_create_cloudmanager_cvo_aws_pass: %s' % repr(exc.value)) 202 assert exc.value.args[0]['changed'] 203 204 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp.CloudManagerRestAPI.get_token') 205 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp.CloudManagerRestAPI.wait_on_completion') 206 @patch('ansible_collections.netapp.cloudmanager.plugins.modules.na_cloudmanager_cvo_aws.NetAppCloudManagerCVOAWS.get_vpc') 207 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp_module.NetAppModule.get_tenant') 208 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp_module.NetAppModule.get_nss') 209 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp_module.NetAppModule.get_working_environment_details_by_name') 210 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp.CloudManagerRestAPI.post') 211 def test_create_cloudmanager_cvo_aws_ha_capacity_license_pass(self, get_post_api, 212 get_working_environment_details_by_name, get_nss, 213 get_tenant, get_vpc, wait_on_completion, get_token): 214 data = self.set_args_create_cloudmanager_cvo_aws() 215 data['is_ha'] = True 216 data['license_type'] = 'ha-capacity-paygo' 217 data['capacity_package_name'] = 'Essential' 218 data.pop('subnet_id') 219 set_module_args(data) 220 get_token.return_value = 'test', 'test' 221 my_obj = my_module() 222 223 response = {'publicId': 'abcdefg12345'} 224 get_working_environment_details_by_name.return_value = None, None 225 get_post_api.return_value = response, None, None 226 get_nss.return_value = 'nss-test', None 227 get_tenant.return_value = 'test', None 228 get_vpc.return_value = 'test' 229 wait_on_completion.return_value = None 230 231 with pytest.raises(AnsibleExitJson) as exc: 232 my_obj.apply() 233 print('Info: test_create_cloudmanager_cvo_aws_ha_pass: %s' % repr(exc.value)) 234 assert exc.value.args[0]['changed'] 235 236 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp.CloudManagerRestAPI.get_token') 237 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp.CloudManagerRestAPI.wait_on_completion') 238 @patch('ansible_collections.netapp.cloudmanager.plugins.modules.na_cloudmanager_cvo_aws.NetAppCloudManagerCVOAWS.get_vpc') 239 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp_module.NetAppModule.get_tenant') 240 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp_module.NetAppModule.get_nss') 241 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp_module.NetAppModule.get_working_environment_details_by_name') 242 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp.CloudManagerRestAPI.post') 243 def test_create_cloudmanager_cvo_aws_nodebase_license_pass(self, get_post_api, 244 get_working_environment_details_by_name, get_nss, 245 get_tenant, get_vpc, wait_on_completion, get_token): 246 data = self.set_args_create_cloudmanager_cvo_aws() 247 data['license_type'] = 'cot-premium-byol' 248 data['platform_serial_number'] = '12345678' 249 set_module_args(data) 250 get_token.return_value = 'test', 'test' 251 my_obj = my_module() 252 253 response = {'publicId': 'abcdefg12345'} 254 get_working_environment_details_by_name.return_value = None, None 255 get_post_api.return_value = response, None, None 256 get_nss.return_value = 'nss-test', None 257 get_tenant.return_value = 'test', None 258 get_vpc.return_value = 'test' 259 wait_on_completion.return_value = None 260 261 with pytest.raises(AnsibleExitJson) as exc: 262 my_obj.apply() 263 print('Info: test_create_cloudmanager_cvo_aws_pass: %s' % repr(exc.value)) 264 assert exc.value.args[0]['changed'] 265 266 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp.CloudManagerRestAPI.get_token') 267 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp.CloudManagerRestAPI.wait_on_completion') 268 @patch('ansible_collections.netapp.cloudmanager.plugins.modules.na_cloudmanager_cvo_aws.NetAppCloudManagerCVOAWS.get_vpc') 269 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp_module.NetAppModule.get_tenant') 270 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp_module.NetAppModule.get_nss') 271 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp_module.NetAppModule.get_working_environment_details_by_name') 272 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp.CloudManagerRestAPI.post') 273 def test_create_cloudmanager_cvo_aws_ha_nodebase_license_pass(self, get_post_api, 274 get_working_environment_details_by_name, get_nss, 275 get_tenant, get_vpc, wait_on_completion, get_token): 276 data = self.set_args_create_cloudmanager_cvo_aws() 277 data['license_type'] = 'ha-cot-premium-byol' 278 data['platform_serial_number_node1'] = '12345678' 279 data['platform_serial_number_node2'] = '23456789' 280 set_module_args(data) 281 get_token.return_value = 'test', 'test' 282 my_obj = my_module() 283 284 response = {'publicId': 'abcdefg12345'} 285 get_working_environment_details_by_name.return_value = None, None 286 get_post_api.return_value = response, None, None 287 get_nss.return_value = 'nss-test', None 288 get_tenant.return_value = 'test', None 289 get_vpc.return_value = 'test' 290 wait_on_completion.return_value = None 291 292 with pytest.raises(AnsibleExitJson) as exc: 293 my_obj.apply() 294 print('Info: test_create_cloudmanager_cvo_aws_pass: %s' % repr(exc.value)) 295 assert exc.value.args[0]['changed'] 296 297 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp.CloudManagerRestAPI.get_token') 298 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp.CloudManagerRestAPI.wait_on_completion') 299 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp_module.NetAppModule.get_working_environment_details_by_name') 300 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp.CloudManagerRestAPI.delete') 301 def test_delete_cloudmanager_cvo_aws_pass(self, get_delete_api, get_working_environment_details_by_name, 302 wait_on_completion, get_token): 303 set_module_args(self.set_args_delete_cloudmanager_cvo_aws()) 304 get_token.return_value = 'test', 'test' 305 my_obj = my_module() 306 307 my_cvo = { 308 'name': 'test', 309 'publicId': 'test'} 310 get_working_environment_details_by_name.return_value = my_cvo, None 311 get_delete_api.return_value = None, None, None 312 wait_on_completion.return_value = None 313 314 with pytest.raises(AnsibleExitJson) as exc: 315 my_obj.apply() 316 print('Info: test_delete_cloudmanager_cvo_aws_pass: %s' % repr(exc.value)) 317 assert exc.value.args[0]['changed'] 318 319 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp.CloudManagerRestAPI.get_token') 320 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp_module.NetAppModule.update_tier_level') 321 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp_module.NetAppModule.update_cvo_tags') 322 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp_module.NetAppModule.update_svm_password') 323 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp_module.NetAppModule.get_working_environment_property') 324 @patch('ansible_collections.netapp.cloudmanager.plugins.module_utils.netapp_module.NetAppModule.get_working_environment_details_by_name') 325 def test_change_cloudmanager_cvo_aws(self, get_cvo, get_property, update_svm_password, update_cvo_tags, 326 update_tier_level, get_token): 327 set_module_args(self.set_default_args_pass_check()) 328 329 modify = ['svm_password', 'aws_tag', 'tier_level'] 330 331 my_cvo = { 332 'name': 'Dummyname', 333 'publicId': 'test', 334 'svm_password': 'diffpassword', 335 'aws_tag': [{'tagKey': 'abc', 'tagValue': 'a124'}, {'tagKey': 'def', 'tagValue': 'b3424'}], 336 'tier_level': 'Blob' 337 } 338 get_cvo.return_value = my_cvo, None 339 cvo_property = {'name': 'Dummyname', 340 'publicId': 'test', 341 'ontapClusterProperties': {'capacityTierInfo': {'tierLevel': 'normal'}}, 342 } 343 get_property.return_value = cvo_property, None 344 get_token.return_value = 'test', 'test' 345 my_obj = my_module() 346 347 for item in modify: 348 if item == 'svm_password': 349 update_svm_password.return_value = True, None 350 elif item == 'aws_tag': 351 update_cvo_tags.return_value = True, None 352 elif item == 'tier_level': 353 update_tier_level.return_value = True, None 354 355 with pytest.raises(AnsibleExitJson) as exc: 356 my_obj.apply() 357 print('Info: test_change_cloudmanager_cvo_aws: %s' % repr(exc.value)) 358