summaryrefslogtreecommitdiffstats
path: root/nova/api
diff options
context:
space:
mode:
Diffstat (limited to 'nova/api')
-rw-r--r--nova/api/openstack/faults.py22
-rw-r--r--nova/api/openstack/limits.py25
2 files changed, 31 insertions, 16 deletions
diff --git a/nova/api/openstack/faults.py b/nova/api/openstack/faults.py
index 6ed9322de..d05c61fc7 100644
--- a/nova/api/openstack/faults.py
+++ b/nova/api/openstack/faults.py
@@ -68,17 +68,31 @@ class OverLimitFault(webob.exc.HTTPException):
Rate-limited request response.
"""
- wrapped_exc = webob.exc.HTTPForbidden()
+ _serialization_metadata = {
+ "application/xml": {
+ "attributes": {
+ "overLimitFault": "code"
+ }
+ }
+ }
def __init__(self, message, details, retry_time):
"""
Initialize new `OverLimitFault` with relevant information.
"""
- self.message = message
- self.details = details
- self.retry_time = retry_time
+ self.wrapped_exc = webob.exc.HTTPForbidden()
+ self.content = {
+ "overLimitFault": {
+ "code": self.wrapped_exc.status_int,
+ "message": message,
+ "details": details,
+ },
+ }
@webob.dec.wsgify(RequestClass=wsgi.Request)
def __call__(self, request):
"""Currently just return the wrapped exception."""
+ serializer = wsgi.Serializer(self._serialization_metadata)
+ content_type = request.best_match_content_type()
+ self.wrapped_exc.body = serializer.serialize(self.content, content_type)
return self.wrapped_exc
diff --git a/nova/api/openstack/limits.py b/nova/api/openstack/limits.py
index 3ecd46377..c4e04e9d9 100644
--- a/nova/api/openstack/limits.py
+++ b/nova/api/openstack/limits.py
@@ -54,8 +54,8 @@ class LimitsController(Controller):
"limit": ["verb", "URI", "regex", "value", "unit",
"resetTime", "remaining", "name"],
},
- "plurals" : {
- "rate" : "limit",
+ "plurals": {
+ "rate": "limit",
},
},
}
@@ -215,7 +215,12 @@ class RateLimitingMiddleware(Middleware):
"""
verb = req.method
url = req.url
- username = req.environ["nova.context"].user_id
+ context = req.environ.get("nova.context")
+
+ if context:
+ username = context.user_id
+ else:
+ username = None
delay, error = self._limiter.check_for_delay(verb, url, username)
@@ -255,14 +260,12 @@ class Limiter(object):
@return: Tuple of delay (in seconds) and error message (or None, None)
"""
- def _get_delay_list():
- """Yield limit delays."""
- for limit in self.levels[username]:
- delay = limit(verb, url)
- if delay:
- yield delay, limit.error_message
+ delays = []
- delays = list(_get_delay_list())
+ for limit in self.levels[username]:
+ delay = limit(verb, url)
+ if delay:
+ delays.append((delay, limit.error_message))
if delays:
delays.sort()
@@ -349,8 +352,6 @@ class WsgiLimiterProxy(object):
resp = conn.getresponse()
- print resp
-
if 200 >= resp.status < 300:
return None, None