diff --git a/pkg/compute/guestdrivers/base.go b/pkg/compute/guestdrivers/base.go index 084815ef55..6e50cf4ea4 100644 --- a/pkg/compute/guestdrivers/base.go +++ b/pkg/compute/guestdrivers/base.go @@ -724,3 +724,7 @@ func (base *SBaseGuestDriver) CanStop(guest *models.SGuest) error { } return errors.Wrapf(errors.ErrInvalidStatus, "Cannot stop server in status %s", guest.Status) } + +func (base *SBaseGuestDriver) IsNeedCleanDisksAfterUndeploy() bool { + return true +} diff --git a/pkg/compute/guestdrivers/ksyun.go b/pkg/compute/guestdrivers/ksyun.go index 1deb176613..84d2b9aabf 100644 --- a/pkg/compute/guestdrivers/ksyun.go +++ b/pkg/compute/guestdrivers/ksyun.go @@ -176,3 +176,7 @@ func (self *SKsyunGuestDriver) IsSupportShutdownMode() bool { func (self *SKsyunGuestDriver) IsNeedRestartForResetLoginInfo() bool { return false } + +func (self *SKsyunGuestDriver) IsNeedCleanDisksAfterUndeploy() bool { + return false +} diff --git a/pkg/compute/guestdrivers/managedvirtual.go b/pkg/compute/guestdrivers/managedvirtual.go index 1b9e98ad1e..44f46eb52f 100644 --- a/pkg/compute/guestdrivers/managedvirtual.go +++ b/pkg/compute/guestdrivers/managedvirtual.go @@ -971,31 +971,39 @@ func (drv *SManagedVirtualizedGuestDriver) RequestUndeployGuestOnHost(ctx contex cloudprovider.WaitDeleted(ivm, time.Second*10, time.Minute*3) - disks, err := guest.GetDisks() + driver, err := guest.GetDriver() if err != nil { - return nil, errors.Wrapf(err, "GetDisks") + return nil, err } - for i := range disks { - disk := disks[i] - storage, _ := disk.GetStorage() - if !utils.IsInStringArray(storage.StorageType, api.STORAGE_LOCAL_TYPES) && disk.DiskType != api.DISK_TYPE_SYS { - idisk, err := disk.GetIDisk(ctx) - if err != nil { - if errors.Cause(err) == cloudprovider.ErrNotFound { + if driver.IsNeedCleanDisksAfterUndeploy() { + disks, err := guest.GetDisks() + if err != nil { + return nil, errors.Wrapf(err, "GetDisks") + } + + for i := range disks { + disk := disks[i] + storage, _ := disk.GetStorage() + if !utils.IsInStringArray(storage.StorageType, api.STORAGE_LOCAL_TYPES) && disk.DiskType != api.DISK_TYPE_SYS { + idisk, err := disk.GetIDisk(ctx) + if err != nil { + if errors.Cause(err) == cloudprovider.ErrNotFound { + continue + } + return nil, errors.Wrapf(err, "disk.GetIDisk") + } + if idisk.GetStatus() == api.DISK_DEALLOC { continue } - return nil, errors.Wrapf(err, "disk.GetIDisk") - } - if idisk.GetStatus() == api.DISK_DEALLOC { - continue - } - err = idisk.Delete(ctx) - if err != nil { - return nil, errors.Wrapf(err, "idisk.Delete") + err = idisk.Delete(ctx) + if err != nil { + return nil, errors.Wrapf(err, "idisk.Delete") + } } } } + return nil, nil }) return nil diff --git a/pkg/compute/models/guestdrivers.go b/pkg/compute/models/guestdrivers.go index 8d07df160d..0ea6f88108 100644 --- a/pkg/compute/models/guestdrivers.go +++ b/pkg/compute/models/guestdrivers.go @@ -128,6 +128,7 @@ type IGuestDriver interface { RequestDetachDisksFromGuestForDelete(ctx context.Context, guest *SGuest, task taskman.ITask) error RequestUndeployGuestOnHost(ctx context.Context, guest *SGuest, host *SHost, task taskman.ITask) error + IsNeedCleanDisksAfterUndeploy() bool OnDeleteGuestFinalCleanup(ctx context.Context, guest *SGuest, userCred mcclient.TokenCredential) error