NeutronExceptions have a 'message' class attribute that holds the
generic error message template, e.g. "Network %(network)s not found",
unfortunately, because the names are the same, it was overshadowing the
actual exception instance 'message', e.g. "Network 1 not found", after
translation when the exception was serialized to JSON.
This patch puts the exception's actual message in a new field called
'msg' and overwrites NeutronException unicode() so that 'msg' is used
during serialization and we'll get the correct message on the REST API
response.
Fixes bug: #
1212882
Change-Id: I3965bffb1c2c2eee0af440d1ecd30ccb3bb958d5
was not translated
"""
localize = gettextutils.get_localized_message
- if isinstance(translatable, Exception):
+ if isinstance(translatable, exceptions.NeutronException):
+ translatable.msg = localize(translatable.msg, locale)
+ elif isinstance(translatable, webob.exc.HTTPError):
+ translatable.detail = localize(translatable.detail, locale)
+ elif isinstance(translatable, Exception):
translatable.message = localize(translatable.message, locale)
- if isinstance(translatable, webob.exc.HTTPError):
- translatable.detail = localize(translatable.detail, locale)
- return translatable
- return localize(translatable, locale)
+ else:
+ return localize(translatable, locale)
+ return translatable
def __init__(self, **kwargs):
try:
super(NeutronException, self).__init__(self.message % kwargs)
+ self.msg = self.message % kwargs
except Exception:
if _FATAL_EXCEPTION_FORMAT_ERRORS:
raise
# at least get the core message out if something happened
super(NeutronException, self).__init__(self.message)
+ def __unicode__(self):
+ return unicode(self.msg)
+
class BadRequest(NeutronException):
message = _('Bad %(resource)s request: %(msg)s')
self.assertEqual(wsgi.XMLDeserializer().deserialize(res.body),
expected_res)
- @mock.patch('neutron.openstack.common.gettextutils.Message.data',
- new_callable=mock.PropertyMock)
+ @mock.patch('neutron.openstack.common.gettextutils.get_localized_message')
def test_unmapped_neutron_error_localized(self, mock_translation):
gettextutils.install('blaa', lazy=True)
msg_translation = 'Translated error'
self.assertEqual(wsgi.XMLDeserializer().deserialize(res.body),
expected_res)
- @mock.patch('neutron.openstack.common.gettextutils.Message.data',
- new_callable=mock.PropertyMock)
+ @mock.patch('neutron.openstack.common.gettextutils.get_localized_message')
def test_mapped_neutron_error_localized(self, mock_translation):
gettextutils.install('blaa', lazy=True)
msg_translation = 'Translated error'