diff --git a/cinderclient/exceptions.py b/cinderclient/exceptions.py index 4987f2420..3c79ceee7 100644 --- a/cinderclient/exceptions.py +++ b/cinderclient/exceptions.py @@ -82,7 +82,9 @@ class ClientException(Exception): """ def __init__(self, code, message=None, details=None, request_id=None): self.code = code - self.message = message or self.__class__.message + # NOTE(mriedem): Use getattr on self.__class__.message since + # BaseException.message was dropped in python 3, see PEP 0352. + self.message = message or getattr(self.__class__, 'message', None) self.details = details self.request_id = request_id @@ -176,8 +178,8 @@ def from_response(response, body): details = "n/a" if hasattr(body, 'keys'): error = body[list(body)[0]] - message = error.get('message', None) - details = error.get('details', None) + message = error.get('message', message) + details = error.get('details', details) return cls(code=response.status_code, message=message, details=details, request_id=request_id) else: diff --git a/cinderclient/tests/unit/test_exceptions.py b/cinderclient/tests/unit/test_exceptions.py new file mode 100644 index 000000000..0559705c2 --- /dev/null +++ b/cinderclient/tests/unit/test_exceptions.py @@ -0,0 +1,32 @@ +# Copyright 2015 IBM Corp. +# +# 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. + +"""Tests the cinderclient.exceptions module.""" + +import requests + +from cinderclient import exceptions +from cinderclient.tests.unit import utils + + +class ExceptionsTest(utils.TestCase): + + def test_from_response_no_body_message(self): + # Tests that we get ClientException back since we don't have 500 mapped + response = requests.Response() + response.status_code = 500 + body = {'keys': ({})} + ex = exceptions.from_response(response, body) + self.assertIs(exceptions.ClientException, type(ex)) + self.assertEqual('n/a', ex.message)