diff --git a/openstack-common.conf b/openstack-common.conf index 571ccfed8b..573ee975f1 100644 --- a/openstack-common.conf +++ b/openstack-common.conf @@ -1,5 +1,5 @@ [DEFAULT] -modules=setup, jsonutils, xmlutils, timeutils, exception, gettextutils, log, local, notifier/api, notifier/log_notifier, notifier/no_op_notifier, notifier/test_notifier, notifier/__init__, importutils, context, uuidutils, version, threadgroup, db, db.sqlalchemy, excutils, cfgfilter +modules=setup, jsonutils, xmlutils, timeutils, exception, gettextutils, log, local, notifier/api, notifier/log_notifier, notifier/no_op_notifier, notifier/test_notifier, notifier/__init__, importutils, context, uuidutils, version, threadgroup, db, db.sqlalchemy, excutils, cfgfilter,middleware.base, middleware.debug base=savanna # The following code from 'wsgi' is needed: diff --git a/savanna/main.py b/savanna/main.py index 72e170e504..27320d5021 100644 --- a/savanna/main.py +++ b/savanna/main.py @@ -23,6 +23,7 @@ from savanna.api import v10 as api_v10 from savanna import context from savanna.db import api as db_api from savanna.middleware import auth_valid +from savanna.openstack.common.middleware import debug from savanna.plugins import base as plugins_base from savanna.utils import api as api_utils from savanna.utils import scheduler @@ -110,6 +111,9 @@ def make_app(): for code in werkzeug_exceptions.default_exceptions.iterkeys(): app.error_handler_spec[None][code] = make_json_error + if CONF.debug: + app.wsgi_app = debug.Debug.factory(app.config)(app.wsgi_app) + app.wsgi_app = auth_valid.filter_factory(app.config)(app.wsgi_app) app.wsgi_app = auth_token.filter_factory( diff --git a/savanna/openstack/common/middleware/__init__.py b/savanna/openstack/common/middleware/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/savanna/openstack/common/middleware/base.py b/savanna/openstack/common/middleware/base.py new file mode 100644 index 0000000000..7236731b51 --- /dev/null +++ b/savanna/openstack/common/middleware/base.py @@ -0,0 +1,59 @@ +# Copyright 2011 OpenStack Foundation. +# All Rights Reserved. +# +# 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. +"""Base class(es) for WSGI Middleware.""" + +import webob.dec + + +class Middleware(object): + """Base WSGI middleware wrapper. + + These classes require an application to be initialized that will be called + next. By default the middleware will simply call its wrapped app, or you + can override __call__ to customize its behavior. + """ + + @classmethod + def factory(cls, global_conf, **local_conf): + """Factory method for paste.deploy.""" + + def filter(app): + return cls(app) + + return filter + + def __init__(self, application): + self.application = application + + def process_request(self, req): + """Called on each request. + + If this returns None, the next application down the stack will be + executed. If it returns a response then that response will be returned + and execution will stop here. + """ + return None + + def process_response(self, response): + """Do whatever you'd like to the response.""" + return response + + @webob.dec.wsgify + def __call__(self, req): + response = self.process_request(req) + if response: + return response + response = req.get_response(self.application) + return self.process_response(response) diff --git a/savanna/openstack/common/middleware/debug.py b/savanna/openstack/common/middleware/debug.py new file mode 100644 index 0000000000..a95bd3ceae --- /dev/null +++ b/savanna/openstack/common/middleware/debug.py @@ -0,0 +1,58 @@ +# Copyright 2011 OpenStack Foundation. +# All Rights Reserved. +# +# 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. +"""Debug middleware""" + +from __future__ import print_function + +import sys + +import webob.dec + +from savanna.openstack.common.middleware import base + + +class Debug(base.Middleware): + """Helper class that returns debug information. + + Can be inserted into any WSGI application chain to get information about + the request and response. + """ + + @webob.dec.wsgify + def __call__(self, req): + print(("*" * 40) + " REQUEST ENVIRON") + for key, value in req.environ.items(): + print(key, "=", value) + print() + resp = req.get_response(self.application) + + print(("*" * 40) + " RESPONSE HEADERS") + for (key, value) in resp.headers.iteritems(): + print(key, "=", value) + print() + + resp.app_iter = self.print_generator(resp.app_iter) + + return resp + + @staticmethod + def print_generator(app_iter): + """Prints the contents of a wrapper string iterator when iterated.""" + print(("*" * 40) + " BODY") + for part in app_iter: + sys.stdout.write(part) + sys.stdout.flush() + yield part + print()