From 2679294529f97de1dd1d49bf6acce91cf6e652c2 Mon Sep 17 00:00:00 2001 From: rainzm Date: Sat, 17 Oct 2020 17:08:48 +0800 Subject: [PATCH] refactor: find the most suitable storage --- pkg/compute/guestdrivers/esxi.go | 37 +++++++++++++++++++---------- pkg/compute/models/storagecaches.go | 12 ++++++++-- 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/pkg/compute/guestdrivers/esxi.go b/pkg/compute/guestdrivers/esxi.go index b7aaf74ddb..582e66e5b2 100644 --- a/pkg/compute/guestdrivers/esxi.go +++ b/pkg/compute/guestdrivers/esxi.go @@ -223,21 +223,34 @@ func (self *SESXiGuestDriver) GetJsonDescAtHost(ctx context.Context, userCred mc return desc, errors.Errorf("no such storage cache associated with cacheimage %s", templateId) } if len(storageCaches) > 1 { - return desc, errors.Errorf("there are multiple storageCache associated with caheimage '%s' ??!!", templateId) + log.Warningf("there are multiple storageCache associated with caheimage '%s' ??!!", templateId) } - var hostIp string - storageCacheHost, err := storageCaches[0].GetHost() - if err != nil { - log.Errorf("unable to GetHost of storageCache %s: %v", storageCaches[0].Id, err) - hostIp = storageCaches[0].ExternalId - } else if storageCacheHost == nil { - log.Errorf("unable to GetHost of storageCache %s: result is nil", storageCaches[0].Id) - hostIp = storageCaches[0].ExternalId - } else { - hostIp = storageCacheHost.AccessIp + var storageCacheHost *models.SHost + // select storagecacheHost + for i := range storageCaches { + hosts, err := storageCaches[i].GetHosts() + if err != nil { + return desc, errors.Wrap(err, "storageCaches.GetHosts") + } + for i := range hosts { + if host.GetId() == hosts[i].GetId() { + storageCacheHost = &hosts[i] + } + } } - hostIp = storageCacheHost.AccessIp + + if storageCacheHost == nil { + storageCacheHost, err = storageCaches[0].GetHost() + if err != nil { + return desc, errors.Wrapf(err, "unable to GetHost of storageCache %s", storageCaches[0].Id) + } + if storageCacheHost == nil { + return desc, fmt.Errorf("unable to GetHost of storageCache %s: result is nil", storageCaches[0].Id) + } + } + + hostIp := storageCacheHost.AccessIp imageInfo := SEsxiImageInfo{ ImageType: img.ImageType, ImageExternalId: img.ExternalId, diff --git a/pkg/compute/models/storagecaches.go b/pkg/compute/models/storagecaches.go index a37132897f..1f53982665 100644 --- a/pkg/compute/models/storagecaches.go +++ b/pkg/compute/models/storagecaches.go @@ -133,7 +133,7 @@ func (self *SStoragecache) GetRegion() (*SCloudregion, error) { return region, nil } -func (self *SStoragecache) getHostId() (string, error) { +func (self *SStoragecache) GetHosts() ([]SHost, error) { hoststorages := HoststorageManager.Query().SubQuery() storages := StorageManager.Query().SubQuery() @@ -153,7 +153,15 @@ func (self *SStoragecache) getHostId() (string, error) { sqlchemy.IsTrue(storages.Field("enabled")))). Filter(sqlchemy.Equals(hoststorages.Field("storage_id"), storages.Field("id"))).All(&hosts) if err != nil { - return "", err + return nil, err + } + return hosts, nil +} + +func (self *SStoragecache) getHostId() (string, error) { + hosts, err := self.GetHosts() + if err != nil { + return "", errors.Wrap(err, "GetHosts") } hostIds := make([]string, 0)