Merge pull request #8337 from swordqiu/hotfix/qj-cancel-pending-delete-should-add-quota-usages

fix: cancel pending-delete should increase resource quota usages
This commit is contained in:
Zexi Li
2020-10-19 17:43:55 +08:00
committed by GitHub
8 changed files with 58 additions and 11 deletions
+1
View File
@@ -33,6 +33,7 @@ var (
func init() {
quotaManagerTable = make(map[reflect.Type]IQuotaManager)
db.AddUsages = AddUsages
db.CancelUsages = CancelUsages
db.CancelPendingUsagesInContext = cancelPendingUsagesInContext
db.InitPendingUsagesInContext = initPendingUsagesInContext
+2
View File
@@ -28,6 +28,8 @@ type IUsage interface {
var (
CancelUsages func(ctx context.Context, userCred mcclient.TokenCredential, usages []IUsage)
AddUsages func(ctx context.Context, userCred mcclient.TokenCredential, usages []IUsage)
CancelPendingUsagesInContext func(ctx context.Context, userCred mcclient.TokenCredential) error
InitPendingUsagesInContext func(ctx context.Context) context.Context
+15 -2
View File
@@ -449,11 +449,21 @@ func (model *SVirtualResourceBase) AllowPerformCancelDelete(ctx context.Context,
func (model *SVirtualResourceBase) PerformCancelDelete(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
if model.PendingDeleted && !model.Deleted {
err := model.DoCancelPendingDelete(ctx, userCred)
return nil, err
if err != nil {
return nil, errors.Wrap(err, "model.DoCancelPendingDelete")
}
model.RecoverUsages(ctx, userCred)
}
return nil, nil
}
func (model *SVirtualResourceBase) RecoverUsages(ctx context.Context, userCred mcclient.TokenCredential) {
usages := model.GetIModel().GetUsages()
if AddUsages != nil && len(usages) > 0 {
AddUsages(ctx, userCred, usages)
}
}
func (model *SVirtualResourceBase) DoCancelPendingDelete(ctx context.Context, userCred mcclient.TokenCredential) error {
err := model.CancelPendingDelete(ctx, userCred)
if err == nil {
@@ -472,7 +482,10 @@ func (model *SVirtualResourceBase) GetIVirtualModel() IVirtualModel {
func (model *SVirtualResourceBase) CancelPendingDelete(ctx context.Context, userCred mcclient.TokenCredential) error {
if model.PendingDeleted && !model.Deleted {
return model.MarkCancelPendingDelete(ctx, userCred)
err := model.MarkCancelPendingDelete(ctx, userCred)
if err != nil {
return errors.Wrap(err, "MarkCancelPendingDelete")
}
}
return nil
}
+5 -2
View File
@@ -2150,9 +2150,12 @@ func (self *SDisk) AllowPerformCancelDelete(ctx context.Context, userCred mcclie
}
func (self *SDisk) PerformCancelDelete(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
if self.PendingDeleted {
if self.PendingDeleted && !self.Deleted {
err := self.DoCancelPendingDelete(ctx, userCred)
return nil, err
if err != nil {
return nil, err
}
self.RecoverUsages(ctx, userCred)
}
return nil, nil
}
+5 -2
View File
@@ -2638,9 +2638,12 @@ func (model *SGuest) AllowPerformCancelDelete(ctx context.Context, userCred mccl
}
func (self *SGuest) PerformCancelDelete(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
if self.PendingDeleted {
if self.PendingDeleted && !self.Deleted {
err := self.DoCancelPendingDelete(ctx, userCred)
return nil, err
if err != nil {
return nil, errors.Wrap(err, "DoCancelPendingDelete")
}
self.RecoverUsages(ctx, userCred)
}
return nil, nil
}
+23 -2
View File
@@ -246,9 +246,12 @@ func (gi *SGuestImage) AllowPerformCancelDelete(ctx context.Context, userCred mc
func (gi *SGuestImage) PerformCancelDelete(ctx context.Context, userCred mcclient.TokenCredential,
query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
if gi.PendingDeleted {
if gi.PendingDeleted && !gi.Deleted {
err := gi.DoCancelPendingDelete(ctx, userCred)
return nil, err
if err != nil {
return nil, errors.Wrap(err, "DoCancelPendingDelete")
}
gi.RecoverUsages(ctx, userCred)
}
return nil, nil
}
@@ -635,3 +638,21 @@ func (manager *SGuestImageManager) Usage(scope rbacutils.TRbacScope, ownerId mcc
return usages
}
func (gi *SGuestImage) GetUsages() []db.IUsage {
if gi.PendingDeleted || gi.Deleted {
return nil
}
images, err := GuestImageJointManager.GetImagesByGuestImageId(gi.Id)
if err != nil {
return nil
}
usages := make([]db.IUsage, 0)
for i := range images {
ui := images[i].GetUsages()
if len(ui) > 0 {
usages = append(usages, ui...)
}
}
return usages
}
+2 -1
View File
@@ -16,6 +16,7 @@ package models
import (
"context"
"database/sql"
"yunion.io/x/pkg/errors"
"yunion.io/x/sqlchemy"
@@ -102,7 +103,7 @@ func (gm *SGuestImageJointManager) GetImagesByFilter(guestImageId string,
q = filter(q)
images := make([]SImage, 0, len(imageIds))
err = db.FetchModelObjects(ImageManager, q, &images)
if err != nil {
if err != nil && errors.Cause(err) != sql.ErrNoRows {
return nil, errors.Wrap(err, "fetch images failed")
}
return images, nil
+5 -2
View File
@@ -806,9 +806,12 @@ func (self *SImage) AllowPerformCancelDelete(ctx context.Context, userCred mccli
}
func (self *SImage) PerformCancelDelete(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
if self.PendingDeleted {
if self.PendingDeleted && !self.Deleted {
err := self.DoCancelPendingDelete(ctx, userCred)
return nil, err
if err != nil {
return nil, errors.Wrap(err, "DoCancelPendingDelete")
}
self.RecoverUsages(ctx, userCred)
}
return nil, nil
}