From 719a8a1db572243337194fc71c58cc12357ae075 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Sat, 1 Dec 2018 13:12:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A3=80=E6=9F=A5=E7=A3=81=E7=9B=98=E6=89=A9?= =?UTF-8?q?=E5=AE=B9=E5=A4=A7=E5=B0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/compute/hostdrivers/aliyun.go | 6 +++--- pkg/compute/hostdrivers/aws.go | 2 +- pkg/compute/hostdrivers/azure.go | 10 +++++++++- pkg/compute/hostdrivers/base.go | 4 ++-- pkg/compute/hostdrivers/kvm.go | 4 ++++ pkg/compute/hostdrivers/qcloud.go | 2 +- pkg/compute/models/disks.go | 18 +++++++++++------- pkg/compute/models/hostdrivers.go | 2 +- 8 files changed, 32 insertions(+), 16 deletions(-) diff --git a/pkg/compute/hostdrivers/aliyun.go b/pkg/compute/hostdrivers/aliyun.go index 47bdbe971e..08c8b8fa25 100644 --- a/pkg/compute/hostdrivers/aliyun.go +++ b/pkg/compute/hostdrivers/aliyun.go @@ -29,14 +29,14 @@ func (self *SAliyunHostDriver) GetHostType() string { return models.HOST_TYPE_ALIYUN } -func (self *SAliyunHostDriver) ValidateCreateDisk(storage *models.SStorage, sizeGb int) error { +func (self *SAliyunHostDriver) ValidateDiskSize(storage *models.SStorage, sizeGb int) error { if utils.IsInStringArray(storage.StorageType, []string{models.STORAGE_CLOUD_EFFICIENCY, models.STORAGE_CLOUD_SSD, models.STORAGE_CLOUD_ESSD}) { if sizeGb < 20 || sizeGb > 32768 { - return fmt.Errorf("The %s disk size must be in the range of 20G ~ 32768G", storage.StorageType) + return fmt.Errorf("The %s disk size must be in the range of 20G ~ 32768GB", storage.StorageType) } } else if storage.StorageType == models.STORAGE_PUBLIC_CLOUD { if sizeGb < 5 || sizeGb > 2000 { - return fmt.Errorf("The %s disk size must be in the range of 5G ~ 2000G", storage.StorageType) + return fmt.Errorf("The %s disk size must be in the range of 5G ~ 2000GB", storage.StorageType) } } else { return fmt.Errorf("Not support create %s disk", storage.StorageType) diff --git a/pkg/compute/hostdrivers/aws.go b/pkg/compute/hostdrivers/aws.go index c1dd56a6c9..3c8eb084d7 100644 --- a/pkg/compute/hostdrivers/aws.go +++ b/pkg/compute/hostdrivers/aws.go @@ -24,7 +24,7 @@ func (self *SAwsHostDriver) GetHostType() string { return models.HOST_TYPE_AWS } -func (self *SAwsHostDriver) ValidateCreateDisk(storage *models.SStorage, sizeGb int) error { +func (self *SAwsHostDriver) ValidateDiskSize(storage *models.SStorage, sizeGb int) error { if storage.StorageType == models.STORAGE_GP2_SSD { if sizeGb < 1 || sizeGb > 16384 { return fmt.Errorf("The %s disk size must be in the range of 1G ~ 16384GB", storage.StorageType) diff --git a/pkg/compute/hostdrivers/azure.go b/pkg/compute/hostdrivers/azure.go index edcf0d15e7..c24d082f9c 100644 --- a/pkg/compute/hostdrivers/azure.go +++ b/pkg/compute/hostdrivers/azure.go @@ -14,6 +14,7 @@ import ( "yunion.io/x/onecloud/pkg/compute/options" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" + "yunion.io/x/pkg/utils" ) type SAzureHostDriver struct { @@ -36,7 +37,14 @@ func (self *SAzureHostDriver) ValidateUpdateDisk(ctx context.Context, userCred m return data, nil } -func (self *SAzureHostDriver) ValidateCreateDisk(storage *models.SStorage, sizeGb int) error { +func (self *SAzureHostDriver) ValidateDiskSize(storage *models.SStorage, sizeGb int) error { + if utils.IsInStringArray(storage.StorageType, []string{models.STORAGE_STANDARD_LRS, models.STORAGE_STANDARDSSD_LRS, models.STORAGE_PREMIUM_LRS}) { + if sizeGb < 1 || sizeGb > 4095 { + return fmt.Errorf("The %s disk size must be in the range of 1G ~ 4095GB", storage.StorageType) + } + } else { + return fmt.Errorf("Not support create %s disk", storage.StorageType) + } return nil } diff --git a/pkg/compute/hostdrivers/base.go b/pkg/compute/hostdrivers/base.go index a245b2befa..6dcaea62f9 100644 --- a/pkg/compute/hostdrivers/base.go +++ b/pkg/compute/hostdrivers/base.go @@ -20,8 +20,8 @@ func (self *SBaseHostDriver) ValidateUpdateDisk(ctx context.Context, userCred mc return data, nil } -func (self *SBaseHostDriver) ValidateCreateDisk(storage *models.SStorage, sizeGb int) error { - return fmt.Errorf("ot Implement ValidateCreateDisk") +func (self *SBaseHostDriver) ValidateDiskSize(storage *models.SStorage, sizeGb int) error { + return fmt.Errorf("Not Implement ValidateDiskSize") } func (self *SBaseHostDriver) RequestDeleteSnapshotsWithStorage(ctx context.Context, host *models.SHost, snapshot *models.SSnapshot, task taskman.ITask) error { diff --git a/pkg/compute/hostdrivers/kvm.go b/pkg/compute/hostdrivers/kvm.go index 57e9fad69a..b7ca0a0bb2 100644 --- a/pkg/compute/hostdrivers/kvm.go +++ b/pkg/compute/hostdrivers/kvm.go @@ -29,6 +29,10 @@ func (self *SKVMHostDriver) GetHostType() string { return models.HOST_TYPE_HYPERVISOR } +func (self *SKVMHostDriver) ValidateDiskSize(storage *models.SStorage, sizeGb int) error { + return nil +} + func (self *SKVMHostDriver) CheckAndSetCacheImage(ctx context.Context, host *models.SHost, storageCache *models.SStoragecache, task taskman.ITask) error { params := task.GetParams() imageId, err := params.GetString("image_id") diff --git a/pkg/compute/hostdrivers/qcloud.go b/pkg/compute/hostdrivers/qcloud.go index 19c59970e1..473af582bb 100644 --- a/pkg/compute/hostdrivers/qcloud.go +++ b/pkg/compute/hostdrivers/qcloud.go @@ -28,7 +28,7 @@ func (self *SQcloudHostDriver) GetHostType() string { return models.HOST_TYPE_QCLOUD } -func (self *SQcloudHostDriver) ValidateCreateDisk(storage *models.SStorage, sizeGb int) error { +func (self *SQcloudHostDriver) ValidateDiskSize(storage *models.SStorage, sizeGb int) error { if sizeGb%10 != 0 { return fmt.Errorf("The disk size must be a multiple of 10Gb") } diff --git a/pkg/compute/models/disks.go b/pkg/compute/models/disks.go index b75255497a..51f4373e9b 100644 --- a/pkg/compute/models/disks.go +++ b/pkg/compute/models/disks.go @@ -310,10 +310,9 @@ func (manager *SDiskManager) validateDiskOnStorage(diskConfig *SDiskConfig, stor if storage.StorageType != diskConfig.Backend { return httperrors.NewInputParameterError("Storage type[%s] not match backend %s", storage.StorageType, diskConfig.Backend) } - sizeGb := diskConfig.SizeMb >> 10 if host := storage.GetMasterHost(); host != nil { //公有云磁盘大小检查。 - if err := host.GetHostDriver().ValidateCreateDisk(storage, sizeGb); err != nil { + if err := host.GetHostDriver().ValidateDiskSize(storage, diskConfig.SizeMb>>10); err != nil { return httperrors.NewInputParameterError(err.Error()) } } @@ -565,21 +564,26 @@ func (self *SDisk) PerformResize(ctx context.Context, userCred mcclient.TokenCre if err != nil { return nil, err } - size, err := fileutils.GetSizeMb(sizeStr, 'M', 1024) + sizeMb, err := fileutils.GetSizeMb(sizeStr, 'M', 1024) if err != nil { return nil, err } if self.Status != DISK_READY { return nil, httperrors.NewResourceNotReadyError("Resize disk when disk is READY") } - if size < self.DiskSize { + if sizeMb < self.DiskSize { return nil, httperrors.NewUnsupportOperationError("Disk cannot be thrink") } - if size == self.DiskSize { + if sizeMb == self.DiskSize { return nil, nil } - addDisk := size - self.DiskSize + addDisk := sizeMb - self.DiskSize storage := self.GetStorage() + if host := storage.GetMasterHost(); host != nil { + if err := host.GetHostDriver().ValidateDiskSize(storage, sizeMb>>10); err != nil { + return nil, httperrors.NewInputParameterError(err.Error()) + } + } if addDisk > storage.GetFreeCapacity() && !storage.IsEmulated { return nil, httperrors.NewOutOfResourceError("Not enough free space") } @@ -592,7 +596,7 @@ func (self *SDisk) PerformResize(ctx context.Context, userCred mcclient.TokenCre if err := QuotaManager.CheckSetPendingQuota(ctx, userCred, userCred.GetProjectId(), &pendingUsage); err != nil { return nil, httperrors.NewOutOfQuotaError(err.Error()) } - return nil, self.StartDiskResizeTask(ctx, userCred, int64(size), "", &pendingUsage) + return nil, self.StartDiskResizeTask(ctx, userCred, int64(sizeMb), "", &pendingUsage) } func (self *SDisk) GetIStorage() (cloudprovider.ICloudStorage, error) { diff --git a/pkg/compute/models/hostdrivers.go b/pkg/compute/models/hostdrivers.go index fc2cfe89de..2e8d1a5fa0 100644 --- a/pkg/compute/models/hostdrivers.go +++ b/pkg/compute/models/hostdrivers.go @@ -14,7 +14,7 @@ type IHostDriver interface { GetHostType() string CheckAndSetCacheImage(ctx context.Context, host *SHost, storagecache *SStoragecache, task taskman.ITask) error ValidateUpdateDisk(ctx context.Context, userCred mcclient.TokenCredential, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) - ValidateCreateDisk(storage *SStorage, sizeGb int) error + ValidateDiskSize(storage *SStorage, sizeGb int) error RequestPrepareSaveDiskOnHost(ctx context.Context, host *SHost, disk *SDisk, imageId string, task taskman.ITask) error RequestSaveUploadImageOnHost(ctx context.Context, host *SHost, disk *SDisk, imageId string, task taskman.ITask, data jsonutils.JSONObject) error RequestAllocateDiskOnStorage(ctx context.Context, host *SHost, storage *SStorage, disk *SDisk, task taskman.ITask, content *jsonutils.JSONDict) error