diff options
| author | Brian Lamar <brian.lamar@rackspace.com> | 2011-04-12 10:41:14 -0400 |
|---|---|---|
| committer | Brian Lamar <brian.lamar@rackspace.com> | 2011-04-12 10:41:14 -0400 |
| commit | 3f27e00b98f697b835dde2b592c17072e2ccf517 (patch) | |
| tree | 5a0b17d9e026458dad71a711478d76127014c464 /nova/compute | |
| parent | cebc98176926f57016a508d5c59b11f55dfcf2b3 (diff) | |
| parent | bb77763d665b113be0793dc1ecbb620dd9c38384 (diff) | |
Merged lp:~rackspace-titan/nova/server_metadata_quotas as a prereq.
Diffstat (limited to 'nova/compute')
| -rw-r--r-- | nova/compute/api.py | 37 |
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) |
