diff --git a/pkg/multicloud/esxi/datacenter.go b/pkg/multicloud/esxi/datacenter.go index cbe30183da..d2692a6668 100644 --- a/pkg/multicloud/esxi/datacenter.go +++ b/pkg/multicloud/esxi/datacenter.go @@ -237,32 +237,23 @@ func (dc *SDatacenter) getDcObj() *object.Datacenter { return object.NewDatacenter(dc.manager.client.Client, dc.object.Reference()) } -// fetchVms will identify if VM is a template and return two different arrays; the latter contains all template vms. -func (dc *SDatacenter) fetchVms(vmRefs []types.ManagedObjectReference, all bool) ([]cloudprovider.ICloudVM, []*SVirtualMachine, error) { - var vms []mo.VirtualMachine +func (dc *SDatacenter) fetchVms(vmRefs []types.ManagedObjectReference, all bool) ([]*SVirtualMachine, error) { + var movms []mo.VirtualMachine if vmRefs != nil { - err := dc.manager.references2Objects(vmRefs, VIRTUAL_MACHINE_PROPS, &vms) + err := dc.manager.references2Objects(vmRefs, VIRTUAL_MACHINE_PROPS, &movms) if err != nil { - return nil, nil, errors.Wrap(err, "dc.manager.references2Objects") + return nil, errors.Wrap(err, "dc.manager.references2Objects") } } // avoid applying new memory and copying - retVms := make([]cloudprovider.ICloudVM, 0, len(vms)/2) - templateVMs := make([]*SVirtualMachine, 0, 2) - for i := 0; i < len(vms); i += 1 { - if all || !strings.HasPrefix(vms[i].Entity().Name, api.ESXI_IMAGE_CACHE_TMP_PREFIX) { - vmObj := NewVirtualMachine(dc.manager, &vms[i], dc) - if vms[i].Config != nil && vms[i].Config.Template { - templateVMs = append(templateVMs, vmObj) - continue - } - if vmObj != nil { - retVms = append(retVms, vmObj) - } + vms := make([]*SVirtualMachine, 0, len(movms)) + for i := range movms { + if all || !strings.HasPrefix(movms[i].Entity().Name, api.ESXI_IMAGE_CACHE_TMP_PREFIX) { + vms = append(vms, NewVirtualMachine(dc.manager, &movms[i], dc)) } } - return retVms, templateVMs, nil + return vms, nil } func (dc *SDatacenter) fetchDatastores(datastoreRefs []types.ManagedObjectReference) ([]cloudprovider.ICloudStorage, error) { diff --git a/pkg/multicloud/esxi/host.go b/pkg/multicloud/esxi/host.go index 602ed46614..b3bc5911c1 100644 --- a/pkg/multicloud/esxi/host.go +++ b/pkg/multicloud/esxi/host.go @@ -179,6 +179,7 @@ func (self *SHost) fetchVMs(all bool) error { } MAX_TRIES := 3 + var vms []*SVirtualMachine for tried := 0; tried < MAX_TRIES; tried += 1 { hostVms := self.getHostSystem().Vm if len(hostVms) == 0 { @@ -186,15 +187,20 @@ func (self *SHost) fetchVMs(all bool) error { return nil } - vms, templatevms, err := dc.fetchVms(hostVms, all) + vms, err = dc.fetchVms(hostVms, all) if err != nil { log.Errorf("dc.fetchVms fail %s", err) time.Sleep(time.Second) self.Refresh() continue } - self.vms = vms - self.tempalteVMs = templatevms + } + for _, vm := range vms { + if vm.IsTemplate() { + self.tempalteVMs = append(self.tempalteVMs, vm) + } else { + self.vms = append(self.vms, vm) + } } return nil } diff --git a/pkg/multicloud/esxi/storage.go b/pkg/multicloud/esxi/storage.go index 346244d86b..1bad99aaf9 100644 --- a/pkg/multicloud/esxi/storage.go +++ b/pkg/multicloud/esxi/storage.go @@ -259,7 +259,14 @@ func (self *SDatastore) getVMs() ([]cloudprovider.ICloudVM, error) { if len(vms) == 0 { return nil, nil } - ret, _, err := dc.fetchVms(vms, false) + svms, err := dc.fetchVms(vms, false) + if err != nil { + return nil, err + } + ret := make([]cloudprovider.ICloudVM, len(svms)) + for i := range svms { + ret[i] = svms[i] + } return ret, err } diff --git a/pkg/multicloud/esxi/virtualmachine.go b/pkg/multicloud/esxi/virtualmachine.go index 258486b469..fe465fffec 100644 --- a/pkg/multicloud/esxi/virtualmachine.go +++ b/pkg/multicloud/esxi/virtualmachine.go @@ -72,10 +72,7 @@ func (d byDiskType) Less(i, j int) bool { func NewVirtualMachine(manager *SESXiClient, vm *mo.VirtualMachine, dc *SDatacenter) *SVirtualMachine { svm := &SVirtualMachine{SManagedObject: newManagedObject(manager, vm, dc)} - err := svm.fetchHardwareInfo() - if err != nil { - return nil - } + svm.fetchHardwareInfo() return svm } @@ -708,7 +705,7 @@ func (self *SVirtualMachine) UpdateUserData(userData string) error { return nil } -func (self *SVirtualMachine) fetchHardwareInfo() error { +func (self *SVirtualMachine) fetchHardwareInfo() { self.vnics = make([]SVirtualNIC, 0) self.vdisks = make([]SVirtualDisk, 0) self.cdroms = make([]SVirtualCdrom, 0) @@ -722,7 +719,8 @@ func (self *SVirtualMachine) fetchHardwareInfo() error { } if moVM == nil || moVM.Config == nil || moVM.Config.Hardware.Device == nil { - return errors.Error("invalid vm config") + log.Errorf("invalid vm config, moVM: %v", moVM) + return } for i := 0; i < len(moVM.Config.Hardware.Device); i += 1 { @@ -750,7 +748,6 @@ func (self *SVirtualMachine) fetchHardwareInfo() error { sort.Slice(self.vdisks, func(i, j int) bool { return self.vdisks[i].GetIndex() < self.vdisks[j].GetIndex() }) - return nil } func (self *SVirtualMachine) getVdev(key int32) SVirtualDevice { @@ -1218,3 +1215,8 @@ func (self *SVirtualMachine) FindMinDiffKey(limit int32) int32 { } return limit } + +func (self *SVirtualMachine) IsTemplate() bool { + movm := self.getVirtualMachine() + return movm.Config != nil && movm.Config.Template +}