diff options
| author | Jenkins <jenkins@review.openstack.org> | 2012-07-13 23:32:51 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2012-07-13 23:32:51 +0000 |
| commit | 58c92d66e7220574038cedd3079d64649ced2106 (patch) | |
| tree | de6e7ba63faf9681e7d4c611c29422b27d6ab374 /nova/api | |
| parent | f4a778f31f647b065b945311920148366d4ead53 (diff) | |
| parent | e9d21589d39355ffc126e360cc2ba7311e014edb (diff) | |
| download | nova-58c92d66e7220574038cedd3079d64649ced2106.tar.gz nova-58c92d66e7220574038cedd3079d64649ced2106.tar.xz nova-58c92d66e7220574038cedd3079d64649ced2106.zip | |
Merge "Expose over-quota exceptions via native API."
Diffstat (limited to 'nova/api')
| -rw-r--r-- | nova/api/openstack/__init__.py | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/nova/api/openstack/__init__.py b/nova/api/openstack/__init__.py index afeed0399..3372d9b5e 100644 --- a/nova/api/openstack/__init__.py +++ b/nova/api/openstack/__init__.py @@ -25,6 +25,7 @@ import webob.dec import webob.exc from nova.api.openstack import wsgi +from nova import exception from nova.openstack.common import log as logging from nova import wsgi as base_wsgi @@ -35,20 +36,31 @@ LOG = logging.getLogger(__name__) class FaultWrapper(base_wsgi.Middleware): """Calls down the middleware stack, making exceptions into faults.""" + def _error(self, inner, req, safe=False): + LOG.exception(_("Caught error: %s"), unicode(inner)) + msg_dict = dict(url=req.url, status=500) + LOG.info(_("%(url)s returned with HTTP %(status)d") % msg_dict) + outer = webob.exc.HTTPInternalServerError() + # NOTE(johannes): We leave the explanation empty here on + # purpose. It could possibly have sensitive information + # that should not be returned back to the user. See + # bugs 868360 and 874472 + # NOTE(eglynn): However, it would be over-conservative and + # inconsistent with the EC2 API to hide every exception, + # including those that are safe to expose, see bug 1021373 + if safe: + outer.explanation = '%s: %s' % (inner.__class__.__name__, + unicode(inner)) + return wsgi.Fault(outer) + @webob.dec.wsgify(RequestClass=wsgi.Request) def __call__(self, req): try: return req.get_response(self.application) + except exception.NovaException as ex: + return self._error(ex, req, ex.safe) except Exception as ex: - LOG.exception(_("Caught error: %s"), unicode(ex)) - msg_dict = dict(url=req.url, status=500) - LOG.info(_("%(url)s returned with HTTP %(status)d") % msg_dict) - exc = webob.exc.HTTPInternalServerError() - # NOTE(johannes): We leave the explanation empty here on - # purpose. It could possibly have sensitive information - # that should not be returned back to the user. See - # bugs 868360 and 874472 - return wsgi.Fault(exc) + return self._error(ex, req) class APIMapper(routes.Mapper): |
