Merge pull request #10102 from rainzm/vmware/iso

feat(esxi): support iso when creating vm
This commit is contained in:
Zexi Li
2021-02-03 09:45:56 +08:00
committed by GitHub
4 changed files with 50 additions and 24 deletions
+5 -1
View File
@@ -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
@@ -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)
+19 -15
View File
@@ -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)))
+10 -1
View File
@@ -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)")
)