From cd97edf07d63f34c7424ae9c0f3655483a863cf9 Mon Sep 17 00:00:00 2001 From: rainzm Date: Tue, 2 Feb 2021 10:33:17 +0800 Subject: [PATCH] feat(esxi): support iso when creating vm --- pkg/compute/hostdrivers/esxi.go | 6 +++- .../storageman/imagecachemanager_agent.go | 23 +++++++++---- pkg/multicloud/esxi/host.go | 34 +++++++++++-------- pkg/multicloud/esxi/storage.go | 11 +++++- 4 files changed, 50 insertions(+), 24 deletions(-) diff --git a/pkg/compute/hostdrivers/esxi.go b/pkg/compute/hostdrivers/esxi.go index 911d4f9c7c..dfac1b6544 100644 --- a/pkg/compute/hostdrivers/esxi.go +++ b/pkg/compute/hostdrivers/esxi.go @@ -98,7 +98,11 @@ func (self *SESXiHostDriver) CheckAndSetCacheImage(ctx context.Context, host *mo content.HostId = host.Id content.HostIp = host.AccessIp // format force VMDK - content.Format = "vmdk" // cacheImage.GetFormat() + format := cacheImage.GetFormat() + if format == "qcow2" { + format = "vmdk" + } + content.Format = format content.ImageType = cacheImage.ImageType content.ImageExternalId = cacheImage.ExternalId diff --git a/pkg/hostman/storageman/imagecachemanager_agent.go b/pkg/hostman/storageman/imagecachemanager_agent.go index 50fa5c80c5..51c9d34376 100644 --- a/pkg/hostman/storageman/imagecachemanager_agent.go +++ b/pkg/hostman/storageman/imagecachemanager_agent.go @@ -148,7 +148,6 @@ func (c *SAgentImageCacheManager) prefetchImageCacheByCopy(ctx context.Context, func (c *SAgentImageCacheManager) prefetchImageCacheByUpload(ctx context.Context, data *sImageCacheData, origin *jsonutils.JSONDict) (jsonutils.JSONObject, error) { - format := "vmdk" localImage, err := c.imageCacheManger.PrefetchImageCache(ctx, origin) if err != nil { return nil, err @@ -168,9 +167,13 @@ func (c *SAgentImageCacheManager) prefetchImageCacheByUpload(ctx context.Context if err != nil { return nil, errors.Wrap(err, "SHost.FindDataStoreById") } - remotePath := fmt.Sprintf("image_cache/%s.%s", data.ImageId, format) - // check if dst vmdk is exist + format, _ := origin.GetString("format") + if format == "" { + format = "vmdk" + } + remotePath := fmt.Sprintf("image_cache/%s.%s", data.ImageId, format) + // check if dst image is exist exists := false if format == "vmdk" { err = ds.CheckVmdk(ctx, remotePath) @@ -192,10 +195,16 @@ func (c *SAgentImageCacheManager) prefetchImageCacheByUpload(ctx context.Context } log.Debugf("exist: %t, remotePath: %s", exists, remotePath) if !exists || data.IsForce { - err := ds.ImportVMDK(ctx, localImgPath, remotePath, host) - //err := ds.ImportVMDK(ctx, localImgPath, host) - if err != nil { - return nil, errors.Wrap(err, "SDatastore.ImportTemplate") + if format == "iso" { + err := ds.ImportISO(ctx, localImgPath, remotePath, host) + if err != nil { + return nil, errors.Wrap(err, "SDatastore.ImportISO") + } + } else { + err := ds.ImportVMDK(ctx, localImgPath, remotePath, host) + if err != nil { + return nil, errors.Wrap(err, "SDatastore.ImportTemplate") + } } } remotePath = ds.GetFullPath(remotePath) diff --git a/pkg/multicloud/esxi/host.go b/pkg/multicloud/esxi/host.go index 835d143d65..dc649c2580 100644 --- a/pkg/multicloud/esxi/host.go +++ b/pkg/multicloud/esxi/host.go @@ -695,7 +695,7 @@ type SCreateVMParam struct { Cpu int Mem int Bios string - Cdrom jsonutils.JSONObject + Cdrom SCdromInfo Disks []SDiskInfo Nics []jsonutils.JSONObject ResourcePool string @@ -707,6 +707,13 @@ type SEsxiInstanceSnapshotInfo struct { InstanceId string } +type SCdromInfo struct { + ImageId string + Path string + Name string + Size string +} + type SDiskInfo struct { ImagePath string Size int64 @@ -735,17 +742,17 @@ func (self *SHost) CreateVM2(ctx context.Context, ds *SDatastore, params SCreate return self.CloneVM(ctx, temvm, &sp.snapshotTree.Snapshot, ds, params) } if len(params.Disks) == 0 { - return self.DoCreateVM(ctx, ds, params) + return nil, errors.Error("empty disk config") } imageInfo := params.Disks[0].ImageInfo - if imageInfo.ImageType != string(cloudprovider.ImageTypeSystem) { - return self.DoCreateVM(ctx, ds, params) + if imageInfo.ImageType == string(cloudprovider.ImageTypeSystem) { + temvm, err := self.manager.SearchTemplateVM(imageInfo.ImageExternalId) + if err != nil { + return nil, errors.Wrapf(err, "SEsxiClient.SearchTemplateVM for image %q", imageInfo.ImageExternalId) + } + return self.CloneVM(ctx, temvm, nil, ds, params) } - temvm, err := self.manager.SearchTemplateVM(imageInfo.ImageExternalId) - if err != nil { - return nil, errors.Wrapf(err, "SEsxiClient.SearchTemplateVM for image %q", imageInfo.ImageExternalId) - } - return self.CloneVM(ctx, temvm, nil, ds, params) + return self.DoCreateVM(ctx, ds, params) } func (self *SHost) DoCreateVM(ctx context.Context, ds *SDatastore, params SCreateVMParam) (*SVirtualMachine, error) { @@ -803,15 +810,12 @@ func (self *SHost) DoCreateVM(ctx context.Context, ds *SDatastore, params SCreat } deviceChange = append(deviceChange, addDevSpec(NewSCSIDev(1000, 100, driver))) } - cdromPath := "" - if params.Cdrom != nil { - cdromPath, _ = params.Cdrom.GetString("path") - } var err error - if len(cdromPath) != 0 && !strings.HasPrefix(cdromPath, "[") { + cdromPath := params.Cdrom.Path + if len(cdromPath) > 0 { cdromPath, err = self.FileUrlPathToDsPath(cdromPath) if err != nil { - return nil, errors.Wrapf(err, "SHost.FileUrlPathToDsPath") + return nil, errors.Wrapf(err, "SHost.FileUrlPathToDsPath for cdrom path") } } deviceChange = append(deviceChange, addDevSpec(NewCDROMDev(cdromPath, 16000, 201))) diff --git a/pkg/multicloud/esxi/storage.go b/pkg/multicloud/esxi/storage.go index 61570c6edc..1aab08ff69 100644 --- a/pkg/multicloud/esxi/storage.go +++ b/pkg/multicloud/esxi/storage.go @@ -793,7 +793,10 @@ func (self *SDatastore) CheckVmdk(ctx context.Context, remotePath string) error } func (self *SDatastore) getDatastoreObj() *object.Datastore { - return object.NewDatastore(self.manager.client.Client, self.getDatastore().Self) + od := object.NewDatastore(self.manager.client.Client, self.getDatastore().Self) + od.DatacenterPath = self.GetDatacenterPathString() + od.InventoryPath = fmt.Sprintf("%s/%s", od.DatacenterPath, self.SManagedObject.GetName()) + return od } func (self *SDatastore) MakeDir(remotePath string) error { @@ -899,6 +902,12 @@ func (self *SDatastore) ImportVMDK(ctx context.Context, diskFile, remotePath str self.GetRelName(), remotePath)) } +func (self *SDatastore) ImportISO(ctx context.Context, isoFile, remotePath string, host *SHost) error { + p := soap.DefaultUpload + ds := self.getDatastoreObj() + return ds.UploadFile(ctx, isoFile, remotePath, &p) +} + var ( ErrInvalidFormat = errors.Error("vmdk: invalid format (must be streamOptimized)") )