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