From 5251304a4758bd4ac946d7fe03abc6e68f84b037 Mon Sep 17 00:00:00 2001 From: rainzm Date: Mon, 26 Oct 2020 19:04:51 +0800 Subject: [PATCH] feat(esxi): expand disk config from subimages when creating vm --- pkg/compute/guestdrivers/esxi.go | 35 ++++++++++++++++++++++++++++++ pkg/compute/models/cachedimages.go | 4 ++++ 2 files changed, 39 insertions(+) diff --git a/pkg/compute/guestdrivers/esxi.go b/pkg/compute/guestdrivers/esxi.go index 582e66e5b2..0a94fde0a2 100644 --- a/pkg/compute/guestdrivers/esxi.go +++ b/pkg/compute/guestdrivers/esxi.go @@ -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()) } diff --git a/pkg/compute/models/cachedimages.go b/pkg/compute/models/cachedimages.go index a94c8feb91..bfc5abf012 100644 --- a/pkg/compute/models/cachedimages.go +++ b/pkg/compute/models/cachedimages.go @@ -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 {