summaryrefslogtreecommitdiff
path: root/test/units/modules/cloud/amazon/test_aws_netapp_cvs_pool.py
blob: 5530916187d63a79f012fbda142fdb22edf6068b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
# (c) 2019, NetApp, Inc
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)

''' Unit tests for AWS Cloud Volumes Services - Manage Pools '''

from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
import json
import pytest

from units.compat import unittest
from units.compat.mock import patch, Mock
from ansible.module_utils import basic
from ansible.module_utils._text import to_bytes
from requests import Response
from ansible.modules.cloud.amazon.aws_netapp_cvs_pool \
    import NetAppAWSCVS as pool_module


def set_module_args(args):
    """prepare arguments so that they will be picked up during module creation"""
    args = json.dumps({'ANSIBLE_MODULE_ARGS': args})
    basic._ANSIBLE_ARGS = to_bytes(args)  # pylint: disable=protected-access


class AnsibleExitJson(Exception):
    """Exception class to be raised by module.exit_json and caught by the test case"""
    pass


class AnsibleFailJson(Exception):
    """Exception class to be raised by module.fail_json and caught by the test case"""
    pass


def exit_json(*args, **kwargs):  # pylint: disable=unused-argument
    """function to patch over exit_json; package return data into an exception"""
    if 'changed' not in kwargs:
        kwargs['changed'] = False
    raise AnsibleExitJson(kwargs)


def fail_json(*args, **kwargs):  # pylint: disable=unused-argument
    """function to patch over fail_json; package return data into an exception"""
    kwargs['failed'] = True
    raise AnsibleFailJson(kwargs)


class TestMyModule(unittest.TestCase):
    ''' a group of related Unit Tests '''

    def setUp(self):
        self.mock_module_helper = patch.multiple(basic.AnsibleModule,
                                                 exit_json=exit_json,
                                                 fail_json=fail_json)
        self.mock_module_helper.start()
        self.addCleanup(self.mock_module_helper.stop)

    def set_default_args_fail_check(self):
        return dict({
            'from_name': 'TestPoolAA',
            'name': 'TestPoolAA_new',
            'serviceLevel': 'standard',
            'sizeInBytes': 4000000000000,
            'vendorID': 'ansiblePoolTestVendorA',
            'region': 'us-east-1',
            'api_url': 'hostname.invalid',
            'api_key': 'myapikey',
            'secret_key': 'mysecretkey'
        })

    def set_default_args_pass_check(self):
        return dict({
            'state': 'present',
            'from_name': 'TestPoolAA',
            'name': 'TestPoolAA_new',
            'serviceLevel': 'standard',
            'sizeInBytes': 4000000000000,
            'vendorID': 'ansiblePoolTestVendorA',
            'region': 'us-east-1',
            'api_url': 'hostname.invalid',
            'api_key': 'myapikey',
            'secret_key': 'mysecretkey'
        })

    def set_args_create_aws_netapp_cvs_pool(self):
        return dict({
            'state': 'present',
            'name': 'TestPoolAA',
            'serviceLevel': 'standard',
            'sizeInBytes': 4000000000000,
            'vendorID': 'ansiblePoolTestVendorA',
            'region': 'us-east-1',
            'api_url': 'hostname.invalid',
            'api_key': 'myapikey',
            'secret_key': 'mysecretkey'
        })

    def set_args_update_aws_netapp_cvs_pool(self):
        return dict({
            'state': 'present',
            'from_name': 'TestPoolAA',
            'name': 'TestPoolAA_new',
            'serviceLevel': 'standard',
            'sizeInBytes': 4000000000000,
            'vendorID': 'ansiblePoolTestVendorA',
            'region': 'us-east-1',
            'api_url': 'hostname.invalid',
            'api_key': 'myapikey',
            'secret_key': 'mysecretkey'
        })

    def set_args_delete_aws_netapp_cvs_pool(self):
        return dict({
            'state': 'absent',
            'name': 'TestPoolAA',
            'region': 'us-east-1',
            'api_url': 'hostname.invalid',
            'api_key': 'myapikey',
            'secret_key': 'mysecretkey'
        })

    def test_module_fail_when_required_args_missing(self):
        ''' required arguments are reported as errors '''
        with pytest.raises(AnsibleFailJson) as exc:
            set_module_args(self.set_default_args_fail_check())
            pool_module()
        print('Info: test_module_fail_when_required_args_missing: %s' % exc.value.args[0]['msg'])

    def test_module_pass_when_required_args_present(self):
        ''' required arguments are present '''
        with pytest.raises(AnsibleExitJson) as exc:
            set_module_args(self.set_default_args_pass_check())
            pool_module()
            exit_json(changed=True, msg="Induced arguments check")
        print('Info: test_module_pass_when_required_args_present: %s' % exc.value.args[0]['msg'])
        assert exc.value.args[0]['changed']

    @patch('ansible.modules.cloud.amazon.aws_netapp_cvs_pool.NetAppAWSCVS.get_aws_netapp_cvs_pool')
    @patch('ansible.module_utils.netapp.AwsCvsRestAPI.put')
    def test_update_aws_netapp_cvs_pool_pass(self, get_put_api, get_aws_api):
        set_module_args(self.set_args_update_aws_netapp_cvs_pool())
        my_obj = pool_module()
        my_pool = {
            "name": "Dummyname",
            "poolId": "1f63b3d0-4fd4-b4fe-1ed6-c62f5f20d975",
            "region": "us-east-1",
            "serviceLevel": "extreme",
            "sizeInBytes": 40000000000000000,
            "state": "available",
            "vendorID": "Dummy"
        }
        get_aws_api.return_value = my_pool
        get_put_api.return_value = my_pool, None
        with pytest.raises(AnsibleExitJson) as exc:
            my_obj.apply()
        print('Info: test_update_aws_netapp_cvs_pool_pass: %s' % repr(exc.value))
        assert exc.value.args[0]['changed']

    @patch('ansible.modules.cloud.amazon.aws_netapp_cvs_pool.NetAppAWSCVS.get_aws_netapp_cvs_pool')
    @patch('ansible.module_utils.netapp.AwsCvsRestAPI.put')
    def test_update_aws_netapp_cvs_pool_fail(self, get_put_api, get_aws_api):
        set_module_args(self.set_args_update_aws_netapp_cvs_pool())
        my_obj = pool_module()
        my_pool = {
            "name": "Dummyname",
            "poolId": "1f63b3d0-4fd4-b4fe-1ed6-c62f5f20d975",
            "region": "us-east-1",
            "serviceLevel": "extreme",
            "sizeInBytes": 40000000000000000,
            "state": "available",
            "vendorID": "Dummy"
        }
        get_put_api.return_value = my_pool, "Error"
        get_aws_api.return_value = my_pool
        with pytest.raises(AnsibleFailJson) as exc:
            my_obj.apply()
        print('Info: test_update_aws_netapp_cvs_pool_fail: %s' % repr(exc.value))
        assert exc.value.args[0]['msg'] is not None

    @patch('ansible.modules.cloud.amazon.aws_netapp_cvs_pool.NetAppAWSCVS.get_aws_netapp_cvs_pool')
    @patch('ansible.module_utils.netapp.AwsCvsRestAPI.post')
    def test_create_aws_netapp_cvs_pool_pass(self, get_post_api, get_aws_api):
        set_module_args(self.set_args_create_aws_netapp_cvs_pool())
        my_obj = pool_module()
        my_pool = {
            "name": "Dummyname",
            "poolId": "1f63b3d0-4fd4-b4fe-1ed6-c62f5f20d975",
            "region": "us-east-1",
            "serviceLevel": "extreme",
            "sizeInBytes": 40000000000000000,
            "state": "available",
            "vendorID": "Dummy"
        }
        get_aws_api.return_value = None
        get_post_api.return_value = None, None
        with pytest.raises(AnsibleExitJson) as exc:
            my_obj.apply()
        print('Info: test_create_aws_netapp_cvs_pool_pass: %s' % repr(exc.value))
        assert exc.value.args[0]['changed']

    @patch('ansible.modules.cloud.amazon.aws_netapp_cvs_pool.NetAppAWSCVS.get_aws_netapp_cvs_pool')
    @patch('ansible.module_utils.netapp.AwsCvsRestAPI.post')
    def test_create_aws_netapp_cvs_pool_fail(self, get_post_api, get_aws_api):
        set_module_args(self.set_args_create_aws_netapp_cvs_pool())
        my_obj = pool_module()
        my_pool = {
            "name": "Dummyname",
            "poolId": "1f63b3d0-4fd4-b4fe-1ed6-c62f5f20d975",
            "region": "us-east-1",
            "serviceLevel": "extreme",
            "sizeInBytes": 40000000000000000,
            "state": "available",
            "vendorID": "Dummy"
        }
        get_post_api.return_value = my_pool, "Error"
        get_aws_api.return_value = None
        with pytest.raises(AnsibleFailJson) as exc:
            my_obj.apply()
        print('Info: test_create_aws_netapp_cvs_pool_fail: %s' % repr(exc.value))
        assert exc.value.args[0]['msg'] is not None

    @patch('ansible.modules.cloud.amazon.aws_netapp_cvs_pool.NetAppAWSCVS.get_aws_netapp_cvs_pool')
    @patch('ansible.module_utils.netapp.AwsCvsRestAPI.delete')
    def test_delete_aws_netapp_cvs_pool_pass(self, get_delete_api, get_aws_api):
        set_module_args(self.set_args_delete_aws_netapp_cvs_pool())
        my_obj = pool_module()
        my_pool = {
            "name": "Dummyname",
            "poolId": "1f63b3d0-4fd4-b4fe-1ed6-c62f5f20d975",
            "region": "us-east-1",
            "serviceLevel": "extreme",
            "sizeInBytes": 40000000000000000,
            "state": "available",
            "vendorID": "Dummy"
        }
        get_aws_api.return_value = my_pool
        get_delete_api.return_value = None, None
        with pytest.raises(AnsibleExitJson) as exc:
            my_obj.apply()
        print('Info: test_delete_aws_netapp_cvs_pool_pass: %s' % repr(exc.value))
        assert exc.value.args[0]['changed']

    @patch('ansible.modules.cloud.amazon.aws_netapp_cvs_pool.NetAppAWSCVS.get_aws_netapp_cvs_pool')
    @patch('ansible.module_utils.netapp.AwsCvsRestAPI.delete')
    def test_delete_aws_netapp_cvs_pool_fail(self, get_delete_api, get_aws_api):
        set_module_args(self.set_args_delete_aws_netapp_cvs_pool())
        my_obj = pool_module()
        my_pool = {
            "name": "Dummyname",
            "poolId": "1f63b3d0-4fd4-b4fe-1ed6-c62f5f20d975",
            "region": "us-east-1",
            "serviceLevel": "extreme",
            "sizeInBytes": 40000000000000000,
            "state": "available",
            "vendorID": "Dummy"
        }
        get_delete_api.return_value = my_pool, "Error"
        get_aws_api.return_value = my_pool
        with pytest.raises(AnsibleFailJson) as exc:
            my_obj.apply()
        print('Info: test_delete_aws_netapp_cvs_pool_fail: %s' % repr(exc.value))
        assert exc.value.args[0]['msg'] is not None