fix(esxi): search template from whole vCenter

This commit is contained in:
rainzm
2020-10-12 17:30:46 +08:00
parent 8e9617ac8c
commit d4c9e6e562
3 changed files with 25 additions and 23 deletions
@@ -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")
+2 -11
View File
@@ -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)
}
+21
View File
@@ -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()