feat(esxi): expand disk config from subimages when creating vm

This commit is contained in:
rainzm
2020-10-26 19:47:04 +08:00
parent a174c32eae
commit 5251304a47
2 changed files with 39 additions and 0 deletions
+35
View File
@@ -17,6 +17,7 @@ package guestdrivers
import (
"context"
"fmt"
"sort"
"time"
"yunion.io/x/jsonutils"
@@ -170,6 +171,40 @@ func (self *SESXiGuestDriver) GetDeployStatus() ([]string, error) {
return []string{api.VM_READY}, nil
}
func (self *SESXiGuestDriver) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, data *api.ServerCreateInput) (*api.ServerCreateInput, error) {
// check disk config
if len(data.Disks) == 0 {
return data, nil
}
rootDisk := data.Disks[0]
image, err := models.CachedimageManager.GetImageInfo(ctx, userCred, rootDisk.ImageId, false)
if err != nil {
return nil, errors.Wrapf(err, "unable to GetImageInfo of image %q", rootDisk.ImageId)
}
if len(image.SubImages) <= 1 {
return data, nil
}
sort.Slice(image.SubImages, func(i, j int) bool {
return image.SubImages[i].Index < image.SubImages[j].Index
})
newDataDisks := make([]*api.DiskConfig, 0, len(image.SubImages)+len(data.Disks)-1)
for i, subImage := range image.SubImages {
nDataDisk := *rootDisk
nDataDisk.SizeMb = subImage.MinDiskMB
nDataDisk.Index = i
if i > 0 {
nDataDisk.ImageId = ""
}
newDataDisks = append(newDataDisks, &nDataDisk)
}
for i := 1; i < len(data.Disks); i++ {
data.Disks[i].Index += len(image.SubImages) - 1
newDataDisks = append(newDataDisks, data.Disks[i])
}
data.Disks = newDataDisks
return data, nil
}
func (self *SESXiGuestDriver) ValidateCreateEip(ctx context.Context, userCred mcclient.TokenCredential, data jsonutils.JSONObject) error {
return httperrors.NewInputParameterError("%s not support create eip", self.GetHypervisor())
}
+4
View File
@@ -329,6 +329,10 @@ func (manager *SCachedimageManager) getImageByName(ctx context.Context, userCred
return cachedImage.GetImage()
}
func (manager *SCachedimageManager) GetImageInfo(ctx context.Context, userCred mcclient.TokenCredential, imageId string, refresh bool) (*cloudprovider.SImage, error) {
return manager.getImageInfo(ctx, userCred, imageId, refresh)
}
func (manager *SCachedimageManager) getImageInfo(ctx context.Context, userCred mcclient.TokenCredential, imageId string, refresh bool) (*cloudprovider.SImage, error) {
img, err := manager.GetImageById(ctx, userCred, imageId, refresh)
if err == nil {