Merge "Documentation for unit test project"
[functest.git] / functest / tests / unit / vnf / ims / test_cloudify_ims.py
1 #!/usr/bin/env python
2
3 # All rights reserved. This program and the accompanying materials
4 # are made available under the terms of the Apache License, Version 2.0
5 # which accompanies this distribution, and is available at
6 # http://www.apache.org/licenses/LICENSE-2.0
7
8 import logging
9 import unittest
10
11 import mock
12
13 from functest.opnfv_tests.vnf.ims import cloudify_ims
14
15
16 class CloudifyImsTesting(unittest.TestCase):
17
18     logging.disable(logging.CRITICAL)
19
20     def setUp(self):
21         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
22                         'os.makedirs'), \
23             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
24                        'get_config', return_value='config_value'):
25             self.ims_vnf = cloudify_ims.CloudifyIms()
26         self.neutron_client = mock.Mock()
27         self.glance_client = mock.Mock()
28         self.keystone_client = mock.Mock()
29         self.nova_client = mock.Mock()
30         self.orchestrator = {'requirements': {'ram_min': 2,
31                                               'os_image': 'test_os_image'},
32                              'blueprint': {'url': 'test_url',
33                                            'branch': 'test_branch'},
34                              'inputs': {'public_domain': 'test_domain'},
35                              'object': 'test_object',
36                              'deployment_name': 'test_deployment_name'}
37         self.ims_vnf.orchestrator = self.orchestrator
38         self.ims_vnf.images = {'test_image': 'test_url'}
39         self.ims_vnf.vnf = self.orchestrator
40         self.ims_vnf.tenant_name = 'test_tenant'
41         self.ims_vnf.inputs = {'public_domain': 'test_domain'}
42         self.ims_vnf.glance_client = self.glance_client
43         self.ims_vnf.neutron_client = self.neutron_client
44         self.ims_vnf.keystone_client = self.keystone_client
45         self.ims_vnf.nova_client = self.nova_client
46         self.ims_vnf.admin_creds = 'test_creds'
47
48         self.mock_post = mock.Mock()
49         attrs = {'status_code': 201,
50                  'cookies': ""}
51         self.mock_post.configure_mock(**attrs)
52
53         self.mock_post_200 = mock.Mock()
54         attrs = {'status_code': 200,
55                  'cookies': ""}
56         self.mock_post_200.configure_mock(**attrs)
57
58     def test_deploy_orchestrator_missing_image(self):
59         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
60                         'os_utils.get_neutron_client',
61                         return_value=self.neutron_client), \
62             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
63                        'os_utils.get_glance_client',
64                        return_value=self.glance_client), \
65             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
66                        'os_utils.get_keystone_client',
67                        return_value=self.keystone_client), \
68             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
69                        'os_utils.get_nova_client',
70                        return_value=self.nova_client), \
71             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
72                        'os_utils.get_image_id',
73                        return_value=''), \
74             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
75                        'download_and_add_image_on_glance') as m, \
76                 self.assertRaises(Exception) as context:
77             self.ims_vnf.deploy_orchestrator()
78             self.assertTrue(m.called)
79             msg = "Failed to find or upload required OS "
80             msg += "image for this deployment"
81             self.assertTrue(msg in context.exception)
82
83     def test_deploy_orchestrator_extend_quota_fail(self):
84         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
85                         'os_utils.get_neutron_client',
86                         return_value=self.neutron_client), \
87             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
88                        'os_utils.get_glance_client',
89                        return_value=self.glance_client), \
90             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
91                        'os_utils.get_keystone_client',
92                        return_value=self.keystone_client), \
93             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
94                        'os_utils.get_nova_client',
95                        return_value=self.nova_client), \
96             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
97                        'os_utils.get_image_id',
98                        return_value='image_id'), \
99             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
100                        'os_utils.get_tenant_id',
101                        return_value='tenant_id'), \
102             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
103                        'os_utils.update_sg_quota',
104                        return_value=False), \
105                 self.assertRaises(Exception) as context:
106             self.ims_vnf.deploy_orchestrator()
107             msg = "Failed to update security group quota"
108             msg += " for tenant test_tenant"
109             self.assertTrue(msg in context.exception)
110
111     def _get_image_id(self, client, name):
112         if name == 'test_image':
113             return 'image_id'
114         else:
115             return ''
116
117     def test_deploy_orchestrator_missing_flavor(self):
118         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
119                         'os_utils.get_neutron_client',
120                         return_value=self.neutron_client), \
121             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
122                        'os_utils.get_glance_client',
123                        return_value=self.glance_client), \
124             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
125                        'os_utils.get_keystone_client',
126                        return_value=self.keystone_client), \
127             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
128                        'os_utils.get_nova_client',
129                        return_value=self.nova_client), \
130             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
131                        'os_utils.get_image_id',
132                        side_effect=self._get_image_id), \
133             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
134                        'os_utils.get_tenant_id',
135                        return_value='tenant_id'), \
136             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
137                        'os_utils.update_sg_quota',
138                        return_value=True), \
139             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
140                        'os_utils.get_endpoint',
141                        return_value='public_auth_url'), \
142             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
143                        'Orchestrator', return_value=mock.Mock()) as m, \
144             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
145                        'os_utils.get_or_create_flavor',
146                        return_value=(False, '')), \
147                 self.assertRaises(Exception) as context:
148             self.ims_vnf.deploy_orchestrator()
149             self.assertTrue(m.set_credentials.called)
150             msg = "Failed to find required flavorfor this deployment"
151             self.assertTrue(msg in context.exception)
152
153     def test_deploy_orchestrator_missing_os_image(self):
154         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
155                         'os_utils.get_neutron_client',
156                         return_value=self.neutron_client), \
157             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
158                        'os_utils.get_glance_client',
159                        return_value=self.glance_client), \
160             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
161                        'os_utils.get_keystone_client',
162                        return_value=self.keystone_client), \
163             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
164                        'os_utils.get_nova_client',
165                        return_value=self.nova_client), \
166             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
167                        'os_utils.get_image_id',
168                        side_effect=self._get_image_id), \
169             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
170                        'os_utils.get_tenant_id',
171                        return_value='tenant_id'), \
172             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
173                        'os_utils.update_sg_quota',
174                        return_value=True), \
175             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
176                        'os_utils.get_endpoint',
177                        return_value='public_auth_url'), \
178             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
179                        'Orchestrator', return_value=mock.Mock()) as m, \
180             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
181                        'os_utils.get_or_create_flavor',
182                        return_value=(True, 'flavor_id')), \
183                 self.assertRaises(Exception) as context:
184             self.ims_vnf.deploy_orchestrator()
185             self.assertTrue(m.set_credentials.called)
186             self.assertTrue(m.set_flavor_id.called)
187             msg = "Failed to find required OS image for cloudify manager"
188             self.assertTrue(msg in context.exception)
189
190     def test_deploy_orchestrator_get_ext_network_fail(self):
191         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
192                         'os_utils.get_neutron_client',
193                         return_value=self.neutron_client), \
194             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
195                        'os_utils.get_glance_client',
196                        return_value=self.glance_client), \
197             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
198                        'os_utils.get_keystone_client',
199                        return_value=self.keystone_client), \
200             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
201                        'os_utils.get_nova_client',
202                        return_value=self.nova_client), \
203             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
204                        'os_utils.get_image_id',
205                        return_value='image_id'), \
206             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
207                        'os_utils.get_tenant_id',
208                        return_value='tenant_id'), \
209             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
210                        'os_utils.update_sg_quota',
211                        return_value=True), \
212             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
213                        'os_utils.get_endpoint',
214                        return_value='public_auth_url'), \
215             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
216                        'Orchestrator', return_value=mock.Mock()) as m, \
217             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
218                        'os_utils.get_or_create_flavor',
219                        return_value=(True, 'flavor_id')), \
220             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
221                        'os_utils.get_external_net',
222                        return_value=''), \
223                 self.assertRaises(Exception) as context:
224             self.ims_vnf.deploy_orchestrator()
225             self.assertTrue(m.set_credentials.called)
226             self.assertTrue(m.set_flavor_id.called)
227             self.assertTrue(m.set_image_id.called)
228             msg = "Failed to get external network"
229             self.assertTrue(msg in context.exception)
230
231     def test_deploy_orchestrator_with_error(self):
232         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
233                         'os_utils.get_neutron_client',
234                         return_value=self.neutron_client), \
235             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
236                        'os_utils.get_glance_client',
237                        return_value=self.glance_client), \
238             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
239                        'os_utils.get_keystone_client',
240                        return_value=self.keystone_client), \
241             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
242                        'os_utils.get_nova_client',
243                        return_value=self.nova_client), \
244             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
245                        'os_utils.get_image_id',
246                        return_value='image_id'), \
247             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
248                        'os_utils.get_tenant_id',
249                        return_value='tenant_id'), \
250             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
251                        'os_utils.update_sg_quota',
252                        return_value=True), \
253             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
254                        'os_utils.get_endpoint',
255                        return_value='public_auth_url'), \
256             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
257                        'Orchestrator') as m, \
258             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
259                        'os_utils.get_or_create_flavor',
260                        return_value=(True, 'flavor_id')), \
261             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
262                        'os_utils.get_external_net',
263                        return_value='ext_net'), \
264             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
265                        'ft_utils.get_resolvconf_ns',
266                        return_value=True), \
267             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
268                        'ft_utils.execute_command'):
269             mock_obj = mock.Mock()
270             attrs = {'deploy_manager.return_value': 'error'}
271             mock_obj.configure_mock(**attrs)
272
273             m.return_value = mock_obj
274
275             self.assertEqual(self.ims_vnf.deploy_orchestrator(),
276                              {'status': 'FAIL', 'result': 'error'})
277
278     def test_deploy_orchestrator_default(self):
279         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
280                         'os_utils.get_neutron_client',
281                         return_value=self.neutron_client), \
282             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
283                        'os_utils.get_glance_client',
284                        return_value=self.glance_client), \
285             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
286                        'os_utils.get_keystone_client',
287                        return_value=self.keystone_client), \
288             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
289                        'os_utils.get_nova_client',
290                        return_value=self.nova_client), \
291             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
292                        'os_utils.get_image_id',
293                        return_value='image_id'), \
294             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
295                        'os_utils.get_tenant_id',
296                        return_value='tenant_id'), \
297             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
298                        'os_utils.update_sg_quota',
299                        return_value=True), \
300             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
301                        'os_utils.get_endpoint',
302                        return_value='public_auth_url'), \
303             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
304                        'Orchestrator') as m, \
305             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
306                        'os_utils.get_or_create_flavor',
307                        return_value=(True, 'flavor_id')), \
308             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
309                        'os_utils.get_external_net',
310                        return_value='ext_net'), \
311             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
312                        'ft_utils.get_resolvconf_ns',
313                        return_value=True), \
314             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
315                        'ft_utils.execute_command'):
316             mock_obj = mock.Mock()
317             attrs = {'deploy_manager.return_value': ''}
318             mock_obj.configure_mock(**attrs)
319
320             m.return_value = mock_obj
321
322             self.assertEqual(self.ims_vnf.deploy_orchestrator(),
323                              {'status': 'PASS', 'result': ''})
324
325     def test_deploy_vnf_missing_flavor(self):
326         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
327                         'Clearwater', return_value=mock.Mock()), \
328             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
329                        'os_utils.get_or_create_flavor',
330                        return_value=(False, '')), \
331                 self.assertRaises(Exception) as context:
332             self.ims_vnf.deploy_vnf()
333             msg = "Failed to find required flavor for this deployment"
334             self.assertTrue(msg in context.exception)
335
336     def test_deploy_vnf_missing_os_image(self):
337         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
338                         'Clearwater', return_value=mock.Mock()) as m, \
339             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
340                        'os_utils.get_or_create_flavor',
341                        return_value=(True, 'test_flavor')), \
342             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
343                        'os_utils.get_image_id',
344                        return_value=''), \
345                 self.assertRaises(Exception) as context:
346             self.ims_vnf.deploy_vnf()
347             msg = "Failed to find required OS image"
348             msg += " for clearwater VMs"
349             self.assertTrue(msg in context.exception)
350             self.assertTrue(m.set_flavor_id.called)
351
352     def test_deploy_vnf_missing_get_ext_net(self):
353         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
354                         'Clearwater', return_value=mock.Mock()) as m, \
355             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
356                        'os_utils.get_or_create_flavor',
357                        return_value=(True, 'test_flavor')), \
358             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
359                        'os_utils.get_image_id',
360                        return_value='image_id'), \
361             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
362                        'os_utils.get_external_net',
363                        return_value=''), \
364                 self.assertRaises(Exception) as context:
365             self.ims_vnf.deploy_vnf()
366             msg = "Failed to get external network"
367             self.assertTrue(msg in context.exception)
368             self.assertTrue(m.set_flavor_id.called)
369             self.assertTrue(m.set_image_id.called)
370
371     def test_deploy_vnf_with_error(self):
372         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
373                         'Clearwater') as m, \
374             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
375                        'os_utils.get_or_create_flavor',
376                        return_value=(True, 'test_flavor')), \
377             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
378                        'os_utils.get_image_id',
379                        return_value='image_id'), \
380             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
381                        'os_utils.get_external_net',
382                        return_value='ext_net'):
383             mock_obj = mock.Mock()
384             attrs = {'deploy_vnf.return_value': 'error'}
385             mock_obj.configure_mock(**attrs)
386
387             m.return_value = mock_obj
388
389             self.assertEqual(self.ims_vnf.deploy_vnf(),
390                              {'status': 'FAIL', 'result': 'error'})
391
392     def test_deploy_vnf_default(self):
393         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
394                         'Clearwater') as m, \
395             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
396                        'os_utils.get_or_create_flavor',
397                        return_value=(True, 'test_flavor')), \
398             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
399                        'os_utils.get_image_id',
400                        return_value='image_id'), \
401             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
402                        'os_utils.get_external_net',
403                        return_value='ext_net'):
404             mock_obj = mock.Mock()
405             attrs = {'deploy_vnf.return_value': ''}
406             mock_obj.configure_mock(**attrs)
407
408             m.return_value = mock_obj
409
410             self.assertEqual(self.ims_vnf.deploy_vnf(),
411                              {'status': 'PASS', 'result': ''})
412
413     def test_test_vnf_ip_retrieval_failure(self):
414         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
415                         'os.popen', side_effect=Exception), \
416                 self.assertRaises(Exception) as context:
417             msg = "Unable to retrieve the IP of the "
418             msg += "cloudify manager server !"
419             self.ims_vnf.test_vnf()
420             self.assertTrue(msg in context.exception)
421
422     def test_test_vnf_fail(self):
423         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
424                         'os.popen'), \
425             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
426                        'requests.get') as mock_get, \
427             mock.patch.object(self.ims_vnf, 'config_ellis'), \
428             mock.patch.object(self.ims_vnf,
429                               'run_clearwater_live_test') as clearwater_obj:
430                 clearwater_obj.return_value = ''
431
432                 mock_obj2 = mock.Mock()
433                 attrs = {'json.return_value': {'outputs':
434                                                {'dns_ip': 'test_dns_ip',
435                                                 'ellis_ip': 'test_ellis_ip'}}}
436                 mock_obj2.configure_mock(**attrs)
437                 mock_get.return_value = mock_obj2
438
439                 self.assertEqual(self.ims_vnf.test_vnf(),
440                                  {'status': 'FAIL', 'result': ''})
441
442     def test_test_vnf_pass(self):
443         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
444                         'os.popen'), \
445             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
446                        'requests.get') as mock_get, \
447             mock.patch.object(self.ims_vnf, 'config_ellis'), \
448             mock.patch.object(self.ims_vnf,
449                               'run_clearwater_live_test') as clearwater_obj:
450                 clearwater_obj.return_value = 'vims_test_result'
451
452                 mock_obj2 = mock.Mock()
453                 attrs = {'json.return_value': {'outputs':
454                                                {'dns_ip': 'test_dns_ip',
455                                                 'ellis_ip': 'test_ellis_ip'}}}
456                 mock_obj2.configure_mock(**attrs)
457                 mock_get.return_value = mock_obj2
458
459                 self.assertEqual(self.ims_vnf.test_vnf(),
460                                  {'status': 'PASS',
461                                   'result': 'vims_test_result'})
462
463     def test_download_and_add_image_on_glance_incorrect_url(self):
464         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
465                         'os.makedirs'), \
466             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
467                        'ft_utils.download_url',
468                        return_value=False):
469             resp = cloudify_ims.download_and_add_image_on_glance(self.
470                                                                  glance_client,
471                                                                  'image_name',
472                                                                  'http://url',
473                                                                  'data_dir')
474             self.assertEqual(resp, False)
475
476     def test_download_and_add_image_on_glance_image_creation_failure(self):
477         with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
478                         'os.makedirs'), \
479             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
480                        'ft_utils.download_url',
481                        return_value=True), \
482             mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
483                        'os_utils.create_glance_image',
484                        return_value=''):
485             resp = cloudify_ims.download_and_add_image_on_glance(self.
486                                                                  glance_client,
487                                                                  'image_name',
488                                                                  'http://url',
489                                                                  'data_dir')
490             self.assertEqual(resp, False)
491
492
493 if __name__ == "__main__":
494     unittest.main(verbosity=2)