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