From 76c26458ac5d8d8e43c7deb4a60d365aeedd12ab Mon Sep 17 00:00:00 2001 From: Jian Qiu Date: Wed, 13 Apr 2022 01:39:36 +0800 Subject: [PATCH] fix: backup bugifxes: 1. not inherit projects of disk. 2. class not (#14000) inherit by disk 3. fail to creat guest image Co-authored-by: Qiu Jian --- pkg/compute/models/backup.go | 5 +++ pkg/compute/models/guest_actions.go | 2 +- .../tasks/disk_backup_recovery_task.go | 37 ++++++++++++------- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/pkg/compute/models/backup.go b/pkg/compute/models/backup.go index c11b41adde..fb346dd91c 100644 --- a/pkg/compute/models/backup.go +++ b/pkg/compute/models/backup.go @@ -271,6 +271,8 @@ func (db *SDiskBackup) CustomizeCreate(ctx context.Context, userCred mcclient.To db.DiskSizeMb = disk.DiskSize db.OsArch = disk.OsArch db.StorageId = disk.StorageId + db.DomainId = disk.DomainId + db.ProjectId = disk.ProjectId return nil } @@ -391,6 +393,9 @@ func (self *SDiskBackup) StartBackupDeleteTask(ctx context.Context, userCred mcc } func (self *SDiskBackup) PerformRecovery(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, input api.DiskBackupRecoveryInput) (jsonutils.JSONObject, error) { + if self.Status != api.BACKUP_STATUS_READY { + return nil, errors.Wrapf(httperrors.ErrInvalidStatus, "cannot recover backup in status %s", self.Status) + } return nil, self.StartRecoveryTask(ctx, userCred, "", input.Name) } diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index b50704180a..5e45b08bbb 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -275,7 +275,7 @@ func (self *SGuest) PerformSaveGuestImage(ctx context.Context, userCred mcclient return nil, errors.Wrap(err, "unable to GetAllClassMetadata") } if len(cm) > 0 { - _, err = image.Images.PerformAction(s, guestImageId, "set-class-metadata", jsonutils.Marshal(cm)) + _, err = image.GuestImages.PerformAction(s, guestImageId, "set-class-metadata", jsonutils.Marshal(cm)) if err != nil { return nil, errors.Wrapf(err, "unable to SetClassMetadata for guest image %s", guestImageId) } diff --git a/pkg/compute/tasks/disk_backup_recovery_task.go b/pkg/compute/tasks/disk_backup_recovery_task.go index 3bee5b11d2..e48142df5f 100644 --- a/pkg/compute/tasks/disk_backup_recovery_task.go +++ b/pkg/compute/tasks/disk_backup_recovery_task.go @@ -5,15 +5,12 @@ import ( "fmt" "yunion.io/x/jsonutils" - "yunion.io/x/log" api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db" + "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman" "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman" "yunion.io/x/onecloud/pkg/compute/models" - "yunion.io/x/onecloud/pkg/mcclient" - "yunion.io/x/onecloud/pkg/mcclient/auth" - compute_modules "yunion.io/x/onecloud/pkg/mcclient/modules/compute" "yunion.io/x/onecloud/pkg/util/logclient" ) @@ -53,21 +50,35 @@ func (self *DiskBackupRecoveryTask) OnInit(ctx context.Context, obj db.IStandalo input.Description = fmt.Sprintf("recovery from backup %s", backup.GetName()) input.Hypervisor = api.HYPERVISOR_KVM input.DiskConfig = diskConfig + ownerId := backup.GetOwnerId() + input.ProjectDomainId = ownerId.GetProjectDomainId() + input.ProjectId = ownerId.GetProjectId() - taskHeader := self.GetTaskRequestHeader() - session := auth.GetSession(ctx, self.UserCred, "", "") - log.Infof("task_notify_url: %s\ntask_id: %s\n", taskHeader.Get(mcclient.TASK_NOTIFY_URL), taskHeader.Get(mcclient.TASK_ID)) - session.Header.Set(mcclient.TASK_NOTIFY_URL, taskHeader.Get(mcclient.TASK_NOTIFY_URL)) - session.Header.Set(mcclient.TASK_ID, taskHeader.Get(mcclient.TASK_ID)) - diskData, err := compute_modules.Disks.Create(session, jsonutils.Marshal(input)) + params := input.JSON(input) + diskObj, err := db.DoCreate(models.DiskManager, ctx, self.UserCred, nil, params, ownerId) if err != nil { self.taskFaild(ctx, backup, jsonutils.NewString(err.Error())) return } - diskId, _ := diskData.GetString("id") - params := jsonutils.NewDict() - params.Set("disk_id", jsonutils.NewString(diskId)) + disk := diskObj.(*models.SDisk) + err = backup.InheritTo(ctx, disk) + if err != nil { + self.taskFaild(ctx, backup, jsonutils.NewString(err.Error())) + return + } + + func() { + lockman.LockObject(ctx, disk) + defer lockman.ReleaseObject(ctx, disk) + + disk.PostCreate(ctx, self.UserCred, backup.GetOwnerId(), nil, params) + }() + + params.Set("disk_id", jsonutils.NewString(disk.Id)) self.SetStage("OnCreateDisk", params) + + params.Set("parent_task_id", jsonutils.NewString(self.GetTaskId())) + models.DiskManager.OnCreateComplete(ctx, []db.IModel{disk}, self.UserCred, ownerId, nil, params) } func (self *DiskBackupRecoveryTask) OnCreateDisk(ctx context.Context, backup *models.SDiskBackup, data jsonutils.JSONObject) {