Support using existing private key when using external heat template file
[yardstick.git] / yardstick / tests / unit / common / test_openstack_utils.py
1 ##############################################################################
2 # Copyright (c) 2016 Huawei Technologies Co.,Ltd and others.
3 #
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ##############################################################################
9
10 import os
11
12 import mock
13 from oslo_utils import uuidutils
14 import shade
15 from shade import exc
16 import unittest
17
18 from yardstick.common import constants
19 from yardstick.common import openstack_utils
20
21
22 class GetCredentialsTestCase(unittest.TestCase):
23
24     @mock.patch('yardstick.common.openstack_utils.os')
25     def test_get_credentials(self, _):
26         with mock.patch.dict('os.environ', {'OS_IDENTITY_API_VERSION': '2'},
27                              clear=True):
28             openstack_utils.get_credentials()
29
30
31 class GetHeatApiVersionTestCase(unittest.TestCase):
32
33     @mock.patch.object(openstack_utils, 'log')
34     def test_get_heat_api_version_check_result(self, *args):
35         API = 'HEAT_API_VERSION'
36         expected_result = '2'
37
38         with mock.patch.dict(os.environ, {API: '2'}, clear=True):
39             api_version = openstack_utils.get_heat_api_version()
40             self.assertEqual(api_version, expected_result)
41
42
43 class GetShadeClientTestCase(unittest.TestCase):
44
45     @mock.patch.object(shade, 'openstack_cloud', return_value='os_client')
46     def test_get_shade_client(self, mock_openstack_cloud):
47         os_cloud_config = {'param1': True, 'param2': 'value2'}
48         self.assertEqual('os_client',
49                          openstack_utils.get_shade_client(**os_cloud_config))
50         os_cloud_config.update(constants.OS_CLOUD_DEFAULT_CONFIG)
51         mock_openstack_cloud.assert_called_once_with(**os_cloud_config)
52
53         mock_openstack_cloud.reset_mock()
54         os_cloud_config = {'verify': True, 'param2': 'value2'}
55         self.assertEqual('os_client',
56                          openstack_utils.get_shade_client(**os_cloud_config))
57         mock_openstack_cloud.assert_called_once_with(**os_cloud_config)
58
59     @mock.patch.object(shade, 'openstack_cloud', return_value='os_client')
60     def test_get_shade_client_no_parameters(self, mock_openstack_cloud):
61         self.assertEqual('os_client', openstack_utils.get_shade_client())
62         mock_openstack_cloud.assert_called_once_with(
63             **constants.OS_CLOUD_DEFAULT_CONFIG)
64
65     @mock.patch.object(shade, 'operator_cloud', return_value='os_client')
66     def test_get_shade_operator_client(self, mock_operator_cloud):
67         self.assertEqual('os_client', openstack_utils.get_shade_operator_client())
68         mock_operator_cloud.assert_called_once_with(
69             **constants.OS_CLOUD_DEFAULT_CONFIG)
70
71
72 class DeleteNeutronNetTestCase(unittest.TestCase):
73
74     def setUp(self):
75         self.mock_shade_client = mock.Mock()
76
77     def test_delete_neutron_net(self):
78         self.mock_shade_client.delete_network.return_value = True
79         output = openstack_utils.delete_neutron_net(self.mock_shade_client,
80                                                     'network_name_or_id')
81         self.assertTrue(output)
82
83     def test_delete_neutron_net_fail(self):
84         self.mock_shade_client.delete_network.return_value = False
85         output = openstack_utils.delete_neutron_net(self.mock_shade_client,
86                                                     'network_name_or_id')
87         self.assertFalse(output)
88
89     @mock.patch.object(openstack_utils, 'log')
90     def test_delete_neutron_net_exception(self, mock_logger):
91         self.mock_shade_client.delete_network.side_effect = (
92             exc.OpenStackCloudException('error message'))
93         output = openstack_utils.delete_neutron_net(self.mock_shade_client,
94                                                     'network_name_or_id')
95         self.assertFalse(output)
96         mock_logger.error.assert_called_once()
97
98
99 class CreateNeutronNetTestCase(unittest.TestCase):
100
101     def setUp(self):
102         self.mock_shade_client = mock.Mock()
103         self.network_name = 'name'
104         self.mock_shade_client.create_network = mock.Mock()
105
106     def test_create_neutron_net(self):
107         _uuid = uuidutils.generate_uuid()
108         self.mock_shade_client.create_network.return_value = {'id': _uuid}
109         output = openstack_utils.create_neutron_net(self.mock_shade_client,
110                                                     self.network_name)
111         self.assertEqual(_uuid, output)
112
113     @mock.patch.object(openstack_utils, 'log')
114     def test_create_neutron_net_exception(self, mock_logger):
115         self.mock_shade_client.create_network.side_effect = (
116             exc.OpenStackCloudException('error message'))
117
118         output = openstack_utils.create_neutron_net(self.mock_shade_client,
119                                                     self.network_name)
120         mock_logger.error.assert_called_once()
121         self.assertIsNone(output)
122
123
124 class CreateNeutronSubnetTestCase(unittest.TestCase):
125
126     def setUp(self):
127         self.mock_shade_client = mock.Mock()
128         self.network_name_or_id = 'name_or_id'
129         self.mock_shade_client.create_subnet = mock.Mock()
130
131     def test_create_neutron_subnet(self):
132         _uuid = uuidutils.generate_uuid()
133         self.mock_shade_client.create_subnet.return_value = {'id': _uuid}
134         output = openstack_utils.create_neutron_subnet(
135             self.mock_shade_client, self.network_name_or_id)
136         self.assertEqual(_uuid, output)
137
138     @mock.patch.object(openstack_utils, 'log')
139     def test_create_neutron_subnet_exception(self, mock_logger):
140         self.mock_shade_client.create_subnet.side_effect = (
141             exc.OpenStackCloudException('error message'))
142
143         output = openstack_utils.create_neutron_subnet(
144             self.mock_shade_client, self.network_name_or_id)
145         mock_logger.error.assert_called_once()
146         self.assertIsNone(output)
147
148
149 class DeleteNeutronRouterTestCase(unittest.TestCase):
150
151     def setUp(self):
152         self.mock_shade_client = mock.Mock()
153         self.mock_shade_client.delete_router = mock.Mock()
154
155     def test_delete_neutron_router(self):
156         self.mock_shade_client.delete_router.return_value = True
157         output = openstack_utils.delete_neutron_router(self.mock_shade_client,
158                                                        'router_id')
159         self.assertTrue(output)
160
161     def test_delete_neutron_router_fail(self):
162         self.mock_shade_client.delete_router.return_value = False
163         output = openstack_utils.delete_neutron_router(self.mock_shade_client,
164                                                        'router_id')
165         self.assertFalse(output)
166
167     @mock.patch.object(openstack_utils, 'log')
168     def test_delete_neutron_router_exception(self, mock_logger):
169         self.mock_shade_client.delete_router.side_effect = (
170             exc.OpenStackCloudException('error message'))
171         output = openstack_utils.delete_neutron_router(self.mock_shade_client,
172                                                        'router_id')
173         mock_logger.error.assert_called_once()
174         self.assertFalse(output)
175
176
177 class CreateNeutronRouterTestCase(unittest.TestCase):
178
179     def setUp(self):
180         self.mock_shade_client = mock.Mock()
181         self.mock_shade_client.create_subnet = mock.Mock()
182
183     def test_create_neutron_router(self):
184         _uuid = uuidutils.generate_uuid()
185         self.mock_shade_client.create_router.return_value = {'id': _uuid}
186         output = openstack_utils.create_neutron_router(
187             self.mock_shade_client)
188         self.assertEqual(_uuid, output)
189
190     @mock.patch.object(openstack_utils, 'log')
191     def test_create_neutron_subnet_exception(self, mock_logger):
192         self.mock_shade_client.create_router.side_effect = (
193             exc.OpenStackCloudException('error message'))
194
195         output = openstack_utils.create_neutron_router(
196             self.mock_shade_client)
197         mock_logger.error.assert_called_once()
198         self.assertIsNone(output)
199
200
201 class RemoveRouterInterfaceTestCase(unittest.TestCase):
202
203     def setUp(self):
204         self.mock_shade_client = mock.Mock()
205         self.router = 'router'
206         self.mock_shade_client.remove_router_interface = mock.Mock()
207
208     def test_remove_router_interface(self):
209         self.mock_shade_client.remove_router_interface.return_value = True
210         output = openstack_utils.remove_router_interface(
211             self.mock_shade_client, self.router)
212         self.assertTrue(output)
213
214     @mock.patch.object(openstack_utils, 'log')
215     def test_remove_router_interface_exception(self, mock_logger):
216         self.mock_shade_client.remove_router_interface.side_effect = (
217             exc.OpenStackCloudException('error message'))
218         output = openstack_utils.remove_router_interface(
219             self.mock_shade_client, self.router)
220         mock_logger.error.assert_called_once()
221         self.assertFalse(output)
222
223
224 class CreateFloatingIpTestCase(unittest.TestCase):
225
226     def setUp(self):
227         self.mock_shade_client = mock.Mock()
228         self.network_name_or_id = 'name'
229         self.mock_shade_client.create_floating_ip = mock.Mock()
230
231     def test_create_floating_ip(self):
232         self.mock_shade_client.create_floating_ip.return_value = \
233             {'floating_ip_address': 'value1', 'id': 'value2'}
234         output = openstack_utils.create_floating_ip(self.mock_shade_client,
235                                                     self.network_name_or_id)
236         self.assertEqual({'fip_addr': 'value1', 'fip_id': 'value2'}, output)
237
238     @mock.patch.object(openstack_utils, 'log')
239     def test_create_floating_ip_exception(self, mock_logger):
240         self.mock_shade_client.create_floating_ip.side_effect = (
241             exc.OpenStackCloudException('error message'))
242         output = openstack_utils.create_floating_ip(
243             self.mock_shade_client, self.network_name_or_id)
244         mock_logger.error.assert_called_once()
245         self.assertIsNone(output)
246
247
248 class DeleteFloatingIpTestCase(unittest.TestCase):
249
250     def setUp(self):
251         self.mock_shade_client = mock.Mock()
252         self.floating_ip_id = 'floating_ip_id'
253         self.mock_shade_client.delete_floating_ip = mock.Mock()
254
255     def test_delete_floating_ip(self):
256         self.mock_shade_client.delete_floating_ip.return_value = True
257         output = openstack_utils.delete_floating_ip(self.mock_shade_client,
258                                                     'floating_ip_id')
259         self.assertTrue(output)
260
261     def test_delete_floating_ip_fail(self):
262         self.mock_shade_client.delete_floating_ip.return_value = False
263         output = openstack_utils.delete_floating_ip(self.mock_shade_client,
264                                                     'floating_ip_id')
265         self.assertFalse(output)
266
267     @mock.patch.object(openstack_utils, 'log')
268     def test_delete_floating_ip_exception(self, mock_logger):
269         self.mock_shade_client.delete_floating_ip.side_effect = (
270             exc.OpenStackCloudException('error message'))
271         output = openstack_utils.delete_floating_ip(self.mock_shade_client,
272                                                     'floating_ip_id')
273         mock_logger.error.assert_called_once()
274         self.assertFalse(output)
275
276
277 class CreateSecurityGroupRuleTestCase(unittest.TestCase):
278
279     def setUp(self):
280         self.mock_shade_client = mock.Mock()
281         self.secgroup_name_or_id = 'sg_name_id'
282         self.mock_shade_client.create_security_group_rule = mock.Mock()
283         self._mock_log = mock.patch.object(openstack_utils, 'log')
284         self.mock_log = self._mock_log.start()
285         self.addCleanup(self._stop_mock)
286
287     def _stop_mock(self):
288         self._mock_log.stop()
289
290     def test_create_security_group_rule(self):
291         self.mock_shade_client.create_security_group_rule.return_value = (
292             {'security_group_rule'})
293         output = openstack_utils.create_security_group_rule(
294             self.mock_shade_client, self.secgroup_name_or_id)
295         self.assertTrue(output)
296
297     def test_create_security_group_rule_exception(self):
298         self.mock_shade_client.create_security_group_rule.side_effect = (
299             exc.OpenStackCloudException('error message'))
300
301         output = openstack_utils.create_security_group_rule(
302             self.mock_shade_client, self.secgroup_name_or_id)
303         self.mock_log.error.assert_called_once()
304         self.assertFalse(output)
305
306
307 class ListImageTestCase(unittest.TestCase):
308
309     def test_list_images(self):
310         mock_shade_client = mock.MagicMock()
311         mock_shade_client.list_images.return_value = []
312         openstack_utils.list_images(mock_shade_client)
313
314     @mock.patch.object(openstack_utils, 'log')
315     def test_list_images_exception(self, mock_logger):
316         mock_shade_client = mock.MagicMock()
317         mock_shade_client.list_images = mock.MagicMock()
318         mock_shade_client.list_images.side_effect = (
319             exc.OpenStackCloudException('error message'))
320         images = openstack_utils.list_images(mock_shade_client)
321         mock_logger.error.assert_called_once()
322         self.assertFalse(images)
323
324
325 class SecurityGroupTestCase(unittest.TestCase):
326
327     def setUp(self):
328         self.mock_shade_client = mock.Mock()
329         self.sg_name = 'sg_name'
330         self.sg_description = 'sg_description'
331         self._uuid = uuidutils.generate_uuid()
332         self._mock_log = mock.patch.object(openstack_utils, 'log')
333         self.mock_log = self._mock_log.start()
334         self.addCleanup(self._stop_mock)
335
336     def _stop_mock(self):
337         self._mock_log.stop()
338
339     def test_create_security_group_full_existing_security_group(self):
340         self.mock_shade_client.get_security_group.return_value = (
341             {'name': 'name', 'id': self._uuid})
342         output = openstack_utils.create_security_group_full(
343             self.mock_shade_client, self.sg_name, self.sg_description)
344         self.mock_shade_client.get_security_group.assert_called_once()
345         self.assertEqual(self._uuid, output)
346
347     def test_create_security_group_full_non_existing_security_group(self):
348         self.mock_shade_client.get_security_group.return_value = None
349         self.mock_shade_client.create_security_group.side_effect = (
350             exc.OpenStackCloudException('error message'))
351         output = openstack_utils.create_security_group_full(
352             self.mock_shade_client, self.sg_name, self.sg_description)
353         self.mock_log.error.assert_called_once()
354         self.assertIsNone(output)
355
356     @mock.patch.object(openstack_utils, 'create_security_group_rule')
357     def test_create_security_group_full_create_rule_fail(
358             self, mock_create_security_group_rule):
359         self.mock_shade_client.get_security_group.return_value = None
360         self.mock_shade_client.create_security_group.return_value = (
361             {'name': 'name', 'id': self._uuid})
362         mock_create_security_group_rule.return_value = False
363         output = openstack_utils.create_security_group_full(
364             self.mock_shade_client, self.sg_name, self.sg_description)
365         mock_create_security_group_rule.assert_called()
366         self.mock_shade_client.delete_security_group(self.sg_name)
367         self.mock_log.error.assert_called_once()
368         self.assertIsNone(output)
369
370     @mock.patch.object(openstack_utils, 'create_security_group_rule')
371     def test_create_security_group_full(
372             self, mock_create_security_group_rule):
373         self.mock_shade_client.get_security_group.return_value = None
374         self.mock_shade_client.create_security_group.return_value = (
375             {'name': 'name', 'id': self._uuid})
376         mock_create_security_group_rule.return_value = True
377         output = openstack_utils.create_security_group_full(
378             self.mock_shade_client, self.sg_name, self.sg_description)
379         mock_create_security_group_rule.assert_called()
380         self.mock_shade_client.delete_security_group(self.sg_name)
381         self.assertEqual(self._uuid, output)
382
383
384 class CreateInstanceTestCase(unittest.TestCase):
385
386     def test_create_instance_and_wait_for_active(self):
387         self.mock_shade_client = mock.Mock()
388         name = 'server_name'
389         image = 'image_name'
390         flavor = 'flavor_name'
391         self.mock_shade_client.create_server.return_value = (
392             {'name': name, 'image': image, 'flavor': flavor})
393         output = openstack_utils.create_instance_and_wait_for_active(
394             self.mock_shade_client, name, image, flavor)
395         self.assertEqual(
396             {'name': name, 'image': image, 'flavor': flavor}, output)
397
398     @mock.patch.object(openstack_utils, 'log')
399     def test_create_instance_and_wait_for_active_fail(self, mock_logger):
400         self.mock_shade_client = mock.Mock()
401         self.mock_shade_client.create_server.side_effect = (
402             exc.OpenStackCloudException('error message'))
403         output = openstack_utils.create_instance_and_wait_for_active(
404             self.mock_shade_client, 'server_name', 'image_name', 'flavor_name')
405         mock_logger.error.assert_called_once()
406         self.assertIsNone(output)
407
408
409 class DeleteInstanceTestCase(unittest.TestCase):
410
411     def setUp(self):
412         self.mock_shade_client = mock.Mock()
413
414     def test_delete_instance(self):
415         self.mock_shade_client.delete_server.return_value = True
416         output = openstack_utils.delete_instance(self.mock_shade_client,
417                                                  'instance_name_id')
418         self.assertTrue(output)
419
420     def test_delete_instance_fail(self):
421         self.mock_shade_client.delete_server.return_value = False
422         output = openstack_utils.delete_instance(self.mock_shade_client,
423                                                  'instance_name_id')
424         self.assertFalse(output)
425
426     @mock.patch.object(openstack_utils, 'log')
427     def test_delete_instance_exception(self, mock_logger):
428         self.mock_shade_client.delete_server.side_effect = (
429             exc.OpenStackCloudException('error message'))
430         output = openstack_utils.delete_instance(self.mock_shade_client,
431                                                  'instance_name_id')
432         mock_logger.error.assert_called_once()
433         self.assertFalse(output)
434
435
436 class CreateKeypairTestCase(unittest.TestCase):
437
438     def setUp(self):
439         self.mock_shade_client = mock.Mock()
440         self.name = 'key_name'
441
442     def test_create_keypair(self):
443         self.mock_shade_client.create_keypair.return_value = (
444             {'name': 'key-name', 'type': 'ssh'})
445         output = openstack_utils.create_keypair(
446             self.mock_shade_client, self.name)
447         self.assertEqual(
448             {'name': 'key-name', 'type': 'ssh'},
449             output)
450
451     @mock.patch.object(openstack_utils, 'log')
452     def test_create_keypair_fail(self, mock_logger):
453         self.mock_shade_client.create_keypair.side_effect = (
454             exc.OpenStackCloudException('error message'))
455         output = openstack_utils.create_keypair(
456             self.mock_shade_client, self.name)
457         mock_logger.error.assert_called_once()
458         self.assertIsNone(output)
459
460
461 class DeleteKeypairTestCase(unittest.TestCase):
462
463     def setUp(self):
464         self.mock_shade_client = mock.Mock()
465
466     def test_delete_keypair(self):
467         self.mock_shade_client.delete_keypair.return_value = True
468         output = openstack_utils.delete_keypair(self.mock_shade_client,
469                                                 'key_name')
470         self.assertTrue(output)
471
472     def test_delete_keypair_fail(self):
473         self.mock_shade_client.delete_keypair.return_value = False
474         output = openstack_utils.delete_keypair(self.mock_shade_client,
475                                                 'key_name')
476         self.assertFalse(output)
477
478     @mock.patch.object(openstack_utils, 'log')
479     def test_delete_keypair_exception(self, mock_logger):
480         self.mock_shade_client.delete_keypair.side_effect = (
481             exc.OpenStackCloudException('error message'))
482         output = openstack_utils.delete_keypair(self.mock_shade_client,
483                                                 'key_name')
484         mock_logger.error.assert_called_once()
485         self.assertFalse(output)
486
487
488 class AttachVolumeToServerTestCase(unittest.TestCase):
489
490     def test_attach_volume_to_server(self):
491         self.mock_shade_client = mock.Mock()
492         self.mock_shade_client.get_server.return_value = {'server_dict'}
493         self.mock_shade_client.get_volume.return_value = {'volume_dict'}
494         self.mock_shade_client.attach_volume.return_value = True
495         output = openstack_utils.attach_volume_to_server(
496             self.mock_shade_client, 'server_name_or_id', 'volume_name_or_id')
497         self.assertTrue(output)
498
499     @mock.patch.object(openstack_utils, 'log')
500     def test_attach_volume_to_server_fail(self, mock_logger):
501         self.mock_shade_client = mock.Mock()
502         self.mock_shade_client.attach_volume.side_effect = (
503             exc.OpenStackCloudException('error message'))
504         output = openstack_utils.attach_volume_to_server(
505             self.mock_shade_client, 'server_name_or_id', 'volume_name_or_id')
506         mock_logger.error.assert_called_once()
507         self.assertFalse(output)
508
509
510 class GetServerTestCase(unittest.TestCase):
511
512     def test_get_server(self):
513         self.mock_shade_client = mock.Mock()
514         _uuid = uuidutils.generate_uuid()
515         self.mock_shade_client.get_server.return_value = {
516             'name': 'server_name', 'id': _uuid}
517         output = openstack_utils.get_server(self.mock_shade_client,
518                                             'server_name_or_id')
519         self.assertEqual({'name': 'server_name', 'id': _uuid}, output)
520
521     @mock.patch.object(openstack_utils, 'log')
522     def test_get_server_exception(self, mock_logger):
523         self.mock_shade_client = mock.Mock()
524         self.mock_shade_client.get_server.side_effect = (
525             exc.OpenStackCloudException('error message'))
526         output = openstack_utils.get_server(self.mock_shade_client,
527                                             'server_name_or_id')
528         mock_logger.error.assert_called_once()
529         self.assertIsNone(output)
530
531
532 class GetFlavorTestCase(unittest.TestCase):
533
534     def test_get_flavor(self):
535         self.mock_shade_client = mock.Mock()
536         _uuid = uuidutils.generate_uuid()
537         self.mock_shade_client.get_flavor.return_value = {
538             'name': 'flavor_name', 'id': _uuid}
539         output = openstack_utils.get_flavor(self.mock_shade_client,
540                                             'flavor_name_or_id')
541         self.assertEqual({'name': 'flavor_name', 'id': _uuid}, output)
542
543     @mock.patch.object(openstack_utils, 'log')
544     def test_get_flavor_exception(self, mock_logger):
545         self.mock_shade_client = mock.Mock()
546         self.mock_shade_client.get_flavor.side_effect = (
547             exc.OpenStackCloudException('error message'))
548         output = openstack_utils.get_flavor(self.mock_shade_client,
549                                             'flavor_name_or_id')
550         mock_logger.error.assert_called_once()
551         self.assertIsNone(output)
552
553
554 class GetVolumeIDTestCase(unittest.TestCase):
555
556     def test_get_volume_id(self):
557         self.mock_shade_client = mock.Mock()
558         _uuid = uuidutils.generate_uuid()
559         self.mock_shade_client.get_volume_id.return_value = _uuid
560         output = openstack_utils.get_volume_id(self.mock_shade_client,
561                                                'volume_name')
562         self.assertEqual(_uuid, output)
563
564     def test_get_volume_id_None(self):
565         self.mock_shade_client = mock.Mock()
566         self.mock_shade_client.get_volume_id.return_value = None
567         output = openstack_utils.get_volume_id(self.mock_shade_client,
568                                                'volume_name')
569         self.assertIsNone(output)
570
571
572 class GetVolumeTestCase(unittest.TestCase):
573
574     def setUp(self):
575         self.mock_shade_client = mock.Mock()
576         self.mock_shade_client.get_volume = mock.Mock()
577
578     def test_get_volume(self):
579         self.mock_shade_client.get_volume.return_value = {'volume'}
580         output = openstack_utils.get_volume(self.mock_shade_client,
581                                             'volume_name_or_id')
582         self.assertEqual({'volume'}, output)
583
584     def test_get_volume_None(self):
585         self.mock_shade_client.get_volume.return_value = None
586         output = openstack_utils.get_volume(self.mock_shade_client,
587                                             'volume_name_or_id')
588         self.assertIsNone(output)
589
590
591 class CreateVolumeTestCase(unittest.TestCase):
592
593     def setUp(self):
594         self.mock_shade_client = mock.Mock()
595         self.size = 1
596
597     def test_create_volume(self):
598         self.mock_shade_client.create_volume.return_value = (
599             {'name': 'volume-name', 'size': self.size})
600         output = openstack_utils.create_volume(
601             self.mock_shade_client, self.size)
602         self.assertEqual(
603             {'name': 'volume-name', 'size': self.size},
604             output)
605
606     @mock.patch.object(openstack_utils, 'log')
607     def test_create_volume_fail(self, mock_logger):
608         self.mock_shade_client.create_volume.side_effect = (
609             exc.OpenStackCloudException('error message'))
610         output = openstack_utils.create_volume(self.mock_shade_client,
611                                                self.size)
612         mock_logger.error.assert_called_once()
613         self.assertIsNone(output)
614
615
616 class DeleteVolumeTestCase(unittest.TestCase):
617
618     def setUp(self):
619         self.mock_shade_client = mock.Mock()
620
621     def test_delete_volume(self):
622         self.mock_shade_client.delete_volume.return_value = True
623         output = openstack_utils.delete_volume(self.mock_shade_client,
624                                                'volume_name_or_id')
625         self.assertTrue(output)
626
627     def test_delete_volume_fail(self):
628         self.mock_shade_client.delete_volume.return_value = False
629         output = openstack_utils.delete_volume(self.mock_shade_client,
630                                                'volume_name_or_id')
631         self.assertFalse(output)
632
633     @mock.patch.object(openstack_utils, 'log')
634     def test_delete_volume_exception(self, mock_logger):
635         self.mock_shade_client.delete_volume.side_effect = (
636             exc.OpenStackCloudException('error message'))
637         output = openstack_utils.delete_volume(self.mock_shade_client,
638                                                'volume_name_or_id')
639         mock_logger.error.assert_called_once()
640         self.assertFalse(output)
641
642
643 class DetachVolumeTestCase(unittest.TestCase):
644
645     @mock.patch.object(openstack_utils, 'get_server')
646     def test_detach_volume(self, mock_get_server):
647         self.mock_shade_client = mock.Mock()
648         mock_get_server.return_value = {'server_dict'}
649         self.mock_shade_client.get_volume.return_value = {'volume_dict'}
650         output = openstack_utils.detach_volume(self.mock_shade_client,
651                                                'server_name_or_id',
652                                                'volume_name_or_id')
653         self.assertTrue(output)
654
655     @mock.patch.object(openstack_utils, 'get_server')
656     @mock.patch.object(openstack_utils, 'log')
657     def test_detach_volume_exception(self, mock_logger, mock_get_server):
658         self.mock_shade_client = mock.Mock()
659         mock_get_server.return_value = {'server_dict'}
660         self.mock_shade_client.get_volume.return_value = {'volume_dict'}
661         self.mock_shade_client.detach_volume.side_effect = (
662             exc.OpenStackCloudException('error message'))
663         output = openstack_utils.detach_volume(self.mock_shade_client,
664                                                'server_name_or_id',
665                                                'volume_name_or_id')
666         mock_logger.error.assert_called_once()
667         self.assertFalse(output)
668
669
670 class CreateImageTestCase(unittest.TestCase):
671
672     def setUp(self):
673         self.mock_shade_client = mock.Mock()
674         self._uuid = uuidutils.generate_uuid()
675         self.name = 'image_name'
676         self._mock_log = mock.patch.object(openstack_utils, 'log')
677         self.mock_log = self._mock_log.start()
678         self.addCleanup(self._stop_mock)
679
680     def _stop_mock(self):
681         self._mock_log.stop()
682
683     def test_create_image_already_exit(self):
684         self.mock_shade_client.get_image_id.return_value = self._uuid
685         output = openstack_utils.create_image(self.mock_shade_client, self.name)
686         self.mock_log.info.assert_called_once()
687         self.assertEqual(self._uuid, output)
688
689     def test_create_image(self):
690         self.mock_shade_client.get_image_id.return_value = None
691         self.mock_shade_client.create_image.return_value = {'id': self._uuid}
692         output = openstack_utils.create_image(self.mock_shade_client, self.name)
693         self.assertEqual(self._uuid, output)
694
695     def test_create_image_exception(self):
696         self.mock_shade_client.get_image_id.return_value = None
697         self.mock_shade_client.create_image.side_effect = (
698             exc.OpenStackCloudException('error message'))
699
700         output = openstack_utils.create_image(self.mock_shade_client,
701                                               self.name)
702         self.mock_log.error.assert_called_once()
703         self.assertIsNone(output)
704
705
706 class DeleteImageTestCase(unittest.TestCase):
707
708     def test_delete_image(self):
709         self.mock_shade_client = mock.Mock()
710         self.mock_shade_client.delete_image.return_value = True
711         output = openstack_utils.delete_image(self.mock_shade_client,
712                                               'image_name_or_id')
713         self.assertTrue(output)
714
715     def test_delete_image_fail(self):
716         self.mock_shade_client = mock.Mock()
717         self.mock_shade_client.delete_image.return_value = False
718         output = openstack_utils.delete_image(self.mock_shade_client,
719                                               'image_name_or_id')
720         self.assertFalse(output)
721
722     @mock.patch.object(openstack_utils, 'log')
723     def test_delete_image_exception(self, mock_logger):
724         self.mock_shade_client = mock.Mock()
725         self.mock_shade_client.delete_image.side_effect = (
726             exc.OpenStackCloudException('error message'))
727         output = openstack_utils.delete_image(self.mock_shade_client,
728                                               'image_name_or_id')
729         mock_logger.error.assert_called_once()
730         self.assertFalse(output)