| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- package volume
- import (
- "context"
- "strings"
- "time"
- "yunion.io/x/jsonutils"
- "yunion.io/x/pkg/errors"
- "yunion.io/x/pkg/util/httputils"
- computeapi "yunion.io/x/onecloud/pkg/apis/compute"
- "yunion.io/x/onecloud/pkg/cloudcommon/db"
- "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman"
- "yunion.io/x/onecloud/pkg/llm/models"
- "yunion.io/x/onecloud/pkg/mcclient/auth"
- "yunion.io/x/onecloud/pkg/mcclient/modules/compute"
- "yunion.io/x/onecloud/pkg/util/logclient"
- )
- type VolumeDeleteTask struct {
- taskman.STask
- }
- func init() {
- taskman.RegisterTask(VolumeDeleteTask{})
- }
- func (volumeDeleteTask *VolumeDeleteTask) taskFailed(ctx context.Context, volume *models.SVolume, status string, err error) {
- volume.SetStatus(ctx, volumeDeleteTask.UserCred, status, err.Error())
- db.OpsLog.LogEvent(volume, db.ACT_DELETE, err, volumeDeleteTask.UserCred)
- logclient.AddActionLogWithStartable(volumeDeleteTask, volume, logclient.ACT_DELETE, err, volumeDeleteTask.UserCred, false)
- volumeDeleteTask.SetStageFailed(ctx, jsonutils.NewString(err.Error()))
- }
- func (volumeDeleteTask *VolumeDeleteTask) taskComplete(ctx context.Context, volume *models.SVolume) {
- volume.RealDelete(ctx, volumeDeleteTask.GetUserCred())
- volumeDeleteTask.SetStageComplete(ctx, nil)
- }
- func (volumeDeleteTask *VolumeDeleteTask) OnInit(ctx context.Context, obj db.IStandaloneModel, body jsonutils.JSONObject) {
- volume := obj.(*models.SVolume)
- if len(volume.CmpId) == 0 {
- volumeDeleteTask.taskComplete(ctx, volume)
- return
- }
- s := auth.GetSession(ctx, volumeDeleteTask.UserCred, "")
- _, err := compute.Disks.Delete(s, volume.CmpId, nil)
- if err != nil {
- if httputils.ErrorCode(err) == 404 {
- volumeDeleteTask.taskComplete(ctx, volume)
- return
- }
- volumeDeleteTask.taskFailed(ctx, volume, computeapi.DISK_DEALLOC_FAILED, errors.Wrap(err, "wait status"))
- return
- }
- for i := 0; i < 60; i++ {
- _, err := compute.Disks.GetById(s, volume.CmpId, jsonutils.Marshal(map[string]interface{}{
- "scope": "max",
- }))
- if err != nil {
- if strings.Contains(err.Error(), "ResourceNotFoundError") {
- volumeDeleteTask.taskComplete(ctx, volume)
- return
- }
- }
- time.Sleep(30 * time.Second)
- }
- volumeDeleteTask.taskFailed(ctx, volume, computeapi.MODELARTS_POOL_STATUS_TIMEOUT, errors.Wrap(err, "wait status"))
- }
|