Update quota when volume type renames

When customers rename volume type, the corresponding quota_usages
should be changed. Or else quota_usage shows incorrect data.

Meanwhile, it deletes quota_usages whose corresponding volume
types don't exist. These invalid data are left when renaming
volume types in old versions.

Closes-bug: #1473183

Change-Id: I9071821f8c1a95fccef214868e5cea026fed9657
Co-Authored-By: wanghao <wanghao749@huawei.com>
This commit is contained in:
LisaLi
2016-01-15 16:12:45 +08:00
parent 221aaaf001
commit b1a322cf8f
8 changed files with 168 additions and 7 deletions

View File

@@ -535,6 +535,15 @@ def quota_allocated_get_all_by_project(context, project_id):
return result
@require_context
def _quota_get_by_resource(context, resource, session=None):
rows = model_query(context, models.Quota,
session=session,
read_deleted='no').filter_by(
resource=resource).all()
return rows
@require_admin_context
def quota_create(context, project_id, resource, limit, allocated):
quota_ref = models.Quota()
@@ -559,6 +568,15 @@ def quota_update(context, project_id, resource, limit):
return quota_ref
@require_context
def quota_update_resource(context, old_res, new_res):
session = get_session()
with session.begin():
quotas = _quota_get_by_resource(context, old_res, session=session)
for quota in quotas:
quota.resource = new_res
@require_admin_context
def quota_allocated_update(context, project_id, resource, allocated):
session = get_session()
@@ -625,6 +643,17 @@ def quota_class_get_all_by_name(context, class_name):
return result
@require_context
def _quota_class_get_all_by_resource(context, resource, session):
result = model_query(context, models.QuotaClass,
session=session,
read_deleted="no").\
filter_by(resource=resource).\
all()
return result
@require_admin_context
def quota_class_create(context, class_name, resource, limit):
quota_class_ref = models.QuotaClass()
@@ -648,6 +677,16 @@ def quota_class_update(context, class_name, resource, limit):
return quota_class_ref
@require_context
def quota_class_update_resource(context, old_res, new_res):
session = get_session()
with session.begin():
quota_class_list = _quota_class_get_all_by_resource(
context, old_res, session)
for quota_class in quota_class_list:
quota_class.resource = new_res
@require_admin_context
def quota_class_destroy(context, class_name, resource):
session = get_session()
@@ -751,6 +790,27 @@ def _get_quota_usages(context, session, project_id):
return {row.resource: row for row in rows}
def _get_quota_usages_by_resource(context, session, resource):
rows = model_query(context, models.QuotaUsage,
deleted="no",
session=session).\
filter_by(resource=resource).\
with_lockmode('update').\
all()
return rows
@require_context
@_retry_on_deadlock
def quota_usage_update_resource(context, old_res, new_res):
session = get_session()
with session.begin():
usages = _get_quota_usages_by_resource(context, session, old_res)
for usage in usages:
usage.resource = new_res
usage.until_refresh = 1
@require_context
@_retry_on_deadlock
def quota_reserve(context, resources, quotas, deltas, expire,
@@ -903,15 +963,20 @@ def _quota_reservations(session, context, reservations):
all()
def _dict_with_usage_id(usages):
return {row.id: row for row in usages.values()}
@require_context
@_retry_on_deadlock
def reservation_commit(context, reservations, project_id=None):
session = get_session()
with session.begin():
usages = _get_quota_usages(context, session, project_id)
usages = _dict_with_usage_id(usages)
for reservation in _quota_reservations(session, context, reservations):
usage = usages[reservation.resource]
usage = usages[reservation.usage_id]
if reservation.delta >= 0:
usage.reserved -= reservation.delta
usage.in_use += reservation.delta
@@ -925,9 +990,9 @@ def reservation_rollback(context, reservations, project_id=None):
session = get_session()
with session.begin():
usages = _get_quota_usages(context, session, project_id)
usages = _dict_with_usage_id(usages)
for reservation in _quota_reservations(session, context, reservations):
usage = usages[reservation.resource]
usage = usages[reservation.usage_id]
if reservation.delta >= 0:
usage.reserved -= reservation.delta