llm_delete_task.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package llm
  2. import (
  3. "context"
  4. "database/sql"
  5. "yunion.io/x/jsonutils"
  6. "yunion.io/x/pkg/errors"
  7. api "yunion.io/x/onecloud/pkg/apis/llm"
  8. "yunion.io/x/onecloud/pkg/cloudcommon/db"
  9. "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman"
  10. "yunion.io/x/onecloud/pkg/llm/models"
  11. "yunion.io/x/onecloud/pkg/mcclient/auth"
  12. "yunion.io/x/onecloud/pkg/util/logclient"
  13. )
  14. type LLMDeleteTask struct {
  15. taskman.STask
  16. }
  17. func init() {
  18. taskman.RegisterTask(LLMDeleteTask{})
  19. }
  20. func (task *LLMDeleteTask) taskFailed(ctx context.Context, llm *models.SLLM, err error) {
  21. llm.SetStatus(ctx, task.UserCred, api.LLM_STATUS_DELETE_FAILED, err.Error())
  22. db.OpsLog.LogEvent(llm, db.ACT_DELETE_FAIL, err, task.UserCred)
  23. logclient.AddActionLogWithStartable(task, llm, logclient.ACT_DELETE, err, task.UserCred, false)
  24. task.SetStageFailed(ctx, jsonutils.NewString(err.Error()))
  25. }
  26. func (task *LLMDeleteTask) OnInit(ctx context.Context, obj db.IStandaloneModel, body jsonutils.JSONObject) {
  27. llm := obj.(*models.SLLM)
  28. llm.SetStatus(ctx, task.UserCred, api.LLM_STATUS_DELETING, "start delete")
  29. if len(llm.CmpId) == 0 {
  30. task.OnLLMRefreshStatusComplete(ctx, llm, nil)
  31. return
  32. }
  33. // 检查 server 是否存在
  34. _, err := llm.GetServer(ctx)
  35. if err != nil {
  36. if errors.Cause(err) == errors.ErrNotFound {
  37. // server 不存在,直接进入下一步
  38. task.OnLLMRefreshStatusComplete(ctx, llm, nil)
  39. return
  40. }
  41. // 其他错误,任务失败
  42. task.taskFailed(ctx, llm, err)
  43. return
  44. }
  45. task.SetStage("OnLLMRefreshStatusComplete", nil)
  46. s := auth.GetSession(ctx, task.GetUserCred(), "")
  47. err = s.WithTaskCallback(task.GetId(), func() error {
  48. return llm.ServerDelete(ctx, task.UserCred, s)
  49. })
  50. if err != nil {
  51. task.taskFailed(ctx, llm, err)
  52. }
  53. }
  54. func (task *LLMDeleteTask) OnLLMRefreshStatusCompleteFailed(ctx context.Context, llm *models.SLLM, err jsonutils.JSONObject) {
  55. task.taskFailed(ctx, llm, errors.Error(err.String()))
  56. }
  57. func (task *LLMDeleteTask) OnLLMRefreshStatusComplete(ctx context.Context, llm *models.SLLM, body jsonutils.JSONObject) {
  58. volume, err := llm.GetVolume()
  59. if err != nil {
  60. if errors.Cause(err) != errors.ErrNotFound {
  61. task.taskFailed(ctx, llm, err)
  62. return
  63. }
  64. }
  65. if volume != nil {
  66. task.SetStage("OnLLMVolumeDeleteComplete", nil)
  67. volume.StartDeleteTask(ctx, task.UserCred, task.GetTaskId())
  68. } else {
  69. task.OnLLMVolumeDeleteComplete(ctx, llm, nil)
  70. }
  71. }
  72. func (task *LLMDeleteTask) OnLLMVolumeDeleteCompleteFailed(ctx context.Context, llm *models.SLLM, err jsonutils.JSONObject) {
  73. task.taskFailed(ctx, llm, errors.Error(err.String()))
  74. }
  75. func (task *LLMDeleteTask) OnLLMVolumeDeleteComplete(ctx context.Context, llm *models.SLLM, body jsonutils.JSONObject) {
  76. lc, err := llm.GetLLMContainer()
  77. if err != nil {
  78. if errors.Cause(err) != errors.ErrNotFound && errors.Cause(err) != sql.ErrNoRows {
  79. task.taskFailed(ctx, llm, err)
  80. return
  81. }
  82. }
  83. if lc != nil {
  84. task.SetStage("OnLLMContainerDeleteComplete", nil)
  85. lc.StartDeleteTask(ctx, task.UserCred, task.GetTaskId())
  86. } else {
  87. task.OnLLMContainerDeleteComplete(ctx, llm, nil)
  88. }
  89. }
  90. func (task *LLMDeleteTask) OnLLMContainerDeleteCompleteFailed(ctx context.Context, llm *models.SLLM, err jsonutils.JSONObject) {
  91. task.taskFailed(ctx, llm, errors.Error(err.String()))
  92. }
  93. func (task *LLMDeleteTask) OnLLMContainerDeleteComplete(ctx context.Context, llm *models.SLLM, body jsonutils.JSONObject) {
  94. err := models.GetLLMInstantModelManager().DeleteByLlmId(ctx, llm.Id)
  95. if err != nil {
  96. task.taskFailed(ctx, llm, err)
  97. return
  98. }
  99. err = llm.RealDelete(ctx, task.UserCred)
  100. if err != nil {
  101. task.taskFailed(ctx, llm, err)
  102. return
  103. }
  104. task.SetStageComplete(ctx, nil)
  105. }