volume_delete_task.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package volume
  2. import (
  3. "context"
  4. "strings"
  5. "time"
  6. "yunion.io/x/jsonutils"
  7. "yunion.io/x/pkg/errors"
  8. "yunion.io/x/pkg/util/httputils"
  9. computeapi "yunion.io/x/onecloud/pkg/apis/compute"
  10. "yunion.io/x/onecloud/pkg/cloudcommon/db"
  11. "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman"
  12. "yunion.io/x/onecloud/pkg/llm/models"
  13. "yunion.io/x/onecloud/pkg/mcclient/auth"
  14. "yunion.io/x/onecloud/pkg/mcclient/modules/compute"
  15. "yunion.io/x/onecloud/pkg/util/logclient"
  16. )
  17. type VolumeDeleteTask struct {
  18. taskman.STask
  19. }
  20. func init() {
  21. taskman.RegisterTask(VolumeDeleteTask{})
  22. }
  23. func (volumeDeleteTask *VolumeDeleteTask) taskFailed(ctx context.Context, volume *models.SVolume, status string, err error) {
  24. volume.SetStatus(ctx, volumeDeleteTask.UserCred, status, err.Error())
  25. db.OpsLog.LogEvent(volume, db.ACT_DELETE, err, volumeDeleteTask.UserCred)
  26. logclient.AddActionLogWithStartable(volumeDeleteTask, volume, logclient.ACT_DELETE, err, volumeDeleteTask.UserCred, false)
  27. volumeDeleteTask.SetStageFailed(ctx, jsonutils.NewString(err.Error()))
  28. }
  29. func (volumeDeleteTask *VolumeDeleteTask) taskComplete(ctx context.Context, volume *models.SVolume) {
  30. volume.RealDelete(ctx, volumeDeleteTask.GetUserCred())
  31. volumeDeleteTask.SetStageComplete(ctx, nil)
  32. }
  33. func (volumeDeleteTask *VolumeDeleteTask) OnInit(ctx context.Context, obj db.IStandaloneModel, body jsonutils.JSONObject) {
  34. volume := obj.(*models.SVolume)
  35. if len(volume.CmpId) == 0 {
  36. volumeDeleteTask.taskComplete(ctx, volume)
  37. return
  38. }
  39. s := auth.GetSession(ctx, volumeDeleteTask.UserCred, "")
  40. _, err := compute.Disks.Delete(s, volume.CmpId, nil)
  41. if err != nil {
  42. if httputils.ErrorCode(err) == 404 {
  43. volumeDeleteTask.taskComplete(ctx, volume)
  44. return
  45. }
  46. volumeDeleteTask.taskFailed(ctx, volume, computeapi.DISK_DEALLOC_FAILED, errors.Wrap(err, "wait status"))
  47. return
  48. }
  49. for i := 0; i < 60; i++ {
  50. _, err := compute.Disks.GetById(s, volume.CmpId, jsonutils.Marshal(map[string]interface{}{
  51. "scope": "max",
  52. }))
  53. if err != nil {
  54. if strings.Contains(err.Error(), "ResourceNotFoundError") {
  55. volumeDeleteTask.taskComplete(ctx, volume)
  56. return
  57. }
  58. }
  59. time.Sleep(30 * time.Second)
  60. }
  61. volumeDeleteTask.taskFailed(ctx, volume, computeapi.MODELARTS_POOL_STATUS_TIMEOUT, errors.Wrap(err, "wait status"))
  62. }