From bf67b58b7b04968b2021f08e09bca8aa27c133e7 Mon Sep 17 00:00:00 2001 From: Zexi Li Date: Thu, 6 Jun 2024 10:03:44 +0800 Subject: [PATCH] fix(region): container is not started when pod's flavor changed (#20488) --- pkg/compute/guestdrivers/baremetals.go | 2 +- pkg/compute/guestdrivers/pod.go | 4 ++-- pkg/compute/guestdrivers/virtualization.go | 4 ++-- pkg/compute/models/guest_actions.go | 2 +- pkg/compute/models/guestdrivers.go | 2 +- pkg/compute/tasks/guest_change_config_task.go | 6 +++++- 6 files changed, 12 insertions(+), 8 deletions(-) diff --git a/pkg/compute/guestdrivers/baremetals.go b/pkg/compute/guestdrivers/baremetals.go index be6573e2ff..73f2a512e9 100644 --- a/pkg/compute/guestdrivers/baremetals.go +++ b/pkg/compute/guestdrivers/baremetals.go @@ -471,7 +471,7 @@ func (self *SBaremetalGuestDriver) RequestRebuildRootDisk(ctx context.Context, g return nil } -func (self *SBaremetalGuestDriver) PerformStart(ctx context.Context, userCred mcclient.TokenCredential, guest *models.SGuest, data *jsonutils.JSONDict) error { +func (self *SBaremetalGuestDriver) PerformStart(ctx context.Context, userCred mcclient.TokenCredential, guest *models.SGuest, data *jsonutils.JSONDict, parentTaskId string) error { return guest.StartGueststartTask(ctx, userCred, data, "") } diff --git a/pkg/compute/guestdrivers/pod.go b/pkg/compute/guestdrivers/pod.go index bffba0a8f6..c9a5a394fb 100644 --- a/pkg/compute/guestdrivers/pod.go +++ b/pkg/compute/guestdrivers/pod.go @@ -247,8 +247,8 @@ func (p *SPodDriver) RequestGuestHotAddIso(ctx context.Context, guest *models.SG return task.ScheduleRun(nil) } -func (p *SPodDriver) PerformStart(ctx context.Context, userCred mcclient.TokenCredential, guest *models.SGuest, data *jsonutils.JSONDict) error { - task, err := taskman.TaskManager.NewTask(ctx, "PodStartTask", guest, userCred, nil, "", "", nil) +func (p *SPodDriver) PerformStart(ctx context.Context, userCred mcclient.TokenCredential, guest *models.SGuest, data *jsonutils.JSONDict, parentTaskId string) error { + task, err := taskman.TaskManager.NewTask(ctx, "PodStartTask", guest, userCred, nil, parentTaskId, "", nil) if err != nil { return errors.Wrap(err, "New PodStartTask") } diff --git a/pkg/compute/guestdrivers/virtualization.go b/pkg/compute/guestdrivers/virtualization.go index cc3f509e48..0deabc5590 100644 --- a/pkg/compute/guestdrivers/virtualization.go +++ b/pkg/compute/guestdrivers/virtualization.go @@ -318,8 +318,8 @@ func (self *SVirtualizedGuestDriver) ValidateCreateDataOnHost(ctx context.Contex return input, nil } -func (self *SVirtualizedGuestDriver) PerformStart(ctx context.Context, userCred mcclient.TokenCredential, guest *models.SGuest, data *jsonutils.JSONDict) error { - return guest.StartGueststartTask(ctx, userCred, data, "") +func (self *SVirtualizedGuestDriver) PerformStart(ctx context.Context, userCred mcclient.TokenCredential, guest *models.SGuest, data *jsonutils.JSONDict, parentTaskId string) error { + return guest.StartGueststartTask(ctx, userCred, data, parentTaskId) } func (self *SVirtualizedGuestDriver) CheckDiskTemplateOnStorage(ctx context.Context, userCred mcclient.TokenCredential, imageId string, format string, storageId string, task taskman.ITask) error { diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index 295e0a5522..6e9ba0d99b 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -1129,7 +1129,7 @@ func (self *SGuest) PerformStart( if err != nil { return nil, errors.Wrapf(err, "GetDriver") } - err = driver.PerformStart(ctx, userCred, self, kwargs) + err = driver.PerformStart(ctx, userCred, self, kwargs, "") return nil, err } else { return nil, httperrors.NewInvalidStatusError("Some disk not ready") diff --git a/pkg/compute/models/guestdrivers.go b/pkg/compute/models/guestdrivers.go index 78d6474ef7..053b27048d 100644 --- a/pkg/compute/models/guestdrivers.go +++ b/pkg/compute/models/guestdrivers.go @@ -129,7 +129,7 @@ type IGuestDriver interface { OnDeleteGuestFinalCleanup(ctx context.Context, guest *SGuest, userCred mcclient.TokenCredential) error - PerformStart(ctx context.Context, userCred mcclient.TokenCredential, guest *SGuest, data *jsonutils.JSONDict) error + PerformStart(ctx context.Context, userCred mcclient.TokenCredential, guest *SGuest, data *jsonutils.JSONDict, parentTaskId string) error CheckDiskTemplateOnStorage(ctx context.Context, userCred mcclient.TokenCredential, imageId string, format string, storageId string, task taskman.ITask) error diff --git a/pkg/compute/tasks/guest_change_config_task.go b/pkg/compute/tasks/guest_change_config_task.go index aab836740d..a1617067f1 100644 --- a/pkg/compute/tasks/guest_change_config_task.go +++ b/pkg/compute/tasks/guest_change_config_task.go @@ -453,7 +453,11 @@ func (task *GuestChangeConfigTask) OnSyncStatusComplete(ctx context.Context, obj guest := obj.(*models.SGuest) if guest.Status == api.VM_READY && jsonutils.QueryBoolean(task.Params, "auto_start", false) { task.SetStage("OnGuestStartComplete", nil) - guest.StartGueststartTask(ctx, task.UserCred, nil, task.GetTaskId()) + drv, _ := guest.GetDriver() + if err := drv.PerformStart(ctx, task.GetUserCred(), guest, nil, task.GetTaskId()); err != nil { + task.OnGuestStartCompleteFailed(ctx, guest, jsonutils.NewString(err.Error())) + return + } } else { dt := jsonutils.NewDict() dt.Add(jsonutils.NewString(guest.Id), "id")