From 5ceaaf716e300f7fd1c037d4c49bb9ba1557defe Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Wed, 13 Feb 2019 23:39:36 +0800 Subject: [PATCH] update: customize system disk size and backend for each hypervisor --- pkg/compute/guestdrivers/aliyun.go | 16 ++++++++++++++- pkg/compute/guestdrivers/aws.go | 16 ++++++++++++++- pkg/compute/guestdrivers/azure.go | 14 ++++++++++++- pkg/compute/guestdrivers/baremetals.go | 8 ++++++++ pkg/compute/guestdrivers/container.go | 9 +++++++++ pkg/compute/guestdrivers/esxi.go | 9 +++++++++ pkg/compute/guestdrivers/kvm.go | 9 +++++++++ pkg/compute/guestdrivers/qcloud.go | 16 ++++++++++++++- pkg/compute/models/disks.go | 8 +++++--- pkg/compute/models/guestdrivers.go | 3 +++ pkg/compute/models/guests.go | 28 ++++++++++++++++++-------- pkg/compute/options/options.go | 2 +- 12 files changed, 122 insertions(+), 16 deletions(-) diff --git a/pkg/compute/guestdrivers/aliyun.go b/pkg/compute/guestdrivers/aliyun.go index e624b61efb..3bed141d9a 100644 --- a/pkg/compute/guestdrivers/aliyun.go +++ b/pkg/compute/guestdrivers/aliyun.go @@ -31,6 +31,14 @@ func (self *SAliyunGuestDriver) GetHypervisor() string { return models.HYPERVISOR_ALIYUN } +func (self *SAliyunGuestDriver) GetDefaultSysDiskBackend() string { + return models.STORAGE_CLOUD_EFFICIENCY +} + +func (self *SAliyunGuestDriver) GetMinimalSysDiskSizeGb() int { + return 20 +} + func (self *SAliyunGuestDriver) ChooseHostStorage(host *models.SHost, backend string) *models.SStorage { storages := host.GetAttachedStorages("") for i := 0; i < len(storages); i += 1 { @@ -38,7 +46,13 @@ func (self *SAliyunGuestDriver) ChooseHostStorage(host *models.SHost, backend st return &storages[i] } } - for _, stype := range []string{"cloud_efficiency", "cloud_ssd", "cloud", "ephemeral_ssd"} { + for _, stype := range []string{ + models.STORAGE_CLOUD_EFFICIENCY, + models.STORAGE_CLOUD_SSD, + models.STORAGE_CLOUD_ESSD, + models.STORAGE_PUBLIC_CLOUD, + models.STORAGE_EPHEMERAL_SSD, + } { for i := 0; i < len(storages); i += 1 { if storages[i].StorageType == stype { return &storages[i] diff --git a/pkg/compute/guestdrivers/aws.go b/pkg/compute/guestdrivers/aws.go index ad8bf44b90..f40b487413 100644 --- a/pkg/compute/guestdrivers/aws.go +++ b/pkg/compute/guestdrivers/aws.go @@ -29,6 +29,14 @@ func (self *SAwsGuestDriver) GetHypervisor() string { return models.HYPERVISOR_AWS } +func (self *SAwsGuestDriver) GetDefaultSysDiskBackend() string { + return models.STORAGE_GP2_SSD +} + +func (self *SAwsGuestDriver) GetMinimalSysDiskSizeGb() int { + return 10 +} + func (self *SAwsGuestDriver) ChooseHostStorage(host *models.SHost, backend string) *models.SStorage { storages := host.GetAttachedStorages("") for i := 0; i < len(storages); i += 1 { @@ -37,7 +45,13 @@ func (self *SAwsGuestDriver) ChooseHostStorage(host *models.SHost, backend strin } } - for _, stype := range []string{"gp2", "io1", "st1", "sc1", "standard"} { + for _, stype := range []string{ + models.STORAGE_GP2_SSD, + models.STORAGE_IO1_SSD, + models.STORAGE_ST1_HDD, + models.STORAGE_SC1_HDD, + models.STORAGE_STANDARD_HDD, + } { for i := 0; i < len(storages); i += 1 { if storages[i].StorageType == stype { return &storages[i] diff --git a/pkg/compute/guestdrivers/azure.go b/pkg/compute/guestdrivers/azure.go index 6004d216d5..9c94621ef8 100644 --- a/pkg/compute/guestdrivers/azure.go +++ b/pkg/compute/guestdrivers/azure.go @@ -35,6 +35,14 @@ func (self *SAzureGuestDriver) GetHypervisor() string { return models.HYPERVISOR_AZURE } +func (self *SAzureGuestDriver) GetDefaultSysDiskBackend() string { + return models.STORAGE_STANDARD_LRS +} + +func (self *SAzureGuestDriver) GetMinimalSysDiskSizeGb() int { + return 10 +} + func (self *SAzureGuestDriver) ChooseHostStorage(host *models.SHost, backend string) *models.SStorage { storages := host.GetAttachedStorages("") for i := 0; i < len(storages); i += 1 { @@ -42,7 +50,11 @@ func (self *SAzureGuestDriver) ChooseHostStorage(host *models.SHost, backend str return &storages[i] } } - for _, stype := range []string{"standard_lrs", "standardssd_lrs", "premium_lrs"} { + for _, stype := range []string{ + models.STORAGE_STANDARD_LRS, + models.STORAGE_STANDARDSSD_LRS, + models.STORAGE_PREMIUM_LRS, + } { for i := 0; i < len(storages); i += 1 { if storages[i].StorageType == stype { return &storages[i] diff --git a/pkg/compute/guestdrivers/baremetals.go b/pkg/compute/guestdrivers/baremetals.go index 1fb83d52bf..a2d1d1eb84 100644 --- a/pkg/compute/guestdrivers/baremetals.go +++ b/pkg/compute/guestdrivers/baremetals.go @@ -34,6 +34,14 @@ func (self *SBaremetalGuestDriver) GetHypervisor() string { return models.HYPERVISOR_BAREMETAL } +func (self *SBaremetalGuestDriver) GetDefaultSysDiskBackend() string { + return models.STORAGE_LOCAL +} + +func (self *SBaremetalGuestDriver) GetMinimalSysDiskSizeGb() int { + return options.Options.DefaultDiskSizeMB / 1024 +} + func (self *SBaremetalGuestDriver) GetMaxSecurityGroupCount() int { //暂不支持绑定安全组 return 0 diff --git a/pkg/compute/guestdrivers/container.go b/pkg/compute/guestdrivers/container.go index 1aececca16..94eaa5a5b3 100644 --- a/pkg/compute/guestdrivers/container.go +++ b/pkg/compute/guestdrivers/container.go @@ -8,6 +8,7 @@ import ( "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman" "yunion.io/x/onecloud/pkg/compute/models" + "yunion.io/x/onecloud/pkg/compute/options" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/util/httputils" @@ -48,6 +49,14 @@ func (self *SContainerDriver) GetHypervisor() string { return models.HYPERVISOR_CONTAINER } +func (self *SContainerDriver) GetDefaultSysDiskBackend() string { + return models.STORAGE_LOCAL +} + +func (self *SContainerDriver) GetMinimalSysDiskSizeGb() int { + return options.Options.DefaultDiskSizeMB / 1024 +} + func (self *SContainerDriver) RequestGuestCreateAllDisks(ctx context.Context, guest *models.SGuest, task taskman.ITask) error { // do nothing, call next stage task.ScheduleRun(nil) diff --git a/pkg/compute/guestdrivers/esxi.go b/pkg/compute/guestdrivers/esxi.go index 68fbbc9a5a..c00b305307 100644 --- a/pkg/compute/guestdrivers/esxi.go +++ b/pkg/compute/guestdrivers/esxi.go @@ -12,6 +12,7 @@ import ( "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman" "yunion.io/x/onecloud/pkg/compute/models" + "yunion.io/x/onecloud/pkg/compute/options" "yunion.io/x/onecloud/pkg/util/billing" ) @@ -28,6 +29,14 @@ func (self *SESXiGuestDriver) GetHypervisor() string { return models.HYPERVISOR_ESXI } +func (self *SESXiGuestDriver) GetDefaultSysDiskBackend() string { + return models.STORAGE_LOCAL +} + +func (self *SESXiGuestDriver) GetMinimalSysDiskSizeGb() int { + return options.Options.DefaultDiskSizeMB / 1024 +} + func (self *SESXiGuestDriver) RequestSyncConfigOnHost(ctx context.Context, guest *models.SGuest, host *models.SHost, task taskman.ITask) error { task.ScheduleRun(nil) return nil diff --git a/pkg/compute/guestdrivers/kvm.go b/pkg/compute/guestdrivers/kvm.go index 3541098108..7678d5c1af 100644 --- a/pkg/compute/guestdrivers/kvm.go +++ b/pkg/compute/guestdrivers/kvm.go @@ -13,6 +13,7 @@ import ( "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman" "yunion.io/x/onecloud/pkg/compute/models" + "yunion.io/x/onecloud/pkg/compute/options" "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/util/httputils" ) @@ -30,6 +31,14 @@ func (self *SKVMGuestDriver) GetHypervisor() string { return models.HYPERVISOR_KVM } +func (self *SKVMGuestDriver) GetDefaultSysDiskBackend() string { + return models.STORAGE_LOCAL +} + +func (self *SKVMGuestDriver) GetMinimalSysDiskSizeGb() int { + return options.Options.DefaultDiskSizeMB / 1024 +} + func (self *SKVMGuestDriver) RequestDetachDisksFromGuestForDelete(ctx context.Context, guest *models.SGuest, task taskman.ITask) error { subtask, err := taskman.TaskManager.NewTask(ctx, "GuestDetachAllDisksTask", guest, task.GetUserCred(), task.GetParams(), task.GetTaskId(), "", nil) if err != nil { diff --git a/pkg/compute/guestdrivers/qcloud.go b/pkg/compute/guestdrivers/qcloud.go index e816c9e248..90ff86184f 100644 --- a/pkg/compute/guestdrivers/qcloud.go +++ b/pkg/compute/guestdrivers/qcloud.go @@ -33,6 +33,14 @@ func (self *SQcloudGuestDriver) GetHypervisor() string { return models.HYPERVISOR_QCLOUD } +func (self *SQcloudGuestDriver) GetDefaultSysDiskBackend() string { + return models.STORAGE_CLOUD_BASIC +} + +func (self *SQcloudGuestDriver) GetMinimalSysDiskSizeGb() int { + return 50 +} + func (self *SQcloudGuestDriver) ChooseHostStorage(host *models.SHost, backend string) *models.SStorage { storages := host.GetAttachedStorages("") for i := 0; i < len(storages); i++ { @@ -40,7 +48,13 @@ func (self *SQcloudGuestDriver) ChooseHostStorage(host *models.SHost, backend st return &storages[i] } } - for _, stype := range []string{"cloud_basic", "cloud_premium", "cloud_ssd", "local_basic", "local_ssd"} { + for _, stype := range []string{ + models.STORAGE_CLOUD_BASIC, + models.STORAGE_CLOUD_PREMIUM, + models.STORAGE_CLOUD_SSD, + models.STORAGE_LOCAL_BASIC, + models.STORAGE_LOCAL_SSD, + } { for i := 0; i < len(storages); i++ { if storages[i].StorageType == stype { return &storages[i] diff --git a/pkg/compute/models/disks.go b/pkg/compute/models/disks.go index 0ec4c874da..8c51cc3479 100644 --- a/pkg/compute/models/disks.go +++ b/pkg/compute/models/disks.go @@ -1173,9 +1173,11 @@ func parseDiskInfo(ctx context.Context, userCred mcclient.TokenCredential, info } } } - if len(diskConfig.ImageId) > 0 && diskConfig.SizeMb == 0 { - diskConfig.SizeMb = options.Options.DefaultDiskSize // MB - } else if len(diskConfig.ImageId) == 0 && diskConfig.SizeMb == 0 { + // XXX: do not set default disk size here, set it by each hypervisor driver + // if len(diskConfig.ImageId) > 0 && diskConfig.SizeMb == 0 { + // diskConfig.SizeMb = options.Options.DefaultDiskSize // MB + // else + if len(diskConfig.ImageId) == 0 && diskConfig.SizeMb == 0 { return nil, httperrors.NewInputParameterError("Diskinfo not contains either imageID or size") } return &diskConfig, nil diff --git a/pkg/compute/models/guestdrivers.go b/pkg/compute/models/guestdrivers.go index b70c973ab4..57bdd8f8dc 100644 --- a/pkg/compute/models/guestdrivers.go +++ b/pkg/compute/models/guestdrivers.go @@ -19,6 +19,9 @@ type IGuestDriver interface { GetMaxVMemSizeGB() int GetMaxSecurityGroupCount() int + GetDefaultSysDiskBackend() string + GetMinimalSysDiskSizeGb() int + IsSupportedBillingCycle(bc billing.SBillingCycle) bool RequestRenewInstance(guest *SGuest, bc billing.SBillingCycle) (time.Time, error) diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 034c127dbb..8097e19c79 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -715,7 +715,7 @@ func (manager *SGuestManager) ValidateCreateData(ctx context.Context, userCred m var err error var hypervisor string - var rootStorageType string + // var rootStorageType string var osProf osprofile.SOSProfile hypervisor, _ = data.GetString("hypervisor") if hypervisor != HYPERVISOR_CONTAINER { @@ -736,10 +736,10 @@ func (manager *SGuestManager) ValidateCreateData(ctx context.Context, userCred m return nil, httperrors.NewBadRequestError("Miss operate system???") } - if len(diskConfig.Backend) == 0 { - diskConfig.Backend = STORAGE_LOCAL - } - rootStorageType = diskConfig.Backend + // if len(diskConfig.Backend) == 0 { + // diskConfig.Backend = STORAGE_LOCAL + // } + // rootStorageType = diskConfig.Backend data.Add(jsonutils.Marshal(diskConfig), "disk.0") @@ -818,7 +818,7 @@ func (manager *SGuestManager) ValidateCreateData(ctx context.Context, userCred m dataDiskDefs := make([]string, 0) if sku != nil && sku.AttachedDiskCount > 0 { for i := 0; i < sku.AttachedDiskCount; i += 1 { - dataDiskDefs = append(dataDiskDefs, fmt.Sprintf("%dgb:%s", sku.AttachedDiskSizeGB, sku.AttachedDiskType)) + dataDiskDefs = append(dataDiskDefs, fmt.Sprintf("%dg:%s", sku.AttachedDiskSizeGB, sku.AttachedDiskType)) } } @@ -832,6 +832,18 @@ func (manager *SGuestManager) ValidateCreateData(ctx context.Context, userCred m dataDiskDefs = append(dataDiskDefs, diskJson) } + rootDiskConfig, err := parseDiskInfo(ctx, userCred, jsonArray[0]) + if err != nil { + return nil, httperrors.NewGeneralError(err) // should no error + } + if len(rootDiskConfig.Backend) == 0 { + rootDiskConfig.Backend = GetDriver(hypervisor).GetDefaultSysDiskBackend() + } + if rootDiskConfig.SizeMb == 0 { + rootDiskConfig.SizeMb = GetDriver(hypervisor).GetMinimalSysDiskSizeGb() * 1024 + } + data.Set("disk.0", jsonutils.Marshal(rootDiskConfig)) + for i := 0; i < len(dataDiskDefs); i += 1 { diskConfig, err := parseDiskInfo(ctx, userCred, jsonutils.NewString(dataDiskDefs[i])) if err != nil { @@ -841,12 +853,12 @@ func (manager *SGuestManager) ValidateCreateData(ctx context.Context, userCred m return nil, httperrors.NewBadRequestError("Snapshot error: disk index %d > 0 but disk type is %s", i+1, DISK_TYPE_SYS) } if len(diskConfig.Backend) == 0 { - diskConfig.Backend = rootStorageType + diskConfig.Backend = rootDiskConfig.Backend } if len(diskConfig.Driver) == 0 { diskConfig.Driver = osProf.DiskDriver } - data.Add(jsonutils.Marshal(diskConfig), fmt.Sprintf("disk.%d", i+1)) + data.Set(fmt.Sprintf("disk.%d", i+1), jsonutils.Marshal(diskConfig)) } resourceTypeStr := jsonutils.GetAnyString(data, []string{"resource_type"}) diff --git a/pkg/compute/options/options.go b/pkg/compute/options/options.go index f792d42279..2f45c8cc6f 100644 --- a/pkg/compute/options/options.go +++ b/pkg/compute/options/options.go @@ -19,7 +19,7 @@ type ComputeOptions struct { DefaultSecurityRules string `help:"Default security rules" default:"allow any"` DefaultAdminSecurityRules string `help:"Default admin security rules" default:""` - DefaultDiskSize int `default:"30720" help:"Default disk size in MB if not specified, default to 30GiB"` + DefaultDiskSizeMB int `default:"30720" help:"Default disk size in MB if not specified, default to 30GiB" json:"default_disk_size"` EnablePendingDelete bool `default:"true" help:"Turn on/off pending delete VM and disk, default is on"` PendingDeleteCheckSeconds int `default:"3600" help:"How long to wait to scan pending delete VM or disks, default is 1 hour"`