summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.openstack.org>2018-12-26 23:24:49 +0000
committerGerrit Code Review <review@openstack.org>2018-12-26 23:24:49 +0000
commit8f3668d8460eef4f7014e880b5c430b628b865fa (patch)
tree20b5e2db933ca45dba803601f77f22545dd8cb5a
parent4c328e7630ebd909a34a43cba5cfcb6a6ec09aa8 (diff)
parent7377cf2638d36dbdbc91b3884e9d53a095364b5e (diff)
downloadglance_store-8f3668d8460eef4f7014e880b5c430b628b865fa.tar.gz
Merge "Catch rbd NoSpace exception"
-rw-r--r--glance_store/_drivers/rbd.py15
-rw-r--r--glance_store/tests/unit/test_multistore_rbd.py3
-rw-r--r--glance_store/tests/unit/test_rbd_store.py31
3 files changed, 48 insertions, 1 deletions
diff --git a/glance_store/_drivers/rbd.py b/glance_store/_drivers/rbd.py
index 74e929b..195083d 100644
--- a/glance_store/_drivers/rbd.py
+++ b/glance_store/_drivers/rbd.py
@@ -514,6 +514,21 @@ class Store(driver.Store):
if loc.snapshot:
image.create_snap(loc.snapshot)
image.protect_snap(loc.snapshot)
+ except rbd.NoSpace:
+ log_msg = (_LE("Failed to store image %(img_name)s "
+ "insufficient space available") %
+ {'img_name': image_name})
+ LOG.error(log_msg)
+
+ # Delete image if one was created
+ try:
+ target_pool = loc.pool or self.pool
+ self._delete_image(target_pool, loc.image,
+ loc.snapshot)
+ except exceptions.NotFound:
+ pass
+
+ raise exceptions.StorageFull(message=log_msg)
except Exception as exc:
log_msg = (_LE("Failed to store image %(img_name)s "
"Store Exception %(store_exc)s") %
diff --git a/glance_store/tests/unit/test_multistore_rbd.py b/glance_store/tests/unit/test_multistore_rbd.py
index 492c64b..363ed9f 100644
--- a/glance_store/tests/unit/test_multistore_rbd.py
+++ b/glance_store/tests/unit/test_multistore_rbd.py
@@ -89,6 +89,9 @@ class MockRBD(object):
class InvalidArgument(Exception):
pass
+ class NoSpace(Exception):
+ pass
+
class Image(object):
def __init__(self, *args, **kwargs):
diff --git a/glance_store/tests/unit/test_rbd_store.py b/glance_store/tests/unit/test_rbd_store.py
index 6863bce..5af6bac 100644
--- a/glance_store/tests/unit/test_rbd_store.py
+++ b/glance_store/tests/unit/test_rbd_store.py
@@ -88,6 +88,9 @@ class MockRBD(object):
class InvalidArgument(Exception):
pass
+ class NoSpace(Exception):
+ pass
+
class Image(object):
def __init__(self, *args, **kwargs):
@@ -214,7 +217,6 @@ class TestStore(base.StoreBaseTest,
def _fake_enter(*args, **kwargs):
raise exceptions.NotFound(image="fake_image_id")
-
create.side_effect = _fake_create_image
delete.side_effect = _fake_delete_image
enter.side_effect = _fake_enter
@@ -226,6 +228,33 @@ class TestStore(base.StoreBaseTest,
self.called_commands_expected = ['create', 'delete']
+ @mock.patch.object(MockRBD.Image, 'resize')
+ @mock.patch.object(rbd_store.Store, '_create_image')
+ @mock.patch.object(rbd_store.Store, '_delete_image')
+ def test_add_w_rbd_no_space_exception(self, delete, create, resize):
+ def _fake_create_image(*args, **kwargs):
+ self.called_commands_actual.append('create')
+ return self.location
+
+ def _fake_delete_image(target_pool, image_name, snapshot_name=None):
+ self.assertEqual(self.location.pool, target_pool)
+ self.assertEqual(self.location.image, image_name)
+ self.assertEqual(self.location.snapshot, snapshot_name)
+ self.called_commands_actual.append('delete')
+
+ def _fake_resize(*args, **kwargs):
+ raise MockRBD.NoSpace()
+ create.side_effect = _fake_create_image
+ delete.side_effect = _fake_delete_image
+ resize.side_effect = _fake_resize
+
+ self.assertRaises(exceptions.StorageFull,
+ self.store.add,
+ 'fake_image_id', self.data_iter, 0,
+ self.hash_algo)
+
+ self.called_commands_expected = ['create', 'delete']
+
def test_add_duplicate_image(self):
def _fake_create_image(*args, **kwargs):