From f678eb97bf3b560edecf354bbcecd1bde520a45b Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Wed, 8 Sep 2021 22:25:32 +0800 Subject: [PATCH] fix: set disk driver and network driver for converting esxi to kvm --- pkg/compute/models/guest_actions.go | 21 ++++++++++--------- .../tasks/guest_convert_esxi_to_kvm_task.go | 9 +++++++- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index 2db10837e8..6126a24010 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -4339,22 +4339,23 @@ func (self *SGuest) PerformConvertToKvm( if self.Status != api.VM_READY { return nil, httperrors.NewBadRequestError("guest status must be ready") } - newGuest, err := self.createConvertedServer(ctx, userCred) + newGuest, createInput, err := self.createConvertedServer(ctx, userCred) if err != nil { return nil, errors.Wrap(err, "create converted server") } - return nil, self.StartConvertEsxiToKvmTask(ctx, userCred, preferHost, newGuest) + return nil, self.StartConvertEsxiToKvmTask(ctx, userCred, preferHost, newGuest, createInput) } func (self *SGuest) StartConvertEsxiToKvmTask( ctx context.Context, userCred mcclient.TokenCredential, - preferHostId string, newGuest *SGuest, + preferHostId string, newGuest *SGuest, createInput *api.ServerCreateInput, ) error { params := jsonutils.NewDict() if len(preferHostId) > 0 { params.Set("prefer_host_id", jsonutils.NewString(preferHostId)) } params.Set("target_guest_id", jsonutils.NewString(newGuest.Id)) + params.Set("input", jsonutils.Marshal(createInput)) task, err := taskman.TaskManager.NewTask(ctx, "GuestConvertEsxiToKvmTask", self, userCred, params, "", "", nil) if err != nil { @@ -4368,28 +4369,28 @@ func (self *SGuest) StartConvertEsxiToKvmTask( func (self *SGuest) createConvertedServer( ctx context.Context, userCred mcclient.TokenCredential, -) (*SGuest, error) { +) (*SGuest, *api.ServerCreateInput, error) { // set guest pending usage pendingUsage, pendingRegionUsage, err := self.getGuestUsage(1) keys, err := self.GetQuotaKeys() if err != nil { - return nil, err + return nil, nil, errors.Wrap(err, "GetQuotaKeys") } pendingUsage.SetKeys(keys) err = quotas.CheckSetPendingQuota(ctx, userCred, &pendingUsage) if err != nil { - return nil, httperrors.NewOutOfQuotaError("Check set pending quota error %s", err) + return nil, nil, httperrors.NewOutOfQuotaError("Check set pending quota error %s", err) } regionKeys, err := self.GetRegionalQuotaKeys() if err != nil { quotas.CancelPendingUsage(ctx, userCred, &pendingUsage, &pendingUsage, false) - return nil, err + return nil, nil, errors.Wrap(err, "GetRegionalQuotaKeys") } pendingRegionUsage.SetKeys(regionKeys) err = quotas.CheckSetPendingQuota(ctx, userCred, &pendingRegionUsage) if err != nil { quotas.CancelPendingUsage(ctx, userCred, &pendingUsage, &pendingUsage, false) - return nil, err + return nil, nil, errors.Wrap(err, "CheckSetPendingQuota") } // generate guest create params createInput := self.ToCreateInput(userCred) @@ -4413,9 +4414,9 @@ func (self *SGuest) createConvertedServer( jsonutils.Marshal(createInput), self.GetOwnerId()) quotas.CancelPendingUsage(ctx, userCred, &pendingUsage, &pendingUsage, true) if err != nil { - return nil, err + return nil, nil, errors.Wrap(err, "db.DoCreate") } - return newGuest.(*SGuest), nil + return newGuest.(*SGuest), createInput, nil } func (self *SGuest) AllowPerformSyncFixNics(ctx context.Context, diff --git a/pkg/compute/tasks/guest_convert_esxi_to_kvm_task.go b/pkg/compute/tasks/guest_convert_esxi_to_kvm_task.go index e0599cd5f6..f42ed2345a 100644 --- a/pkg/compute/tasks/guest_convert_esxi_to_kvm_task.go +++ b/pkg/compute/tasks/guest_convert_esxi_to_kvm_task.go @@ -116,7 +116,14 @@ func (self *GuestConvertEsxiToKvmTask) SaveScheduleResult(ctx context.Context, o host, _ := targetGuest.GetHost() //pendingUsage := models.SQuota{} - input := guest.ToCreateInput(self.UserCred) + input := new(api.ServerCreateInput) + + err = self.Params.Unmarshal(input, "input") + if err != nil { + log.Errorf("fail to unmarshal params input") + input = guest.ToCreateInput(self.UserCred) + } + //pendingUsage.Storage = guest.GetDisksSize() err = targetGuest.CreateDisksOnHost(ctx, self.UserCred, host, input.Disks, nil, true, true, target.Disks, nil, true)