From af03b18155236026ec794dfc4eed078824ddc8a7 Mon Sep 17 00:00:00 2001 From: rainzm Date: Fri, 9 Oct 2020 11:38:46 +0800 Subject: [PATCH] fix(esxi): check nil value when NewVirtualMachine --- pkg/multicloud/esxi/datacenter.go | 7 ++++++- pkg/multicloud/esxi/host.go | 9 ++++++++- pkg/multicloud/esxi/manager.go | 6 +++++- pkg/multicloud/esxi/virtualmachine.go | 12 ++++++++---- 4 files changed, 27 insertions(+), 7 deletions(-) diff --git a/pkg/multicloud/esxi/datacenter.go b/pkg/multicloud/esxi/datacenter.go index 5ad5e2a536..f98dbb1224 100644 --- a/pkg/multicloud/esxi/datacenter.go +++ b/pkg/multicloud/esxi/datacenter.go @@ -252,7 +252,12 @@ func (dc *SDatacenter) fetchVms(vmRefs []types.ManagedObjectReference, all bool) 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)) + vm := NewVirtualMachine(dc.manager, &movms[i], dc) + // must + if vm == nil { + continue + } + vms = append(vms, vm) } } return vms, nil diff --git a/pkg/multicloud/esxi/host.go b/pkg/multicloud/esxi/host.go index 44c8898553..2c0240f286 100644 --- a/pkg/multicloud/esxi/host.go +++ b/pkg/multicloud/esxi/host.go @@ -878,7 +878,11 @@ func (self *SHost) DoCreateVM(ctx context.Context, ds *SDatastore, params SCreat return nil, errors.Wrap(err, "fail to fetch virtual machine just created") } - return NewVirtualMachine(self.manager, &moVM, self.datacenter), nil + evm := NewVirtualMachine(self.manager, &moVM, self.datacenter) + if evm == nil { + return nil, errors.Error("create successfully but unable to NewVirtualMachine") + } + return evm, nil } func (host *SHost) CloneVM(ctx context.Context, from *SVirtualMachine, ds *SDatastore, params SCreateVMParam) (*SVirtualMachine, error) { @@ -1050,6 +1054,9 @@ func (host *SHost) CloneVM(ctx context.Context, from *SVirtualMachine, ds *SData // resize the disk vm := NewVirtualMachine(host.manager, &moVM, host.datacenter) + if vm == nil { + return nil, errors.Error("clone successfully but unable to NewVirtualMachine") + } sort.Sort(byDiskType(vm.vdisks)) for i, s := range newSizes { err := vm.vdisks[i].Resize(ctx, s) diff --git a/pkg/multicloud/esxi/manager.go b/pkg/multicloud/esxi/manager.go index ed8e7f1981..38478bebab 100644 --- a/pkg/multicloud/esxi/manager.go +++ b/pkg/multicloud/esxi/manager.go @@ -536,7 +536,11 @@ func (cli *SESXiClient) FindVMByPrivateID(idstr string) (*SVirtualMachine, error return nil, errors.Wrap(err, "reference2Object fail") } - return NewVirtualMachine(cli, &vm, nil), nil + ret := NewVirtualMachine(cli, &vm, nil) + if ret == nil { + return nil, errors.Error("invalid vm") + } + return ret, nil } func (cli *SESXiClient) DoExtendDiskOnline(_vm *SVirtualMachine, _disk *SVirtualDisk, newSizeMb int64) error { diff --git a/pkg/multicloud/esxi/virtualmachine.go b/pkg/multicloud/esxi/virtualmachine.go index fe465fffec..2b2208e0d9 100644 --- a/pkg/multicloud/esxi/virtualmachine.go +++ b/pkg/multicloud/esxi/virtualmachine.go @@ -72,7 +72,11 @@ 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)} - svm.fetchHardwareInfo() + err := svm.fetchHardwareInfo() + if err != nil { + log.Errorf("NewVirtualMachine: %v", err) + return nil + } return svm } @@ -705,7 +709,7 @@ func (self *SVirtualMachine) UpdateUserData(userData string) error { return nil } -func (self *SVirtualMachine) fetchHardwareInfo() { +func (self *SVirtualMachine) fetchHardwareInfo() error { self.vnics = make([]SVirtualNIC, 0) self.vdisks = make([]SVirtualDisk, 0) self.cdroms = make([]SVirtualCdrom, 0) @@ -719,8 +723,7 @@ func (self *SVirtualMachine) fetchHardwareInfo() { } if moVM == nil || moVM.Config == nil || moVM.Config.Hardware.Device == nil { - log.Errorf("invalid vm config, moVM: %v", moVM) - return + return fmt.Errorf("invalid vm") } for i := 0; i < len(moVM.Config.Hardware.Device); i += 1 { @@ -748,6 +751,7 @@ func (self *SVirtualMachine) fetchHardwareInfo() { 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 {