diff options
author | Abhishek Kekane <akekane@redhat.com> | 2020-04-24 15:39:26 +0000 |
---|---|---|
committer | Abhishek Kekane <akekane@redhat.com> | 2020-04-27 06:47:30 +0000 |
commit | 98b9091129e78d03dc5b97bd1503063499f166d5 (patch) | |
tree | 3e9e3e1020e020fafbdfa5e453202a6d1d33e8a6 | |
parent | 814b7f23e296abb86fa6664279605cc9fab01e59 (diff) | |
download | glance_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.py | 14 | ||||
-rw-r--r-- | glance_store/tests/unit/test_multistore_rbd.py | 6 | ||||
-rw-r--r-- | glance_store/tests/unit/test_rbd_store.py | 4 |
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'): |