From 1585d24302c5f0bfe28f769ad2aeef86a8afed9c Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Thu, 9 Aug 2018 23:58:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=EF=BC=9A=E9=98=BF=E9=87=8C?= =?UTF-8?q?=E4=BA=91=E5=9B=9E=E6=94=B6=E7=AB=99=E4=B8=BB=E6=9C=BA=E6=81=A2?= =?UTF-8?q?=E5=A4=8D=E5=90=8E=E6=97=A0=E7=B3=BB=E7=BB=9F=E7=9B=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/cloudcommon/db/virtualresource.go | 4 ++++ pkg/compute/models/disks.go | 15 +++++++++++++- pkg/compute/models/guests.go | 30 +++++++++++++++++++-------- 3 files changed, 39 insertions(+), 10 deletions(-) diff --git a/pkg/cloudcommon/db/virtualresource.go b/pkg/cloudcommon/db/virtualresource.go index a07ac9e192..6d1f94c3ba 100644 --- a/pkg/cloudcommon/db/virtualresource.go +++ b/pkg/cloudcommon/db/virtualresource.go @@ -256,6 +256,10 @@ func (model *SVirtualResourceBase) AllowPerformCancelDelete(ctx context.Context, return false } +/*func DoCancelPendingDelete(model IVirtualModel, ctx context.Context, userCred mcclient.TokenCredential) error { + return model.DoCancelPendingDelete(ctx, userCred) +}*/ + func (model *SVirtualResourceBase) PerformCancelDelete(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { if model.PendingDeleted { err := model.DoCancelPendingDelete(ctx, userCred) diff --git a/pkg/compute/models/disks.go b/pkg/compute/models/disks.go index 038d27e24b..9d362c69ef 100644 --- a/pkg/compute/models/disks.go +++ b/pkg/compute/models/disks.go @@ -486,7 +486,8 @@ func (self *SDisk) fetchDiskInfo(diskConfig *SDiskConfig) { if len(diskConfig.ImageId) > 0 { self.TemplateId = diskConfig.ImageId self.DiskType = DISK_TYPE_SYS - } else if len(diskConfig.Fs) > 0 { + } + if len(diskConfig.Fs) > 0 { self.FsFormat = diskConfig.Fs } if self.FsFormat == "swap" { @@ -619,3 +620,15 @@ func (self *SDisk) isReady() bool { func (self *SDisk) isInit() bool { return self.Status == DISK_INIT } + +func (model *SDisk) AllowPerformCancelDelete(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool { + return userCred.IsSystemAdmin() +} + +func (self *SDisk) PerformCancelDelete(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { + if self.PendingDeleted { + err := self.DoCancelPendingDelete(ctx, userCred) + return nil, err + } + return nil, nil +} \ No newline at end of file diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index d7490a5f42..3d375eb287 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -1953,7 +1953,7 @@ func (self *SGuest) DoPendingDelete(ctx context.Context, userCred mcclient.Token for _, guestdisk := range self.GetDisks() { disk := guestdisk.GetDisk() storage := disk.GetStorage() - if utils.IsInStringArray(storage.StorageType, sysutils.LOCAL_STORAGE_TYPES) || disk.DiskType == DISK_TYPE_SYS || disk.DiskType == DISK_TYPE_SWAP { + if utils.IsInStringArray(storage.StorageType, sysutils.LOCAL_STORAGE_TYPES) || disk.DiskType == DISK_TYPE_SYS || disk.DiskType == DISK_TYPE_SWAP || self.Hypervisor == HYPERVISOR_ALIYUN { disk.DoPendingDelete(ctx, userCred) } else { self.detachDisk(ctx, disk, userCred) @@ -1962,6 +1962,26 @@ func (self *SGuest) DoPendingDelete(ctx context.Context, userCred mcclient.Token self.SVirtualResourceBase.DoPendingDelete(ctx, userCred) } +func (model *SGuest) AllowPerformCancelDelete(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool { + return userCred.IsSystemAdmin() +} + +func (self *SGuest) PerformCancelDelete(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { + if self.PendingDeleted { + err := self.DoCancelPendingDelete(ctx, userCred) + return nil, err + } + return nil, nil +} + +func (self *SGuest) DoCancelPendingDelete(ctx context.Context, userCred mcclient.TokenCredential) error { + for _, guestdisk := range self.GetDisks() { + disk := guestdisk.GetDisk() + disk.DoCancelPendingDelete(ctx, userCred) + } + return self.SVirtualResourceBase.DoCancelPendingDelete(ctx, userCred) +} + func (self *SGuest) StartUndeployGuestTask(ctx context.Context, userCred mcclient.TokenCredential, parentTaskId string, targetHostId string) error { data := jsonutils.NewDict() if len(targetHostId) > 0 { @@ -2548,10 +2568,6 @@ func (self *SGuest) GetDetailsVnc(ctx context.Context, userCred mcclient.TokenCr } } -func (model *SGuestManager) AllowPerformCancelDelete(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool { - return userCred.IsSystemAdmin() -} - func (self *SGuest) GetKeypairPublicKey() string { keypair := self.getKeypair() if keypair != nil { @@ -2560,10 +2576,6 @@ func (self *SGuest) GetKeypairPublicKey() string { return "" } -func (model *SGuest) AllowPerformCancelDelete(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool { - return userCred.IsSystemAdmin() -} - func (manager *SGuestManager) GetIpInProjectWithName(projectId, name string, isExitOnly bool) []string { guestnics := GuestnetworkManager.Query().SubQuery() guests := manager.Query().SubQuery()