Improve HTTP error formatting
This improves formatting for HTTP errors. keystoneauth's HttpErrors are now caught an re-formatted to include the body of the http response. Work items: * Introduce the "http_error_formatter" function decorator, which catches an re-formats keystoneauths HttpErrors. * Introduce the "format_http_errors" class decorator, which applies the "http_error_formatter" to all functions of a class. * Add an "HttpDecoratorMeta" to the "BaseManager" class. This will decorate all functions of classes inheriting from "BaseManager" with the "http_error_formatter" decorator. Change-Id: I6735f1fa8d876a87e2b7d4aaa533d5a32b085735
This commit is contained in:
@@ -15,9 +15,23 @@
|
|||||||
#
|
#
|
||||||
from string import Formatter as StringFormatter
|
from string import Formatter as StringFormatter
|
||||||
|
|
||||||
|
from six import add_metaclass
|
||||||
from six.moves.urllib.parse import urlencode
|
from six.moves.urllib.parse import urlencode
|
||||||
|
|
||||||
|
from cloudkittyclient import utils
|
||||||
|
|
||||||
|
|
||||||
|
class HttpDecoratorMeta(type):
|
||||||
|
|
||||||
|
ignore = ('get_url', )
|
||||||
|
|
||||||
|
def __new__(cls, *args, **kwargs):
|
||||||
|
return utils.format_http_errors(HttpDecoratorMeta.ignore)(
|
||||||
|
super(HttpDecoratorMeta, cls).__new__(cls, *args, **kwargs)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@add_metaclass(HttpDecoratorMeta)
|
||||||
class BaseManager(object):
|
class BaseManager(object):
|
||||||
"""Base class for Endpoint Manager objects."""
|
"""Base class for Endpoint Manager objects."""
|
||||||
|
|
||||||
|
@@ -1,4 +1,3 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Copyright 2018 Objectif Libre
|
# Copyright 2018 Objectif Libre
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
@@ -13,8 +12,12 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
#
|
#
|
||||||
|
import inspect
|
||||||
|
import sys
|
||||||
|
|
||||||
import pbr.version
|
import pbr.version
|
||||||
|
|
||||||
|
from keystoneauth1.exceptions import http
|
||||||
from oslo_utils import timeutils
|
from oslo_utils import timeutils
|
||||||
|
|
||||||
|
|
||||||
@@ -56,3 +59,44 @@ def list_to_cols(list_obj, cols):
|
|||||||
for item in list_obj:
|
for item in list_obj:
|
||||||
values.append(dict_to_cols(item, cols))
|
values.append(dict_to_cols(item, cols))
|
||||||
return values
|
return values
|
||||||
|
|
||||||
|
|
||||||
|
def http_error_formatter(func):
|
||||||
|
"""This decorator catches Http Errors and re-formats them"""
|
||||||
|
|
||||||
|
def wrap(*args, **kwargs):
|
||||||
|
try:
|
||||||
|
return func(*args, **kwargs)
|
||||||
|
except http.HttpError as e:
|
||||||
|
raise http.HttpError(message=e.response.text,
|
||||||
|
http_status=e.http_status)
|
||||||
|
|
||||||
|
return wrap
|
||||||
|
|
||||||
|
|
||||||
|
def format_http_errors(ignore):
|
||||||
|
"""Applies ``http_error_formatter`` to all methods of a class.
|
||||||
|
|
||||||
|
:param ignore: List of function names to ignore
|
||||||
|
:type ignore: iterable
|
||||||
|
"""
|
||||||
|
|
||||||
|
def wrap(cls):
|
||||||
|
# If you want pretty errors, use python3.
|
||||||
|
# __qualname__ does not exist in python 2
|
||||||
|
if sys.version_info.major < 3:
|
||||||
|
return cls
|
||||||
|
|
||||||
|
def predicate(item):
|
||||||
|
# This avoids decorating functions of parent classes
|
||||||
|
return (inspect.isfunction(item)
|
||||||
|
and item.__name__ not in ignore
|
||||||
|
and not item.__name__.startswith('_')
|
||||||
|
and cls.__name__ in item.__qualname__)
|
||||||
|
|
||||||
|
for name, func in inspect.getmembers(cls, predicate):
|
||||||
|
setattr(cls, name, http_error_formatter(func))
|
||||||
|
|
||||||
|
return cls
|
||||||
|
|
||||||
|
return wrap
|
||||||
|
Reference in New Issue
Block a user