middleware.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import logging
  2. import sys
  3. from pyeventsystem.middleware import dispatch as pyevent_dispatch
  4. from pyeventsystem.middleware import intercept
  5. from pyeventsystem.middleware import observe
  6. import six
  7. from ..interfaces.exceptions import CloudBridgeBaseException
  8. log = logging.getLogger(__name__)
  9. dispatch = pyevent_dispatch
  10. class EventDebugLoggingMiddleware(object):
  11. """
  12. Logs all event parameters. This middleware should not be enabled other
  13. than for debugging, as it could log sensitive parameters such as
  14. access keys.
  15. """
  16. @observe(event_pattern="*", priority=100)
  17. def pre_log_event(self, event_args, *args, **kwargs):
  18. log.debug("Event: {0}, args: {1} kwargs: {2}".format(
  19. event_args.get("event"), args, kwargs))
  20. @observe(event_pattern="*", priority=4900)
  21. def post_log_event(self, event_args, *args, **kwargs):
  22. log.debug("Event: {0}, result: {1}".format(
  23. event_args.get("event"), event_args.get("result")))
  24. class ExceptionWrappingMiddleware(object):
  25. """
  26. Wraps all unhandled exceptions in cloudbridge exceptions.
  27. """
  28. @intercept(event_pattern="*", priority=1050)
  29. def wrap_exception(self, event_args, *args, **kwargs):
  30. next_handler = event_args.pop("next_handler")
  31. if not next_handler:
  32. return
  33. try:
  34. return next_handler.invoke(event_args, *args, **kwargs)
  35. except Exception as e:
  36. if isinstance(e, CloudBridgeBaseException):
  37. raise
  38. else:
  39. ex_type, ex_value, traceback = sys.exc_info()
  40. cb_ex = CloudBridgeBaseException(
  41. "CloudBridgeBaseException: {0} from exception type: {1}"
  42. .format(ex_value, ex_type))
  43. if sys.version_info >= (3, 0):
  44. six.raise_from(cb_ex, e)
  45. else:
  46. six.reraise(CloudBridgeBaseException, cb_ex, traceback)