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:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user