From 3e43510b5c3b618b64df3a745e7a7e8eaa3ccccf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Tue, 25 Feb 2025 12:02:12 +0800 Subject: [PATCH] fix(region): allow create disk when vm running (#22171) --- pkg/apis/compute/guests.go | 4 +++ pkg/compute/guestdrivers/aliyun.go | 4 +-- pkg/compute/guestdrivers/aws.go | 2 +- pkg/compute/guestdrivers/azure.go | 2 +- pkg/compute/guestdrivers/baremetals.go | 2 +- pkg/compute/guestdrivers/base.go | 4 +-- pkg/compute/guestdrivers/cloudpods.go | 2 +- pkg/compute/guestdrivers/ctyun.go | 2 +- pkg/compute/guestdrivers/ecloud.go | 2 +- pkg/compute/guestdrivers/esxi.go | 2 +- pkg/compute/guestdrivers/google.go | 2 +- pkg/compute/guestdrivers/h3c.go | 2 +- pkg/compute/guestdrivers/hcs.go | 2 +- pkg/compute/guestdrivers/hcsop.go | 2 +- pkg/compute/guestdrivers/huawei.go | 2 +- pkg/compute/guestdrivers/huaweistack.go | 2 +- pkg/compute/guestdrivers/incloudsphere.go | 2 +- pkg/compute/guestdrivers/kvm.go | 2 +- pkg/compute/guestdrivers/nutanix.go | 2 +- pkg/compute/guestdrivers/openstack.go | 2 +- pkg/compute/guestdrivers/proxmox.go | 2 +- pkg/compute/guestdrivers/qcloud.go | 2 +- pkg/compute/guestdrivers/ucloud.go | 2 +- pkg/compute/guestdrivers/volcengine.go | 2 +- pkg/compute/guestdrivers/zstack.go | 2 +- pkg/compute/models/guest_actions.go | 30 ++++++++++++++++------- pkg/compute/models/guestdrivers.go | 2 +- 27 files changed, 52 insertions(+), 36 deletions(-) diff --git a/pkg/apis/compute/guests.go b/pkg/apis/compute/guests.go index 68b024cde5..464534995c 100644 --- a/pkg/apis/compute/guests.go +++ b/pkg/apis/compute/guests.go @@ -1335,6 +1335,10 @@ func (conf ServerChangeConfigSettings) MemChanged() bool { return conf.VmemSize != conf.Old.VmemSize } +func (conf ServerChangeConfigSettings) InstanceTypeChanged() bool { + return len(conf.InstanceType) > 0 && conf.InstanceType != conf.Old.InstanceType +} + func (conf ServerChangeConfigSettings) AddedMem() int { addMem := conf.VmemSize - conf.Old.VmemSize if addMem < 0 { diff --git a/pkg/compute/guestdrivers/aliyun.go b/pkg/compute/guestdrivers/aliyun.go index 8a4d7d1d21..656785d5e8 100644 --- a/pkg/compute/guestdrivers/aliyun.go +++ b/pkg/compute/guestdrivers/aliyun.go @@ -103,8 +103,8 @@ func (self *SAliyunGuestDriver) IsAllowSaveImageOnRunning() bool { return true } -func (self *SAliyunGuestDriver) GetChangeConfigStatus(guest *models.SGuest) ([]string, error) { - return []string{api.VM_READY, api.VM_RUNNING}, nil +func (self *SAliyunGuestDriver) GetChangeInstanceTypeStatus() ([]string, error) { + return []string{api.VM_READY}, nil } func (self *SAliyunGuestDriver) GetDeployStatus() ([]string, error) { diff --git a/pkg/compute/guestdrivers/aws.go b/pkg/compute/guestdrivers/aws.go index 3871621f71..701396aeab 100644 --- a/pkg/compute/guestdrivers/aws.go +++ b/pkg/compute/guestdrivers/aws.go @@ -179,7 +179,7 @@ func (self *SAwsGuestDriver) GetRebuildRootStatus() ([]string, error) { return []string{api.VM_READY, api.VM_RUNNING}, nil } -func (self *SAwsGuestDriver) GetChangeConfigStatus(guest *models.SGuest) ([]string, error) { +func (self *SAwsGuestDriver) GetChangeInstanceTypeStatus() ([]string, error) { return []string{api.VM_READY}, nil } diff --git a/pkg/compute/guestdrivers/azure.go b/pkg/compute/guestdrivers/azure.go index c236bab739..aae9892bef 100644 --- a/pkg/compute/guestdrivers/azure.go +++ b/pkg/compute/guestdrivers/azure.go @@ -102,7 +102,7 @@ func (self *SAzureGuestDriver) IsRebuildRootSupportChangeUEFI() bool { return false } -func (self *SAzureGuestDriver) GetChangeConfigStatus(guest *models.SGuest) ([]string, error) { +func (self *SAzureGuestDriver) GetChangeInstanceTypeStatus() ([]string, error) { return []string{api.VM_READY, api.VM_RUNNING}, nil } diff --git a/pkg/compute/guestdrivers/baremetals.go b/pkg/compute/guestdrivers/baremetals.go index 7343756de9..2c979c8294 100644 --- a/pkg/compute/guestdrivers/baremetals.go +++ b/pkg/compute/guestdrivers/baremetals.go @@ -123,7 +123,7 @@ func (self *SBaremetalGuestDriver) GetRebuildRootStatus() ([]string, error) { return []string{api.VM_READY, api.VM_ADMIN}, nil } -func (self *SBaremetalGuestDriver) GetChangeConfigStatus(guest *models.SGuest) ([]string, error) { +func (self *SBaremetalGuestDriver) GetChangeInstanceTypeStatus() ([]string, error) { return nil, httperrors.NewUnsupportOperationError("Cannot change config for baremtal") } diff --git a/pkg/compute/guestdrivers/base.go b/pkg/compute/guestdrivers/base.go index 8e3428422c..4300a908d4 100644 --- a/pkg/compute/guestdrivers/base.go +++ b/pkg/compute/guestdrivers/base.go @@ -174,8 +174,8 @@ func (drv *SBaseGuestDriver) IsRebuildRootSupportChangeUEFI() bool { return true } -func (drv *SBaseGuestDriver) GetChangeConfigStatus(guest *models.SGuest) ([]string, error) { - return []string{}, fmt.Errorf("This Guest driver dose not implement GetChangeConfigStatus") +func (drv *SBaseGuestDriver) GetChangeInstanceTypeStatus() ([]string, error) { + return []string{}, fmt.Errorf("This Guest driver dose not implement GetChangeInstanceTypeStatus") } func (drv *SBaseGuestDriver) ValidateDetachDisk(ctx context.Context, userCred mcclient.TokenCredential, guest *models.SGuest, disk *models.SDisk) error { diff --git a/pkg/compute/guestdrivers/cloudpods.go b/pkg/compute/guestdrivers/cloudpods.go index 99a1a625f2..812f945f68 100644 --- a/pkg/compute/guestdrivers/cloudpods.go +++ b/pkg/compute/guestdrivers/cloudpods.go @@ -80,7 +80,7 @@ func (self *SCloudpodsGuestDriver) GetRebuildRootStatus() ([]string, error) { return []string{api.VM_READY, api.VM_RUNNING}, nil } -func (self *SCloudpodsGuestDriver) GetChangeConfigStatus(guest *models.SGuest) ([]string, error) { +func (self *SCloudpodsGuestDriver) GetChangeInstanceTypeStatus() ([]string, error) { return []string{api.VM_READY, api.VM_RUNNING}, nil } diff --git a/pkg/compute/guestdrivers/ctyun.go b/pkg/compute/guestdrivers/ctyun.go index 199862a80e..bd77be2926 100644 --- a/pkg/compute/guestdrivers/ctyun.go +++ b/pkg/compute/guestdrivers/ctyun.go @@ -94,7 +94,7 @@ func (self *SCtyunGuestDriver) GetAttachDiskStatus() ([]string, error) { return []string{api.VM_READY, api.VM_RUNNING}, nil } -func (self *SCtyunGuestDriver) GetChangeConfigStatus(guest *models.SGuest) ([]string, error) { +func (self *SCtyunGuestDriver) GetChangeInstanceTypeStatus() ([]string, error) { return []string{api.VM_READY}, nil } diff --git a/pkg/compute/guestdrivers/ecloud.go b/pkg/compute/guestdrivers/ecloud.go index 7c57357658..3a53741c63 100644 --- a/pkg/compute/guestdrivers/ecloud.go +++ b/pkg/compute/guestdrivers/ecloud.go @@ -88,7 +88,7 @@ func (self *SEcloudGuestDriver) GetAttachDiskStatus() ([]string, error) { return []string{api.VM_READY, api.VM_RUNNING}, nil } -func (self *SEcloudGuestDriver) GetChangeConfigStatus(guest *models.SGuest) ([]string, error) { +func (self *SEcloudGuestDriver) GetChangeInstanceTypeStatus() ([]string, error) { return []string{api.VM_READY}, nil } diff --git a/pkg/compute/guestdrivers/esxi.go b/pkg/compute/guestdrivers/esxi.go index 9ba7967f21..d88ae66957 100644 --- a/pkg/compute/guestdrivers/esxi.go +++ b/pkg/compute/guestdrivers/esxi.go @@ -209,7 +209,7 @@ func (self *SESXiGuestDriver) GetAttachDiskStatus() ([]string, error) { return []string{api.VM_READY, api.VM_RUNNING}, nil } -func (self *SESXiGuestDriver) GetChangeConfigStatus(guest *models.SGuest) ([]string, error) { +func (self *SESXiGuestDriver) GetChangeInstanceTypeStatus() ([]string, error) { return []string{api.VM_READY, api.VM_RUNNING}, nil } diff --git a/pkg/compute/guestdrivers/google.go b/pkg/compute/guestdrivers/google.go index afb0e8e128..ebabff6ba4 100644 --- a/pkg/compute/guestdrivers/google.go +++ b/pkg/compute/guestdrivers/google.go @@ -129,7 +129,7 @@ func (self *SGoogleGuestDriver) GetRebuildRootStatus() ([]string, error) { return []string{api.VM_READY}, nil } -func (self *SGoogleGuestDriver) GetChangeConfigStatus(guest *models.SGuest) ([]string, error) { +func (self *SGoogleGuestDriver) GetChangeInstanceTypeStatus() ([]string, error) { return []string{api.VM_READY}, nil } diff --git a/pkg/compute/guestdrivers/h3c.go b/pkg/compute/guestdrivers/h3c.go index d9d45f0296..cdb468c4a7 100644 --- a/pkg/compute/guestdrivers/h3c.go +++ b/pkg/compute/guestdrivers/h3c.go @@ -98,7 +98,7 @@ func (self *SH3CGuestDriver) GetRebuildRootStatus() ([]string, error) { return []string{api.VM_READY, api.VM_RUNNING}, nil } -func (self *SH3CGuestDriver) GetChangeConfigStatus(guest *models.SGuest) ([]string, error) { +func (self *SH3CGuestDriver) GetChangeInstanceTypeStatus() ([]string, error) { return []string{api.VM_READY}, nil } diff --git a/pkg/compute/guestdrivers/hcs.go b/pkg/compute/guestdrivers/hcs.go index 76588da4f4..64e7d713f2 100644 --- a/pkg/compute/guestdrivers/hcs.go +++ b/pkg/compute/guestdrivers/hcs.go @@ -98,7 +98,7 @@ func (self *SHCSGuestDriver) GetRebuildRootStatus() ([]string, error) { return []string{api.VM_READY, api.VM_RUNNING}, nil } -func (self *SHCSGuestDriver) GetChangeConfigStatus(guest *models.SGuest) ([]string, error) { +func (self *SHCSGuestDriver) GetChangeInstanceTypeStatus() ([]string, error) { return []string{api.VM_READY}, nil } diff --git a/pkg/compute/guestdrivers/hcsop.go b/pkg/compute/guestdrivers/hcsop.go index a4eb2795e1..2051cdf9e6 100644 --- a/pkg/compute/guestdrivers/hcsop.go +++ b/pkg/compute/guestdrivers/hcsop.go @@ -98,7 +98,7 @@ func (self *SHCSOPGuestDriver) GetRebuildRootStatus() ([]string, error) { return []string{api.VM_READY, api.VM_RUNNING}, nil } -func (self *SHCSOPGuestDriver) GetChangeConfigStatus(guest *models.SGuest) ([]string, error) { +func (self *SHCSOPGuestDriver) GetChangeInstanceTypeStatus() ([]string, error) { return []string{api.VM_READY}, nil } diff --git a/pkg/compute/guestdrivers/huawei.go b/pkg/compute/guestdrivers/huawei.go index 61b270ea57..144ae1575c 100644 --- a/pkg/compute/guestdrivers/huawei.go +++ b/pkg/compute/guestdrivers/huawei.go @@ -89,7 +89,7 @@ func (self *SHuaweiGuestDriver) GetRebuildRootStatus() ([]string, error) { return []string{api.VM_READY, api.VM_RUNNING}, nil } -func (self *SHuaweiGuestDriver) GetChangeConfigStatus(guest *models.SGuest) ([]string, error) { +func (self *SHuaweiGuestDriver) GetChangeInstanceTypeStatus() ([]string, error) { return []string{api.VM_READY}, nil } diff --git a/pkg/compute/guestdrivers/huaweistack.go b/pkg/compute/guestdrivers/huaweistack.go index 95adf9ef29..64c00bc45d 100644 --- a/pkg/compute/guestdrivers/huaweistack.go +++ b/pkg/compute/guestdrivers/huaweistack.go @@ -93,7 +93,7 @@ func (self *SHCSOGuestDriver) GetRebuildRootStatus() ([]string, error) { return []string{api.VM_READY, api.VM_RUNNING}, nil } -func (self *SHCSOGuestDriver) GetChangeConfigStatus(guest *models.SGuest) ([]string, error) { +func (self *SHCSOGuestDriver) GetChangeInstanceTypeStatus() ([]string, error) { return []string{api.VM_READY}, nil } diff --git a/pkg/compute/guestdrivers/incloudsphere.go b/pkg/compute/guestdrivers/incloudsphere.go index 8986017588..38329705e7 100644 --- a/pkg/compute/guestdrivers/incloudsphere.go +++ b/pkg/compute/guestdrivers/incloudsphere.go @@ -119,7 +119,7 @@ func (self *SInCloudSphereGuestDriver) GetAttachDiskStatus() ([]string, error) { return []string{api.VM_READY}, nil } -func (self *SInCloudSphereGuestDriver) GetChangeConfigStatus(guest *models.SGuest) ([]string, error) { +func (self *SInCloudSphereGuestDriver) GetChangeInstanceTypeStatus() ([]string, error) { return []string{api.VM_READY, api.VM_RUNNING}, nil } diff --git a/pkg/compute/guestdrivers/kvm.go b/pkg/compute/guestdrivers/kvm.go index 4d3b2a5743..5c279127ff 100644 --- a/pkg/compute/guestdrivers/kvm.go +++ b/pkg/compute/guestdrivers/kvm.go @@ -606,7 +606,7 @@ func (self *SKVMGuestDriver) GetRebuildRootStatus() ([]string, error) { return []string{api.VM_READY}, nil } -func (self *SKVMGuestDriver) GetChangeConfigStatus(guest *models.SGuest) ([]string, error) { +func (self *SKVMGuestDriver) GetChangeInstanceTypeStatus() ([]string, error) { return []string{api.VM_READY, api.VM_RUNNING}, nil } diff --git a/pkg/compute/guestdrivers/nutanix.go b/pkg/compute/guestdrivers/nutanix.go index 3bda5bef29..4ce00895d2 100644 --- a/pkg/compute/guestdrivers/nutanix.go +++ b/pkg/compute/guestdrivers/nutanix.go @@ -131,7 +131,7 @@ func (self *SNutanixGuestDriver) GetAttachDiskStatus() ([]string, error) { return []string{api.VM_READY}, nil } -func (self *SNutanixGuestDriver) GetChangeConfigStatus(guest *models.SGuest) ([]string, error) { +func (self *SNutanixGuestDriver) GetChangeInstanceTypeStatus() ([]string, error) { return []string{api.VM_READY}, nil } diff --git a/pkg/compute/guestdrivers/openstack.go b/pkg/compute/guestdrivers/openstack.go index 41459061d4..0a3a981fc3 100644 --- a/pkg/compute/guestdrivers/openstack.go +++ b/pkg/compute/guestdrivers/openstack.go @@ -132,7 +132,7 @@ func (self *SOpenStackGuestDriver) GetRebuildRootStatus() ([]string, error) { return []string{api.VM_READY, api.VM_RUNNING, api.VM_REBUILD_ROOT_FAIL}, nil } -func (self *SOpenStackGuestDriver) GetChangeConfigStatus(guest *models.SGuest) ([]string, error) { +func (self *SOpenStackGuestDriver) GetChangeInstanceTypeStatus() ([]string, error) { return []string{api.VM_READY, api.VM_RUNNING}, nil } diff --git a/pkg/compute/guestdrivers/proxmox.go b/pkg/compute/guestdrivers/proxmox.go index ad10bf5657..dfefdec79c 100644 --- a/pkg/compute/guestdrivers/proxmox.go +++ b/pkg/compute/guestdrivers/proxmox.go @@ -136,7 +136,7 @@ func (self *SProxmoxGuestDriver) GetAttachDiskStatus() ([]string, error) { return []string{api.VM_READY}, nil } -func (self *SProxmoxGuestDriver) GetChangeConfigStatus(guest *models.SGuest) ([]string, error) { +func (self *SProxmoxGuestDriver) GetChangeInstanceTypeStatus() ([]string, error) { return []string{api.VM_READY, api.VM_RUNNING}, nil } diff --git a/pkg/compute/guestdrivers/qcloud.go b/pkg/compute/guestdrivers/qcloud.go index 7f5e31ebe3..fd56af150b 100644 --- a/pkg/compute/guestdrivers/qcloud.go +++ b/pkg/compute/guestdrivers/qcloud.go @@ -95,7 +95,7 @@ func (self *SQcloudGuestDriver) GetRebuildRootStatus() ([]string, error) { return []string{api.VM_READY, api.VM_RUNNING}, nil } -func (self *SQcloudGuestDriver) GetChangeConfigStatus(guest *models.SGuest) ([]string, error) { +func (self *SQcloudGuestDriver) GetChangeInstanceTypeStatus() ([]string, error) { return []string{api.VM_READY, api.VM_RUNNING}, nil } diff --git a/pkg/compute/guestdrivers/ucloud.go b/pkg/compute/guestdrivers/ucloud.go index 271093a0ce..111a1bbeb3 100644 --- a/pkg/compute/guestdrivers/ucloud.go +++ b/pkg/compute/guestdrivers/ucloud.go @@ -77,7 +77,7 @@ func (self *SUCloudGuestDriver) GetAttachDiskStatus() ([]string, error) { return []string{api.VM_READY, api.VM_RUNNING}, nil } -func (self *SUCloudGuestDriver) GetChangeConfigStatus(guest *models.SGuest) ([]string, error) { +func (self *SUCloudGuestDriver) GetChangeInstanceTypeStatus() ([]string, error) { return []string{api.VM_READY}, nil } diff --git a/pkg/compute/guestdrivers/volcengine.go b/pkg/compute/guestdrivers/volcengine.go index 250f8b5235..de83993fa9 100644 --- a/pkg/compute/guestdrivers/volcengine.go +++ b/pkg/compute/guestdrivers/volcengine.go @@ -83,7 +83,7 @@ func (self *SVolcengineGuestDriver) GetRebuildRootStatus() ([]string, error) { return []string{api.VM_READY, api.VM_RUNNING}, nil } -func (self *SVolcengineGuestDriver) GetChangeConfigStatus(guest *models.SGuest) ([]string, error) { +func (self *SVolcengineGuestDriver) GetChangeInstanceTypeStatus() ([]string, error) { return []string{api.VM_READY}, nil } diff --git a/pkg/compute/guestdrivers/zstack.go b/pkg/compute/guestdrivers/zstack.go index a7cf2fbe6b..4490e6c210 100644 --- a/pkg/compute/guestdrivers/zstack.go +++ b/pkg/compute/guestdrivers/zstack.go @@ -101,7 +101,7 @@ func (self *SZStackGuestDriver) GetRebuildRootStatus() ([]string, error) { return []string{api.VM_READY}, nil } -func (self *SZStackGuestDriver) GetChangeConfigStatus(guest *models.SGuest) ([]string, error) { +func (self *SZStackGuestDriver) GetChangeInstanceTypeStatus() ([]string, error) { return []string{api.VM_READY, api.VM_RUNNING}, nil } diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index 3d4632c2df..a10cec67e9 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -2965,15 +2965,7 @@ func (self *SGuest) PerformChangeConfig(ctx context.Context, userCred mcclient.T return nil, httperrors.NewBadRequestError("Guest have backup not allow to change config") } - changeStatus, err := self.GetDriver().GetChangeConfigStatus(self) - if err != nil { - return nil, httperrors.NewInputParameterError("%v", err) - } - if !utils.IsInStringArray(self.Status, changeStatus) { - return nil, httperrors.NewInvalidStatusError("Cannot change config in %s for %s, requires %s", self.Status, self.GetHypervisor(), changeStatus) - } - - _, err = self.GetHost() + _, err := self.GetHost() if err != nil { return nil, httperrors.NewInvalidStatusError("no valid host") } @@ -2983,6 +2975,16 @@ func (self *SGuest) PerformChangeConfig(ctx context.Context, userCred mcclient.T return nil, errors.Wrap(err, "ValidateGuestChangeConfigInput") } + if confs.CpuChanged() || confs.MemChanged() || confs.InstanceTypeChanged() { + changeStatus, err := self.GetDriver().GetChangeInstanceTypeStatus() + if err != nil { + return nil, httperrors.NewInputParameterError("%v", err) + } + if !utils.IsInStringArray(self.Status, changeStatus) { + return nil, httperrors.NewInvalidStatusError("Cannot change config in %s for %s, requires %s", self.Status, self.GetHypervisor(), changeStatus) + } + } + if self.PowerStates == api.VM_POWER_STATES_ON && (confs.CpuChanged() || confs.MemChanged()) { confs, err = self.GetDriver().ValidateGuestHotChangeConfigInput(ctx, self, confs) if err != nil { @@ -2990,6 +2992,16 @@ func (self *SGuest) PerformChangeConfig(ctx context.Context, userCred mcclient.T } } + if len(confs.Create) > 0 { + attachStatus, err := self.GetDriver().GetAttachDiskStatus() + if err != nil { + return nil, httperrors.NewInputParameterError("%v", err) + } + if !utils.IsInStringArray(self.Status, attachStatus) { + return nil, httperrors.NewInvalidStatusError("Cannot attach disk in %s for %s, requires %s", self.Status, self.GetHypervisor(), attachStatus) + } + } + log.Debugf("%s", jsonutils.Marshal(confs).String()) pendingUsage := &SQuota{} diff --git a/pkg/compute/models/guestdrivers.go b/pkg/compute/models/guestdrivers.go index 1d9082a5f5..162fa70f0d 100644 --- a/pkg/compute/models/guestdrivers.go +++ b/pkg/compute/models/guestdrivers.go @@ -141,7 +141,7 @@ type IGuestDriver interface { GetAttachDiskStatus() ([]string, error) GetRebuildRootStatus() ([]string, error) IsAllowSaveImageOnRunning() bool - GetChangeConfigStatus(guest *SGuest) ([]string, error) + GetChangeInstanceTypeStatus() ([]string, error) GetDeployStatus() ([]string, error) ValidateResizeDisk(guest *SGuest, disk *SDisk, storage *SStorage) error CanKeepDetachDisk() bool