From d18b4d13cbc25c85005e4b19a02abedbed7aba46 Mon Sep 17 00:00:00 2001 From: Nate Coraor Date: Mon, 20 Mar 2017 10:56:44 -0400 Subject: [PATCH] Add an exception for unsupported middleware wrapping for better failure handling. --- lib/galaxy/webapps/galaxy/buildapp.py | 23 ++++++++----- lib/galaxy/webapps/reports/buildapp.py | 24 ++++++++----- lib/galaxy/webapps/tool_shed/buildapp.py | 24 ++++++++----- lib/galaxy/webapps/util.py | 43 +++++++++++++++++------- 4 files changed, 76 insertions(+), 38 deletions(-) diff --git a/lib/galaxy/webapps/galaxy/buildapp.py b/lib/galaxy/webapps/galaxy/buildapp.py index 1448f05d0c6..b75b124543c 100644 --- a/lib/galaxy/webapps/galaxy/buildapp.py +++ b/lib/galaxy/webapps/galaxy/buildapp.py @@ -19,7 +19,12 @@ import galaxy.model.mapping import galaxy.datatypes.registry import galaxy.web.framework import galaxy.web.framework.webapp -from galaxy.webapps.util import build_template_error_formatters, wrap_if_allowed +from galaxy.webapps.util import ( + MiddlewareWrapUnsupported, + build_template_error_formatters, + wrap_if_allowed, + wrap_if_allowed_or_fail +) from galaxy import util from galaxy.util import asbool from galaxy.util.properties import load_app_properties @@ -912,13 +917,15 @@ def wrap_in_middleware( app, global_conf, application_stack, **local_conf ): # Interactive exception debugging, scary dangerous if publicly # accessible, if not enabled we'll use the regular error printing # middleware. - from weberror import evalexception - import galaxy.web.framework.middleware.error - app = wrap_if_allowed( app, stack, evalexception.EvalException, - args=(conf,), - kwargs=dict(templating_formatters=build_template_error_formatters()), - alt_wrap=galaxy.web.framework.middleware.error.ErrorMiddleware, - alt_args=(conf,) ) + try: + from weberror import evalexception + app = wrap_if_allowed_or_fail( app, stack, evalexception.EvalException, + args=(conf,), + kwargs=dict(templating_formatters=build_template_error_formatters()) ) + except MiddlewareWrapUnsupported as exc: + log.warning(str(exc)) + import galaxy.web.framework.middleware.error + app = wrap_if_allowed( app, stack, galaxy.web.framework.middleware.error.ErrorMiddleware, args=(conf,) ) else: # Not in interactive debug mode, just use the regular error middleware import galaxy.web.framework.middleware.error diff --git a/lib/galaxy/webapps/reports/buildapp.py b/lib/galaxy/webapps/reports/buildapp.py index 1a3cb3e70b9..e2e6317b742 100644 --- a/lib/galaxy/webapps/reports/buildapp.py +++ b/lib/galaxy/webapps/reports/buildapp.py @@ -11,8 +11,12 @@ from inspect import isclass from paste import httpexceptions from galaxy.util import asbool -from galaxy.webapps.util import build_template_error_formatters, wrap_if_allowed - +from galaxy.webapps.util import ( + MiddlewareWrapUnsupported, + build_template_error_formatters, + wrap_if_allowed, + wrap_if_allowed_or_fail +) import galaxy.model import galaxy.model.mapping import galaxy.web.framework.webapp @@ -119,13 +123,15 @@ def wrap_in_middleware( app, global_conf, application_stack, **local_conf ): # Interactive exception debugging, scary dangerous if publicly # accessible, if not enabled we'll use the regular error printing # middleware. - from weberror import evalexception - import galaxy.web.framework.middleware.error - app = wrap_if_allowed( app, stack, evalexception.EvalException, - args=(conf,), - kwargs=dict(templating_formatters=build_template_error_formatters()), - alt_wrap=galaxy.web.framework.middleware.error.ErrorMiddleware, - alt_args=(conf,) ) + try: + from weberror import evalexception + app = wrap_if_allowed_or_fail( app, stack, evalexception.EvalException, + args=(conf,), + kwargs=dict(templating_formatters=build_template_error_formatters()) ) + except MiddlewareWrapUnsupported as exc: + log.warning(str(exc)) + import galaxy.web.framework.middleware.error + app = wrap_if_allowed( app, stack, galaxy.web.framework.middleware.error.ErrorMiddleware, args=(conf,) ) else: # Not in interactive debug mode, just use the regular error middleware import galaxy.web.framework.middleware.error diff --git a/lib/galaxy/webapps/tool_shed/buildapp.py b/lib/galaxy/webapps/tool_shed/buildapp.py index 1ccb8de440a..32f710308d4 100644 --- a/lib/galaxy/webapps/tool_shed/buildapp.py +++ b/lib/galaxy/webapps/tool_shed/buildapp.py @@ -14,7 +14,12 @@ from galaxy.util import asbool import galaxy.webapps.tool_shed.model import galaxy.webapps.tool_shed.model.mapping import galaxy.web.framework.webapp -from galaxy.webapps.util import build_template_error_formatters, wrap_if_allowed +from galaxy.webapps.util import ( + MiddlewareWrapUnsupported, + build_template_error_formatters, + wrap_if_allowed, + wrap_if_allowed_or_fail +) from galaxy import util from galaxy.util.properties import load_app_properties from routes.middleware import RoutesMiddleware @@ -237,13 +242,16 @@ def wrap_in_middleware( app, global_conf, application_stack, **local_conf ): # Interactive exception debugging, scary dangerous if publicly # accessible, if not enabled we'll use the regular error printing # middleware. - from weberror import evalexception - import galaxy.web.framework.middleware.error - app = wrap_if_allowed( app, stack, evalexception.EvalException, - args=(conf,), - kwargs=dict(templating_formatters=build_template_error_formatters()), - alt_wrap=galaxy.web.framework.middleware.error.ErrorMiddleware, - alt_args=(conf,) ) + try: + from weberror import evalexception + app = wrap_if_allowed_or_fail( app, stack, evalexception.EvalException, + args=(conf,), + kwargs=dict(templating_formatters=build_template_error_formatters()) ) + except MiddlewareWrapUnsupported as exc: + log.warning(str(exc)) + import galaxy.web.framework.middleware.error + app = wrap_if_allowed( app, stack, galaxy.web.framework.middleware.error.ErrorMiddleware, args=(conf,) ) + else: # Not in interactive debug mode, just use the regular error middleware import galaxy.web.framework.middleware.error diff --git a/lib/galaxy/webapps/util.py b/lib/galaxy/webapps/util.py index 9cb0029d99e..442b938fa5d 100644 --- a/lib/galaxy/webapps/util.py +++ b/lib/galaxy/webapps/util.py @@ -8,6 +8,10 @@ import mako.exceptions log = logging.getLogger(__name__) +class MiddlewareWrapUnsupported(Exception): + pass + + def build_template_error_formatters(): """ Build a list of template error formatters for WebError. When an error @@ -26,8 +30,26 @@ def build_template_error_formatters(): return formatters -def wrap_if_allowed(app, stack, wrap, name=None, args=None, kwargs=None, - alt_wrap=None, alt_name=None, alt_args=None, alt_kwargs=None): +def wrap_if_allowed_or_fail(app, stack, wrap, name=None, args=None, kwargs=None): + """ + Wrap the application with the given method if the application stack allows for it. + + Arguments are the same as for :func:`wrap_if_allowed`. + + Raises :exception:`MiddlewareWrapUnsupported` if the stack does not allow the middleware. + """ + name = name or wrap.__name__ + if not stack.allowed_middleware(wrap): + raise MiddlewareWrapUnsupported( + "'%s' is enabled in your configuration but the %s application stack does not support it, this " + "middleware has been disabled" % (name, stack.name)) + args = args or [] + kwargs = kwargs or {} + log.debug("Enabling '%s' middleware", name) + return wrap(app, *args, **kwargs) + + +def wrap_if_allowed(app, stack, wrap, name=None, args=None, kwargs=None): """ Wrap the application with the given method if the application stack allows for it. @@ -43,16 +65,11 @@ def wrap_if_allowed(app, stack, wrap, name=None, args=None, kwargs=None, :param args: arguments to pass to `wrap` (not including `app` itself) :type kwargs: dict :param kwargs: keyword arguments to pass to `wrap` + + Returns `app` unmodified if the stack does not allow the middleware. """ - name = name or wrap.__name__ - if stack.allowed_middleware(wrap): - args = args or [] - kwargs = kwargs or {} - log.debug("Enabling '%s' middleware", name) - return wrap(app, *args, **kwargs) - else: - log.warning("'%s' is enabled in your configuration but the %s application stack does not support it, this " - "middleware has been disabled", name, stack.name) - if alt_wrap: - app = wrap_if_allowed(app, stack, alt_wrap, name=alt_name, args=alt_args, kwargs=alt_kwargs) + try: + return wrap_if_allowed_or_fail(app, stack, wrap, name=name, args=args, kwargs=kwargs) + except MiddlewareWrapUnsupported as exc: + log.warning(str(exc)) return app