From d616b4004411649824a183b859f3dda86724ea5f Mon Sep 17 00:00:00 2001 From: rainzm Date: Tue, 27 Oct 2020 21:19:40 +0800 Subject: [PATCH 1/3] fix(esxi): no callback in uploadHandler --- pkg/esxi/handler/handlers.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/esxi/handler/handlers.go b/pkg/esxi/handler/handlers.go index 7074e5bb41..7ad4d666c3 100644 --- a/pkg/esxi/handler/handlers.go +++ b/pkg/esxi/handler/handlers.go @@ -75,7 +75,7 @@ func uploadHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) httperrors.MissingParameterError(ctx, w, "miss disk") return } - hostutils.DelayTask(ctx, esxi.EsxiAgent.AgentStorage.SaveToGlance, disk) + hostutils.DelayTaskWithoutReqctx(ctx, esxi.EsxiAgent.AgentStorage.SaveToGlance, disk) hostutils.ResponseOk(ctx, w) } From 6afa80305019bf65325ab7dbe4f36f1c4fea695c Mon Sep 17 00:00:00 2001 From: rainzm Date: Tue, 27 Oct 2020 21:20:58 +0800 Subject: [PATCH 2/3] fix(esxi): use correct device index 1. Sort devices via their Key. 2. There is no relationship between vdisk index and vnics length. --- pkg/multicloud/esxi/virtualmachine.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/pkg/multicloud/esxi/virtualmachine.go b/pkg/multicloud/esxi/virtualmachine.go index c0c023ede6..ad8feae4b6 100644 --- a/pkg/multicloud/esxi/virtualmachine.go +++ b/pkg/multicloud/esxi/virtualmachine.go @@ -733,8 +733,13 @@ func (self *SVirtualMachine) fetchHardwareInfo() error { return fmt.Errorf("invalid vm") } - for i := 0; i < len(moVM.Config.Hardware.Device); i += 1 { - dev := moVM.Config.Hardware.Device[i] + // sort devices via their Key + devices := moVM.Config.Hardware.Device + sort.Slice(devices, func(i, j int) bool { + return devices[i].GetVirtualDevice().Key < devices[j].GetVirtualDevice().Key + }) + for i := 0; i < len(devices); i += 1 { + dev := devices[i] devType := reflect.Indirect(reflect.ValueOf(dev)).Type() etherType := reflect.TypeOf((*types.VirtualEthernetCard)(nil)).Elem() @@ -745,7 +750,7 @@ func (self *SVirtualMachine) fetchHardwareInfo() error { if reflectutils.StructContains(devType, etherType) { self.vnics = append(self.vnics, NewVirtualNIC(self, dev, len(self.vnics))) } else if reflectutils.StructContains(devType, diskType) { - self.vdisks = append(self.vdisks, NewVirtualDisk(self, dev, len(self.vnics))) + self.vdisks = append(self.vdisks, NewVirtualDisk(self, dev, len(self.vdisks))) } else if reflectutils.StructContains(devType, vgaType) { self.vga = NewVirtualVGA(self, dev, 0) } else if reflectutils.StructContains(devType, cdromType) { From 26b1050b31334c34041c9c9b12e16e65a70177f9 Mon Sep 17 00:00:00 2001 From: rainzm Date: Tue, 27 Oct 2020 21:25:32 +0800 Subject: [PATCH 3/3] fix(esxi): filter vmdk item in lease.info --- pkg/multicloud/esxi/virtualmachine.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/pkg/multicloud/esxi/virtualmachine.go b/pkg/multicloud/esxi/virtualmachine.go index ad8feae4b6..940c96e84d 100644 --- a/pkg/multicloud/esxi/virtualmachine.go +++ b/pkg/multicloud/esxi/virtualmachine.go @@ -22,6 +22,7 @@ import ( "strings" "time" + "github.com/vmware/govmomi/nfc" "github.com/vmware/govmomi/object" "github.com/vmware/govmomi/vim25/mo" "github.com/vmware/govmomi/vim25/soap" @@ -1229,8 +1230,19 @@ func (self *SVirtualMachine) ExportTemplate(ctx context.Context, idx int, diskPa lr := newLeaseLogger("download vmdk", 5) lr.Log() defer lr.End() + + // filter vmdk item + vmdkItems := make([]nfc.FileItem, 0, len(info.Items)/2) + for i := range info.Items { + if strings.HasSuffix(info.Items[i].Path, ".vmdk") { + vmdkItems = append(vmdkItems, info.Items[i]) + } else { + log.Infof("item.Path does not end in '.vmdk': %#v", info.Items[i]) + } + } + log.Debugf("download to %s start...", diskPath) - err = lease.DownloadFile(ctx, diskPath, info.Items[idx], soap.Download{Progress: lr}) + err = lease.DownloadFile(ctx, diskPath, vmdkItems[idx], soap.Download{Progress: lr}) if err != nil { return errors.Wrap(err, "lease.DownloadFile") }