diff --git a/pkg/hostman/storageman/imagecachemanager_agent.go b/pkg/hostman/storageman/imagecachemanager_agent.go index 5c6d1a1d37..c418f8b72b 100644 --- a/pkg/hostman/storageman/imagecachemanager_agent.go +++ b/pkg/hostman/storageman/imagecachemanager_agent.go @@ -211,23 +211,13 @@ func (c *SAgentImageCacheManager) prefetchImageCacheByUpload(ctx context.Context } func (c *SAgentImageCacheManager) perfetchTemplateVMImageCache(ctx context.Context, data *sImageCacheData) (jsonutils.JSONObject, error) { - client, err := esxi.NewESXiClientFromAccessInfo(ctx, &data.Datastore) if err != nil { return nil, errors.Wrap(err, "esxi.NewESXiClientFromJson") } - // data.StorageCacheExternalId is Host Ip associated with the StorageCache in where CachedImage stored - host, err := client.FindHostByIp(data.StorageCacheHostIp) + _, err = client.SearchTemplateVM(data.ImageExternalId) if err != nil { - return nil, err - } - dc, err := host.GetDatacenter() - if err != nil { - return nil, errors.Wrap(err, "host.GetDatacenter") - } - _, err = dc.FetchTemplateVMById(data.ImageExternalId) - if err != nil { - return nil, err + return nil, errors.Wrapf(err, "SEsxiClient.SearchTemplateVM for image %q", data.ImageExternalId) } res := jsonutils.NewDict() res.Add(jsonutils.NewString(data.ImageExternalId), "image_id") diff --git a/pkg/multicloud/esxi/host.go b/pkg/multicloud/esxi/host.go index b5d3b5eb9b..ff46b71fd7 100644 --- a/pkg/multicloud/esxi/host.go +++ b/pkg/multicloud/esxi/host.go @@ -728,18 +728,9 @@ func (self *SHost) CreateVM2(ctx context.Context, ds *SDatastore, params SCreate if imageInfo.ImageType != cloudprovider.CachedImageTypeSystem { return self.DoCreateVM(ctx, ds, params) } - // get host - imgHost, err := self.manager.FindHostByIp(imageInfo.StorageCacheHostIp) + temvm, err := self.manager.SearchTemplateVM(imageInfo.ImageExternalId) if err != nil { - return nil, errors.Wrap(err, "SEsxiClient.FindHostByIp") - } - dc, err := imgHost.GetDatacenter() - if err != nil { - return nil, errors.Wrap(err, "host.GetDatacenter") - } - temvm, err := dc.FetchTemplateVMById(imageInfo.ImageExternalId) - if err != nil { - return nil, errors.Wrapf(err, "datacenter.TemplateVMById for image %q and datacenter %q", imageInfo.ImageExternalId, dc.GetId()) + return nil, errors.Wrapf(err, "SEsxiClient.SearchTemplateVM for image %q", imageInfo.ImageExternalId) } return self.CloneVM(ctx, temvm, ds, params) } diff --git a/pkg/multicloud/esxi/manager.go b/pkg/multicloud/esxi/manager.go index d53981534a..b8e5cdfb5b 100644 --- a/pkg/multicloud/esxi/manager.go +++ b/pkg/multicloud/esxi/manager.go @@ -349,6 +349,27 @@ func (cli *SESXiClient) scanAllMObjects(props []string, dst interface{}) error { return cli.scanMObjects(cli.client.ServiceContent.RootFolder, props, dst) } +func (cli *SESXiClient) SearchTemplateVM(id string) (*SVirtualMachine, error) { + filter := property.Filter{} + filter["config.template"] = true + filter["summary.config.uuid"] = id + var movms []mo.VirtualMachine + err := cli.scanMObjectsWithFilter(cli.client.ServiceContent.RootFolder, VIRTUAL_MACHINE_PROPS, &movms, filter) + if err != nil { + return nil, err + } + if len(movms) == 0 { + return nil, errors.ErrNotFound + } + vm := NewVirtualMachine(cli, &movms[0], nil) + dc, err := vm.fetchDatacenter() + if err != nil { + return nil, errors.Wrap(err, "fetchDatacenter") + } + vm.datacenter = dc + return vm, nil +} + func (cli *SESXiClient) scanMObjectsWithFilter(folder types.ManagedObjectReference, props []string, dst interface{}, filter property.Filter) error { dstValue := reflect.Indirect(reflect.ValueOf(dst)) dstType := dstValue.Type()