summaryrefslogtreecommitdiff
path: root/keystoneclient/exceptions.py
diff options
context:
space:
mode:
authorAlessio Ababilov <aababilo@yahoo-inc.com>2013-08-15 17:19:31 +0300
committerAlessio Ababilov <aababilo@yahoo-inc.com>2013-08-20 14:03:26 +0300
commitfba0cd51d97fa04c9a2732439771d0df067a2d6c (patch)
treebb648f40195a83b0a51bc8c92543e9bd8a25b156 /keystoneclient/exceptions.py
parentd8673ff449a1c659fbf66031cf26793bf4ede972 (diff)
downloadpython-keystoneclient-fba0cd51d97fa04c9a2732439771d0df067a2d6c.tar.gz
Add apiclient.exceptions hierarchy
The new apiclient.exceptions hierarchy is more comprehensive and it covers almost all HTTP error status codes. These exceptions can be used in novaclient, keystoneclient, glanceclient, and other client projects thus providing a single inteface. Users can have benefit from OpenStack clients raising exceptions of known classes while now every client has its own classes making difficult to catch, e.g., NotFound for every client. Change-Id: Ia7b25880e0ffca3526525a0f0e77c7e77c4f0076
Diffstat (limited to 'keystoneclient/exceptions.py')
-rw-r--r--keystoneclient/exceptions.py161
1 files changed, 2 insertions, 159 deletions
diff --git a/keystoneclient/exceptions.py b/keystoneclient/exceptions.py
index 4c33346..3092ea8 100644
--- a/keystoneclient/exceptions.py
+++ b/keystoneclient/exceptions.py
@@ -4,162 +4,5 @@
Exception definitions.
"""
-from keystoneclient.openstack.common import jsonutils
-
-
-class CommandError(Exception):
- pass
-
-
-class ValidationError(Exception):
- pass
-
-
-class AuthorizationFailure(Exception):
- pass
-
-
-class NoTokenLookupException(Exception):
- """This form of authentication does not support looking up
- endpoints from an existing token.
- """
- pass
-
-
-class EndpointNotFound(Exception):
- """Could not find Service or Region in Service Catalog."""
- pass
-
-
-class EmptyCatalog(Exception):
- """The service catalog is empty."""
- pass
-
-
-class NoUniqueMatch(Exception):
- """Unable to find unique resource."""
- pass
-
-
-class ClientException(Exception):
- """The base exception class for all exceptions this library raises."""
-
- def __init__(self, code, message=None, details=None):
- self.code = code
- self.message = message or self.__class__.message
- self.details = details
-
- def __str__(self):
- return "%s (HTTP %s)" % (self.message, self.code)
-
-
-class BadRequest(ClientException):
- """HTTP 400 - Bad request: you sent some malformed data."""
-
- http_status = 400
- message = "Bad request"
-
-
-class Unauthorized(ClientException):
- """HTTP 401 - Unauthorized: bad credentials."""
-
- http_status = 401
- message = "Unauthorized"
-
-
-class Forbidden(ClientException):
- """HTTP 403 - Forbidden: your credentials do not allow access to this
- resource.
- """
- http_status = 403
- message = "Forbidden"
-
-
-class NotFound(ClientException):
- """HTTP 404 - Not found."""
- http_status = 404
- message = "Not found"
-
-
-class MethodNotAllowed(ClientException):
- """HTTP 405 - Method not allowed."""
- http_status = 405
- message = "Method not allowed"
-
-
-class Conflict(ClientException):
- """HTTP 409 - Conflict."""
- http_status = 409
- message = "Conflict"
-
-
-class OverLimit(ClientException):
- """HTTP 413 - Over limit: you're over the API limits for this time
- period.
- """
- http_status = 413
- message = "Over limit"
-
-
-# NotImplemented is a python keyword.
-class HTTPNotImplemented(ClientException):
- """HTTP 501 - Not Implemented: the server does not support this
- operation.
- """
- http_status = 501
- message = "Not Implemented"
-
-
-class ServiceUnavailable(ClientException):
- """HTTP 503 - Service Unavailable: The server is currently unavailable."""
- http_status = 503
- message = "Service Unavailable"
-
-
-# In Python 2.4 Exception is old-style and thus doesn't have a __subclasses__()
-# so we can do this:
-# _code_map = dict((c.http_status, c)
-# for c in ClientException.__subclasses__())
-#
-# Instead, we have to hardcode it:
-_code_map = dict((c.http_status, c) for c in [BadRequest,
- Unauthorized,
- Forbidden,
- NotFound,
- MethodNotAllowed,
- Conflict,
- OverLimit,
- HTTPNotImplemented,
- ServiceUnavailable])
-
-
-def from_response(response, body=None):
- """Return an instance of a ClientException or subclass
- based on a requests response.
-
- Usage::
-
- resp = requests.request(...)
- if resp.status_code != 200:
- raise exception_from_response(resp, resp.text)
- """
- cls = _code_map.get(response.status_code, ClientException)
- if body is None:
- try:
- body = jsonutils.loads(response.text)
- except Exception:
- body = response.text
-
- if body:
- if hasattr(body, 'keys'):
- error = body[body.keys()[0]]
- message = error.get('message', None)
- details = error.get('details', None)
- else:
- # If we didn't get back a properly formed error message we
- # probably couldn't communicate with Keystone at all.
- message = "Unable to communicate with identity service: %s." % body
- details = None
- return cls(code=response.status_code, message=message, details=details)
- else:
- return cls(code=response.status_code)
+#flake8: noqa
+from keystoneclient.apiclient.exceptions import *