![Eva Balycheva](/assets/img/avatar_default.png)
Problems: 1. In some cases no information is provided for the CLI user when these exceptions are raised: https://github.com/openstack/python-zaqarclient/blob/master/zaqarclient/ transport/http.py#L30. For example, try "openstack pool show unexisting_pool". You will see just blank line. It is because the server returns no message in the 404 response body. And the user sees the blank line. 2. Most of the error responses from Zaqar have bodies in title-description format. TransportErrors can only show descriptions from these responses. It's better to include also titles in the client's exception messages. 3. Some of the error responses from Zaqar are not in title-description format, but still have some info in their bodies. It's better to include this info to the client's exception message. Solution: This patch makes all exceptions in zaqarclient/transport/errors.py show at least error response code. The patch TransportErrors properly gather the info from Zaqar's error response bodies and show it. Partial-Bug: 1542804 Change-Id: Ie2cc3081a5dd7c4f21c29bdf78a9bad76b515121
107 lines
2.6 KiB
Python
107 lines
2.6 KiB
Python
# Copyright (c) 2013 Red Hat, Inc.
|
|
#
|
|
# 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.
|
|
|
|
|
|
"""
|
|
Errors below must be used to translate transport specific
|
|
errors to Zaqar errors. For example, HTTP 404s should be
|
|
raised as `ResourceNotFound`
|
|
"""
|
|
|
|
from zaqarclient import errors
|
|
|
|
__all__ = ['TransportError', 'ResourceNotFound', 'MalformedRequest',
|
|
'UnauthorizedError', 'ForbiddenError', 'ServiceUnavailableError',
|
|
'InternalServerError', 'ConflictError']
|
|
|
|
|
|
class TransportError(errors.ZaqarError):
|
|
"""Base class for all transport errors."""
|
|
|
|
code = None
|
|
|
|
def __init__(self, title=None, description=None, text=None):
|
|
msg = 'Error response from Zaqar. Code: {0}.'.format(self.code)
|
|
if title:
|
|
msg += ' Title: {0}.'.format(title)
|
|
if description:
|
|
msg += ' Description: {0}.'.format(description)
|
|
if text:
|
|
msg += ' Text: {0}.'.format(text)
|
|
super(TransportError, self).__init__(msg)
|
|
|
|
|
|
class ResourceNotFound(TransportError):
|
|
"""Indicates that a resource is missing
|
|
|
|
This error maps to HTTP's 404
|
|
"""
|
|
|
|
code = 404
|
|
|
|
|
|
class MalformedRequest(TransportError):
|
|
"""Indicates that a request is malformed
|
|
|
|
This error maps to HTTP's 400
|
|
"""
|
|
|
|
code = 400
|
|
|
|
|
|
class UnauthorizedError(TransportError):
|
|
"""Indicates that a request was not authenticated
|
|
|
|
This error maps to HTTP's 401
|
|
"""
|
|
|
|
code = 401
|
|
|
|
|
|
class ForbiddenError(TransportError):
|
|
"""Indicates that a request is forbidden to access the particular resource
|
|
|
|
This error maps to HTTP's 403
|
|
"""
|
|
|
|
code = 403
|
|
|
|
|
|
class InternalServerError(TransportError):
|
|
"""Indicates that the server encountered an unexpected situation
|
|
|
|
This error maps to HTTP's 500
|
|
"""
|
|
|
|
code = 500
|
|
|
|
|
|
class ServiceUnavailableError(TransportError):
|
|
"""Indicates that the server was unable to service the request
|
|
|
|
This error maps to HTTP's 503
|
|
"""
|
|
|
|
code = 503
|
|
|
|
|
|
class ConflictError(TransportError):
|
|
"""Indicates that the server was unable to service the request
|
|
|
|
This error maps to HTTP's 409
|
|
"""
|
|
|
|
code = 409
|