summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAbhishek Kekane <akekane@redhat.com>2020-04-24 15:39:26 +0000
committerAbhishek Kekane <akekane@redhat.com>2020-04-27 06:47:30 +0000
commit98b9091129e78d03dc5b97bd1503063499f166d5 (patch)
tree3e9e3e1020e020fafbdfa5e453202a6d1d33e8a6
parent814b7f23e296abb86fa6664279605cc9fab01e59 (diff)
downloadglance_store-98b9091129e78d03dc5b97bd1503063499f166d5.tar.gz
Fix: API returns 503 if one of the store is mis-configured
If user mis-configures one of the multiple stores defined in glance-api configuratio file, then service returns 503 for all API requests. Made provision to exclude faulty store and resume service normally to function wiht other configured stores. Closes-Bug: #1875281 Change-Id: I685a0ecbfba7cf7dbce3fd2eb84f97bd8ffbfcf3
-rw-r--r--glance_store/_drivers/rbd.py14
-rw-r--r--glance_store/tests/unit/test_multistore_rbd.py6
-rw-r--r--glance_store/tests/unit/test_rbd_store.py4
3 files changed, 19 insertions, 5 deletions
diff --git a/glance_store/_drivers/rbd.py b/glance_store/_drivers/rbd.py
index 0e3e487..09dc941 100644
--- a/glance_store/_drivers/rbd.py
+++ b/glance_store/_drivers/rbd.py
@@ -271,10 +271,16 @@ class Store(driver.Store):
try:
client.connect(timeout=self.connect_timeout)
- except rados.Error:
- msg = _LE("Error connecting to ceph cluster.")
- LOG.exception(msg)
- raise exceptions.BackendException()
+ except (rados.Error, rados.ObjectNotFound) as e:
+ if self.backend_group and len(self.conf.enabled_backends) > 1:
+ reason = _("Error in store configuration: %s") % e
+ LOG.debug(reason)
+ raise exceptions.BadStoreConfiguration(
+ store_name=self.backend_group, reason=reason)
+ else:
+ msg = _LE("Error connecting to ceph cluster.")
+ LOG.exception(msg)
+ raise exceptions.BackendException()
try:
yield client
finally:
diff --git a/glance_store/tests/unit/test_multistore_rbd.py b/glance_store/tests/unit/test_multistore_rbd.py
index 353ad9e..384fca0 100644
--- a/glance_store/tests/unit/test_multistore_rbd.py
+++ b/glance_store/tests/unit/test_multistore_rbd.py
@@ -36,6 +36,9 @@ class MockRados(object):
class Error(Exception):
pass
+ class ObjectNotFound(Exception):
+ pass
+
class ioctx(object):
def __init__(self, *args, **kwargs):
pass
@@ -443,11 +446,12 @@ class TestMultiStore(base.MultiStoreBaseTest,
@mock.patch.object(MockRados.Rados, 'connect', side_effect=MockRados.Error)
def test_rados_connect_error(self, _):
rbd_store.rados.Error = MockRados.Error
+ rbd_store.rados.ObjectNotFound = MockRados.ObjectNotFound
def test():
with self.store.get_connection('conffile', 'rados_id'):
pass
- self.assertRaises(exceptions.BackendException, test)
+ self.assertRaises(exceptions.BadStoreConfiguration, test)
def test_create_image_conf_features(self):
# Tests that we use non-0 features from ceph.conf and cast to int.
diff --git a/glance_store/tests/unit/test_rbd_store.py b/glance_store/tests/unit/test_rbd_store.py
index 8d30855..b5ac713 100644
--- a/glance_store/tests/unit/test_rbd_store.py
+++ b/glance_store/tests/unit/test_rbd_store.py
@@ -35,6 +35,9 @@ class MockRados(object):
class Error(Exception):
pass
+ class ObjectNotFound(Exception):
+ pass
+
class ioctx(object):
def __init__(self, *args, **kwargs):
pass
@@ -451,6 +454,7 @@ class TestStore(base.StoreBaseTest,
@mock.patch.object(MockRados.Rados, 'connect', side_effect=MockRados.Error)
def test_rados_connect_error(self, _):
rbd_store.rados.Error = MockRados.Error
+ rbd_store.rados.ObjectNotFound = MockRados.ObjectNotFound
def test():
with self.store.get_connection('conffile', 'rados_id'):