From d3c1bfd21dcf91b8b0bcf9544d60e43ee62f5ba8 Mon Sep 17 00:00:00 2001 From: rainzm Date: Thu, 16 Jul 2020 21:24:25 +0800 Subject: [PATCH] fix: prefetch image error when create guest with vmware template 1. Only need the corresponding vmware template in the vcenter where the host is located. 2. Chose storagecache which cacheimage is ready before deploying. --- pkg/compute/guestdrivers/esxi.go | 2 +- .../storageman/imagecachemanager_agent.go | 6 ++- pkg/multicloud/esxi/datacenter.go | 38 +++++++++++++++++++ 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/pkg/compute/guestdrivers/esxi.go b/pkg/compute/guestdrivers/esxi.go index d6e1063e5e..6b50111b9b 100644 --- a/pkg/compute/guestdrivers/esxi.go +++ b/pkg/compute/guestdrivers/esxi.go @@ -172,7 +172,7 @@ func (self *SESXiGuestDriver) GetJsonDescAtHost(ctx context.Context, userCred mc if img.ImageType != cloudprovider.CachedImageTypeSystem { return desc } - sciSubQ := models.StoragecachedimageManager.Query("storagecache_id").Equals("cachedimage_id", templateId).SubQuery() + sciSubQ := models.StoragecachedimageManager.Query("storagecache_id").Equals("cachedimage_id", templateId).Equals("status", api.CACHED_IMAGE_STATUS_READY).SubQuery() scQ := models.StoragecacheManager.Query().In("id", sciSubQ) storageCaches := make([]models.SStoragecache, 0, 1) err = db.FetchModelObjects(models.StoragecacheManager, scQ, &storageCaches) diff --git a/pkg/hostman/storageman/imagecachemanager_agent.go b/pkg/hostman/storageman/imagecachemanager_agent.go index f2db06403a..8f5e597590 100644 --- a/pkg/hostman/storageman/imagecachemanager_agent.go +++ b/pkg/hostman/storageman/imagecachemanager_agent.go @@ -221,7 +221,11 @@ func (c *SAgentImageCacheManager) perfetchTemplateVMImageCache(ctx context.Conte if err != nil { return nil, err } - _, err = host.GetTemplateVMById(data.ImageExternalId) + dc, err := host.GetDatacenter() + if err != nil { + return nil, errors.Wrap(err, "host.GetDatacenter") + } + _, err = dc.GetTemplateVMById(data.ImageExternalId) if err != nil { return nil, err } diff --git a/pkg/multicloud/esxi/datacenter.go b/pkg/multicloud/esxi/datacenter.go index a29cdcc35c..cbe30183da 100644 --- a/pkg/multicloud/esxi/datacenter.go +++ b/pkg/multicloud/esxi/datacenter.go @@ -364,3 +364,41 @@ func (dc *SDatacenter) GetNetworks() ([]IVMNetwork, error) { } return dc.inetworks, nil } + +func (dc *SDatacenter) GetTemplateVMs() ([]*SVirtualMachine, error) { + hosts, err := dc.GetIHosts() + if err != nil { + return nil, errors.Wrap(err, "SDatacenter.GetIHosts") + } + templateVms := make([]*SVirtualMachine, 5) + for _, ihost := range hosts { + host := ihost.(*SHost) + tvms, err := host.GetTemplateVMs() + if err != nil { + return nil, errors.Wrap(err, "host.GetTemplateVMs") + } + templateVms = append(templateVms, tvms...) + } + return templateVms, nil +} + +func (dc *SDatacenter) GetTemplateVMById(id string) (*SVirtualMachine, error) { + id = dc.manager.getPrivateId(id) + hosts, err := dc.GetIHosts() + if err != nil { + return nil, errors.Wrap(err, "SDatacenter.GetIHosts") + } + for _, ihost := range hosts { + host := ihost.(*SHost) + tvms, err := host.GetTemplateVMs() + if err != nil { + return nil, errors.Wrap(err, "host.GetTemplateVMs") + } + for i := range tvms { + if tvms[i].GetGlobalId() == id { + return tvms[i], nil + } + } + } + return nil, cloudprovider.ErrNotFound +}