mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-21 14:19:49 +08:00
Merge pull request #10102 from rainzm/vmware/iso
feat(esxi): support iso when creating vm
This commit is contained in:
@@ -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
@@ -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)))
|
||||
|
||||
@@ -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)")
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user