diff --git a/pkg/compute/models/regiondrivers.go b/pkg/compute/models/regiondrivers.go index d0839b2cd0..a22ca33c8a 100644 --- a/pkg/compute/models/regiondrivers.go +++ b/pkg/compute/models/regiondrivers.go @@ -96,6 +96,7 @@ type IRegionDriver interface { OnDiskReset(ctx context.Context, userCred mcclient.TokenCredential, disk *SDisk, snapshot *SSnapshot, data jsonutils.JSONObject) error RequestApplySnapshotPolicy(ctx context.Context, userCred mcclient.TokenCredential, sp *SSnapshotPolicy, task taskman.ITask, diskId string) error RequestCancelSnapshotPolicy(ctx context.Context, userCred mcclient.TokenCredential, sp *SSnapshotPolicy, task taskman.ITask, diskId string) error + OnSnapshotDelete(ctx context.Context, snapshot *SSnapshot, task taskman.ITask) error } var regionDrivers map[string]IRegionDriver diff --git a/pkg/compute/regiondrivers/base.go b/pkg/compute/regiondrivers/base.go index daeb1cd420..5d3fe4116e 100644 --- a/pkg/compute/regiondrivers/base.go +++ b/pkg/compute/regiondrivers/base.go @@ -195,3 +195,7 @@ func (self *SBaseRegionDriver) OnDiskReset(ctx context.Context, userCred mcclien func (self *SBaseRegionDriver) ValidateCreateSnapshopolicyDiskData(ctx context.Context, userCred mcclient.TokenCredential, diskID string) error { return fmt.Errorf("Not Implement ValidateCreateSnapshotpolicyDiskData") } + +func (self *SBaseRegionDriver) OnSnapshotDelete(ctx context.Context, snapshot *models.SSnapshot, task taskman.ITask) error { + return fmt.Errorf("Not implement OnSnapshotDelete") +} diff --git a/pkg/compute/regiondrivers/kvm.go b/pkg/compute/regiondrivers/kvm.go index a50e3f419d..5423d4de2e 100644 --- a/pkg/compute/regiondrivers/kvm.go +++ b/pkg/compute/regiondrivers/kvm.go @@ -808,3 +808,9 @@ func (self *SKVMRegionDriver) RequestCancelSnapshotPolicy(ctx context.Context, u }) return nil } + +func (self *SKVMRegionDriver) OnSnapshotDelete(ctx context.Context, snapshot *models.SSnapshot, task taskman.ITask) error { + task.SetStage("OnKvmSnapshotDelete", nil) + task.ScheduleRun(nil) + return nil +} diff --git a/pkg/compute/regiondrivers/managedvirtual.go b/pkg/compute/regiondrivers/managedvirtual.go index eb687b7f81..c75c7c8951 100644 --- a/pkg/compute/regiondrivers/managedvirtual.go +++ b/pkg/compute/regiondrivers/managedvirtual.go @@ -1123,23 +1123,27 @@ func (self *SManagedVirtualizationRegionDriver) ValidateSnapshotDelete(ctx conte } func (self *SManagedVirtualizationRegionDriver) RequestDeleteSnapshot(ctx context.Context, snapshot *models.SSnapshot, task taskman.ITask) error { - cloudRegion, err := snapshot.GetISnapshotRegion() - if err != nil { - log.Errorln(err, cloudRegion, snapshot.CloudregionId) - return err - } - cloudSnapshot, err := cloudRegion.GetISnapshotById(snapshot.ExternalId) - if err != nil { - if err == cloudprovider.ErrNotFound { - return nil + taskman.LocalTaskRun(task, func() (jsonutils.JSONObject, error) { + cloudRegion, err := snapshot.GetISnapshotRegion() + if err != nil { + return nil, err } - log.Errorln(err, cloudSnapshot) - return err - } - if err := cloudSnapshot.Delete(); err != nil { - return err - } - return cloudprovider.WaitDeleted(cloudSnapshot, 10*time.Second, 300*time.Second) + cloudSnapshot, err := cloudRegion.GetISnapshotById(snapshot.ExternalId) + if err != nil { + if err == cloudprovider.ErrNotFound { + return nil, nil + } + return nil, err + } + if err := cloudSnapshot.Delete(); err != nil { + return nil, err + } + if err := cloudprovider.WaitDeleted(cloudSnapshot, 10*time.Second, 300*time.Second); err != nil { + return nil, err + } + return nil, nil + }) + return nil } func (self *SManagedVirtualizationRegionDriver) ValidateSnapshotCreate(ctx context.Context, userCred mcclient.TokenCredential, disk *models.SDisk, data *jsonutils.JSONDict) error { @@ -1222,3 +1226,9 @@ func (self *SManagedVirtualizationRegionDriver) ValidateCreateSnapshotPolicyData input.CloudregionId = cloudregion.GetId() return nil } + +func (self *SManagedVirtualizationRegionDriver) OnSnapshotDelete(ctx context.Context, snapshot *models.SSnapshot, task taskman.ITask) error { + task.SetStage("OnManagedSnapshotDelete", nil) + task.ScheduleRun(nil) + return nil +} diff --git a/pkg/compute/tasks/snapshot_delete_task.go b/pkg/compute/tasks/snapshot_delete_task.go index 62298ab5ee..d9466ca73d 100644 --- a/pkg/compute/tasks/snapshot_delete_task.go +++ b/pkg/compute/tasks/snapshot_delete_task.go @@ -43,18 +43,25 @@ func (self *SnapshotDeleteTask) OnRequestSnapshotFailed(ctx context.Context, sna } func (self *SnapshotDeleteTask) OnRequestSnapshot(ctx context.Context, snapshot *models.SSnapshot, data jsonutils.JSONObject) { - if len(snapshot.ExternalId) > 0 { - snapshot.RealDelete(ctx, self.GetUserCred()) - self.TaskComplete(ctx, snapshot, nil) + err := snapshot.GetRegionDriver().OnSnapshotDelete(ctx, snapshot, self) + if err != nil { + self.TaskFailed(ctx, snapshot, err.Error()) + } +} + +func (self *SnapshotDeleteTask) OnManagedSnapshotDelete(ctx context.Context, snapshot *models.SSnapshot, data jsonutils.JSONObject) { + snapshot.RealDelete(ctx, self.GetUserCred()) + self.TaskComplete(ctx, snapshot, nil) +} + +func (self *SnapshotDeleteTask) OnKvmSnapshotDelete(ctx context.Context, snapshot *models.SSnapshot, data jsonutils.JSONObject) { + snapshot.SetStatus(self.UserCred, api.SNAPSHOT_READY, "") + if jsonutils.QueryBoolean(self.Params, "reload_disk", false) && snapshot.OutOfChain { + self.SetStage("OnReloadDiskSnapshot", nil) + self.OnReloadDiskSnapshot(ctx, snapshot, data) } else { - snapshot.SetStatus(self.UserCred, api.SNAPSHOT_READY, "") - if jsonutils.QueryBoolean(self.Params, "reload_disk", false) && snapshot.OutOfChain { - self.SetStage("OnReloadDiskSnapshot", nil) - self.OnReloadDiskSnapshot(ctx, snapshot, data) - } else { - self.SetStage("OnDeleteSnapshot", nil) - self.OnDeleteSnapshot(ctx, snapshot, data) - } + self.SetStage("OnDeleteSnapshot", nil) + self.OnDeleteSnapshot(ctx, snapshot, data) } }