diff options
author | Mike Fedosin <mfedosin@mirantis.com> | 2015-07-15 15:25:29 +0300 |
---|---|---|
committer | Mike Fedosin <mfedosin@mirantis.com> | 2015-10-08 16:20:53 +0000 |
commit | f5b34ba964b34beb7b69a02abe7c7f004c10f6c6 (patch) | |
tree | c96b7cb981f4c9f6c765631e874b98954befcaa9 | |
parent | 7a4f828ac437553d0aa88ed99aaee5b5571dd91a (diff) | |
download | glance_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.py | 28 | ||||
-rw-r--r-- | glance_store/tests/unit/test_exceptions.py | 57 |
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) |