ha_disk_create_task.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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 disk
  15. import (
  16. "context"
  17. "fmt"
  18. "yunion.io/x/jsonutils"
  19. "yunion.io/x/pkg/errors"
  20. api "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/compute/models"
  24. )
  25. func init() {
  26. taskman.RegisterTask(HADiskCreateTask{})
  27. taskman.RegisterTask(DiskCreateBackupTask{})
  28. }
  29. type HADiskCreateTask struct {
  30. DiskCreateTask
  31. }
  32. func (self *HADiskCreateTask) OnStorageCacheImageComplete(
  33. ctx context.Context, disk *models.SDisk, data jsonutils.JSONObject,
  34. ) {
  35. storage := models.StorageManager.FetchStorageById(disk.BackupStorageId)
  36. storagecache := storage.GetStoragecache()
  37. imageId := disk.GetTemplateId()
  38. self.SetStage("OnBackupStorageCacheImageComplete", nil)
  39. input := api.CacheImageInput{
  40. ImageId: imageId,
  41. Format: disk.DiskFormat,
  42. ParentTaskId: self.GetTaskId(),
  43. }
  44. storagecache.StartImageCacheTask(ctx, self.UserCred, input)
  45. }
  46. func (self *HADiskCreateTask) OnBackupStorageCacheImageComplete(
  47. ctx context.Context, disk *models.SDisk, data jsonutils.JSONObject,
  48. ) {
  49. self.DiskCreateTask.OnStorageCacheImageComplete(ctx, disk, data)
  50. }
  51. func (self *HADiskCreateTask) OnDiskReady(
  52. ctx context.Context, disk *models.SDisk, data jsonutils.JSONObject,
  53. ) {
  54. rebuild, _ := self.GetParams().Bool("rebuild")
  55. snapshot, _ := self.GetParams().GetString("snapshot")
  56. storage := models.StorageManager.FetchStorageById(disk.BackupStorageId)
  57. host, err := storage.GetMasterHost()
  58. if err != nil {
  59. self.OnBackupAllocateFailed(ctx, disk, jsonutils.NewString(errors.Wrapf(err, "storage.GetMasterHost").Error()))
  60. return
  61. }
  62. db.OpsLog.LogEvent(disk, db.ACT_BACKUP_ALLOCATING, disk.GetShortDesc(ctx), self.GetUserCred())
  63. disk.SetStatus(ctx, self.UserCred, api.DISK_BACKUP_STARTALLOC,
  64. fmt.Sprintf("Backup disk start alloc use host %s(%s)", host.Name, host.Id),
  65. )
  66. self.SetStage("OnSlaveDiskReady", nil)
  67. if err := disk.StartAllocate(ctx, host, storage,
  68. self.GetTaskId(), self.GetUserCred(), rebuild, snapshot, self,
  69. ); err != nil {
  70. self.OnBackupAllocateFailed(ctx, disk,
  71. jsonutils.NewString(fmt.Sprintf("Backup disk alloctate failed: %s", err.Error())))
  72. }
  73. }
  74. func (self *HADiskCreateTask) OnBackupAllocateFailed(ctx context.Context, disk *models.SDisk, data jsonutils.JSONObject) {
  75. disk.SetStatus(ctx, self.UserCred, api.DISK_BACKUP_ALLOC_FAILED, data.String())
  76. self.SetStageFailed(ctx, data)
  77. }
  78. func (self *HADiskCreateTask) OnSlaveDiskReady(
  79. ctx context.Context, disk *models.SDisk, data jsonutils.JSONObject,
  80. ) {
  81. self.DiskCreateTask.OnDiskReady(ctx, disk, data)
  82. }
  83. type DiskCreateBackupTask struct {
  84. HADiskCreateTask
  85. }
  86. func (self *DiskCreateBackupTask) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) {
  87. disk := obj.(*models.SDisk)
  88. storage := models.StorageManager.FetchStorageById(disk.BackupStorageId)
  89. storagecache := storage.GetStoragecache()
  90. imageId := disk.GetTemplateId()
  91. if len(imageId) > 0 {
  92. self.SetStage("OnBackupStorageCacheImageComplete", nil)
  93. input := api.CacheImageInput{
  94. ImageId: imageId,
  95. Format: disk.DiskFormat,
  96. ParentTaskId: self.GetTaskId(),
  97. }
  98. storagecache.StartImageCacheTask(ctx, self.UserCred, input)
  99. } else {
  100. self.OnBackupStorageCacheImageComplete(ctx, disk, nil)
  101. }
  102. }
  103. func (self *DiskCreateBackupTask) OnBackupStorageCacheImageComplete(
  104. ctx context.Context, disk *models.SDisk, data jsonutils.JSONObject,
  105. ) {
  106. self.HADiskCreateTask.OnDiskReady(ctx, disk, data)
  107. }
  108. func (self *DiskCreateBackupTask) OnSlaveDiskReady(ctx context.Context, disk *models.SDisk, data jsonutils.JSONObject) {
  109. bkStorage := models.StorageManager.FetchStorageById(disk.BackupStorageId)
  110. bkStorage.ClearSchedDescCache()
  111. disk.SetStatus(ctx, self.UserCred, api.DISK_READY, "")
  112. db.OpsLog.LogEvent(disk, db.ACT_BACKUP_ALLOCATE, disk.GetShortDesc(ctx), self.UserCred)
  113. self.SetStageComplete(ctx, nil)
  114. }