From 6a38b650c001ec8e6da435856c37a28737401aaf Mon Sep 17 00:00:00 2001 From: "Kevin L. Mitchell" Date: Tue, 13 Mar 2012 17:13:02 -0500 Subject: Implement quota classes. Allows entire classes of quotas to be associated with projects, which makes it easier to set specific quotas across multiple projects. TODO: * (?) Adding a mapping between projects and quota classes Change-Id: I6b6477481187d16af225d33c1989430e4071d5a8 --- .../api/openstack/compute/contrib/quota_classes.py | 99 ++++++++++++++++++++++ nova/api/openstack/compute/contrib/quotas.py | 11 +-- 2 files changed, 102 insertions(+), 8 deletions(-) create mode 100644 nova/api/openstack/compute/contrib/quota_classes.py (limited to 'nova/api') diff --git a/nova/api/openstack/compute/contrib/quota_classes.py b/nova/api/openstack/compute/contrib/quota_classes.py new file mode 100644 index 000000000..5c8e07ba9 --- /dev/null +++ b/nova/api/openstack/compute/contrib/quota_classes.py @@ -0,0 +1,99 @@ +# Copyright 2012 OpenStack LLC. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import webob + +from nova.api.openstack import wsgi +from nova.api.openstack import xmlutil +from nova.api.openstack import extensions +from nova import db +from nova import exception +from nova import quota + + +authorize = extensions.extension_authorizer('compute', 'quota_classes') + + +class QuotaClassTemplate(xmlutil.TemplateBuilder): + def construct(self): + root = xmlutil.TemplateElement('quota_class_set', + selector='quota_class_set') + root.set('id') + + for resource in quota.quota_resources: + elem = xmlutil.SubTemplateElement(root, resource) + elem.text = resource + + return xmlutil.MasterTemplate(root, 1) + + +class QuotaClassSetsController(object): + + def _format_quota_set(self, quota_class, quota_set): + """Convert the quota object to a result dict""" + + result = dict(id=str(quota_class)) + + for resource in quota.quota_resources: + result[resource] = quota_set[resource] + + return dict(quota_class_set=result) + + @wsgi.serializers(xml=QuotaClassTemplate) + def show(self, req, id): + context = req.environ['nova.context'] + authorize(context) + try: + db.sqlalchemy.api.authorize_quota_class_context(context, id) + return self._format_quota_set(id, + quota.get_class_quotas(context, id)) + except exception.NotAuthorized: + raise webob.exc.HTTPForbidden() + + @wsgi.serializers(xml=QuotaClassTemplate) + def update(self, req, id, body): + context = req.environ['nova.context'] + authorize(context) + quota_class = id + for key in body['quota_class_set'].keys(): + if key in quota.quota_resources: + value = int(body['quota_class_set'][key]) + try: + db.quota_class_update(context, quota_class, key, value) + except exception.QuotaClassNotFound: + db.quota_class_create(context, quota_class, key, value) + except exception.AdminRequired: + raise webob.exc.HTTPForbidden() + return {'quota_class_set': quota.get_class_quotas(context, + quota_class)} + + +class Quota_classes(extensions.ExtensionDescriptor): + """Quota classes management support""" + + name = "QuotaClasses" + alias = "os-quota-class-sets" + namespace = ("http://docs.openstack.org/compute/ext/" + "quota-classes-sets/api/v1.1") + updated = "2012-03-12T00:00:00+00:00" + + def get_resources(self): + resources = [] + + res = extensions.ResourceExtension('os-quota-class-sets', + QuotaClassSetsController()) + resources.append(res) + + return resources diff --git a/nova/api/openstack/compute/contrib/quotas.py b/nova/api/openstack/compute/contrib/quotas.py index 196df0ea0..0738fb81b 100644 --- a/nova/api/openstack/compute/contrib/quotas.py +++ b/nova/api/openstack/compute/contrib/quotas.py @@ -28,17 +28,12 @@ from nova import quota authorize = extensions.extension_authorizer('compute', 'quotas') -quota_resources = ['metadata_items', 'injected_file_content_bytes', - 'volumes', 'gigabytes', 'ram', 'floating_ips', 'instances', - 'injected_files', 'cores'] - - class QuotaTemplate(xmlutil.TemplateBuilder): def construct(self): root = xmlutil.TemplateElement('quota_set', selector='quota_set') root.set('id') - for resource in quota_resources: + for resource in quota.quota_resources: elem = xmlutil.SubTemplateElement(root, resource) elem.text = resource @@ -52,7 +47,7 @@ class QuotaSetsController(object): result = dict(id=str(project_id)) - for resource in quota_resources: + for resource in quota.quota_resources: result[resource] = quota_set[resource] return dict(quota_set=result) @@ -74,7 +69,7 @@ class QuotaSetsController(object): authorize(context) project_id = id for key in body['quota_set'].keys(): - if key in quota_resources: + if key in quota.quota_resources: value = int(body['quota_set'][key]) try: db.quota_update(context, project_id, key, value) -- cgit