Merge pull request #9371 from ioito/automated-cherry-pick-of-#9360-upstream-release-3.5

Automated cherry pick of #9360: fix(region): sync servers
This commit is contained in:
Zexi Li
2020-12-21 10:40:51 +08:00
committed by GitHub
5 changed files with 45 additions and 27 deletions

View File

@@ -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)

View File

@@ -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)
}

View File

@@ -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 {

View File

@@ -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)

View File

@@ -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]