From c9fb6b45dee051d5254740ba3c2145c4018c4a06 Mon Sep 17 00:00:00 2001 From: Qu Xuan Date: Fri, 11 Dec 2020 20:35:12 +0800 Subject: [PATCH] fix(region): sync servers --- pkg/compute/models/host_recycle.go | 7 +++- pkg/compute/models/hosts.go | 40 ++++++++++++------- pkg/compute/models/purge.go | 5 ++- .../tasks/baremetal_sync_status_task.go | 12 ++---- .../baremetal_unconvert_hypervisor_task.go | 8 +++- 5 files changed, 45 insertions(+), 27 deletions(-) diff --git a/pkg/compute/models/host_recycle.go b/pkg/compute/models/host_recycle.go index dad6bb8fa2..37e65ae7c9 100644 --- a/pkg/compute/models/host_recycle.go +++ b/pkg/compute/models/host_recycle.go @@ -344,7 +344,10 @@ func (self *SHost) PerformUndoPrepaidRecycle(ctx context.Context, userCred mccli return nil, httperrors.NewInvalidStatusError("host is not a prepaid recycle host") } - guests := self.GetGuests() + guests, err := self.GetGuests() + if err != nil { + return nil, httperrors.NewGeneralError(errors.Wrapf(err, "GetGuests")) + } if len(guests) == 0 { return nil, httperrors.NewInvalidStatusError("cannot delete a recycle host without active instance") @@ -362,7 +365,7 @@ func (self *SHost) PerformUndoPrepaidRecycle(ctx context.Context, userCred mccli return nil, httperrors.NewInvalidStatusError("cannot undo a recycle host with pending_deleted guest") } - err := doUndoPrepaidRecycleLockGuest(ctx, userCred, self, &guests[0]) + err = doUndoPrepaidRecycleLockGuest(ctx, userCred, self, &guests[0]) if err != nil { logclient.AddActionLogWithContext(ctx, self, logclient.ACT_UNDO_RECYCLE_PREPAID, self.GetShortDesc(ctx), userCred, false) return nil, httperrors.NewGeneralError(err) diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index 3e2eee0ac9..7643e254e9 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -1421,15 +1421,14 @@ func (self *SHost) GetGuestsQuery() *sqlchemy.SQuery { return GuestManager.Query().Equals("host_id", self.Id) } -func (self *SHost) GetGuests() []SGuest { +func (self *SHost) GetGuests() ([]SGuest, error) { q := self.GetGuestsQuery() guests := make([]SGuest, 0) err := db.FetchModelObjects(GuestManager, q, &guests) if err != nil { - log.Errorf("GetGuests %s", err) - return nil + return nil, errors.Wrapf(err, "db.FetchModelObjects") } - return guests + return guests, nil } func (self *SHost) GetKvmGuests() []SGuest { @@ -1672,7 +1671,10 @@ func (self *SHost) syncRemoveCloudHost(ctx context.Context, userCred mcclient.To if err == nil { _, err = self.PerformDisable(ctx, userCred, nil, apis.PerformDisableInput{}) } - guests := self.GetGuests() + guests, err := self.GetGuests() + if err != nil { + return errors.Wrapf(err, "GetGuests") + } for _, guest := range guests { err = guest.SetStatus(userCred, api.VM_UNKNOWN, "sync to delete") if err != nil { @@ -2259,7 +2261,11 @@ func (self *SHost) SyncHostVMs(ctx context.Context, userCred mcclient.TokenCrede syncVMPairs := make([]SGuestSyncResult, 0) syncResult := compare.SyncResult{} - dbVMs := self.GetGuests() + dbVMs, err := self.GetGuests() + if err != nil { + syncResult.Error(errors.Wrapf(err, "GetGuests")) + return nil, syncResult + } for i := range dbVMs { if taskman.TaskManager.IsInTask(&dbVMs[i]) { @@ -2273,7 +2279,7 @@ func (self *SHost) SyncHostVMs(ctx context.Context, userCred mcclient.TokenCrede commonext := make([]cloudprovider.ICloudVM, 0) added := make([]cloudprovider.ICloudVM, 0) - err := compare.CompareSets(dbVMs, vms, &removed, &commondb, &commonext, &added) + err = compare.CompareSets(dbVMs, vms, &removed, &commondb, &commonext, &added) if err != nil { syncResult.Error(err) return nil, syncResult @@ -4737,7 +4743,10 @@ func (self *SHost) PerformUndoConvert(ctx context.Context, userCred mcclient.Tok if err != nil { return nil, httperrors.NewNotAcceptableError("%v", err) } - guests := self.GetGuests() + guests, err := self.GetGuests() + if err != nil { + return nil, httperrors.NewGeneralError(errors.Wrapf(err, "GetGuests")) + } if len(guests) > 1 { return nil, httperrors.NewNotAcceptableError("Not an empty host") } else if len(guests) == 1 { @@ -5023,8 +5032,8 @@ func (self *SHost) GetShortDesc(ctx context.Context) *jsonutils.JSONDict { } func (self *SHost) MarkGuestUnknown(userCred mcclient.TokenCredential) { - log.Errorln(self.GetGuests()) - for _, guest := range self.GetGuests() { + guests, _ := self.GetGuests() + for _, guest := range guests { guest.SetStatus(userCred, api.VM_UNKNOWN, "host offline") } } @@ -5238,10 +5247,11 @@ func (host *SHost) migrateOnHostDown(ctx context.Context, userCred mcclient.Toke } func (host *SHost) MigrateSharedStorageServers(ctx context.Context, userCred mcclient.TokenCredential) error { - var ( - guests = host.GetGuests() - hostGuests = []*api.GuestBatchMigrateParams{} - ) + guests, err := host.GetGuests() + if err != nil { + return errors.Wrapf(err, "host %s(%s) get guests", host.Name, host.Id) + } + hostGuests := []*api.GuestBatchMigrateParams{} for i := 0; i < len(guests); i++ { lockman.LockObject(ctx, &guests[i]) @@ -5517,7 +5527,7 @@ func (host *SHost) PerformChangeOwner(ctx context.Context, userCred mcclient.Tok func (host *SHost) GetChangeOwnerRequiredDomainIds() []string { requires := stringutils2.SSortedStrings{} - guests := host.GetGuests() + guests, _ := host.GetGuests() for i := range guests { requires = stringutils2.Append(requires, guests[i].DomainId) } diff --git a/pkg/compute/models/purge.go b/pkg/compute/models/purge.go index d658820d6e..6f25cfd8f3 100644 --- a/pkg/compute/models/purge.go +++ b/pkg/compute/models/purge.go @@ -86,7 +86,10 @@ func (host *SHost) purge(ctx context.Context, userCred mcclient.TokenCredential) return errors.Wrapf(err, "PerformDisable") } - guests := host.GetGuests() + guests, err := host.GetGuests() + if err != nil { + return errors.Wrapf(err, "host.GetGuests") + } for i := range guests { err := guests[i].purge(ctx, userCred) if err != nil { diff --git a/pkg/compute/tasks/baremetal_sync_status_task.go b/pkg/compute/tasks/baremetal_sync_status_task.go index 9a360f08d0..4c2b4b1503 100644 --- a/pkg/compute/tasks/baremetal_sync_status_task.go +++ b/pkg/compute/tasks/baremetal_sync_status_task.go @@ -95,15 +95,11 @@ func (self *BaremetalSyncAllGuestsStatusTask) OnInit(ctx context.Context, obj db } func (self *BaremetalSyncAllGuestsStatusTask) OnGuestSyncStatusComplete(ctx context.Context, baremetal *models.SHost, body jsonutils.JSONObject) { - var guests = make([]models.SGuest, 0) - for _, guest := range baremetal.GetGuests() { - if guest.Status == api.VM_UNKNOWN && guest.Hypervisor != api.HYPERVISOR_BAREMETAL { - guest.SetStatus(self.UserCred, models.SYNC_STATUS, "") - guests = append(guests, guest) - } - } + guests, _ := baremetal.GetGuests() for _, guest := range guests { - guest.StartSyncstatus(ctx, self.UserCred, "") + if guest.Status == api.VM_UNKNOWN && guest.Hypervisor != api.HYPERVISOR_BAREMETAL { + guest.StartSyncstatus(ctx, self.GetUserCred(), "") + } } log.Infof("All unknown guests syncstatus complete") self.SetStageComplete(ctx, nil) diff --git a/pkg/compute/tasks/baremetal_unconvert_hypervisor_task.go b/pkg/compute/tasks/baremetal_unconvert_hypervisor_task.go index 951ce41241..16a02a0f58 100644 --- a/pkg/compute/tasks/baremetal_unconvert_hypervisor_task.go +++ b/pkg/compute/tasks/baremetal_unconvert_hypervisor_task.go @@ -19,6 +19,7 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/log" + "yunion.io/x/pkg/errors" api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db" @@ -38,9 +39,14 @@ func init() { func (self *BaremetalUnconvertHypervisorTask) OnInit(ctx context.Context, obj db.IStandaloneModel, body jsonutils.JSONObject) { baremetal := obj.(*models.SHost) baremetal.SetStatus(self.UserCred, api.BAREMETAL_CONVERTING, "") - guests := baremetal.GetGuests() + guests, err := baremetal.GetGuests() + if err != nil { + self.SetStageFailed(ctx, jsonutils.NewString(errors.Wrapf(err, "baremetal.GetGuests").Error())) + return + } if len(guests) > 1 { self.SetStageFailed(ctx, jsonutils.NewString("Host guest conut > 1")) + return } if len(guests) == 1 { guest := guests[0]