From d479c796f2893cbc2807f12908d03ba97cd821bb Mon Sep 17 00:00:00 2001 From: Eoghan Glynn Date: Thu, 16 Aug 2012 16:11:03 +0100 Subject: [PATCH] Revert per-user-quotas See bug 1034384, bug 1037590. This reverts commit https://github.com/openstack/nova/commit/391f345d, but leaves the DB migration in place while adding a further migration to reverse it. The motivation for reversion is that the per-user quota logic would totally undermine the per-project quotas set for a pre-existing openstack install. The per-user quota logic could be re-introduced in a fixed state after Folsom-3. Change-Id: Idd4b55a2404a25f43f6737b661f828c28501066f (cherry picked from commit bf7862222d25c9bd09671b90fed3287cbe26e488) --- bin/nova-manage | 51 -- etc/nova/policy.json | 4 +- nova/api/openstack/compute/contrib/quotas.py | 78 +-- nova/api/openstack/compute/limits.py | 15 +- nova/db/api.py | 105 +-- nova/db/sqlalchemy/api.py | 250 +------- .../116_drop_user_quotas_key_and_value.py | 98 +++ nova/db/sqlalchemy/models.py | 15 - nova/exception.py | 5 - nova/quota.py | 241 ++----- nova/tests/policy.json | 3 +- nova/tests/test_quota.py | 607 ++---------------- 12 files changed, 266 insertions(+), 1206 deletions(-) create mode 100644 nova/db/sqlalchemy/migrate_repo/versions/116_drop_user_quotas_key_and_value.py diff --git a/bin/nova-manage b/bin/nova-manage index 7005c7fcf4cb..9a09a8b5a646 100755 --- a/bin/nova-manage +++ b/bin/nova-manage @@ -224,10 +224,6 @@ def _db_error(caught_exception): class ProjectCommands(object): """Class for managing projects.""" - @args('--project', dest="project_id", metavar='', - help='Project name') - @args('--key', dest="key", metavar='', help='Key') - @args('--value', dest="value", metavar='', help='Value') def quota(self, project_id, key=None, value=None): """Set or display quotas for project""" ctxt = context.get_admin_context() @@ -260,52 +256,6 @@ class ProjectCommands(object): AccountCommands = ProjectCommands -class QuotaCommands(object): - """Class for managing quotas.""" - - @args('--project', dest="project_id", metavar='', - help='Project name') - @args('--key', dest="key", metavar='', help='Key') - @args('--value', dest="value", metavar='', help='Value') - def project(self, project_id, key=None, value=None): - """Set or display quotas for project""" - ctxt = context.get_admin_context() - if key: - if value.lower() == 'unlimited': - value = None - try: - db.quota_update(ctxt, project_id, key, value) - except exception.ProjectQuotaNotFound: - db.quota_create(ctxt, project_id, key, value) - project_quota = QUOTAS.get_project_quotas(ctxt, project_id) - for key, value in project_quota.iteritems(): - if value['limit'] < 0 or value['limit'] is None: - value['limit'] = 'unlimited' - print '%s: %s' % (key, value['limit']) - - @args('--user', dest="user_id", metavar='', - help='User name') - @args('--project', dest="project_id", metavar='', - help='Project name') - @args('--key', dest="key", metavar='', help='Key') - @args('--value', dest="value", metavar='', help='Value') - def user(self, user_id, project_id, key=None, value=None): - """Set or display quotas for user""" - ctxt = context.get_admin_context() - if key: - if value.lower() == 'unlimited': - value = None - try: - db.quota_update_for_user(ctxt, user_id, project_id, key, value) - except exception.UserQuotaNotFound: - db.quota_create_for_user(ctxt, user_id, project_id, key, value) - user_quota = QUOTAS.get_user_quotas(ctxt, user_id, project_id) - for key, value in user_quota.iteritems(): - if value['limit'] < 0 or value['limit'] is None: - value['limit'] = 'unlimited' - print '%s: %s' % (key, value['limit']) - - class FixedIpCommands(object): """Class for managing fixed ip.""" @@ -1364,7 +1314,6 @@ CATEGORIES = [ ('logs', GetLogCommands), ('network', NetworkCommands), ('project', ProjectCommands), - ('quota', QuotaCommands), ('service', ServiceCommands), ('shell', ShellCommands), ('sm', StorageManagerCommands), diff --git a/etc/nova/policy.json b/etc/nova/policy.json index 72390c75e4f7..3970ce96aea9 100644 --- a/etc/nova/policy.json +++ b/etc/nova/policy.json @@ -1,6 +1,5 @@ { "admin_or_owner": [["role:admin"], ["project_id:%(project_id)s"]], - "admin_or_projectadmin": [["role:projectadmin"], ["role:admin"]], "default": [["rule:admin_or_owner"]], @@ -49,8 +48,7 @@ "compute_extension:networks": [["rule:admin_api"]], "compute_extension:networks:view": [], "compute_extension:quotas:show": [], - "compute_extension:quotas:update_for_project": [["rule:admin_api"]], - "compute_extension:quotas:update_for_user": [["rule:admin_or_projectadmin"]], + "compute_extension:quotas:update": [["rule:admin_api"]], "compute_extension:quota_classes": [], "compute_extension:rescue": [], "compute_extension:security_groups": [], diff --git a/nova/api/openstack/compute/contrib/quotas.py b/nova/api/openstack/compute/contrib/quotas.py index 56583ff79420..33584badc893 100644 --- a/nova/api/openstack/compute/contrib/quotas.py +++ b/nova/api/openstack/compute/contrib/quotas.py @@ -15,7 +15,6 @@ # License for the specific language governing permissions and limitations # under the License. -import urlparse import webob from nova.api.openstack import extensions @@ -25,15 +24,13 @@ from nova import db from nova.db.sqlalchemy import api as sqlalchemy_api from nova import exception from nova import quota -from nova import utils QUOTAS = quota.QUOTAS -def authorize_action(context, action_name): - action = 'quotas:%s' % action_name - extensions.extension_authorizer('compute', action)(context) +authorize_update = extensions.extension_authorizer('compute', 'quotas:update') +authorize_show = extensions.extension_authorizer('compute', 'quotas:show') class QuotaTemplate(xmlutil.TemplateBuilder): @@ -60,102 +57,51 @@ class QuotaSetsController(object): return dict(quota_set=result) - def _validate_quota_limit(self, limit, remain, quota): + def _validate_quota_limit(self, limit): # NOTE: -1 is a flag value for unlimited if limit < -1: msg = _("Quota limit must be -1 or greater.") raise webob.exc.HTTPBadRequest(explanation=msg) - # Quota limit must be less than the remains of the project. - if remain != -1 and remain < limit - quota: - msg = _("Quota limit exceed the remains of the project.") - raise webob.exc.HTTPBadRequest(explanation=msg) - - def _get_quotas(self, context, id, user_id=None, remaining=False, - usages=False): - # Get the remaining quotas for a project. - if remaining: - values = QUOTAS.get_remaining_quotas(context, id) - return values - - if user_id: - # If user_id, return quotas for the given user. - values = QUOTAS.get_user_quotas(context, user_id, id, - usages=usages) - else: - values = QUOTAS.get_project_quotas(context, id, usages=usages) + def _get_quotas(self, context, id, usages=False): + values = QUOTAS.get_project_quotas(context, id, usages=usages) if usages: return values else: return dict((k, v['limit']) for k, v in values.items()) - def _request_params(self, req): - qs = req.environ.get('QUERY_STRING', '') - return urlparse.parse_qs(qs) - @wsgi.serializers(xml=QuotaTemplate) def show(self, req, id): context = req.environ['nova.context'] - authorize_action(context, 'show') - params = self._request_params(req) - remaining = False - if 'remaining' in params: - remaining = utils.bool_from_str(params["remaining"][0]) - user_id = None - if 'user_id' in params: - user_id = params["user_id"][0] + authorize_show(context) try: sqlalchemy_api.authorize_project_context(context, id) - return self._format_quota_set(id, - self._get_quotas(context, id, user_id, remaining)) + return self._format_quota_set(id, self._get_quotas(context, id)) except exception.NotAuthorized: raise webob.exc.HTTPForbidden() @wsgi.serializers(xml=QuotaTemplate) def update(self, req, id, body): context = req.environ['nova.context'] - params = self._request_params(req) + authorize_update(context) project_id = id - user_id = None - remains = {} - quotas = {} - if 'user_id' in params: - # Project admins are able to modify per-user quotas. - authorize_action(context, 'update_for_user') - user_id = params["user_id"][0] - remains = self._get_quotas(context, project_id, remaining=True) - quotas = db.quota_get_all_by_user(context, user_id, project_id) - else: - # Only admins are able to modify per-project quotas. - authorize_action(context, 'update_for_project') - for key in body['quota_set'].keys(): if key in QUOTAS: value = int(body['quota_set'][key]) + self._validate_quota_limit(value) try: - if user_id: - self._validate_quota_limit(value, remains.get(key, 0), - quotas.get(key, 0)) - db.quota_update_for_user(context, user_id, - project_id, key, value) - else: - self._validate_quota_limit(value, remains.get(key, -1), - quotas.get(key, 0)) - db.quota_update(context, project_id, key, value) + db.quota_update(context, project_id, key, value) except exception.ProjectQuotaNotFound: db.quota_create(context, project_id, key, value) - except exception.UserQuotaNotFound: - db.quota_create_for_user(context, user_id, - project_id, key, value) except exception.AdminRequired: raise webob.exc.HTTPForbidden() - return {'quota_set': self._get_quotas(context, id, user_id)} + return {'quota_set': self._get_quotas(context, id)} @wsgi.serializers(xml=QuotaTemplate) def defaults(self, req, id): context = req.environ['nova.context'] - authorize_action(context, 'show') + authorize_show(context) return self._format_quota_set(id, QUOTAS.get_defaults(context)) diff --git a/nova/api/openstack/compute/limits.py b/nova/api/openstack/compute/limits.py index 990c08a10425..c0ef656706d4 100644 --- a/nova/api/openstack/compute/limits.py +++ b/nova/api/openstack/compute/limits.py @@ -23,7 +23,6 @@ import httplib import math import re import time -import urlparse import webob.dec import webob.exc @@ -86,18 +85,8 @@ class LimitsController(object): Return all global and rate limit information. """ context = req.environ['nova.context'] - qs = req.environ.get('QUERY_STRING', '') - params = urlparse.parse_qs(qs) - if 'user_id' in params: - user_id = params["user_id"][0] - quotas = QUOTAS.get_user_quotas(context, user_id, - context.project_id, - usages=False) - else: - quotas = QUOTAS.get_project_quotas(context, - context.project_id, - usages=False) - + quotas = QUOTAS.get_project_quotas(context, context.project_id, + usages=False) abs_limits = dict((k, v['limit']) for k, v in quotas.items()) rate_limits = req.environ.get("nova.limits", []) diff --git a/nova/db/api.py b/nova/db/api.py index d8274b2db9e1..94fdd8ce2a3f 100644 --- a/nova/db/api.py +++ b/nova/db/api.py @@ -568,12 +568,6 @@ def instance_create(context, values): return IMPL.instance_create(context, values) -def instance_data_get_for_user(context, user_id, project_id, session=None): - """Get (instance_count, total_cores, total_ram) for user.""" - return IMPL.instance_data_get_for_user(context, user_id, project_id, - session=session) - - def instance_data_get_for_project(context, project_id, session=None): """Get (instance_count, total_cores, total_ram) for project.""" return IMPL.instance_data_get_for_project(context, project_id, @@ -955,42 +949,6 @@ def quota_destroy(context, project_id, resource): ################### -def quota_create_for_user(context, user_id, project_id, resource, limit): - """Create a quota for the given user and project.""" - return IMPL.quota_create_for_user(context, user_id, - project_id, resource, limit) - - -def quota_get_for_user(context, user_id, project_id, resource): - """Retrieve a quota or raise if it does not exist.""" - return IMPL.quota_get_for_user(context, user_id, - project_id, resource) - - -def quota_get_all_by_user(context, user_id, project_id): - """Retrieve all quotas associated with a given user and project.""" - return IMPL.quota_get_all_by_user(context, user_id, project_id) - - -def quota_get_remaining(context, project_id): - """Retrieve the remaining quotas associated with a given project.""" - return IMPL.quota_get_remaining(context, project_id) - - -def quota_update_for_user(context, user_id, project_id, resource, limit): - """Update a quota or raise if it does not exist.""" - return IMPL.quota_update_for_user(context, user_id, - project_id, resource, limit) - - -def quota_destroy_for_user(context, user_id, project_id, resource): - """Destroy the quota or raise if it does not exist.""" - return IMPL.quota_destroy_for_user(context, user_id, project_id, resource) - - -################### - - def quota_class_create(context, class_name, resource, limit): """Create a quota class for the given name and resource.""" return IMPL.quota_class_create(context, class_name, resource, limit) @@ -1024,21 +982,16 @@ def quota_class_destroy_all_by_name(context, class_name): ################### -def quota_usage_create(context, user_id, project_id, resource, in_use, - reserved, until_refresh): - """Create a quota usage for the given user and resource.""" - return IMPL.quota_usage_create(context, user_id, project_id, resource, +def quota_usage_create(context, project_id, resource, in_use, reserved, + until_refresh): + """Create a quota usage for the given project and resource.""" + return IMPL.quota_usage_create(context, project_id, resource, in_use, reserved, until_refresh) -def quota_usage_get(context, user_id, project_id, resource): +def quota_usage_get(context, project_id, resource): """Retrieve a quota usage or raise if it does not exist.""" - return IMPL.quota_usage_get(context, user_id, project_id, resource) - - -def quota_usage_get_all_by_user(context, user_id, project_id): - """Retrieve all usage associated with a given user.""" - return IMPL.quota_usage_get_all_by_user(context, user_id, project_id) + return IMPL.quota_usage_get(context, project_id, resource) def quota_usage_get_all_by_project(context, project_id): @@ -1046,25 +999,25 @@ def quota_usage_get_all_by_project(context, project_id): return IMPL.quota_usage_get_all_by_project(context, project_id) -def quota_usage_update(context, user_id, project_id, resource, in_use, - reserved, until_refresh): +def quota_usage_update(context, class_name, resource, in_use, reserved, + until_refresh): """Update a quota usage or raise if it does not exist.""" - return IMPL.quota_usage_update(context, user_id, project_id, resource, + return IMPL.quota_usage_update(context, project_id, resource, in_use, reserved, until_refresh) -def quota_usage_destroy(context, user_id, project_id, resource): +def quota_usage_destroy(context, project_id, resource): """Destroy the quota usage or raise if it does not exist.""" - return IMPL.quota_usage_destroy(context, user_id, project_id, resource) + return IMPL.quota_usage_destroy(context, project_id, resource) ################### -def reservation_create(context, uuid, usage, user_id, project_id, resource, - delta, expire): - """Create a reservation for the given user and resource.""" - return IMPL.reservation_create(context, uuid, usage, user_id, project_id, +def reservation_create(context, uuid, usage, project_id, resource, delta, + expire): + """Create a reservation for the given project and resource.""" + return IMPL.reservation_create(context, uuid, usage, project_id, resource, delta, expire) @@ -1073,9 +1026,9 @@ def reservation_get(context, uuid): return IMPL.reservation_get(context, uuid) -def reservation_get_all_by_user(context, user_id, project_id): - """Retrieve all reservations associated with a given user.""" - return IMPL.reservation_get_all_by_user(context, user_id, project_id) +def reservation_get_all_by_project(context, project_id): + """Retrieve all reservations associated with a given project.""" + return IMPL.reservation_get_all_by_project(context, project_id) def reservation_destroy(context, uuid): @@ -1103,11 +1056,6 @@ def reservation_rollback(context, reservations): return IMPL.reservation_rollback(context, reservations) -def quota_destroy_all_by_user(context, user_id, project_id): - """Destroy all quotas associated with a given user.""" - return IMPL.quota_destroy_all_by_user(context, user_id, project_id) - - def quota_destroy_all_by_project(context, project_id): """Destroy all quotas associated with a given project.""" return IMPL.quota_destroy_all_by_project(context, project_id) @@ -1136,12 +1084,6 @@ def volume_create(context, values): return IMPL.volume_create(context, values) -def volume_data_get_for_user(context, user_id, project_id, session=None): - """Get (volume_count, gigabytes) for user.""" - return IMPL.volume_data_get_for_user(context, user_id, project_id, - session=session) - - def volume_data_get_for_project(context, project_id, session=None): """Get (volume_count, gigabytes) for project.""" return IMPL.volume_data_get_for_project(context, project_id, @@ -1330,11 +1272,6 @@ def security_group_get_by_name(context, project_id, group_name): return IMPL.security_group_get_by_name(context, project_id, group_name) -def security_group_get_by_user(context, user_id, project_id): - """Get all security groups belonging to a user.""" - return IMPL.security_group_get_by_user(context, user_id, project_id) - - def security_group_get_by_project(context, project_id): """Get all security groups belonging to a project.""" return IMPL.security_group_get_by_project(context, project_id) @@ -1370,12 +1307,6 @@ def security_group_destroy(context, security_group_id): return IMPL.security_group_destroy(context, security_group_id) -def security_group_count_by_user(context, user_id, project_id, session=None): - """Count number of security groups for a user in specific project.""" - return IMPL.security_group_count_by_user(context, user_id, project_id, - session=session) - - def security_group_count_by_project(context, project_id, session=None): """Count number of security groups in a project.""" return IMPL.security_group_count_by_project(context, project_id, diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 02b4607c2006..d15b7b353670 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -1442,33 +1442,20 @@ def instance_create(context, values): return instance_ref -def _get_instance_data(context, project_id, user_id=None, session=None): +@require_admin_context +def instance_data_get_for_project(context, project_id, session=None): result = model_query(context, func.count(models.Instance.id), func.sum(models.Instance.vcpus), func.sum(models.Instance.memory_mb), read_deleted="no", session=session).\ - filter_by(project_id=project_id) - if user_id: - result = result.filter_by(user_id=user_id).first() - else: - result = result.first() + filter_by(project_id=project_id).\ + first() # NOTE(vish): convert None to 0 return (result[0] or 0, result[1] or 0, result[2] or 0) -@require_admin_context -def instance_data_get_for_project(context, project_id, session=None): - return _get_instance_data(context, project_id, session=session) - - -@require_admin_context -def instance_data_get_for_user(context, user_id, project_id, session=None): - return _get_instance_data(context, project_id, user_id=user_id, - session=session) - - @require_context def instance_destroy(context, instance_uuid, constraint=None): session = get_session() @@ -2390,11 +2377,10 @@ def quota_get(context, project_id, resource, session=None): @require_context -def quota_get_all_by_project(context, project_id, session=None): +def quota_get_all_by_project(context, project_id): authorize_project_context(context, project_id) - rows = model_query(context, models.Quota, session=session, - read_deleted="no").\ + rows = model_query(context, models.Quota, read_deleted="no").\ filter_by(project_id=project_id).\ all() @@ -2435,97 +2421,6 @@ def quota_destroy(context, project_id, resource): ################### -@require_context -def quota_get_for_user(context, user_id, project_id, resource, session=None): - authorize_project_context(context, project_id) - result = model_query(context, models.UserQuota, session=session, - read_deleted="no").\ - filter_by(user_id=user_id).\ - filter_by(project_id=project_id).\ - filter_by(resource=resource).\ - first() - - if not result: - raise exception.UserQuotaNotFound(project_id=project_id, - user_id=user_id) - - return result - - -@require_context -def quota_get_all_by_user(context, user_id, project_id): - authorize_project_context(context, project_id) - - rows = model_query(context, models.UserQuota, read_deleted="no").\ - filter_by(user_id=user_id).\ - filter_by(project_id=project_id).\ - all() - - result = {'user_id': user_id, 'project_id': project_id} - for row in rows: - result[row.resource] = row.hard_limit - - return result - - -@require_context -def quota_get_remaining(context, project_id): - authorize_project_context(context, project_id) - - session = get_session() - with session.begin(): - rows = model_query(context, models.UserQuota, session=session, - read_deleted="no").\ - filter_by(project_id=project_id).\ - all() - - result = quota_get_all_by_project(context, project_id, session=session) - - for row in rows: - if row.resource in result: - result[row.resource] -= row.hard_limit - - result['project_id'] = project_id - - return result - - -@require_context -def quota_create_for_user(context, user_id, project_id, resource, limit): - authorize_project_context(context, project_id) - quota_ref = models.UserQuota() - quota_ref.user_id = user_id - quota_ref.project_id = project_id - quota_ref.resource = resource - quota_ref.hard_limit = limit - quota_ref.save() - return quota_ref - - -@require_context -def quota_update_for_user(context, user_id, project_id, resource, limit): - authorize_project_context(context, project_id) - session = get_session() - with session.begin(): - quota_ref = quota_get_for_user(context, user_id, project_id, resource, - session=session) - quota_ref.hard_limit = limit - quota_ref.save(session=session) - - -@require_context -def quota_destroy_for_user(context, user_id, project_id, resource): - authorize_project_context(context, project_id) - session = get_session() - with session.begin(): - quota_ref = quota_get_for_user(context, user_id, project_id, resource, - session=session) - quota_ref.delete(session=session) - - -################### - - @require_context def quota_class_get(context, class_name, resource, session=None): result = model_query(context, models.QuotaClass, session=session, @@ -2601,10 +2496,9 @@ def quota_class_destroy_all_by_name(context, class_name): @require_context -def quota_usage_get(context, user_id, project_id, resource, session=None): +def quota_usage_get(context, project_id, resource, session=None): result = model_query(context, models.QuotaUsage, session=session, read_deleted="no").\ - filter_by(user_id=user_id).\ filter_by(project_id=project_id).\ filter_by(resource=resource).\ first() @@ -2615,22 +2509,6 @@ def quota_usage_get(context, user_id, project_id, resource, session=None): return result -@require_context -def quota_usage_get_all_by_user(context, user_id, project_id): - authorize_project_context(context, project_id) - - rows = model_query(context, models.QuotaUsage, read_deleted="no").\ - filter_by(user_id=user_id).\ - filter_by(project_id=project_id).\ - all() - - result = {'user_id': user_id, 'project_id': project_id} - for row in rows: - result[row.resource] = dict(in_use=row.in_use, reserved=row.reserved) - - return result - - @require_context def quota_usage_get_all_by_project(context, project_id): authorize_project_context(context, project_id) @@ -2640,20 +2518,16 @@ def quota_usage_get_all_by_project(context, project_id): all() result = {'project_id': project_id} - in_use = 0 - reserved = 0 for row in rows: - result[row.resource] = dict(in_use=in_use + row.in_use, - reserved=reserved + row.reserved) + result[row.resource] = dict(in_use=row.in_use, reserved=row.reserved) return result @require_admin_context -def quota_usage_create(context, user_id, project_id, resource, in_use, - reserved, until_refresh, session=None): +def quota_usage_create(context, project_id, resource, in_use, reserved, + until_refresh, session=None): quota_usage_ref = models.QuotaUsage() - quota_usage_ref.user_id = user_id quota_usage_ref.project_id = project_id quota_usage_ref.resource = resource quota_usage_ref.in_use = in_use @@ -2665,11 +2539,11 @@ def quota_usage_create(context, user_id, project_id, resource, in_use, @require_admin_context -def quota_usage_update(context, user_id, project_id, resource, in_use, - reserved, until_refresh, session=None): +def quota_usage_update(context, project_id, resource, in_use, reserved, + until_refresh, session=None): def do_update(session): - quota_usage_ref = quota_usage_get(context, user_id, project_id, - resource, session=session) + quota_usage_ref = quota_usage_get(context, project_id, resource, + session=session) quota_usage_ref.in_use = in_use quota_usage_ref.reserved = reserved quota_usage_ref.until_refresh = until_refresh @@ -2685,11 +2559,11 @@ def quota_usage_update(context, user_id, project_id, resource, in_use, @require_admin_context -def quota_usage_destroy(context, user_id, project_id, resource): +def quota_usage_destroy(context, project_id, resource): session = get_session() with session.begin(): - quota_usage_ref = quota_usage_get(context, user_id, project_id, - resource, session=session) + quota_usage_ref = quota_usage_get(context, project_id, resource, + session=session) quota_usage_ref.delete(session=session) @@ -2710,15 +2584,14 @@ def reservation_get(context, uuid, session=None): @require_context -def reservation_get_all_by_user(context, user_id, project_id): +def reservation_get_all_by_project(context, project_id): authorize_project_context(context, project_id) rows = model_query(context, models.QuotaUsage, read_deleted="no").\ - filter_by(user_id=user_id).\ filter_by(project_id=project_id).\ all() - result = {'user_id': user_id, 'project_id': project_id} + result = {'project_id': project_id} for row in rows: result.setdefault(row.resource, {}) result[row.resource][row.uuid] = row.delta @@ -2727,12 +2600,11 @@ def reservation_get_all_by_user(context, user_id, project_id): @require_admin_context -def reservation_create(context, uuid, usage, user_id, project_id, resource, - delta, expire, session=None): +def reservation_create(context, uuid, usage, project_id, resource, delta, + expire, session=None): reservation_ref = models.Reservation() reservation_ref.uuid = uuid reservation_ref.usage_id = usage['id'] - reservation_ref.user_id = user_id reservation_ref.project_id = project_id reservation_ref.resource = resource reservation_ref.delta = delta @@ -2762,7 +2634,6 @@ def _get_quota_usages(context, session): rows = model_query(context, models.QuotaUsage, read_deleted="no", session=session).\ - filter_by(user_id=context.user_id).\ filter_by(project_id=context.project_id).\ with_lockmode('update').\ all() @@ -2787,7 +2658,6 @@ def quota_reserve(context, resources, quotas, deltas, expire, refresh = False if resource not in usages: usages[resource] = quota_usage_create(elevated, - context.user_id, context.project_id, resource, 0, 0, @@ -2811,13 +2681,11 @@ def quota_reserve(context, resources, quotas, deltas, expire, # Grab the sync routine sync = resources[resource].sync - updates = sync(elevated, context.user_id, - context.project_id, session) + updates = sync(elevated, context.project_id, session) for res, in_use in updates.items(): # Make sure we have a destination for the usage! if res not in usages: usages[res] = quota_usage_create(elevated, - context.user_id, context.project_id, res, 0, 0, @@ -2868,7 +2736,6 @@ def quota_reserve(context, resources, quotas, deltas, expire, reservation = reservation_create(elevated, str(utils.gen_uuid()), usages[resource], - context.user_id, context.project_id, resource, delta, expire, session=session) @@ -2952,38 +2819,6 @@ def reservation_rollback(context, reservations): usage.save(session=session) -@require_admin_context -def quota_destroy_all_by_user(context, user_id, project_id): - session = get_session() - with session.begin(): - quotas = model_query(context, models.UserQuota, session=session, - read_deleted="no").\ - filter_by(user_id=user_id).\ - filter_by(project_id=project_id).\ - all() - - for quota_ref in quotas: - quota_ref.delete(session=session) - - quota_usages = model_query(context, models.QuotaUsage, - session=session, read_deleted="no").\ - filter_by(user_id=user_id).\ - filter_by(project_id=project_id).\ - all() - - for quota_usage_ref in quota_usages: - quota_usage_ref.delete(session=session) - - reservations = model_query(context, models.Reservation, - session=session, read_deleted="no").\ - filter_by(user_id=user_id).\ - filter_by(project_id=project_id).\ - all() - - for reservation_ref in reservations: - reservation_ref.delete(session=session) - - @require_admin_context def quota_destroy_all_by_project(context, project_id): session = get_session() @@ -3089,33 +2924,20 @@ def volume_create(context, values): return volume_ref -def _get_volume_data(context, project_id, user_id=None, session=None): +@require_admin_context +def volume_data_get_for_project(context, project_id, session=None): result = model_query(context, func.count(models.Volume.id), func.sum(models.Volume.size), read_deleted="no", session=session).\ - filter_by(project_id=project_id) - - if user_id: - result = result.filter_by(user_id=user_id).first() - else: - result = result.first() + filter_by(project_id=project_id).\ + first() + # NOTE(vish): convert None to 0 return (result[0] or 0, result[1] or 0) -@require_admin_context -def volume_data_get_for_user(context, user_id, project_id, session=None): - return _get_volume_data(context, project_id, user_id=user_id, - session=session) - - -@require_admin_context -def volume_data_get_for_project(context, project_id, session=None): - return _get_volume_data(context, project_id, session=session) - - @require_admin_context def volume_destroy(context, volume_id): session = get_session() @@ -3636,14 +3458,6 @@ def security_group_get_by_name(context, project_id, group_name, return result -@require_context -def security_group_get_by_user(context, user_id, project_id): - return _security_group_get_query(context, read_deleted="no").\ - filter_by(user_id=user_id).\ - filter_by(project_id=project_id).\ - all() - - @require_context def security_group_get_by_project(context, project_id): return _security_group_get_query(context, read_deleted="no").\ @@ -3739,16 +3553,6 @@ def security_group_destroy(context, security_group_id): 'updated_at': literal_column('updated_at')}) -@require_context -def security_group_count_by_user(context, user_id, project_id, session=None): - authorize_project_context(context, project_id) - return model_query(context, models.SecurityGroup, read_deleted="no", - session=session).\ - filter_by(user_id=user_id).\ - filter_by(project_id=project_id).\ - count() - - @require_context def security_group_count_by_project(context, project_id, session=None): authorize_project_context(context, project_id) diff --git a/nova/db/sqlalchemy/migrate_repo/versions/116_drop_user_quotas_key_and_value.py b/nova/db/sqlalchemy/migrate_repo/versions/116_drop_user_quotas_key_and_value.py new file mode 100644 index 000000000000..ccf9d66b8db4 --- /dev/null +++ b/nova/db/sqlalchemy/migrate_repo/versions/116_drop_user_quotas_key_and_value.py @@ -0,0 +1,98 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2012 Red Hat, Inc. +# +# 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. + +from nova.openstack.common import log as logging +from sqlalchemy import Boolean, Column, DateTime, Integer +from sqlalchemy import MetaData, String, Table + +LOG = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + # Reverse the previous migration + meta = MetaData() + meta.bind = migrate_engine + + reservations = Table('reservations', meta, autoload=True) + d = reservations.delete(reservations.c.deleted == True) + d.execute() + reservations.drop_column('user_id') + + quota_usages = Table('quota_usages', meta, autoload=True) + d = quota_usages.delete(quota_usages.c.user_id != None) + d.execute() + quota_usages.drop_column('user_id') + + user_quotas = Table('user_quotas', meta, autoload=True) + try: + user_quotas.drop() + except Exception: + LOG.error(_("user_quotas table not dropped")) + raise + + +def downgrade(migrate_engine): + # Undo the reversal of the previous migration + # (data is not preserved) + meta = MetaData() + meta.bind = migrate_engine + + # Add 'user_id' column to quota_usages table. + quota_usages = Table('quota_usages', meta, autoload=True) + user_id = Column('user_id', + String(length=255, convert_unicode=False, + assert_unicode=None, unicode_error=None, + _warn_on_bytestring=False)) + quota_usages.create_column(user_id) + + # Add 'user_id' column to reservations table. + reservations = Table('reservations', meta, autoload=True) + user_id = Column('user_id', + String(length=255, convert_unicode=False, + assert_unicode=None, unicode_error=None, + _warn_on_bytestring=False)) + reservations.create_column(user_id) + + # New table. + user_quotas = Table('user_quotas', meta, + Column('id', Integer(), primary_key=True), + Column('created_at', DateTime(timezone=False)), + Column('updated_at', DateTime(timezone=False)), + Column('deleted_at', DateTime(timezone=False)), + Column('deleted', Boolean(), default=False), + Column('user_id', + String(length=255, convert_unicode=False, + assert_unicode=None, unicode_error=None, + _warn_on_bytestring=False)), + Column('project_id', + String(length=255, convert_unicode=False, + assert_unicode=None, unicode_error=None, + _warn_on_bytestring=False)), + Column('resource', + String(length=255, convert_unicode=False, + assert_unicode=None, unicode_error=None, + _warn_on_bytestring=False), + nullable=False), + Column('hard_limit', Integer(), nullable=True), + mysql_engine='InnoDB', + mysql_charset='utf8', + ) + + try: + user_quotas.create() + except Exception: + LOG.error(_("Table |%s| not created!"), repr(user_quotas)) + raise diff --git a/nova/db/sqlalchemy/models.py b/nova/db/sqlalchemy/models.py index fa3ebe8f056b..7d4435a7aff0 100644 --- a/nova/db/sqlalchemy/models.py +++ b/nova/db/sqlalchemy/models.py @@ -428,19 +428,6 @@ class Quota(BASE, NovaBase): hard_limit = Column(Integer, nullable=True) -class UserQuota(BASE, NovaBase): - """Represents a single quota override for a user.""" - - __tablename__ = 'user_quotas' - id = Column(Integer, primary_key=True) - - user_id = Column(String(255), index=True) - project_id = Column(String(255), index=True) - - resource = Column(String(255)) - hard_limit = Column(Integer, nullable=True) - - class QuotaClass(BASE, NovaBase): """Represents a single quota override for a quota class. @@ -464,7 +451,6 @@ class QuotaUsage(BASE, NovaBase): __tablename__ = 'quota_usages' id = Column(Integer, primary_key=True) - user_id = Column(String(255), index=True) project_id = Column(String(255), index=True) resource = Column(String(255)) @@ -487,7 +473,6 @@ class Reservation(BASE, NovaBase): usage_id = Column(Integer, ForeignKey('quota_usages.id'), nullable=False) - user_id = Column(String(255), index=True) project_id = Column(String(255), index=True) resource = Column(String(255)) diff --git a/nova/exception.py b/nova/exception.py index 6c855ec7e39e..5d232bdd8732 100644 --- a/nova/exception.py +++ b/nova/exception.py @@ -750,11 +750,6 @@ class QuotaResourceUnknown(QuotaNotFound): message = _("Unknown quota resources %(unknown)s.") -class UserQuotaNotFound(QuotaNotFound): - message = _("Quota for user %(user_id)s in project %(project_id)s " - "could not be found.") - - class ProjectQuotaNotFound(QuotaNotFound): message = _("Quota for project %(project_id)s could not be found.") diff --git a/nova/quota.py b/nova/quota.py index 44e3c593dbbd..d3ba0aa0209a 100644 --- a/nova/quota.py +++ b/nova/quota.py @@ -101,11 +101,6 @@ class DbQuotaDriver(object): return db.quota_get(context, project_id, resource) - def get_by_user(self, context, user_id, project_id, resource): - """Get a specific quota by user.""" - - return db.quota_get_for_user(context, user_id, project_id, resource) - def get_by_class(self, context, quota_class, resource): """Get a specific quota by quota class.""" @@ -148,63 +143,6 @@ class DbQuotaDriver(object): return quotas - def _process_quotas(self, context, resources, project_id, quotas, - quota_class=None, defaults=True, usages=None): - """ - Given a list of resources, process the quotas for the given - quotas and usages. - - :param context: The request context, for access checks. - :param resources: A dictionary of the registered resources. - :param project_id: The ID of the project to return quotas for. - :param quotas: The quotas dictionary need to be processed. - :param quota_class: If project_id != context.project_id, the - quota class cannot be determined. This - parameter allows it to be specified. It - will be ignored if project_id == - context.project_id. - :param defaults: If True, the quota class value (or the - default value, if there is no value from the - quota class) will be reported if there is no - specific value for the resource. - :param usages: If not None, the current in_use and reserved counts - will also be returned. - """ - - modified_quotas = {} - # Get the quotas for the appropriate class. If the project ID - # matches the one in the context, we use the quota_class from - # the context, otherwise, we use the provided quota_class (if - # any) - if project_id == context.project_id: - quota_class = context.quota_class - if quota_class: - class_quotas = db.quota_class_get_all_by_name(context, quota_class) - else: - class_quotas = {} - - for resource in resources.values(): - # Omit default/quota class values - if not defaults and resource.name not in quotas: - continue - - modified_quotas[resource.name] = dict( - limit=quotas.get(resource.name, class_quotas.get( - resource.name, resource.default)), - ) - - # Include usages if desired. This is optional because one - # internal consumer of this interface wants to access the - # usages directly from inside a transaction. - if usages: - usage = usages.get(resource.name, {}) - modified_quotas[resource.name].update( - in_use=usage.get('in_use', 0), - reserved=usage.get('reserved', 0), - ) - - return modified_quotas - def get_project_quotas(self, context, resources, project_id, quota_class=None, defaults=True, usages=True): @@ -228,65 +166,44 @@ class DbQuotaDriver(object): will also be returned. """ + quotas = {} project_quotas = db.quota_get_all_by_project(context, project_id) - - project_usages = None if usages: project_usages = db.quota_usage_get_all_by_project(context, project_id) - return self._process_quotas(context, resources, - project_id, project_quotas, - quota_class=quota_class, - defaults=defaults, - usages=project_usages) + # Get the quotas for the appropriate class. If the project ID + # matches the one in the context, we use the quota_class from + # the context, otherwise, we use the provided quota_class (if + # any) + if project_id == context.project_id: + quota_class = context.quota_class + if quota_class: + class_quotas = db.quota_class_get_all_by_name(context, quota_class) + else: + class_quotas = {} - def get_user_quotas(self, context, resources, user_id, project_id, - quota_class=None, defaults=True, - usages=True): - """ - Given a list of resources, retrieve the quotas for the given - user. + for resource in resources.values(): + # Omit default/quota class values + if not defaults and resource.name not in project_quotas: + continue - :param context: The request context, for access checks. - :param resources: A dictionary of the registered resources. - :param project_id: The ID of the project to return quotas for. - :param user_id: The ID of the user to return quotas for. - :param quota_class: If project_id != context.project_id, the - quota class cannot be determined. This - parameter allows it to be specified. It - will be ignored if project_id == - context.project_id. - :param defaults: If True, the quota class value (or the - default value, if there is no value from the - quota class) will be reported if there is no - specific value for the resource. - :param usages: If True, the current in_use and reserved counts - will also be returned. - """ + quotas[resource.name] = dict( + limit=project_quotas.get(resource.name, class_quotas.get( + resource.name, resource.default)), + ) - user_quotas = db.quota_get_all_by_user(context, user_id, project_id) + # Include usages if desired. This is optional because one + # internal consumer of this interface wants to access the + # usages directly from inside a transaction. + if usages: + usage = project_usages.get(resource.name, {}) + quotas[resource.name].update( + in_use=usage.get('in_use', 0), + reserved=usage.get('reserved', 0), + ) - user_usages = None - if usages: - user_usages = db.quota_usage_get_all_by_user(context, - user_id, - project_id) - - return self._process_quotas(context, resources, - project_id, user_quotas, - quota_class=quota_class, - defaults=defaults, - usages=user_usages) - - def get_remaining_quotas(self, context, project_id, resources): - """Get the remaining quotas for the given project.""" - defaults = self.get_defaults(context, resources) - quotas = db.quota_get_remaining(context, project_id) - for key in defaults.keys(): - if key in quotas: - defaults[key] = quotas[key] - return defaults + return quotas def _get_quotas(self, context, resources, keys, has_sync): """ @@ -318,10 +235,9 @@ class DbQuotaDriver(object): raise exception.QuotaResourceUnknown(unknown=sorted(unknown)) # Grab and return the quotas (without usages) - quotas = self.get_user_quotas(context, sub_resources, - context.user_id, - context.project_id, - context.quota_class, usages=False) + quotas = self.get_project_quotas(context, sub_resources, + context.project_id, + context.quota_class, usages=False) return dict((k, v['limit']) for k, v in quotas.items()) @@ -452,18 +368,6 @@ class DbQuotaDriver(object): db.quota_destroy_all_by_project(context, project_id) - def destroy_all_by_user(self, context, user_id, project_id): - """ - Destroy all quotas, usages, and reservations associated with a - user. - - :param context: The request context, for access checks. - :param user_id: The ID of the user being deleted. - :param project_id: The ID of the project being deleted. - """ - - db.quota_destroy_all_by_user(context, user_id, project_id) - def expire(self, context): """Expire reservations. @@ -662,11 +566,6 @@ class QuotaEngine(object): return self._driver.get_by_project(context, project_id, resource) - def get_by_user(self, context, user_id, project_id, resource): - """Get a specific quota by user.""" - - return self._driver.get_by_user(context, user_id, project_id, resource) - def get_by_class(self, context, quota_class, resource): """Get a specific quota by quota class.""" @@ -712,46 +611,10 @@ class QuotaEngine(object): """ return self._driver.get_project_quotas(context, self._resources, - project_id, - quota_class=quota_class, - defaults=defaults, - usages=usages) - - def get_user_quotas(self, context, user_id, project_id, - quota_class=None, defaults=True, - usages=True): - """Retrieve the quotas for the given user. - - :param context: The request context, for access checks. - :param user_id: The ID of the user to return quotas for. - :param project_id: The ID of the project to return quotas for. - :param quota_class: If project_id != context.project_id, the - quota class cannot be determined. This - parameter allows it to be specified. - :param defaults: If True, the quota class value (or the - default value, if there is no value from the - quota class) will be reported if there is no - specific value for the resource. - :param usages: If True, the current in_use and reserved counts - will also be returned. - """ - - return self._driver.get_user_quotas(context, self._resources, - user_id, - project_id, - quota_class=quota_class, - defaults=defaults, - usages=usages) - - def get_remaining_quotas(self, context, project_id): - """Retrieve the remaining quotas for the given project. - - :param context: The request context, for access checks. - :param project_id: The ID of the project to return quotas for. - """ - - return self._driver.get_remaining_quotas(context, project_id, - self._resources) + project_id, + quota_class=quota_class, + defaults=defaults, + usages=usages) def count(self, context, resource, *args, **kwargs): """Count a resource. @@ -882,18 +745,6 @@ class QuotaEngine(object): self._driver.destroy_all_by_project(context, project_id) - def destroy_all_by_user(self, context, user_id, project_id): - """ - Destroy all quotas, usages, and reservations associated with a - user. - - :param context: The request context, for access checks. - :param user_id: The ID of the user being deleted. - :param project_id: The ID of the project being deleted. - """ - - self._driver.destroy_all_by_user(context, user_id, project_id) - def expire(self, context): """Expire reservations. @@ -910,26 +761,26 @@ class QuotaEngine(object): return sorted(self._resources.keys()) -def _sync_instances(context, user_id, project_id, session): +def _sync_instances(context, project_id, session): return dict(zip(('instances', 'cores', 'ram'), - db.instance_data_get_for_user( - context, user_id, project_id, session=session))) + db.instance_data_get_for_project( + context, project_id, session=session))) -def _sync_volumes(context, user_id, project_id, session): +def _sync_volumes(context, project_id, session): return dict(zip(('volumes', 'gigabytes'), - db.volume_data_get_for_user( - context, user_id, project_id, session=session))) + db.volume_data_get_for_project( + context, project_id, session=session))) -def _sync_floating_ips(context, user_id, project_id, session): +def _sync_floating_ips(context, project_id, session): return dict(floating_ips=db.floating_ip_count_by_project( context, project_id, session=session)) -def _sync_security_groups(context, user_id, project_id, session): - return dict(security_groups=db.security_group_count_by_user( - context, user_id, project_id, session=session)) +def _sync_security_groups(context, project_id, session): + return dict(security_groups=db.security_group_count_by_project( + context, project_id, session=session)) QUOTAS = QuotaEngine() diff --git a/nova/tests/policy.json b/nova/tests/policy.json index c2388d411b24..6fa0cf4b398a 100644 --- a/nova/tests/policy.json +++ b/nova/tests/policy.json @@ -105,8 +105,7 @@ "compute_extension:networks": [], "compute_extension:networks:view": [], "compute_extension:quotas:show": [], - "compute_extension:quotas:update_for_project": [], - "compute_extension:quotas:update_for_user": [], + "compute_extension:quotas:update": [], "compute_extension:quota_classes": [], "compute_extension:rescue": [], "compute_extension:security_groups": [], diff --git a/nova/tests/test_quota.py b/nova/tests/test_quota.py index 1fcff0e4a4d0..794c578d6bd3 100644 --- a/nova/tests/test_quota.py +++ b/nova/tests/test_quota.py @@ -243,10 +243,8 @@ class FakeContext(object): class FakeDriver(object): - def __init__(self, by_user=None, by_project=None, by_class=None, - reservations=None): + def __init__(self, by_project=None, by_class=None, reservations=None): self.called = [] - self.by_user = by_user or {} self.by_project = by_project or {} self.by_class = by_class or {} self.reservations = reservations or [] @@ -258,15 +256,6 @@ class FakeDriver(object): except KeyError: raise exception.ProjectQuotaNotFound(project_id=project_id) - def get_by_user(self, context, user_id, project_id, resource): - self.called.append(('get_by_user', context, user_id, project_id, - resource)) - try: - return self.by_user[user_id][resource] - except KeyError: - raise exception.UserQuotaNotFound(project_id=project_id, - user_id=user_id) - def get_by_class(self, context, quota_class, resource): self.called.append(('get_by_class', context, quota_class, resource)) try: @@ -290,13 +279,6 @@ class FakeDriver(object): project_id, quota_class, defaults, usages)) return resources - def get_user_quotas(self, context, resources, user_id, project_id, - quota_class=None, defaults=True, usages=True): - self.called.append(('get_user_quotas', context, resources, - user_id, project_id, quota_class, defaults, - usages)) - return resources - def limit_check(self, context, resources, values): self.called.append(('limit_check', context, resources, values)) @@ -313,10 +295,6 @@ class FakeDriver(object): def destroy_all_by_project(self, context, project_id): self.called.append(('destroy_all_by_project', context, project_id)) - def destroy_all_by_user(self, context, user_id, project_id,): - self.called.append(('destroy_all_by_user', context, user_id, - project_id)) - def expire(self, context): self.called.append(('expire', context)) @@ -503,19 +481,6 @@ class QuotaEngineTestCase(test.TestCase): ]) self.assertEqual(result, 42) - def test_get_by_user(self): - context = FakeContext('test_project', 'test_class') - driver = FakeDriver(by_user=dict( - fake_user=dict(test_resource=42))) - quota_obj = quota.QuotaEngine(quota_driver_class=driver) - result = quota_obj.get_by_user(context, 'fake_user', - 'test_project', 'test_resource') - - self.assertEqual(driver.called, [ - ('get_by_user', context, 'fake_user', 'test_project', - 'test_resource'), ]) - self.assertEqual(result, 42) - def test_get_by_class(self): context = FakeContext('test_project', 'test_class') driver = FakeDriver(by_class=dict( @@ -586,27 +551,6 @@ class QuotaEngineTestCase(test.TestCase): self.assertEqual(result1, quota_obj._resources) self.assertEqual(result2, quota_obj._resources) - def test_get_user_quotas(self): - context = FakeContext(None, None) - driver = FakeDriver() - quota_obj = self._make_quota_obj(driver) - result1 = quota_obj.get_user_quotas(context, 'fake_user', - 'test_project') - result2 = quota_obj.get_user_quotas(context, 'fake_user', - 'test_project', - quota_class='test_class', - defaults=False, - usages=False) - - self.assertEqual(driver.called, [ - ('get_user_quotas', context, quota_obj._resources, - 'fake_user', 'test_project', None, True, True), - ('get_user_quotas', context, quota_obj._resources, - 'fake_user', 'test_project', 'test_class', False, False), - ]) - self.assertEqual(result1, quota_obj._resources) - self.assertEqual(result2, quota_obj._resources) - def test_count_no_resource(self): context = FakeContext(None, None) driver = FakeDriver() @@ -718,16 +662,6 @@ class QuotaEngineTestCase(test.TestCase): ('destroy_all_by_project', context, 'test_project'), ]) - def test_destroy_all_by_user(self): - context = FakeContext(None, None) - driver = FakeDriver() - quota_obj = self._make_quota_obj(driver) - quota_obj.destroy_all_by_user(context, 'fake_user', 'test_project') - - self.assertEqual(driver.called, [ - ('destroy_all_by_user', context, 'fake_user', 'test_project'), - ]) - def test_expire(self): context = FakeContext(None, None) driver = FakeDriver() @@ -1212,378 +1146,8 @@ class DbQuotaDriverTestCase(test.TestCase): self.stubs.Set(self.driver, 'get_project_quotas', fake_get_project_quotas) - def _stub_get_by_user(self): - def fake_qgabp(context, user_id, project_id): - self.calls.append('quota_get_all_by_user') - self.assertEqual(project_id, 'test_project') - self.assertEqual(user_id, 'fake_user') - return dict( - cores=10, - gigabytes=50, - injected_files=2, - injected_file_path_bytes=127, - ) - - def fake_qugabp(context, user_id, project_id): - self.calls.append('quota_usage_get_all_by_user') - self.assertEqual(project_id, 'test_project') - self.assertEqual(user_id, 'fake_user') - return dict( - instances=dict(in_use=2, reserved=2), - cores=dict(in_use=4, reserved=4), - ram=dict(in_use=10 * 1024, reserved=0), - volumes=dict(in_use=2, reserved=0), - gigabytes=dict(in_use=10, reserved=0), - floating_ips=dict(in_use=2, reserved=0), - metadata_items=dict(in_use=0, reserved=0), - injected_files=dict(in_use=0, reserved=0), - injected_file_content_bytes=dict(in_use=0, reserved=0), - injected_file_path_bytes=dict(in_use=0, reserved=0), - ) - - self.stubs.Set(db, 'quota_get_all_by_user', fake_qgabp) - self.stubs.Set(db, 'quota_usage_get_all_by_user', fake_qugabp) - - self._stub_quota_class_get_all_by_name() - - def test_get_user_quotas(self): - self._stub_get_by_user() - result = self.driver.get_user_quotas( - FakeContext('test_project', 'test_class'), - quota.QUOTAS._resources, 'fake_user', 'test_project') - - self.assertEqual(self.calls, [ - 'quota_get_all_by_user', - 'quota_usage_get_all_by_user', - 'quota_class_get_all_by_name', - ]) - self.assertEqual(result, dict( - instances=dict( - limit=5, - in_use=2, - reserved=2, - ), - cores=dict( - limit=10, - in_use=4, - reserved=4, - ), - ram=dict( - limit=25 * 1024, - in_use=10 * 1024, - reserved=0, - ), - volumes=dict( - limit=10, - in_use=2, - reserved=0, - ), - gigabytes=dict( - limit=50, - in_use=10, - reserved=0, - ), - floating_ips=dict( - limit=10, - in_use=2, - reserved=0, - ), - metadata_items=dict( - limit=64, - in_use=0, - reserved=0, - ), - injected_files=dict( - limit=2, - in_use=0, - reserved=0, - ), - injected_file_content_bytes=dict( - limit=5 * 1024, - in_use=0, - reserved=0, - ), - injected_file_path_bytes=dict( - limit=127, - in_use=0, - reserved=0, - ), - security_groups=dict( - limit=10, - in_use=0, - reserved=0, - ), - security_group_rules=dict( - limit=20, - in_use=0, - reserved=0, - ), - key_pairs=dict( - limit=100, - in_use=0, - reserved=0, - ), - )) - - def test_get_user_quotas_alt_context_no_class(self): - self._stub_get_by_user() - result = self.driver.get_user_quotas( - FakeContext('other_project', 'other_class'), - quota.QUOTAS._resources, 'fake_user', 'test_project') - - self.assertEqual(self.calls, [ - 'quota_get_all_by_user', - 'quota_usage_get_all_by_user', - ]) - self.assertEqual(result, dict( - instances=dict( - limit=10, - in_use=2, - reserved=2, - ), - cores=dict( - limit=10, - in_use=4, - reserved=4, - ), - ram=dict( - limit=50 * 1024, - in_use=10 * 1024, - reserved=0, - ), - volumes=dict( - limit=10, - in_use=2, - reserved=0, - ), - gigabytes=dict( - limit=50, - in_use=10, - reserved=0, - ), - floating_ips=dict( - limit=10, - in_use=2, - reserved=0, - ), - metadata_items=dict( - limit=128, - in_use=0, - reserved=0, - ), - injected_files=dict( - limit=2, - in_use=0, - reserved=0, - ), - injected_file_content_bytes=dict( - limit=10 * 1024, - in_use=0, - reserved=0, - ), - injected_file_path_bytes=dict( - limit=127, - in_use=0, - reserved=0, - ), - security_groups=dict( - limit=10, - in_use=0, - reserved=0, - ), - security_group_rules=dict( - limit=20, - in_use=0, - reserved=0, - ), - key_pairs=dict( - limit=100, - in_use=0, - reserved=0, - ), - )) - - def test_get_user_quotas_alt_context_with_class(self): - self._stub_get_by_user() - result = self.driver.get_user_quotas( - FakeContext('other_project', 'other_class'), - quota.QUOTAS._resources, 'fake_user', 'test_project', - quota_class='test_class') - - self.assertEqual(self.calls, [ - 'quota_get_all_by_user', - 'quota_usage_get_all_by_user', - 'quota_class_get_all_by_name', - ]) - self.assertEqual(result, dict( - instances=dict( - limit=5, - in_use=2, - reserved=2, - ), - cores=dict( - limit=10, - in_use=4, - reserved=4, - ), - ram=dict( - limit=25 * 1024, - in_use=10 * 1024, - reserved=0, - ), - volumes=dict( - limit=10, - in_use=2, - reserved=0, - ), - gigabytes=dict( - limit=50, - in_use=10, - reserved=0, - ), - floating_ips=dict( - limit=10, - in_use=2, - reserved=0, - ), - metadata_items=dict( - limit=64, - in_use=0, - reserved=0, - ), - injected_files=dict( - limit=2, - in_use=0, - reserved=0, - ), - injected_file_content_bytes=dict( - limit=5 * 1024, - in_use=0, - reserved=0, - ), - injected_file_path_bytes=dict( - limit=127, - in_use=0, - reserved=0, - ), - security_groups=dict( - limit=10, - in_use=0, - reserved=0, - ), - security_group_rules=dict( - limit=20, - in_use=0, - reserved=0, - ), - key_pairs=dict( - limit=100, - in_use=0, - reserved=0, - ), - )) - - def test_get_user_quotas_no_defaults(self): - self._stub_get_by_user() - result = self.driver.get_user_quotas( - FakeContext('test_project', 'test_class'), - quota.QUOTAS._resources, 'fake_user', 'test_project', - defaults=False) - - self.assertEqual(self.calls, [ - 'quota_get_all_by_user', - 'quota_usage_get_all_by_user', - 'quota_class_get_all_by_name', - ]) - self.assertEqual(result, dict( - cores=dict( - limit=10, - in_use=4, - reserved=4, - ), - gigabytes=dict( - limit=50, - in_use=10, - reserved=0, - ), - injected_files=dict( - limit=2, - in_use=0, - reserved=0, - ), - injected_file_path_bytes=dict( - limit=127, - in_use=0, - reserved=0, - ), - )) - - def test_get_user_quotas_no_usages(self): - self._stub_get_by_user() - result = self.driver.get_user_quotas( - FakeContext('test_project', 'test_class'), - quota.QUOTAS._resources, 'fake_user', 'test_project', - usages=False) - - self.assertEqual(self.calls, [ - 'quota_get_all_by_user', - 'quota_class_get_all_by_name', - ]) - self.assertEqual(result, dict( - instances=dict( - limit=5, - ), - cores=dict( - limit=10, - ), - ram=dict( - limit=25 * 1024, - ), - volumes=dict( - limit=10, - ), - gigabytes=dict( - limit=50, - ), - floating_ips=dict( - limit=10, - ), - metadata_items=dict( - limit=64, - ), - injected_files=dict( - limit=2, - ), - injected_file_content_bytes=dict( - limit=5 * 1024, - ), - injected_file_path_bytes=dict( - limit=127, - ), - security_groups=dict( - limit=10, - ), - security_group_rules=dict( - limit=20, - ), - key_pairs=dict( - limit=100, - ), - )) - - def _stub_get_user_quotas(self): - def fake_get_user_quotas(context, resources, user_id, project_id, - quota_class=None, defaults=True, - usages=True): - self.calls.append('get_user_quotas') - return dict((k, dict(limit=v.default)) - for k, v in resources.items()) - - self.stubs.Set(self.driver, 'get_user_quotas', - fake_get_user_quotas) - def test_get_quotas_has_sync_unknown(self): - self._stub_get_user_quotas() + self._stub_get_project_quotas() self.assertRaises(exception.QuotaResourceUnknown, self.driver._get_quotas, None, quota.QUOTAS._resources, @@ -1591,7 +1155,7 @@ class DbQuotaDriverTestCase(test.TestCase): self.assertEqual(self.calls, []) def test_get_quotas_no_sync_unknown(self): - self._stub_get_user_quotas() + self._stub_get_project_quotas() self.assertRaises(exception.QuotaResourceUnknown, self.driver._get_quotas, None, quota.QUOTAS._resources, @@ -1599,7 +1163,7 @@ class DbQuotaDriverTestCase(test.TestCase): self.assertEqual(self.calls, []) def test_get_quotas_has_sync_no_sync_resource(self): - self._stub_get_user_quotas() + self._stub_get_project_quotas() self.assertRaises(exception.QuotaResourceUnknown, self.driver._get_quotas, None, quota.QUOTAS._resources, @@ -1607,7 +1171,7 @@ class DbQuotaDriverTestCase(test.TestCase): self.assertEqual(self.calls, []) def test_get_quotas_no_sync_has_sync_resource(self): - self._stub_get_user_quotas() + self._stub_get_project_quotas() self.assertRaises(exception.QuotaResourceUnknown, self.driver._get_quotas, None, quota.QUOTAS._resources, @@ -1615,7 +1179,7 @@ class DbQuotaDriverTestCase(test.TestCase): self.assertEqual(self.calls, []) def test_get_quotas_has_sync(self): - self._stub_get_user_quotas() + self._stub_get_project_quotas() result = self.driver._get_quotas(FakeContext('test_project', 'test_class'), quota.QUOTAS._resources, @@ -1624,7 +1188,7 @@ class DbQuotaDriverTestCase(test.TestCase): 'floating_ips', 'security_groups'], True) - self.assertEqual(self.calls, ['get_user_quotas']) + self.assertEqual(self.calls, ['get_project_quotas']) self.assertEqual(result, dict( instances=10, cores=20, @@ -1636,7 +1200,7 @@ class DbQuotaDriverTestCase(test.TestCase): )) def test_get_quotas_no_sync(self): - self._stub_get_user_quotas() + self._stub_get_project_quotas() result = self.driver._get_quotas(FakeContext('test_project', 'test_class'), quota.QUOTAS._resources, @@ -1645,7 +1209,7 @@ class DbQuotaDriverTestCase(test.TestCase): 'injected_file_path_bytes', 'security_group_rules'], False) - self.assertEqual(self.calls, ['get_user_quotas']) + self.assertEqual(self.calls, ['get_project_quotas']) self.assertEqual(result, dict( metadata_items=128, injected_files=5, @@ -1655,7 +1219,7 @@ class DbQuotaDriverTestCase(test.TestCase): )) def test_limit_check_under(self): - self._stub_get_user_quotas() + self._stub_get_project_quotas() self.assertRaises(exception.InvalidQuotaValue, self.driver.limit_check, FakeContext('test_project', 'test_class'), @@ -1663,7 +1227,7 @@ class DbQuotaDriverTestCase(test.TestCase): dict(metadata_items=-1)) def test_limit_check_over(self): - self._stub_get_user_quotas() + self._stub_get_project_quotas() self.assertRaises(exception.OverQuota, self.driver.limit_check, FakeContext('test_project', 'test_class'), @@ -1672,13 +1236,13 @@ class DbQuotaDriverTestCase(test.TestCase): def test_limit_check_unlimited(self): self.flags(quota_metadata_items=-1) - self._stub_get_user_quotas() + self._stub_get_project_quotas() self.driver.limit_check(FakeContext('test_project', 'test_class'), quota.QUOTAS._resources, dict(metadata_items=32767)) def test_limit_check(self): - self._stub_get_user_quotas() + self._stub_get_project_quotas() self.driver.limit_check(FakeContext('test_project', 'test_class'), quota.QUOTAS._resources, dict(metadata_items=128)) @@ -1692,7 +1256,7 @@ class DbQuotaDriverTestCase(test.TestCase): self.stubs.Set(db, 'quota_reserve', fake_quota_reserve) def test_reserve_bad_expire(self): - self._stub_get_user_quotas() + self._stub_get_project_quotas() self._stub_quota_reserve() self.assertRaises(exception.InvalidReservationExpiration, self.driver.reserve, @@ -1702,7 +1266,7 @@ class DbQuotaDriverTestCase(test.TestCase): self.assertEqual(self.calls, []) def test_reserve_default_expire(self): - self._stub_get_user_quotas() + self._stub_get_project_quotas() self._stub_quota_reserve() result = self.driver.reserve(FakeContext('test_project', 'test_class'), quota.QUOTAS._resources, @@ -1710,13 +1274,13 @@ class DbQuotaDriverTestCase(test.TestCase): expire = timeutils.utcnow() + datetime.timedelta(seconds=86400) self.assertEqual(self.calls, [ - 'get_user_quotas', + 'get_project_quotas', ('quota_reserve', expire, 0, 0), ]) self.assertEqual(result, ['resv-1', 'resv-2', 'resv-3']) def test_reserve_int_expire(self): - self._stub_get_user_quotas() + self._stub_get_project_quotas() self._stub_quota_reserve() result = self.driver.reserve(FakeContext('test_project', 'test_class'), quota.QUOTAS._resources, @@ -1724,13 +1288,13 @@ class DbQuotaDriverTestCase(test.TestCase): expire = timeutils.utcnow() + datetime.timedelta(seconds=3600) self.assertEqual(self.calls, [ - 'get_user_quotas', + 'get_project_quotas', ('quota_reserve', expire, 0, 0), ]) self.assertEqual(result, ['resv-1', 'resv-2', 'resv-3']) def test_reserve_timedelta_expire(self): - self._stub_get_user_quotas() + self._stub_get_project_quotas() self._stub_quota_reserve() expire_delta = datetime.timedelta(seconds=60) result = self.driver.reserve(FakeContext('test_project', 'test_class'), @@ -1739,13 +1303,13 @@ class DbQuotaDriverTestCase(test.TestCase): expire = timeutils.utcnow() + expire_delta self.assertEqual(self.calls, [ - 'get_user_quotas', + 'get_project_quotas', ('quota_reserve', expire, 0, 0), ]) self.assertEqual(result, ['resv-1', 'resv-2', 'resv-3']) def test_reserve_datetime_expire(self): - self._stub_get_user_quotas() + self._stub_get_project_quotas() self._stub_quota_reserve() expire = timeutils.utcnow() + datetime.timedelta(seconds=120) result = self.driver.reserve(FakeContext('test_project', 'test_class'), @@ -1753,13 +1317,13 @@ class DbQuotaDriverTestCase(test.TestCase): dict(instances=2), expire=expire) self.assertEqual(self.calls, [ - 'get_user_quotas', + 'get_project_quotas', ('quota_reserve', expire, 0, 0), ]) self.assertEqual(result, ['resv-1', 'resv-2', 'resv-3']) def test_reserve_until_refresh(self): - self._stub_get_user_quotas() + self._stub_get_project_quotas() self._stub_quota_reserve() self.flags(until_refresh=500) expire = timeutils.utcnow() + datetime.timedelta(seconds=120) @@ -1768,13 +1332,13 @@ class DbQuotaDriverTestCase(test.TestCase): dict(instances=2), expire=expire) self.assertEqual(self.calls, [ - 'get_user_quotas', + 'get_project_quotas', ('quota_reserve', expire, 500, 0), ]) self.assertEqual(result, ['resv-1', 'resv-2', 'resv-3']) def test_reserve_max_age(self): - self._stub_get_user_quotas() + self._stub_get_project_quotas() self._stub_quota_reserve() self.flags(max_age=86400) expire = timeutils.utcnow() + datetime.timedelta(seconds=120) @@ -1783,7 +1347,7 @@ class DbQuotaDriverTestCase(test.TestCase): dict(instances=2), expire=expire) self.assertEqual(self.calls, [ - 'get_user_quotas', + 'get_project_quotas', ('quota_reserve', expire, 0, 86400), ]) self.assertEqual(result, ['resv-1', 'resv-2', 'resv-3']) @@ -1816,7 +1380,7 @@ class QuotaReserveSqlAlchemyTestCase(test.TestCase): self.sync_called = set() def make_sync(res_name): - def sync(context, user_id, project_id, session): + def sync(context, project_id, session): self.sync_called.add(res_name) if res_name in self.usages: if self.usages[res_name].in_use < 0: @@ -1843,22 +1407,21 @@ class QuotaReserveSqlAlchemyTestCase(test.TestCase): def fake_get_quota_usages(context, session): return self.usages.copy() - def fake_quota_usage_create(context, user_id, project_id, resource, - in_use, reserved, until_refresh, - session=None, save=True): + def fake_quota_usage_create(context, project_id, resource, in_use, + reserved, until_refresh, session=None, + save=True): quota_usage_ref = self._make_quota_usage( - user_id, project_id, resource, in_use, reserved, - until_refresh, timeutils.utcnow(), timeutils.utcnow()) + project_id, resource, in_use, reserved, until_refresh, + timeutils.utcnow(), timeutils.utcnow()) self.usages_created[resource] = quota_usage_ref return quota_usage_ref - def fake_reservation_create(context, uuid, usage_id, user_id, - project_id, resource, delta, expire, - session=None): + def fake_reservation_create(context, uuid, usage_id, project_id, + resource, delta, expire, session=None): reservation_ref = self._make_reservation( - uuid, usage_id, user_id, project_id, resource, delta, expire, + uuid, usage_id, project_id, resource, delta, expire, timeutils.utcnow(), timeutils.utcnow()) self.reservations_created[resource] = reservation_ref @@ -1872,11 +1435,10 @@ class QuotaReserveSqlAlchemyTestCase(test.TestCase): timeutils.set_time_override() - def _make_quota_usage(self, user_id, project_id, resource, in_use, - reserved, until_refresh, created_at, updated_at): + def _make_quota_usage(self, project_id, resource, in_use, reserved, + until_refresh, created_at, updated_at): quota_usage_ref = FakeUsage() quota_usage_ref.id = len(self.usages) + len(self.usages_created) - quota_usage_ref.user_id = user_id quota_usage_ref.project_id = project_id quota_usage_ref.resource = resource quota_usage_ref.in_use = in_use @@ -1889,15 +1451,14 @@ class QuotaReserveSqlAlchemyTestCase(test.TestCase): return quota_usage_ref - def init_usage(self, user_id, project_id, resource, in_use, reserved, + def init_usage(self, project_id, resource, in_use, reserved, until_refresh=None, created_at=None, updated_at=None): if created_at is None: created_at = timeutils.utcnow() if updated_at is None: updated_at = timeutils.utcnow() - quota_usage_ref = self._make_quota_usage(user_id, project_id, - resource, in_use, + quota_usage_ref = self._make_quota_usage(project_id, resource, in_use, reserved, until_refresh, created_at, updated_at) @@ -1912,13 +1473,12 @@ class QuotaReserveSqlAlchemyTestCase(test.TestCase): "%s != %s on usage for resource %s" % (actual, value, resource)) - def _make_reservation(self, uuid, usage_id, user_id, project_id, resource, + def _make_reservation(self, uuid, usage_id, project_id, resource, delta, expire, created_at, updated_at): reservation_ref = sqa_models.Reservation() reservation_ref.id = len(self.reservations_created) reservation_ref.uuid = uuid reservation_ref.usage_id = usage_id - reservation_ref.user_id = user_id reservation_ref.project_id = project_id reservation_ref.resource = resource reservation_ref.delta = delta @@ -1965,19 +1525,16 @@ class QuotaReserveSqlAlchemyTestCase(test.TestCase): self.assertEqual(self.sync_called, set(['instances', 'cores', 'ram'])) self.compare_usage(self.usages_created, [ dict(resource='instances', - user_id='fake_user', project_id='test_project', in_use=0, reserved=2, until_refresh=None), dict(resource='cores', - user_id='fake_user', project_id='test_project', in_use=0, reserved=4, until_refresh=None), dict(resource='ram', - user_id='fake_user', project_id='test_project', in_use=0, reserved=2 * 1024, @@ -1986,12 +1543,10 @@ class QuotaReserveSqlAlchemyTestCase(test.TestCase): self.compare_reservation(result, [ dict(resource='instances', usage_id=self.usages_created['instances'], - user_id='fake_user', project_id='test_project', delta=2), dict(resource='cores', usage_id=self.usages_created['cores'], - user_id='fake_user', project_id='test_project', delta=4), dict(resource='ram', @@ -2000,12 +1555,9 @@ class QuotaReserveSqlAlchemyTestCase(test.TestCase): ]) def test_quota_reserve_negative_in_use(self): - self.init_usage('fake_user', 'test_project', 'instances', -1, 0, - until_refresh=1) - self.init_usage('fake_user', 'test_project', 'cores', -1, 0, - until_refresh=1) - self.init_usage('fake_user', 'test_project', 'ram', -1, 0, - until_refresh=1) + self.init_usage('test_project', 'instances', -1, 0, until_refresh=1) + self.init_usage('test_project', 'cores', -1, 0, until_refresh=1) + self.init_usage('test_project', 'ram', -1, 0, until_refresh=1) context = FakeContext('test_project', 'test_class') quotas = dict( instances=5, @@ -2023,19 +1575,16 @@ class QuotaReserveSqlAlchemyTestCase(test.TestCase): self.assertEqual(self.sync_called, set(['instances', 'cores', 'ram'])) self.compare_usage(self.usages, [ dict(resource='instances', - user_id='fake_user', project_id='test_project', in_use=2, reserved=2, until_refresh=5), dict(resource='cores', - user_id='fake_user', project_id='test_project', in_use=2, reserved=4, until_refresh=5), dict(resource='ram', - user_id='fake_user', project_id='test_project', in_use=2, reserved=2 * 1024, @@ -2045,12 +1594,10 @@ class QuotaReserveSqlAlchemyTestCase(test.TestCase): self.compare_reservation(result, [ dict(resource='instances', usage_id=self.usages['instances'], - user_id='fake_user', project_id='test_project', delta=2), dict(resource='cores', usage_id=self.usages['cores'], - user_id='fake_user', project_id='test_project', delta=4), dict(resource='ram', @@ -2059,12 +1606,9 @@ class QuotaReserveSqlAlchemyTestCase(test.TestCase): ]) def test_quota_reserve_until_refresh(self): - self.init_usage('fake_user', 'test_project', 'instances', 3, 0, - until_refresh=1) - self.init_usage('fake_user', 'test_project', 'cores', 3, 0, - until_refresh=1) - self.init_usage('fake_user', 'test_project', 'ram', 3, 0, - until_refresh=1) + self.init_usage('test_project', 'instances', 3, 0, until_refresh=1) + self.init_usage('test_project', 'cores', 3, 0, until_refresh=1) + self.init_usage('test_project', 'ram', 3, 0, until_refresh=1) context = FakeContext('test_project', 'test_class') quotas = dict( instances=5, @@ -2082,19 +1626,16 @@ class QuotaReserveSqlAlchemyTestCase(test.TestCase): self.assertEqual(self.sync_called, set(['instances', 'cores', 'ram'])) self.compare_usage(self.usages, [ dict(resource='instances', - user_id='fake_user', project_id='test_project', in_use=2, reserved=2, until_refresh=5), dict(resource='cores', - user_id='fake_user', project_id='test_project', in_use=2, reserved=4, until_refresh=5), dict(resource='ram', - user_id='fake_user', project_id='test_project', in_use=2, reserved=2 * 1024, @@ -2104,12 +1645,10 @@ class QuotaReserveSqlAlchemyTestCase(test.TestCase): self.compare_reservation(result, [ dict(resource='instances', usage_id=self.usages['instances'], - user_id='fake_user', project_id='test_project', delta=2), dict(resource='cores', usage_id=self.usages['cores'], - user_id='fake_user', project_id='test_project', delta=4), dict(resource='ram', @@ -2121,11 +1660,11 @@ class QuotaReserveSqlAlchemyTestCase(test.TestCase): max_age = 3600 record_created = (timeutils.utcnow() - datetime.timedelta(seconds=max_age)) - self.init_usage('fake_user', 'test_project', 'instances', 3, 0, + self.init_usage('test_project', 'instances', 3, 0, created_at=record_created, updated_at=record_created) - self.init_usage('fake_user', 'test_project', 'cores', 3, 0, + self.init_usage('test_project', 'cores', 3, 0, created_at=record_created, updated_at=record_created) - self.init_usage('fake_user', 'test_project', 'ram', 3, 0, + self.init_usage('test_project', 'ram', 3, 0, created_at=record_created, updated_at=record_created) context = FakeContext('test_project', 'test_class') quotas = dict( @@ -2144,19 +1683,16 @@ class QuotaReserveSqlAlchemyTestCase(test.TestCase): self.assertEqual(self.sync_called, set(['instances', 'cores', 'ram'])) self.compare_usage(self.usages, [ dict(resource='instances', - user_id='fake_user', project_id='test_project', in_use=2, reserved=2, until_refresh=None), dict(resource='cores', - user_id='fake_user', project_id='test_project', in_use=2, reserved=4, until_refresh=None), dict(resource='ram', - user_id='fake_user', project_id='test_project', in_use=2, reserved=2 * 1024, @@ -2166,12 +1702,10 @@ class QuotaReserveSqlAlchemyTestCase(test.TestCase): self.compare_reservation(result, [ dict(resource='instances', usage_id=self.usages['instances'], - user_id='fake_user', project_id='test_project', delta=2), dict(resource='cores', usage_id=self.usages['cores'], - user_id='fake_user', project_id='test_project', delta=4), dict(resource='ram', @@ -2180,9 +1714,9 @@ class QuotaReserveSqlAlchemyTestCase(test.TestCase): ]) def test_quota_reserve_no_refresh(self): - self.init_usage('fake_user', 'test_project', 'instances', 3, 0) - self.init_usage('fake_user', 'test_project', 'cores', 3, 0) - self.init_usage('fake_user', 'test_project', 'ram', 3, 0) + self.init_usage('test_project', 'instances', 3, 0) + self.init_usage('test_project', 'cores', 3, 0) + self.init_usage('test_project', 'ram', 3, 0) context = FakeContext('test_project', 'test_class') quotas = dict( instances=5, @@ -2200,19 +1734,16 @@ class QuotaReserveSqlAlchemyTestCase(test.TestCase): self.assertEqual(self.sync_called, set([])) self.compare_usage(self.usages, [ dict(resource='instances', - user_id='fake_user', project_id='test_project', in_use=3, reserved=2, until_refresh=None), dict(resource='cores', - user_id='fake_user', project_id='test_project', in_use=3, reserved=4, until_refresh=None), dict(resource='ram', - user_id='fake_user', project_id='test_project', in_use=3, reserved=2 * 1024, @@ -2222,12 +1753,10 @@ class QuotaReserveSqlAlchemyTestCase(test.TestCase): self.compare_reservation(result, [ dict(resource='instances', usage_id=self.usages['instances'], - user_id='fake_user', project_id='test_project', delta=2), dict(resource='cores', usage_id=self.usages['cores'], - user_id='fake_user', project_id='test_project', delta=4), dict(resource='ram', @@ -2236,9 +1765,9 @@ class QuotaReserveSqlAlchemyTestCase(test.TestCase): ]) def test_quota_reserve_unders(self): - self.init_usage('fake_user', 'test_project', 'instances', 1, 0) - self.init_usage('fake_user', 'test_project', 'cores', 3, 0) - self.init_usage('fake_user', 'test_project', 'ram', 1 * 1024, 0) + self.init_usage('test_project', 'instances', 1, 0) + self.init_usage('test_project', 'cores', 3, 0) + self.init_usage('test_project', 'ram', 1 * 1024, 0) context = FakeContext('test_project', 'test_class') quotas = dict( instances=5, @@ -2256,19 +1785,16 @@ class QuotaReserveSqlAlchemyTestCase(test.TestCase): self.assertEqual(self.sync_called, set([])) self.compare_usage(self.usages, [ dict(resource='instances', - user_id='fake_user', project_id='test_project', in_use=1, reserved=0, until_refresh=None), dict(resource='cores', - user_id='fake_user', project_id='test_project', in_use=3, reserved=0, until_refresh=None), dict(resource='ram', - user_id='fake_user', project_id='test_project', in_use=1 * 1024, reserved=0, @@ -2278,12 +1804,10 @@ class QuotaReserveSqlAlchemyTestCase(test.TestCase): self.compare_reservation(result, [ dict(resource='instances', usage_id=self.usages['instances'], - user_id='fake_user', project_id='test_project', delta=-2), dict(resource='cores', usage_id=self.usages['cores'], - user_id='fake_user', project_id='test_project', delta=-4), dict(resource='ram', @@ -2292,9 +1816,9 @@ class QuotaReserveSqlAlchemyTestCase(test.TestCase): ]) def test_quota_reserve_overs(self): - self.init_usage('fake_user', 'test_project', 'instances', 4, 0) - self.init_usage('fake_user', 'test_project', 'cores', 8, 0) - self.init_usage('fake_user', 'test_project', 'ram', 10 * 1024, 0) + self.init_usage('test_project', 'instances', 4, 0) + self.init_usage('test_project', 'cores', 8, 0) + self.init_usage('test_project', 'ram', 10 * 1024, 0) context = FakeContext('test_project', 'test_class') quotas = dict( instances=5, @@ -2314,19 +1838,16 @@ class QuotaReserveSqlAlchemyTestCase(test.TestCase): self.assertEqual(self.sync_called, set([])) self.compare_usage(self.usages, [ dict(resource='instances', - user_id='fake_user', project_id='test_project', in_use=4, reserved=0, until_refresh=None), dict(resource='cores', - user_id='fake_user', project_id='test_project', in_use=8, reserved=0, until_refresh=None), dict(resource='ram', - user_id='fake_user', project_id='test_project', in_use=10 * 1024, reserved=0, @@ -2336,9 +1857,9 @@ class QuotaReserveSqlAlchemyTestCase(test.TestCase): self.assertEqual(self.reservations_created, {}) def test_quota_reserve_reduction(self): - self.init_usage('fake_user', 'test_project', 'instances', 10, 0) - self.init_usage('fake_user', 'test_project', 'cores', 20, 0) - self.init_usage('fake_user', 'test_project', 'ram', 20 * 1024, 0) + self.init_usage('test_project', 'instances', 10, 0) + self.init_usage('test_project', 'cores', 20, 0) + self.init_usage('test_project', 'ram', 20 * 1024, 0) context = FakeContext('test_project', 'test_class') quotas = dict( instances=5, @@ -2356,19 +1877,16 @@ class QuotaReserveSqlAlchemyTestCase(test.TestCase): self.assertEqual(self.sync_called, set([])) self.compare_usage(self.usages, [ dict(resource='instances', - user_id='fake_user', project_id='test_project', in_use=10, reserved=0, until_refresh=None), dict(resource='cores', - user_id='fake_user', project_id='test_project', in_use=20, reserved=0, until_refresh=None), dict(resource='ram', - user_id='fake_user', project_id='test_project', in_use=20 * 1024, reserved=0, @@ -2378,17 +1896,14 @@ class QuotaReserveSqlAlchemyTestCase(test.TestCase): self.compare_reservation(result, [ dict(resource='instances', usage_id=self.usages['instances'], - user_id='fake_user', project_id='test_project', delta=-2), dict(resource='cores', usage_id=self.usages['cores'], - user_id='fake_user', project_id='test_project', delta=-4), dict(resource='ram', usage_id=self.usages['ram'], - user_id='fake_user', project_id='test_project', delta=-2 * 1024), ])