diff --git a/pkg/compute/hostdrivers/base.go b/pkg/compute/hostdrivers/base.go index 81ecc159d3..0ba8e4d794 100644 --- a/pkg/compute/hostdrivers/base.go +++ b/pkg/compute/hostdrivers/base.go @@ -11,6 +11,6 @@ import ( type SBaseHostDriver struct { } -func (self *SBaseHostDriver) RequestDeleteSnapshotWithStorage(ctx context.Context, host *models.SHost, snapshot *models.SSnapshot, task taskman.ITask) error { +func (self *SBaseHostDriver) RequestDeleteSnapshotsWithStorage(ctx context.Context, host *models.SHost, snapshot *models.SSnapshot, task taskman.ITask) error { return fmt.Errorf("Not Implement") } diff --git a/pkg/compute/hostdrivers/kvm.go b/pkg/compute/hostdrivers/kvm.go index b317f44a49..24b893b7e6 100644 --- a/pkg/compute/hostdrivers/kvm.go +++ b/pkg/compute/hostdrivers/kvm.go @@ -149,7 +149,7 @@ func (self *SKVMHostDriver) RequestSaveUploadImageOnHost(ctx context.Context, ho return err } -func (self *SKVMHostDriver) RequestDeleteSnapshotWithStorage(ctx context.Context, host *models.SHost, snapshot *models.SSnapshot, task taskman.ITask) error { +func (self *SKVMHostDriver) RequestDeleteSnapshotsWithStorage(ctx context.Context, host *models.SHost, snapshot *models.SSnapshot, task taskman.ITask) error { url := fmt.Sprintf("/storages/%s/delete-snapshots", snapshot.StorageId) body := jsonutils.NewDict() body.Set("disk_id", jsonutils.NewString(snapshot.DiskId)) diff --git a/pkg/compute/models/hostdrivers.go b/pkg/compute/models/hostdrivers.go index 7a46ba820d..a911c691cd 100644 --- a/pkg/compute/models/hostdrivers.go +++ b/pkg/compute/models/hostdrivers.go @@ -18,7 +18,7 @@ type IHostDriver interface { RequestDeallocateDiskOnHost(host *SHost, storage *SStorage, disk *SDisk, task taskman.ITask) error RequestResizeDiskOnHostOnline(host *SHost, storage *SStorage, disk *SDisk, size int64, task taskman.ITask) error RequestResizeDiskOnHost(host *SHost, storage *SStorage, disk *SDisk, size int64, task taskman.ITask) error - RequestDeleteSnapshotWithStorage(ctx context.Context, host *SHost, snapshot *SSnapshot, task taskman.ITask) error + RequestDeleteSnapshotsWithStorage(ctx context.Context, host *SHost, snapshot *SSnapshot, task taskman.ITask) error } var hostDrivers map[string]IHostDriver diff --git a/pkg/compute/models/snapshots.go b/pkg/compute/models/snapshots.go index a2d2df78ad..8eea624e72 100644 --- a/pkg/compute/models/snapshots.go +++ b/pkg/compute/models/snapshots.go @@ -2,6 +2,7 @@ package models import ( "context" + "database/sql" "fmt" "yunion.io/x/jsonutils" @@ -92,10 +93,19 @@ func (self *SSnapshot) GetGuest() (*SGuest, error) { } else if len(guests) == 1 { return &guests[0], nil } else { - return nil, nil + return nil, sql.ErrNoRows } } +func (self *SSnapshot) GetDisk() (*SDisk, error) { + iDisk, err := DiskManager.FetchById(self.DiskId) + if err != nil { + return nil, err + } + disk := iDisk.(*SDisk) + return disk, nil +} + func (self *SSnapshot) GetHost() *SHost { iStorage, err := StorageManager.FetchById(self.StorageId) if err != nil { @@ -204,6 +214,10 @@ func (self *SSnapshot) CustomizeDelete(ctx context.Context, userCred mcclient.To if !self.FakeDeleted { return self.FakeDelete() } else { + _, err := SnapshotManager.GetConvertSnapshot(self) + if err != nil { + httperrors.NewBadRequestError("Snapshot dosen't have convert snapshot, use disk-delete-snapshots") + } return self.StartSnapshotDeleteTask(ctx, userCred, false, "") } } else { @@ -280,7 +294,7 @@ func (self *SSnapshotManager) PerformDeleteDiskSnapshots(ctx context.Context, us } func (self *SSnapshot) StartSnapshotsDeleteTask(ctx context.Context, userCred mcclient.TokenCredential, parentTaskId string) error { - task, err := taskman.TaskManager.NewTask(ctx, "BatchSnapshostDeleteTask", self, userCred, nil, parentTaskId, "", nil) + task, err := taskman.TaskManager.NewTask(ctx, "BatchSnapshotsDeleteTask", self, userCred, nil, parentTaskId, "", nil) if err != nil { log.Errorf(err.Error()) return err diff --git a/pkg/compute/tasks/guest_disk_snapshot_task.go b/pkg/compute/tasks/guest_disk_snapshot_task.go index ebf2e08e61..f2e40ab790 100644 --- a/pkg/compute/tasks/guest_disk_snapshot_task.go +++ b/pkg/compute/tasks/guest_disk_snapshot_task.go @@ -19,7 +19,7 @@ type GuestDiskSnapshotTask struct { func init() { taskman.RegisterTask(GuestDiskSnapshotTask{}) taskman.RegisterTask(SnapshotDeleteTask{}) - taskman.RegisterTask(BatchSnapshostDeleteTask{}) + taskman.RegisterTask(BatchSnapshotsDeleteTask{}) } func (self *GuestDiskSnapshotTask) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { @@ -114,6 +114,7 @@ func (self *SnapshotDeleteTask) OnInit(ctx context.Context, obj db.IStandaloneMo self.SetStageFailed(ctx, err.Error()) return } else { + // if snapshot is not used self.DeleteStaticSnapshot(ctx, snapshot) return } @@ -169,14 +170,6 @@ func (self *SnapshotDeleteTask) StartDeleteSnapshot(ctx context.Context, snapsho } func (self *SnapshotDeleteTask) DeleteStaticSnapshot(ctx context.Context, snapshot *models.SSnapshot) { - // convertSnapshot, err := models.SnapshotManager.GetConvertSnapshot(snapshot) - // if err != nil { - // self.TaskFailed(ctx, snapshot, err.Error()) - // return - // } - // if convertSnapshot == nil { - // self.TaskFailed(ctx, snapshot, "Snapshot dose not have convert snapshot") - // } err := snapshot.FakeDelete() if err != nil { self.TaskFailed(ctx, snapshot, err.Error()) @@ -258,29 +251,29 @@ func (self *SnapshotDeleteTask) TaskFailed(ctx context.Context, snapshot *models guest.StartSyncstatus(ctx, self.UserCred, "") } -type BatchSnapshostDeleteTask struct { +type BatchSnapshotsDeleteTask struct { taskman.STask } -func (self *BatchSnapshostDeleteTask) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { +func (self *BatchSnapshotsDeleteTask) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { snapshot := obj.(*models.SSnapshot) self.StartStorageDeleteSnapshot(ctx, snapshot) } -func (self *BatchSnapshostDeleteTask) StartStorageDeleteSnapshot(ctx context.Context, snapshot *models.SSnapshot) { +func (self *BatchSnapshotsDeleteTask) StartStorageDeleteSnapshot(ctx context.Context, snapshot *models.SSnapshot) { host := snapshot.GetHost() if host == nil { self.SetStageFailed(ctx, "Cannot found snapshot host") return } self.SetStage("OnStorageDeleteSnapshot", nil) - err := host.GetHostDriver().RequestDeleteSnapshotWithStorage(ctx, host, snapshot, self) + err := host.GetHostDriver().RequestDeleteSnapshotsWithStorage(ctx, host, snapshot, self) if err != nil { self.SetStageFailed(ctx, err.Error()) } } -func (self *BatchSnapshostDeleteTask) OnStorageDeleteSnapshot(ctx context.Context, snapshot *models.SSnapshot, data jsonutils.JSONObject) { +func (self *BatchSnapshotsDeleteTask) OnStorageDeleteSnapshot(ctx context.Context, snapshot *models.SSnapshot, data jsonutils.JSONObject) { snapshots := models.SnapshotManager.GetDiskSnapshots(snapshot.DiskId) for i := 0; i < len(snapshots); i++ { snapshots[i].RealDelete(ctx, self.UserCred)