guest_delete_backup_task.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. // Copyright 2019 Yunion
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package guest
  15. import (
  16. "context"
  17. "fmt"
  18. "yunion.io/x/jsonutils"
  19. "yunion.io/x/pkg/util/httputils"
  20. "yunion.io/x/onecloud/pkg/apis/compute"
  21. "yunion.io/x/onecloud/pkg/cloudcommon/db"
  22. "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman"
  23. "yunion.io/x/onecloud/pkg/cloudcommon/notifyclient"
  24. "yunion.io/x/onecloud/pkg/compute/models"
  25. "yunion.io/x/onecloud/pkg/util/logclient"
  26. )
  27. func init() {
  28. taskman.RegisterTask(GuestDeleteBackupTask{})
  29. }
  30. type GuestDeleteBackupTask struct {
  31. SGuestBaseTask
  32. }
  33. func (self *GuestDeleteBackupTask) OnFail(ctx context.Context, guest *models.SGuest, reason jsonutils.JSONObject) {
  34. logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_DELETE_BACKUP, reason, self.UserCred, false)
  35. db.OpsLog.LogEvent(guest, db.ACT_DELETE_BACKUP_FAILED, reason, self.UserCred)
  36. guest.SetStatus(ctx, self.UserCred, compute.VM_BACKUP_DELETE_FAILED, reason.String())
  37. notifyclient.EventNotify(ctx, self.GetUserCred(), notifyclient.SEventNotifyParam{
  38. Obj: guest,
  39. Action: notifyclient.ActionDelBackupServer,
  40. IsFail: true,
  41. })
  42. self.SetStageFailed(ctx, reason)
  43. }
  44. func (self *GuestDeleteBackupTask) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) {
  45. guest := obj.(*models.SGuest)
  46. host := models.HostManager.FetchHostById(guest.HostId)
  47. if host == nil {
  48. self.OnFail(ctx, guest, jsonutils.NewString("Host not found"))
  49. return
  50. }
  51. self.SetStage("OnCancelBlockReplication", nil)
  52. url := fmt.Sprintf("%s/servers/%s/cancel-block-replication", host.ManagerUri, guest.Id)
  53. _, _, err := httputils.JSONRequest(httputils.GetDefaultClient(),
  54. ctx, "POST", url, self.GetTaskRequestHeader(), nil, false)
  55. if err != nil {
  56. self.OnFail(ctx, guest, jsonutils.NewString(err.Error()))
  57. return
  58. }
  59. }
  60. func (self *GuestDeleteBackupTask) OnCancelBlockReplication(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) {
  61. self.StartDeleteBackupOnHost(ctx, guest)
  62. }
  63. func (self *GuestDeleteBackupTask) StartDeleteBackupOnHost(ctx context.Context, guest *models.SGuest) {
  64. taskData := jsonutils.NewDict()
  65. taskData.Set("purge", jsonutils.NewBool(jsonutils.QueryBoolean(self.Params, "purge", false)))
  66. taskData.Set("host_id", jsonutils.NewString(guest.BackupHostId))
  67. taskData.Set("failed_status", jsonutils.NewString(compute.VM_BACKUP_DELETE_FAILED))
  68. self.SetStage("OnDeleteOnHost", nil)
  69. if task, err := taskman.TaskManager.NewTask(
  70. ctx, "GuestDeleteOnHostTask", guest, self.UserCred, taskData, self.GetId(), "", nil); err != nil {
  71. self.OnFail(ctx, guest, jsonutils.NewString(err.Error()))
  72. return
  73. } else {
  74. task.ScheduleRun(nil)
  75. }
  76. }
  77. func (self *GuestDeleteBackupTask) OnCancelBlockReplicationFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) {
  78. self.OnFail(ctx, guest, data)
  79. }
  80. func (self *GuestDeleteBackupTask) OnDeleteOnHost(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) {
  81. guest.SetGuestBackupMirrorJobNotReady(ctx, self.UserCred)
  82. if jsonutils.QueryBoolean(self.Params, "create", false) {
  83. self.OnDeleteBackupComplete(ctx, guest, data)
  84. self.SetStage("OnCreateNewBackup", nil)
  85. params := jsonutils.NewDict()
  86. _, err := guest.StartGuestCreateBackupTask(ctx, self.UserCred, self.GetId(), params)
  87. if err != nil {
  88. self.onCreateNewBackupFailed(ctx, guest, jsonutils.NewString(err.Error()))
  89. }
  90. } else {
  91. self.TaskComplete(ctx, guest, data)
  92. }
  93. }
  94. func (self *GuestDeleteBackupTask) OnCreateNewBackup(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) {
  95. logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_CREATE_BACKUP, "", self.UserCred, false)
  96. db.OpsLog.LogEvent(guest, db.ACT_CREATE_BACKUP, "", self.UserCred)
  97. self.SetStageComplete(ctx, nil)
  98. }
  99. func (self *GuestDeleteBackupTask) OnCreateNewBackupFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) {
  100. self.onCreateNewBackupFailed(ctx, guest, data)
  101. }
  102. func (self *GuestDeleteBackupTask) onCreateNewBackupFailed(ctx context.Context, guest *models.SGuest, reason jsonutils.JSONObject) {
  103. logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_CREATE_BACKUP, reason, self.UserCred, false)
  104. db.OpsLog.LogEvent(guest, db.ACT_CREATE_BACKUP_FAILED, reason, self.UserCred)
  105. self.SetStageFailed(ctx, reason)
  106. }
  107. func (self *GuestDeleteBackupTask) OnDeleteOnHostFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) {
  108. self.OnFail(ctx, guest, data)
  109. }
  110. func (self *GuestDeleteBackupTask) OnDeleteBackupComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) {
  111. logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_DELETE_BACKUP, "", self.UserCred, true)
  112. db.OpsLog.LogEvent(guest, db.ACT_DELETE_BACKUP, guest.GetShortDesc(ctx), self.UserCred)
  113. }
  114. func (self *GuestDeleteBackupTask) TaskComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) {
  115. self.OnDeleteBackupComplete(ctx, guest, data)
  116. self.SetStageComplete(ctx, nil)
  117. }