From 05abebeea5b5873dc5f657d51f562b633b4feec9 Mon Sep 17 00:00:00 2001 From: rainzm Date: Wed, 9 Sep 2020 21:38:57 +0800 Subject: [PATCH] fix(region): add RequestSyncstatusOnHost for SESXiGuestDriver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit esxi 平台 Guest 进行 syncstatus 和其他平台有所区别,Vcenter 可能会更改 VM 所在的 Host,所以在 Host 上寻找 VM 可能会出现 ErrNotFound。此时,应该 主动去整个 datacenter 中寻找 VM,然后更改 Host,进行同步。 --- pkg/compute/guestdrivers/esxi.go | 39 ++++++++++++++++++++++++++++++++ pkg/compute/models/hosts.go | 12 ++++++++++ 2 files changed, 51 insertions(+) diff --git a/pkg/compute/guestdrivers/esxi.go b/pkg/compute/guestdrivers/esxi.go index 6b50111b9b..d682dea36b 100644 --- a/pkg/compute/guestdrivers/esxi.go +++ b/pkg/compute/guestdrivers/esxi.go @@ -368,3 +368,42 @@ func (self *SESXiGuestDriver) RequestAssociateEip(ctx context.Context, userCred func (self *SESXiGuestDriver) IsSupportCdrom(guest *models.SGuest) (bool, error) { return false, nil } + +func (self *SESXiGuestDriver) RequestSyncstatusOnHost(ctx context.Context, guest *models.SGuest, host *models.SHost, userCred mcclient.TokenCredential) (jsonutils.JSONObject, error) { + ihost, err := host.GetIHost() + if err != nil { + return nil, err + } + ivm, err := ihost.GetIVMById(guest.GetExternalId()) + if err != nil && errors.Cause(err) != errors.ErrNotFound { + return nil, err + } + // VM may be migrated by Vcenter, try to find VM from whole datacenter. + if err != nil { + ehost := ihost.(*esxi.SHost) + dc, err := ehost.GetDatacenter() + if err != nil { + return nil, errors.Wrapf(err, "ehost.GetDatacenter") + } + vm, err := dc.FetchVMById(guest.GetExternalId()) + if err != nil { + log.Errorf("fail to find ivm by id %q in dc %q: %v", guest.GetExternalId(), dc.GetName(), err) + return nil, err + } + ihost = vm.GetIHost() + host = models.HostManager.FetchHostByExtId(ihost.GetGlobalId()) + if host == nil { + return nil, errors.Wrapf(errors.ErrNotFound, "find ivm %q in ihost %q which is not existed here", guest.GetExternalId(), ihost.GetGlobalId()) + } + ivm = vm + } + err = guest.SyncAllWithCloudVM(ctx, userCred, host, ivm) + if err != nil { + return nil, err + } + + status := GetCloudVMStatus(ivm) + body := jsonutils.NewDict() + body.Add(jsonutils.NewString(status), "status") + return body, nil +} diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index c27917e6a3..604c901ee6 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -5240,3 +5240,15 @@ func (manager *SHostManager) ListItemExportKeys(ctx context.Context, } return q, nil } + +func (manager *SHostManager) FetchHostByExtId(extid string) *SHost { + host := SHost{} + host.SetModelManager(manager, &host) + err := manager.Query().Equals("external_id", extid).First(&host) + if err != nil { + log.Errorf("fetchHostByExtId fail %s", err) + return nil + } else { + return &host + } +}