78 lines
2.5 KiB
Python
78 lines
2.5 KiB
Python
# Copyright 2013 - Noorul Islam K M
|
|
#
|
|
# 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.
|
|
|
|
from solumclient.common.apiclient import exceptions
|
|
|
|
|
|
class CommandException(Exception):
|
|
"""An error occurred."""
|
|
def __init__(self, message=None):
|
|
self.message = message
|
|
|
|
def __str__(self):
|
|
return self.message or self.__class__.__doc__
|
|
|
|
|
|
class CommandError(CommandException):
|
|
"""Invalid usage of CLI."""
|
|
|
|
|
|
class NotUnique(CommandException):
|
|
"""Name refers to more than one of a given resource."""
|
|
def __init__(self, resource='resource'):
|
|
message = "More than one %s by that name. Retry with the UUID."
|
|
self.message = message % resource
|
|
|
|
|
|
def from_response(response, method, url):
|
|
"""Returns an instance of :class:`HttpError` or subclass based on response.
|
|
|
|
:param response: instance of `requests.Response` class
|
|
:param method: HTTP method used for request
|
|
:param url: URL used for request
|
|
"""
|
|
kwargs = {
|
|
"http_status": response.status_code,
|
|
"response": response,
|
|
"method": method,
|
|
"url": url,
|
|
"request_id": response.headers.get("x-compute-request-id"),
|
|
}
|
|
if "retry-after" in response.headers:
|
|
kwargs["retry_after"] = response.headers["retry-after"]
|
|
|
|
content_type = response.headers.get("Content-Type", "")
|
|
if content_type.startswith("application/json"):
|
|
try:
|
|
body = response.json()
|
|
except ValueError:
|
|
pass
|
|
else:
|
|
if isinstance(body, dict):
|
|
kwargs["message"] = body.get("faultstring")
|
|
kwargs["details"] = body.get("debuginfo")
|
|
elif content_type.startswith("text/"):
|
|
kwargs["details"] = response.text
|
|
|
|
try:
|
|
cls = exceptions._code_map[response.status_code]
|
|
except KeyError:
|
|
if 500 <= response.status_code < 600:
|
|
cls = exceptions.HttpServerError
|
|
elif 400 <= response.status_code < 500:
|
|
cls = exceptions.HTTPClientError
|
|
else:
|
|
cls = exceptions.HttpError
|
|
return cls(**kwargs)
|