summaryrefslogtreecommitdiffstats
path: root/nova/compute
diff options
context:
space:
mode:
authorBrian Lamar <brian.lamar@rackspace.com>2011-04-12 10:41:14 -0400
committerBrian Lamar <brian.lamar@rackspace.com>2011-04-12 10:41:14 -0400
commit3f27e00b98f697b835dde2b592c17072e2ccf517 (patch)
tree5a0b17d9e026458dad71a711478d76127014c464 /nova/compute
parentcebc98176926f57016a508d5c59b11f55dfcf2b3 (diff)
parentbb77763d665b113be0793dc1ecbb620dd9c38384 (diff)
Merged lp:~rackspace-titan/nova/server_metadata_quotas as a prereq.
Diffstat (limited to 'nova/compute')
-rw-r--r--nova/compute/api.py37
1 files changed, 31 insertions, 6 deletions
diff --git a/nova/compute/api.py b/nova/compute/api.py
index e5065c3a5..effe68d6d 100644
--- a/nova/compute/api.py
+++ b/nova/compute/api.py
@@ -105,16 +105,40 @@ class API(base.Base):
if len(content) > content_limit:
raise quota.QuotaError(code="OnsetFileContentLimitExceeded")
+ def _check_metadata_properties_quota(self, context, metadata={}):
+ """Enforce quota limits on metadata properties"""
+ num_metadata = len(metadata)
+ quota_metadata = quota.allowed_metadata_items(context, num_metadata)
+ if quota_metadata < num_metadata:
+ pid = context.project_id
+ msg = _("Quota exceeeded for %(pid)s, tried to set "
+ "%(num_metadata)s metadata properties") % locals()
+ LOG.warn(msg)
+ raise quota.QuotaError(msg, "MetadataLimitExceeded")
+
+ # Because metadata is stored in the DB, we hard-code the size limits
+ # In future, we may support more variable length strings, so we act
+ # as if this is quota-controlled for forwards compatibility
+ for k, v in metadata.iteritems():
+ if len(k) > 255 or len(v) > 255:
+ pid = context.project_id
+ msg = _("Quota exceeeded for %(pid)s, metadata property "
+ "key or value too long") % locals()
+ LOG.warn(msg)
+ raise quota.QuotaError(msg, "MetadataLimitExceeded")
+
def create(self, context, instance_type,
image_id, kernel_id=None, ramdisk_id=None,
min_count=1, max_count=1,
display_name='', display_description='',
key_name=None, key_data=None, security_group='default',
- availability_zone=None, user_data=None, metadata=[],
+ availability_zone=None, user_data=None, metadata={},
injected_files=None):
- """Create the number of instances requested if quota and
- other arguments check out ok."""
+ """Create number of instances requested, given quotas.
+ Create the number of instances requested if quota and
+ other arguments check out ok.
+ """
if not instance_type:
instance_type = instance_types.get_default_instance_type()
@@ -128,9 +152,7 @@ class API(base.Base):
"run %s more instances of this type.") %
num_instances, "InstanceLimitExceeded")
- self._check_metadata_quota(context, metadata)
- self._check_metadata_item_length(context, metadata)
-
+ self._check_metadata_properties_quota(context, metadata)
self._check_injected_file_quota(context, injected_files)
image = self.image_service.show(context, image_id)
@@ -750,5 +772,8 @@ class API(base.Base):
def update_or_create_instance_metadata(self, context, instance_id,
metadata):
"""Updates or creates instance metadata"""
+ combined_metadata = self.get_instance_metadata(context, instance_id)
+ combined_metadata.update(metadata)
+ self._check_metadata_properties_quota(context, combined_metadata)
self.db.instance_metadata_update_or_create(context, instance_id,
metadata)