Fix ClientException init when there is no message on py34
BaseException.message was removed in python 3 per PEP 0352 so if no message is passed to the ClientException __init__ it will blow up: AttributeError: type object 'ClientException' has no attribute 'message' So this change does two things: 1. Default to 'n/a' for message and details when body['keys'] doesn't have a message or details in it (which should be fine since from_response defaults to n/a if 'keys' is not in body). 2. Use getattr for self.__class__.message and default to None if that attribute is not set. Arguably we could just remove this and make the message kwarg default to 'n/a' in ClientException.__init__ but I figured that was more invasive. Closes-Bug: #1481478 Change-Id: I738cb9c8d4f015048c45a1df16bf18e29190e392
This commit is contained in:
parent
59fef40f0e
commit
03542ee65a
@ -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:
|
||||
|
32
cinderclient/tests/unit/test_exceptions.py
Normal file
32
cinderclient/tests/unit/test_exceptions.py
Normal file
@ -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)
|
Loading…
Reference in New Issue
Block a user