diff options
author | whoami-rajat <rajatdhasmana@gmail.com> | 2022-03-16 15:40:04 +0530 |
---|---|---|
committer | whoami-rajat <rajatdhasmana@gmail.com> | 2022-03-22 14:32:10 +0530 |
commit | 4bd0304efbdfb98e2742741af42b483708f48a41 (patch) | |
tree | a26ee469536bf750ce4869ee0c2b0b9b32e2f61b | |
parent | e5a3c9eefa83f173f12ee38804207e94bbdfa544 (diff) | |
download | glance_store-4bd0304efbdfb98e2742741af42b483708f48a41.tar.gz |
Add exception coverage for get, get_size, delete
This patch adds coverage for the various exceptions handled and
raised in get, get_size and delete methods.
It also corrects the behavior of _test_cinder_get_size method where
client.volumes returned dictionary instead of a MagicMock and it
worked due to the existing method "get" in dictionary which has
same name as "get" method in cinderclient. The dictionary object
is replaced with the appropriate MagicMock object in this patch.
Change-Id: If63a6c810b5aab992e54857bc81f5052c2c593c4
-rw-r--r-- | glance_store/tests/unit/test_cinder_base.py | 70 | ||||
-rw-r--r-- | glance_store/tests/unit/test_cinder_store.py | 14 | ||||
-rw-r--r-- | glance_store/tests/unit/test_multistore_cinder.py | 15 |
3 files changed, 71 insertions, 28 deletions
diff --git a/glance_store/tests/unit/test_cinder_base.py b/glance_store/tests/unit/test_cinder_base.py index 29bf5cc..245372d 100644 --- a/glance_store/tests/unit/test_cinder_base.py +++ b/glance_store/tests/unit/test_cinder_base.py @@ -437,11 +437,42 @@ class TestCinderStoreBase(object): self.assertEqual(expected_num_chunks, num_chunks) self.assertEqual(expected_file_contents, data) + def _test_cinder_volume_not_found(self, method_call, mock_method): + fake_volume_uuid = str(uuid.uuid4()) + loc = mock.MagicMock(volume_id=fake_volume_uuid) + mock_not_found = {mock_method: mock.MagicMock( + side_effect=cinder.cinder_exception.NotFound(code=404))} + fake_volumes = mock.MagicMock(**mock_not_found) + + with mock.patch.object(cinder.Store, 'get_cinderclient') as mocked_cc: + mocked_cc.return_value = mock.MagicMock(volumes=fake_volumes) + self.assertRaises(exceptions.NotFound, method_call, loc, + context=self.context) + + def test_cinder_get_volume_not_found(self): + self._test_cinder_volume_not_found(self.store.get, 'get') + + def test_cinder_get_size_volume_not_found(self): + self._test_cinder_volume_not_found(self.store.get_size, 'get') + + def test_cinder_delete_volume_not_found(self): + self._test_cinder_volume_not_found(self.store.delete, 'delete') + + def test_cinder_get_client_exception(self): + fake_volume_uuid = str(uuid.uuid4()) + loc = mock.MagicMock(volume_id=fake_volume_uuid) + + with mock.patch.object(cinder.Store, 'get_cinderclient') as mock_cc: + mock_cc.side_effect = ( + cinder.cinder_exception.ClientException(code=500)) + self.assertRaises(exceptions.BackendException, self.store.get, loc, + context=self.context) + def _test_cinder_get_size(self, is_multi_store=False): fake_client = mock.MagicMock(auth_token=None, management_url=None) fake_volume_uuid = str(uuid.uuid4()) fake_volume = mock.MagicMock(size=5, metadata={}) - fake_volumes = {fake_volume_uuid: fake_volume} + fake_volumes = mock.MagicMock(get=lambda fake_volume_uuid: fake_volume) with mock.patch.object(cinder.Store, 'get_cinderclient') as mocked_cc: mocked_cc.return_value = mock.MagicMock(client=fake_client, @@ -471,6 +502,17 @@ class TestCinderStoreBase(object): image_size = self.store.get_size(loc, context=self.context) self.assertEqual(expected_image_size, image_size) + def test_cinder_get_size_generic_exception(self): + fake_volume_uuid = str(uuid.uuid4()) + loc = mock.MagicMock(volume_id=fake_volume_uuid) + fake_volumes = mock.MagicMock( + get=mock.MagicMock(side_effect=Exception())) + + with mock.patch.object(cinder.Store, 'get_cinderclient') as mocked_cc: + mocked_cc.return_value = mock.MagicMock(volumes=fake_volumes) + image_size = self.store.get_size(loc, context=self.context) + self.assertEqual(0, image_size) + def _test_cinder_add(self, fake_volume, volume_file, size_kb=5, verifier=None, backend='glance_store', fail_resize=False, is_multi_store=False): @@ -528,6 +570,32 @@ class TestCinderStoreBase(object): if is_multi_store: self.assertEqual(backend, metadata["store"]) + def _test_cinder_delete(self, is_multi_store=False): + fake_client = mock.MagicMock(auth_token=None, management_url=None) + fake_volume_uuid = str(uuid.uuid4()) + fake_volumes = mock.MagicMock(delete=mock.Mock()) + + with mock.patch.object(cinder.Store, 'get_cinderclient') as mocked_cc: + mocked_cc.return_value = mock.MagicMock(client=fake_client, + volumes=fake_volumes) + + loc = self._get_uri_loc(fake_volume_uuid, + is_multi_store=is_multi_store) + + self.store.delete(loc, context=self.context) + fake_volumes.delete.assert_called_once_with(fake_volume_uuid) + + def test_cinder_delete_client_exception(self): + fake_volume_uuid = str(uuid.uuid4()) + loc = mock.MagicMock(volume_id=fake_volume_uuid) + fake_volumes = mock.MagicMock(delete=mock.MagicMock( + side_effect=cinder.cinder_exception.ClientException(code=500))) + + with mock.patch.object(cinder.Store, 'get_cinderclient') as mocked_cc: + mocked_cc.return_value = mock.MagicMock(volumes=fake_volumes) + self.assertRaises(exceptions.BackendException, self.store.delete, + loc, context=self.context) + def test__get_device_size(self): fake_data = b"fake binary data" fake_len = int(math.ceil(float(len(fake_data)) / units.Gi)) diff --git a/glance_store/tests/unit/test_cinder_store.py b/glance_store/tests/unit/test_cinder_store.py index 60fba6f..25e098c 100644 --- a/glance_store/tests/unit/test_cinder_store.py +++ b/glance_store/tests/unit/test_cinder_store.py @@ -23,7 +23,6 @@ import uuid from oslo_utils import units from glance_store import exceptions -from glance_store import location from glance_store.tests import base from glance_store.tests.unit import test_cinder_base from glance_store.tests.unit import test_store_capabilities @@ -147,18 +146,7 @@ class TestCinderStore(base.StoreBaseTest, fake_volume.delete.assert_called_once() def test_cinder_delete(self): - fake_client = mock.MagicMock(auth_token=None, management_url=None) - fake_volume_uuid = str(uuid.uuid4()) - fake_volumes = mock.MagicMock(delete=mock.Mock()) - - with mock.patch.object(cinder.Store, 'get_cinderclient') as mocked_cc: - mocked_cc.return_value = mock.MagicMock(client=fake_client, - volumes=fake_volumes) - - uri = 'cinder://%s' % fake_volume_uuid - loc = location.get_location_from_uri(uri, conf=self.conf) - self.store.delete(loc, context=self.context) - fake_volumes.delete.assert_called_once_with(fake_volume_uuid) + self._test_cinder_delete() def test_set_url_prefix(self): self.assertEqual('cinder://', self.store._url_prefix) diff --git a/glance_store/tests/unit/test_multistore_cinder.py b/glance_store/tests/unit/test_multistore_cinder.py index e92f86c..40e6f51 100644 --- a/glance_store/tests/unit/test_multistore_cinder.py +++ b/glance_store/tests/unit/test_multistore_cinder.py @@ -284,20 +284,7 @@ class TestMultiCinderStore(base.MultiStoreBaseTest, fake_volume.delete.assert_called_once() def test_cinder_delete(self): - fake_client = mock.MagicMock(auth_token=None, management_url=None) - fake_volume_uuid = str(uuid.uuid4()) - fake_volumes = mock.MagicMock(delete=mock.Mock()) - - with mock.patch.object(cinder.Store, 'get_cinderclient') as mocked_cc: - mocked_cc.return_value = mock.MagicMock(client=fake_client, - volumes=fake_volumes) - - uri = 'cinder://cinder1/%s' % fake_volume_uuid - loc = location.get_location_from_uri_and_backend(uri, - "cinder1", - conf=self.conf) - self.store.delete(loc, context=self.context) - fake_volumes.delete.assert_called_once_with(fake_volume_uuid) + self._test_cinder_delete(is_multi_store=True) def test_set_url_prefix(self): self.assertEqual('cinder://cinder1', self.store._url_prefix) |