diff options
author | Brian Lamar <brian.lamar@rackspace.com> | 2011-08-03 17:41:33 -0400 |
---|---|---|
committer | Brian Lamar <brian.lamar@rackspace.com> | 2011-08-03 17:41:33 -0400 |
commit | 454daa2cba9058d0e744b398ce6af0135b5b27b7 (patch) | |
tree | 7b213f9d0a1c9f24d9b4ff167ab0a7ae19be3eed /novaclient/exceptions.py | |
parent | f8496672cc61ffba052a8c9626e24fde18519010 (diff) | |
download | python-novaclient-454daa2cba9058d0e744b398ce6af0135b5b27b7.tar.gz |
Tests working again...merged in some work we did earlier.
Diffstat (limited to 'novaclient/exceptions.py')
-rw-r--r-- | novaclient/exceptions.py | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/novaclient/exceptions.py b/novaclient/exceptions.py new file mode 100644 index 00000000..ae456dec --- /dev/null +++ b/novaclient/exceptions.py @@ -0,0 +1,105 @@ +# Copyright 2010 Jacob Kaplan-Moss +""" +Exception definitions. +""" + + +class CommandError(Exception): + 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 don't give you access to this + resource. + """ + http_status = 403 + message = "Forbidden" + + +class NotFound(ClientException): + """ + HTTP 404 - Not found + """ + http_status = 404 + message = "Not found" + + +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" + + +# 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, OverLimit, HTTPNotImplemented]) + + +def from_response(response, body): + """ + Return an instance of an ClientException or subclass + based on an httplib2 response. + + Usage:: + + resp, body = http.request(...) + if resp.status != 200: + raise exception_from_response(resp, body) + """ + cls = _code_map.get(response.status, ClientException) + if body: + message = "n/a" + details = "n/a" + if hasattr(body, 'keys'): + error = body[body.keys()[0]] + message = error.get('message', None) + details = error.get('details', None) + return cls(code=response.status, message=message, details=details) + else: + return cls(code=response.status) |