summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Fedosin <mfedosin@mirantis.com>2015-07-15 15:25:29 +0300
committerMike Fedosin <mfedosin@mirantis.com>2015-10-08 16:20:53 +0000
commitf5b34ba964b34beb7b69a02abe7c7f004c10f6c6 (patch)
treec96b7cb981f4c9f6c765631e874b98954befcaa9
parent7a4f828ac437553d0aa88ed99aaee5b5571dd91a (diff)
downloadglance_store-f5b34ba964b34beb7b69a02abe7c7f004c10f6c6.tar.gz
Improving GlanceStoreException
This code improves current implementation of base store exception with several things: 1. default message shouldn't be an empty string and has to provide some information. 2. __init__ has to accept position parameter with message string to bring glance_store to conformity with glance. 3. 'super' should use GlanceStoreException instead of just Exception. Note: This matches the behaviour of glance_store's exceptions with glance's. Co-authored-by: Mike Fedosin <mfedosin@mirantis.com> Co-authored-by: Stuart McLaren <stuart.​mclaren@hp.​com> Closes-bug: 1501443 Change-Id: I04d25874de1c0ec0c46d094c4d9144412e0ae5c9 (cherry picked from commit 845254f5e17d159964249bc8d8cb2c84bf110e92)
-rw-r--r--glance_store/exceptions.py28
-rw-r--r--glance_store/tests/unit/test_exceptions.py57
2 files changed, 78 insertions, 7 deletions
diff --git a/glance_store/exceptions.py b/glance_store/exceptions.py
index 79af298..ef4a363 100644
--- a/glance_store/exceptions.py
+++ b/glance_store/exceptions.py
@@ -15,7 +15,8 @@
"""Glance Store exception subclasses"""
-from six.moves import urllib
+import six
+import six.moves.urllib.parse as urlparse
from glance_store import i18n
@@ -32,7 +33,7 @@ class UnsupportedBackend(BackendException):
class RedirectException(Exception):
def __init__(self, url):
- self.url = urllib.parse.urlparse(url)
+ self.url = urlparse.urlparse(url)
class GlanceStoreException(Exception):
@@ -43,11 +44,24 @@ class GlanceStoreException(Exception):
a 'message' property. That message will get printf'd
with the keyword arguments provided to the constructor.
"""
- message = ''
-
- def __init__(self, **kwargs):
- self.msg = kwargs.pop('message', None) or self.message % kwargs
- super(Exception, self).__init__(self.msg)
+ message = _("An unknown exception occurred")
+
+ def __init__(self, message=None, **kwargs):
+ if not message:
+ message = self.message
+ try:
+ if kwargs:
+ message = message % kwargs
+ except Exception:
+ pass
+ self.msg = message
+ super(GlanceStoreException, self).__init__(message)
+
+ def __unicode__(self):
+ # NOTE(flwang): By default, self.msg is an instance of Message, which
+ # can't be converted by str(). Based on the definition of
+ # __unicode__, it should return unicode always.
+ return six.text_type(self.msg)
class MissingCredentialError(GlanceStoreException):
diff --git a/glance_store/tests/unit/test_exceptions.py b/glance_store/tests/unit/test_exceptions.py
new file mode 100644
index 0000000..d9fe1e1
--- /dev/null
+++ b/glance_store/tests/unit/test_exceptions.py
@@ -0,0 +1,57 @@
+# Copyright 2015 OpenStack Foundation
+# All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+from oslo_utils import encodeutils
+from oslotest import base
+import six
+
+import glance_store
+
+
+class TestExceptions(base.BaseTestCase):
+ """Test routines in glance_store.common.utils."""
+ def test_backend_exception(self):
+ msg = glance_store.BackendException()
+ self.assertIn(u'', encodeutils.exception_to_unicode(msg))
+
+ def test_unsupported_backend_exception(self):
+ msg = glance_store.UnsupportedBackend()
+ self.assertIn(u'', encodeutils.exception_to_unicode(msg))
+
+ def test_redirect_exception(self):
+ # Just checks imports work ok
+ glance_store.RedirectException(url='http://localhost')
+
+ def test_exception_no_message(self):
+ msg = glance_store.NotFound()
+ self.assertIn('Image %(image)s not found',
+ encodeutils.exception_to_unicode(msg))
+
+ def test_exception_not_found_with_image(self):
+ msg = glance_store.NotFound(image='123')
+ self.assertIn('Image 123 not found',
+ encodeutils.exception_to_unicode(msg))
+
+ def test_exception_with_message(self):
+ msg = glance_store.NotFound('Some message')
+ self.assertIn('Some message', encodeutils.exception_to_unicode(msg))
+
+ def test_exception_with_kwargs(self):
+ msg = glance_store.NotFound('Message: %(foo)s', foo='bar')
+ self.assertIn('Message: bar', encodeutils.exception_to_unicode(msg))
+
+ def test_non_unicode_error_msg(self):
+ exc = glance_store.NotFound(str('test'))
+ self.assertIsInstance(encodeutils.exception_to_unicode(exc),
+ six.text_type)