From 4e44ae2932082f81836f7d3b6938ee680a20496c Mon Sep 17 00:00:00 2001 From: ioito Date: Thu, 2 Nov 2023 11:22:53 +0800 Subject: [PATCH] fix(region): esxi vm resize disk online --- pkg/compute/guestdrivers/esxi.go | 2 +- pkg/compute/hostdrivers/esxi.go | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/pkg/compute/guestdrivers/esxi.go b/pkg/compute/guestdrivers/esxi.go index aae7740cac..51008d9ede 100644 --- a/pkg/compute/guestdrivers/esxi.go +++ b/pkg/compute/guestdrivers/esxi.go @@ -290,7 +290,7 @@ func (self *SESXiGuestDriver) ValidateCreateEip(ctx context.Context, userCred mc } func (self *SESXiGuestDriver) ValidateResizeDisk(guest *models.SGuest, disk *models.SDisk, storage *models.SStorage) error { - if !utils.IsInStringArray(guest.Status, []string{api.VM_READY}) { + if !utils.IsInStringArray(guest.Status, []string{api.VM_READY, api.VM_RUNNING}) { return fmt.Errorf("Cannot resize disk when guest in status %s", guest.Status) } count, err := guest.GetInstanceSnapshotCount() diff --git a/pkg/compute/hostdrivers/esxi.go b/pkg/compute/hostdrivers/esxi.go index e4ace3020c..fb3e7b6f8c 100644 --- a/pkg/compute/hostdrivers/esxi.go +++ b/pkg/compute/hostdrivers/esxi.go @@ -269,6 +269,30 @@ func (self *SESXiHostDriver) RequestResizeDiskOnHost(ctx context.Context, host * if guest == nil { return fmt.Errorf("unable to find guest has disk %s", disk.GetId()) } + + iVm, err := guest.GetIVM(ctx) + if err != nil { + return errors.Wrapf(err, "GetIVM") + } + if iVm.GetStatus() == api.VM_RUNNING { + taskman.LocalTaskRun(task, func() (jsonutils.JSONObject, error) { + disks, err := iVm.GetIDisks() + if err != nil { + return nil, errors.Wrapf(err, "GetIDisk") + } + for i := range disks { + if disks[i].GetGlobalId() == disk.ExternalId { + err = disks[i].Resize(ctx, sizeMb) + if err != nil { + return nil, errors.Wrapf(err, "Resize") + } + return jsonutils.Marshal(map[string]int64{"disk_size": sizeMb}), nil + } + } + return nil, errors.Wrapf(cloudprovider.ErrNotFound, "disk %s", disk.Name) + }) + return nil + } spec := struct { HostInfo vcenter.SVCenterAccessInfo VMId string