diff --git a/pkg/compute/guestdrivers/baremetals.go b/pkg/compute/guestdrivers/baremetals.go index 63575bf47a..dead2c293f 100644 --- a/pkg/compute/guestdrivers/baremetals.go +++ b/pkg/compute/guestdrivers/baremetals.go @@ -361,7 +361,7 @@ func (self *SBaremetalGuestDriver) RequestStopGuestForDelete(ctx context.Context return nil } -func (self *SBaremetalGuestDriver) RequestStopOnHost(ctx context.Context, guest *models.SGuest, host *models.SHost, task taskman.ITask) error { +func (self *SBaremetalGuestDriver) RequestStopOnHost(ctx context.Context, guest *models.SGuest, host *models.SHost, task taskman.ITask, syncStatus bool) error { body := jsonutils.NewDict() timeout, err := task.GetParams().Int("timeout") if err != nil { diff --git a/pkg/compute/guestdrivers/container.go b/pkg/compute/guestdrivers/container.go index 3085d8b46f..164b5bbc23 100644 --- a/pkg/compute/guestdrivers/container.go +++ b/pkg/compute/guestdrivers/container.go @@ -100,7 +100,7 @@ func (self *SContainerDriver) RequestStartOnHost(ctx context.Context, guest *mod return httperrors.NewUnsupportOperationError("") } -func (self *SContainerDriver) RequestStopOnHost(ctx context.Context, guest *models.SGuest, host *models.SHost, task taskman.ITask) error { +func (self *SContainerDriver) RequestStopOnHost(ctx context.Context, guest *models.SGuest, host *models.SHost, task taskman.ITask, syncStatus bool) error { return containerUseKubectlError } diff --git a/pkg/compute/guestdrivers/esxi.go b/pkg/compute/guestdrivers/esxi.go index cec00a7bf1..fd59104188 100644 --- a/pkg/compute/guestdrivers/esxi.go +++ b/pkg/compute/guestdrivers/esxi.go @@ -660,7 +660,7 @@ func (self *SESXiGuestDriver) RequestStartOnHost(ctx context.Context, guest *mod return guest.SetStatus(userCred, api.VM_RUNNING, "StartOnHost") } -func (self *SESXiGuestDriver) RequestStopOnHost(ctx context.Context, guest *models.SGuest, host *models.SHost, task taskman.ITask) error { +func (self *SESXiGuestDriver) RequestStopOnHost(ctx context.Context, guest *models.SGuest, host *models.SHost, task taskman.ITask, syncStatus bool) error { taskman.LocalTaskRun(task, func() (jsonutils.JSONObject, error) { ivm, err := guest.GetIVM() if err != nil { @@ -709,7 +709,7 @@ func (self *SESXiGuestDriver) RequestSyncstatusOnHost(ctx context.Context, guest } ivm = vm } - err = guest.SyncAllWithCloudVM(ctx, userCred, host, ivm) + err = guest.SyncAllWithCloudVM(ctx, userCred, host, ivm, true) if err != nil { return nil, err } diff --git a/pkg/compute/guestdrivers/kvm.go b/pkg/compute/guestdrivers/kvm.go index 2a2baf5702..8235dc6c5f 100644 --- a/pkg/compute/guestdrivers/kvm.go +++ b/pkg/compute/guestdrivers/kvm.go @@ -213,7 +213,7 @@ func (self *SKVMGuestDriver) GetGuestVncInfo(ctx context.Context, userCred mccli return result, nil } -func (self *SKVMGuestDriver) RequestStopOnHost(ctx context.Context, guest *models.SGuest, host *models.SHost, task taskman.ITask) error { +func (self *SKVMGuestDriver) RequestStopOnHost(ctx context.Context, guest *models.SGuest, host *models.SHost, task taskman.ITask, syncStatus bool) error { body := jsonutils.NewDict() params := task.GetParams() timeout, err := params.Int("timeout") diff --git a/pkg/compute/guestdrivers/managedvirtual.go b/pkg/compute/guestdrivers/managedvirtual.go index aa93b210e3..67d5266987 100644 --- a/pkg/compute/guestdrivers/managedvirtual.go +++ b/pkg/compute/guestdrivers/managedvirtual.go @@ -345,7 +345,7 @@ func (self *SManagedVirtualizedGuestDriver) RequestStartOnHost(ctx context.Conte return errors.Wrapf(err, "Wait vm running") } // 虚拟机开机,公网ip自动生成 - guest.SyncAllWithCloudVM(ctx, userCred, host, ivm) + guest.SyncAllWithCloudVM(ctx, userCred, host, ivm, true) return task.ScheduleRun(result) } return guest.SetStatus(userCred, api.VM_RUNNING, "StartOnHost") @@ -795,7 +795,7 @@ func (self *SManagedVirtualizedGuestDriver) RequestUndeployGuestOnHost(ctx conte return nil } -func (self *SManagedVirtualizedGuestDriver) RequestStopOnHost(ctx context.Context, guest *models.SGuest, host *models.SHost, task taskman.ITask) error { +func (self *SManagedVirtualizedGuestDriver) RequestStopOnHost(ctx context.Context, guest *models.SGuest, host *models.SHost, task taskman.ITask, syncStatus bool) error { taskman.LocalTaskRun(task, func() (jsonutils.JSONObject, error) { ivm, err := guest.GetIVM() if err != nil { @@ -812,7 +812,7 @@ func (self *SManagedVirtualizedGuestDriver) RequestStopOnHost(ctx context.Contex return nil, errors.Wrapf(err, "wait server stop after 5 miniutes") } // 公有云关机,公网ip会释放 - guest.SyncAllWithCloudVM(ctx, task.GetUserCred(), host, ivm) + guest.SyncAllWithCloudVM(ctx, task.GetUserCred(), host, ivm, syncStatus) return nil, nil }) return nil @@ -829,7 +829,7 @@ func (self *SManagedVirtualizedGuestDriver) RequestSyncstatusOnHost(ctx context. return nil, err } - err = guest.SyncAllWithCloudVM(ctx, userCred, host, ivm) + err = guest.SyncAllWithCloudVM(ctx, userCred, host, ivm, true) if err != nil { return nil, err } diff --git a/pkg/compute/models/guestdrivers.go b/pkg/compute/models/guestdrivers.go index e5e550e5c1..dd6587434f 100644 --- a/pkg/compute/models/guestdrivers.go +++ b/pkg/compute/models/guestdrivers.go @@ -109,7 +109,7 @@ type IGuestDriver interface { RequestStartOnHost(ctx context.Context, guest *SGuest, host *SHost, userCred mcclient.TokenCredential, task taskman.ITask) error - RequestStopOnHost(ctx context.Context, guest *SGuest, host *SHost, task taskman.ITask) error + RequestStopOnHost(ctx context.Context, guest *SGuest, host *SHost, task taskman.ITask, syncStatus bool) error StartDeleteGuestTask(ctx context.Context, userCred mcclient.TokenCredential, guest *SGuest, params *jsonutils.JSONDict, parentTaskId string) error diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index bc03552a2f..6e3ffcd854 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -2452,7 +2452,7 @@ func (self *SGuest) syncRemoveCloudVM(ctx context.Context, userCred mcclient.Tok return nil } -func (guest *SGuest) SyncAllWithCloudVM(ctx context.Context, userCred mcclient.TokenCredential, host *SHost, extVM cloudprovider.ICloudVM) error { +func (guest *SGuest) SyncAllWithCloudVM(ctx context.Context, userCred mcclient.TokenCredential, host *SHost, extVM cloudprovider.ICloudVM, syncStatus bool) error { if host == nil { return errors.Error("guest has no host") } @@ -2467,7 +2467,7 @@ func (guest *SGuest) SyncAllWithCloudVM(ctx context.Context, userCred mcclient.T return errors.Wrap(err, "provider.GetProvider") } - err = guest.syncWithCloudVM(ctx, userCred, driver, host, extVM, provider.GetOwnerId()) + err = guest.syncWithCloudVM(ctx, userCred, driver, host, extVM, provider.GetOwnerId(), syncStatus) if err != nil { return errors.Wrap(err, "guest.syncWithCloudVM") } @@ -2477,7 +2477,7 @@ func (guest *SGuest) SyncAllWithCloudVM(ctx context.Context, userCred mcclient.T return nil } -func (self *SGuest) syncWithCloudVM(ctx context.Context, userCred mcclient.TokenCredential, provider cloudprovider.ICloudProvider, host *SHost, extVM cloudprovider.ICloudVM, syncOwnerId mcclient.IIdentityProvider) error { +func (self *SGuest) syncWithCloudVM(ctx context.Context, userCred mcclient.TokenCredential, provider cloudprovider.ICloudProvider, host *SHost, extVM cloudprovider.ICloudVM, syncOwnerId mcclient.IIdentityProvider, syncStatus bool) error { recycle := false if provider.GetFactory().IsSupportPrepaidResources() && self.IsPrepaidRecycle() { @@ -2494,7 +2494,7 @@ func (self *SGuest) syncWithCloudVM(ctx context.Context, userCred mcclient.Token if extVM.GetName() != extVM.GetHostname() { self.Hostname = extVM.GetHostname() } - if !self.IsFailureStatus() { + if !self.IsFailureStatus() && syncStatus { self.Status = extVM.GetStatus() } @@ -4601,7 +4601,7 @@ func (self *SGuest) doExternalSync(ctx context.Context, userCred mcclient.TokenC if err != nil { return err } - return self.syncWithCloudVM(ctx, userCred, iprovider, host, iVM, nil) + return self.syncWithCloudVM(ctx, userCred, iprovider, host, iVM, nil, true) } func (manager *SGuestManager) DeleteExpiredPrepaidServers(ctx context.Context, userCred mcclient.TokenCredential, isStart bool) { diff --git a/pkg/compute/models/host_recycle.go b/pkg/compute/models/host_recycle.go index 2c5243ea7b..210a64cb3a 100644 --- a/pkg/compute/models/host_recycle.go +++ b/pkg/compute/models/host_recycle.go @@ -661,7 +661,7 @@ func (host *SHost) RebuildRecycledGuest(ctx context.Context, userCred mcclient.T return err } - err = guest.syncWithCloudVM(ctx, userCred, iprovider, &oHost, extVM, nil) + err = guest.syncWithCloudVM(ctx, userCred, iprovider, &oHost, extVM, nil, true) if err != nil { log.Errorf("guest.syncWithCloudVM fail %s", err) return err diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index 017746becf..f168bfaa9a 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -2341,7 +2341,7 @@ func (self *SHost) SyncHostVMs(ctx context.Context, userCred mcclient.TokenCrede } for i := 0; i < len(commondb); i += 1 { - err := commondb[i].syncWithCloudVM(ctx, userCred, iprovider, self, commonext[i], syncOwnerId) + err := commondb[i].syncWithCloudVM(ctx, userCred, iprovider, self, commonext[i], syncOwnerId, true) if err != nil { syncResult.UpdateError(err) } else { @@ -2379,7 +2379,7 @@ func (self *SHost) SyncHostVMs(ctx context.Context, userCred mcclient.TokenCrede continue } host := _host.(*SHost) - err = guest.syncWithCloudVM(ctx, userCred, iprovider, host, added[i], syncOwnerId) + err = guest.syncWithCloudVM(ctx, userCred, iprovider, host, added[i], syncOwnerId, true) if err != nil { syncResult.UpdateError(err) } else { diff --git a/pkg/compute/tasks/guest_backup_tasks.go b/pkg/compute/tasks/guest_backup_tasks.go index 2993fd67d2..4a40849ed2 100644 --- a/pkg/compute/tasks/guest_backup_tasks.go +++ b/pkg/compute/tasks/guest_backup_tasks.go @@ -46,7 +46,7 @@ func (self *GuestSwitchToBackupTask) OnInit(ctx context.Context, obj db.IStandal host, _ := guest.GetHost() self.Params.Set("is_force", jsonutils.JSONTrue) self.SetStage("OnEnsureMasterGuestStoped", nil) - err := guest.GetDriver().RequestStopOnHost(ctx, guest, host, self) + err := guest.GetDriver().RequestStopOnHost(ctx, guest, host, self, true) if err != nil { // In case of master host crash self.OnEnsureMasterGuestStoped(ctx, guest, nil) @@ -57,7 +57,7 @@ func (self *GuestSwitchToBackupTask) OnEnsureMasterGuestStoped(ctx context.Conte backupHost := models.HostManager.FetchHostById(guest.BackupHostId) self.Params.Set("is_force", jsonutils.JSONTrue) self.SetStage("OnBackupGuestStoped", nil) - err := guest.GetDriver().RequestStopOnHost(ctx, guest, backupHost, self) + err := guest.GetDriver().RequestStopOnHost(ctx, guest, backupHost, self, true) if err != nil { self.OnFail(ctx, guest, jsonutils.NewString(err.Error())) } diff --git a/pkg/compute/tasks/guest_delete_on_host_task.go b/pkg/compute/tasks/guest_delete_on_host_task.go index 084d54835b..0d0a4dd50b 100644 --- a/pkg/compute/tasks/guest_delete_on_host_task.go +++ b/pkg/compute/tasks/guest_delete_on_host_task.go @@ -49,7 +49,7 @@ func (self *GuestDeleteOnHostTask) OnInit(ctx context.Context, obj db.IStandalon self.SetStage("OnStopGuest", nil) self.Params.Set("is_force", jsonutils.JSONTrue) - if err := guest.GetDriver().RequestStopOnHost(ctx, guest, host, self); err != nil { + if err := guest.GetDriver().RequestStopOnHost(ctx, guest, host, self, true); err != nil { log.Errorf("RequestStopGuestForDelete fail %s", err) self.OnStopGuest(ctx, guest, nil) } diff --git a/pkg/compute/tasks/guest_stop_task.go b/pkg/compute/tasks/guest_stop_task.go index 0adddfab35..0b11f89b53 100644 --- a/pkg/compute/tasks/guest_stop_task.go +++ b/pkg/compute/tasks/guest_stop_task.go @@ -53,7 +53,7 @@ func (self *GuestStopTask) stopGuest(ctx context.Context, guest *models.SGuest) guest.SetStatus(self.GetUserCred(), api.VM_STOPPING, "") } self.SetStage("OnGuestStopTaskComplete", nil) - err = guest.GetDriver().RequestStopOnHost(ctx, guest, host, self) + err = guest.GetDriver().RequestStopOnHost(ctx, guest, host, self, !self.IsSubtask()) if err != nil { self.OnGuestStopTaskCompleteFailed(ctx, guest, jsonutils.NewString(err.Error())) } @@ -62,7 +62,7 @@ func (self *GuestStopTask) stopGuest(ctx context.Context, guest *models.SGuest) func (self *GuestStopTask) OnGuestStopTaskComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { db.OpsLog.LogEvent(guest, db.ACT_STOP, guest.GetShortDesc(ctx), self.UserCred) models.HostManager.ClearSchedDescCache(guest.HostId) - if guest.Status != api.VM_READY { // for kvm + if guest.Status != api.VM_READY && !self.IsSubtask() { // for kvm guest.SetStatus(self.GetUserCred(), api.VM_READY, "") } logclient.AddActionLogWithStartable(self, guest, logclient.ACT_VM_STOP, "success", self.UserCred, true) diff --git a/pkg/compute/tasks/ha_guest_stop_task.go b/pkg/compute/tasks/ha_guest_stop_task.go index cb5a7937ee..2de216ebaf 100644 --- a/pkg/compute/tasks/ha_guest_stop_task.go +++ b/pkg/compute/tasks/ha_guest_stop_task.go @@ -37,7 +37,7 @@ func (self *HAGuestStopTask) OnGuestStopTaskComplete( ) { host := models.HostManager.FetchHostById(guest.BackupHostId) self.SetStage("OnSlaveGuestStopTaskComplete", nil) - err := guest.GetDriver().RequestStopOnHost(ctx, guest, host, self) + err := guest.GetDriver().RequestStopOnHost(ctx, guest, host, self, true) if err != nil { log.Errorf("RequestStopOnHost fail %s", err) self.OnGuestStopTaskCompleteFailed(