Merge "Make TransportErrors more descriptive"

This commit is contained in:
Jenkins
2016-03-01 22:40:12 +00:00
committed by Gerrit Code Review
2 changed files with 36 additions and 4 deletions

View File

@@ -24,12 +24,24 @@ from zaqarclient import errors
__all__ = ['TransportError', 'ResourceNotFound', 'MalformedRequest', __all__ = ['TransportError', 'ResourceNotFound', 'MalformedRequest',
'UnauthorizedError', 'ForbiddenError', 'ServiceUnavailableError', 'UnauthorizedError', 'ForbiddenError', 'ServiceUnavailableError',
'InternalServerError'] 'InternalServerError', 'ConflictError']
class TransportError(errors.ZaqarError): class TransportError(errors.ZaqarError):
"""Base class for all transport errors.""" """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): class ResourceNotFound(TransportError):
"""Indicates that a resource is missing """Indicates that a resource is missing
@@ -37,6 +49,8 @@ class ResourceNotFound(TransportError):
This error maps to HTTP's 404 This error maps to HTTP's 404
""" """
code = 404
class MalformedRequest(TransportError): class MalformedRequest(TransportError):
"""Indicates that a request is malformed """Indicates that a request is malformed
@@ -44,6 +58,8 @@ class MalformedRequest(TransportError):
This error maps to HTTP's 400 This error maps to HTTP's 400
""" """
code = 400
class UnauthorizedError(TransportError): class UnauthorizedError(TransportError):
"""Indicates that a request was not authenticated """Indicates that a request was not authenticated
@@ -51,6 +67,8 @@ class UnauthorizedError(TransportError):
This error maps to HTTP's 401 This error maps to HTTP's 401
""" """
code = 401
class ForbiddenError(TransportError): class ForbiddenError(TransportError):
"""Indicates that a request is forbidden to access the particular resource """Indicates that a request is forbidden to access the particular resource
@@ -58,6 +76,8 @@ class ForbiddenError(TransportError):
This error maps to HTTP's 403 This error maps to HTTP's 403
""" """
code = 403
class InternalServerError(TransportError): class InternalServerError(TransportError):
"""Indicates that the server encountered an unexpected situation """Indicates that the server encountered an unexpected situation
@@ -65,6 +85,8 @@ class InternalServerError(TransportError):
This error maps to HTTP's 500 This error maps to HTTP's 500
""" """
code = 500
class ServiceUnavailableError(TransportError): class ServiceUnavailableError(TransportError):
"""Indicates that the server was unable to service the request """Indicates that the server was unable to service the request
@@ -72,9 +94,13 @@ class ServiceUnavailableError(TransportError):
This error maps to HTTP's 503 This error maps to HTTP's 503
""" """
code = 503
class ConflictError(TransportError): class ConflictError(TransportError):
"""Indicates that the server was unable to service the request """Indicates that the server was unable to service the request
This error maps to HTTP's 409 This error maps to HTTP's 409
""" """
code = 409

View File

@@ -97,14 +97,20 @@ class HttpTransport(base.Transport):
data=request.content) data=request.content)
if resp.status_code in self.http_to_zaqar: if resp.status_code in self.http_to_zaqar:
kwargs = {}
try: try:
msg = json.loads(resp.text)['description'] error_body = json.loads(resp.text)
kwargs['title'] = error_body['title']
kwargs['description'] = error_body['description']
except Exception: except Exception:
# TODO(flaper87): Log this exception # TODO(flaper87): Log this exception
# but don't stop raising the corresponding # but don't stop raising the corresponding
# exception # exception
msg = '' # Note(Eva-i): most of the error responses from Zaqar have
raise self.http_to_zaqar[resp.status_code](msg) # dict with title and description in their bodies. If it's not
# the case, let's just show body text.
kwargs['text'] = resp.text
raise self.http_to_zaqar[resp.status_code](**kwargs)
# NOTE(flaper87): This reads the whole content # NOTE(flaper87): This reads the whole content
# and will consume any attempt of streaming. # and will consume any attempt of streaming.