Merge pull request #1044 in YUNIONIO/onecloud from ~QIUJIAN/onecloud:hotfix/qj-guest-driver-sysdisk-info to release/2.4.0

* commit '5ceaaf716e300f7fd1c037d4c49bb9ba1557defe':
  update: customize system disk size and backend for each hypervisor
This commit is contained in:
邱剑
2019-02-15 12:09:44 +08:00
12 changed files with 122 additions and 16 deletions
+15 -1
View File
@@ -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]
+15 -1
View File
@@ -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]
+13 -1
View File
@@ -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]
+8
View File
@@ -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
+9
View File
@@ -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)
+9
View File
@@ -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
+9
View File
@@ -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 {
+15 -1
View File
@@ -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]
+5 -3
View File
@@ -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
+3
View File
@@ -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)
+20 -8
View File
@@ -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"})
+1 -1
View File
@@ -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"`