summaryrefslogtreecommitdiffstats
path: root/nova/api
diff options
context:
space:
mode:
authorDan Prince <dan.prince@rackspace.com>2011-03-31 09:20:47 -0400
committerDan Prince <dan.prince@rackspace.com>2011-03-31 09:20:47 -0400
commit7f98416fdba59c4305f88a30a457bbf6c68ef372 (patch)
treea932ebc3db1ab2070d978121c27b827ff8a9128e /nova/api
parenteda275741f5865a1bf58d0176b36d4d99bfeb015 (diff)
Limit image metadata to the configured metadata quota for a project.
Diffstat (limited to 'nova/api')
-rw-r--r--nova/api/openstack/image_metadata.py12
1 files changed, 12 insertions, 0 deletions
diff --git a/nova/api/openstack/image_metadata.py b/nova/api/openstack/image_metadata.py
index c9d6ac532..76abdaa7e 100644
--- a/nova/api/openstack/image_metadata.py
+++ b/nova/api/openstack/image_metadata.py
@@ -18,6 +18,7 @@
from webob import exc
from nova import flags
+from nova import quota
from nova import utils
from nova import wsgi
from nova.api.openstack import faults
@@ -39,6 +40,15 @@ class Controller(wsgi.Controller):
metadata = image.get('properties', {})
return metadata
+ def _check_quota_limit(self, context, metadata):
+ if metadata is None:
+ return
+ num_metadata = len(metadata)
+ quota_metadata = quota.allowed_metadata_items(context, num_metadata)
+ if quota_metadata < num_metadata:
+ expl = ("Image metadata limit exceeded")
+ raise exc.HTTPBadRequest(explanation=expl)
+
def index(self, req, image_id):
"""Returns the list of metadata for a given instance"""
context = req.environ['nova.context']
@@ -61,6 +71,7 @@ class Controller(wsgi.Controller):
if 'metadata' in body:
for key, value in body['metadata'].iteritems():
metadata[key] = value
+ self._check_quota_limit(context, metadata)
img['properties'] = metadata
self.image_service.update(context, image_id, img, None)
return dict(metadata=metadata)
@@ -77,6 +88,7 @@ class Controller(wsgi.Controller):
img = self.image_service.show(context, image_id)
metadata = self._get_metadata(context, image_id, img)
metadata[id] = body[id]
+ self._check_quota_limit(context, metadata)
img['properties'] = metadata
self.image_service.update(context, image_id, img, None)