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
13 from functest.opnfv_tests.vnf.ims import cloudify_ims
16 class CloudifyImsTesting(unittest.TestCase):
18 logging.disable(logging.CRITICAL)
21 with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
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'
48 self.mock_post = mock.Mock()
49 attrs = {'status_code': 201,
51 self.mock_post.configure_mock(**attrs)
53 self.mock_post_200 = mock.Mock()
54 attrs = {'status_code': 200,
56 self.mock_post_200.configure_mock(**attrs)
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',
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)
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)
111 def _get_image_id(self, client, name):
112 if name == 'test_image':
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)
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)
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',
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)
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)
273 m.return_value = mock_obj
275 self.assertEqual(self.ims_vnf.deploy_orchestrator(),
276 {'status': 'FAIL', 'result': 'error'})
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)
320 m.return_value = mock_obj
322 self.assertEqual(self.ims_vnf.deploy_orchestrator(),
323 {'status': 'PASS', 'result': ''})
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)
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',
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)
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',
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)
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)
387 m.return_value = mock_obj
389 self.assertEqual(self.ims_vnf.deploy_vnf(),
390 {'status': 'FAIL', 'result': 'error'})
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)
408 m.return_value = mock_obj
410 self.assertEqual(self.ims_vnf.deploy_vnf(),
411 {'status': 'PASS', 'result': ''})
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)
422 def test_test_vnf_fail(self):
423 with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
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 = ''
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
439 self.assertEqual(self.ims_vnf.test_vnf(),
440 {'status': 'FAIL', 'result': ''})
442 def test_test_vnf_pass(self):
443 with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
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'
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
459 self.assertEqual(self.ims_vnf.test_vnf(),
461 'result': 'vims_test_result'})
463 def test_download_and_add_image_on_glance_incorrect_url(self):
464 with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
466 mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
467 'ft_utils.download_url',
469 resp = cloudify_ims.download_and_add_image_on_glance(self.
474 self.assertEqual(resp, False)
476 def test_download_and_add_image_on_glance_image_creation_failure(self):
477 with mock.patch('functest.opnfv_tests.vnf.ims.cloudify_ims.'
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',
485 resp = cloudify_ims.download_and_add_image_on_glance(self.
490 self.assertEqual(resp, False)
493 if __name__ == "__main__":
494 unittest.main(verbosity=2)