From 19afa629e6d3d7369f179d58fb7a97b86ac97ebd Mon Sep 17 00:00:00 2001 From: TangBin Date: Sat, 1 Dec 2018 11:24:19 +0800 Subject: [PATCH 1/3] InstanceTypeCategory chaset --- pkg/compute/models/skus.go | 47 +++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/pkg/compute/models/skus.go b/pkg/compute/models/skus.go index f7b3e7eccb..5a9ddf37f5 100644 --- a/pkg/compute/models/skus.go +++ b/pkg/compute/models/skus.go @@ -48,7 +48,7 @@ type SServerSku struct { // SkuId string `width:"64" charset:"ascii" nullable:"false" list:"user" create:"admin_required"` // x2.large InstanceTypeFamily string `width:"32" charset:"ascii" nullable:"false" list:"user" create:"admin_optional" update:"admin"` // x2 - InstanceTypeCategory string `width:"32" charset:"ascii" nullable:"false" list:"user" create:"admin_optional" update:"admin"` // 通用型 + InstanceTypeCategory string `width:"32" charset:"utf8" nullable:"false" list:"user" create:"admin_optional" update:"admin"` // 通用型 CpuCoreCount int `nullable:"false" list:"user" create:"admin_required" update:"admin"` MemorySizeMB int `nullable:"false" list:"user" create:"admin_required" update:"admin"` @@ -80,6 +80,16 @@ type SServerSku struct { Provider string `width:"64" charset:"ascii" nullable:"false" list:"user" create:"admin_optional" update:"admin"` } +func inWhiteList(provider string) bool { + // 只有为true的hypervisor才进行创建和更新操作 + switch provider { + case HYPERVISOR_ESXI, HYPERVISOR_KVM: + return true + default: + return false + } +} + func (self *SServerSkuManager) AllowListItems(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) bool { return true } @@ -94,6 +104,15 @@ func (self *SServerSkuManager) ValidateCreateData(ctx context.Context, query jsonutils.JSONObject, data *jsonutils.JSONDict, ) (*jsonutils.JSONDict, error) { + provider, err := data.GetString("provider") + if err != nil || len(provider) == 0 { + return nil, httperrors.NewMissingParameterError("provider") + } + + if !inWhiteList(provider) { + return nil, httperrors.NewInputParameterError("can not create with provider %s", provider) + } + regionStr := jsonutils.GetAnyString(data, []string{"region", "region_id", "cloudregion", "cloudregion_id"}) if len(regionStr) > 0 { regionObj, err := CloudregionManager.FetchByIdOrName(userCred, regionStr) @@ -151,11 +170,24 @@ func (self *SServerSkuManager) FetchByZoneId(zoneId string, name string) (db.IMo } } +func (self *SServerSku) AllowUpdateItem(ctx context.Context, userCred mcclient.TokenCredential) bool { + if self.SStandaloneResourceBase.AllowUpdateItem(ctx, userCred) == false { + return false + } + + return inWhiteList(self.Provider) +} + func (self *SServerSku) ValidateUpdateData( ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) { + provider, err := data.GetString("provider") + if err == nil && !inWhiteList(provider) { + return nil, httperrors.NewInputParameterError("can not create with provider %s", provider) + } + zoneStr := jsonutils.GetAnyString(data, []string{"zone", "zone_id"}) if len(zoneStr) > 0 { zoneObj, err := ZoneManager.FetchByIdOrName(userCred, zoneStr) @@ -170,6 +202,19 @@ func (self *SServerSku) ValidateUpdateData( return self.SStandaloneResourceBase.ValidateUpdateData(ctx, userCred, query, data) } +func (self *SServerSku) AllowDeleteItem(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool { + if !inWhiteList(self.Provider) { + return false + } + + count := GuestManager.Query().Equals("sku_id", self.Id).Count() + if count == 0 { + return self.SStandaloneResourceBase.AllowDeleteItem(ctx, userCred, query, data) + } else { + return false + } +} + func (self *SServerSku) GetZoneExternalId() (string, error) { zoneObj, err := ZoneManager.FetchById(self.ZoneId) if err != nil { From cec80f4a62dac5cb0acb1849f600d89e5c2e57ba Mon Sep 17 00:00:00 2001 From: TangBin Date: Sat, 1 Dec 2018 12:47:21 +0800 Subject: [PATCH 2/3] skus update --- cmd/climc/shell/skus.go | 11 +++++++---- pkg/compute/models/guests.go | 4 +++- pkg/compute/models/skus.go | 6 +++--- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/cmd/climc/shell/skus.go b/cmd/climc/shell/skus.go index 57b135e78f..2ce4465751 100644 --- a/cmd/climc/shell/skus.go +++ b/cmd/climc/shell/skus.go @@ -40,11 +40,13 @@ func init() { CpuCoreCount int `help:"Cpu Count" required:"true" positional:"true"` MemorySizeMB int `help:"Memory MB" required:"true" positional:"true"` + OsName *string `help:"OS name/type" choices:"Linux|Windows|Any" default:"Any"` SkuFamily *string `help:"sku family"` SkuCategory *string `help:"sku category" choices:"general_purpose|compute_optimized|memory_optimized|storage_optimized|hardware_accelerated|high_memory|high_storage"` - SysDiskResizable *bool `help:"system disk is resizable"` - SysDiskMaxSizeGB *int `help:"system disk maximal size in gb"` + SysDiskResizable *bool `help:"system disk is resizable"` + SysDiskType *string `help:"system disk type" default:"local" choices:"local"` + SysDiskMaxSizeGB *int `help:"system disk maximal size in gb"` AttachedDiskType *string `help:"attached data disk type"` AttachedDiskSizeGB *int `help:"attached data disk size in GB"` @@ -59,8 +61,9 @@ func init() { GPUCount *int `help:"GPU count"` GPUAttachable *bool `help:"Allow attach GPU"` - Zone *string `help:"Zone ID or name"` - Region *string `help:"Region ID or name"` + Zone *string `help:"Zone ID or name"` + Region *string `help:"Region ID or name"` + Provider *string `help:"Provider name" choices:"kvm|esxi"` } R(&ServerSkusCreateOptions{}, "server-sku-create", "Create a server sku record", func(s *mcclient.ClientSession, args *ServerSkusCreateOptions) error { params, err := options.StructToParams(args) diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index a47f76d641..a2ba90e945 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -797,7 +797,9 @@ func (manager *SGuestManager) ValidateCreateData(ctx context.Context, userCred m sku_id, _ := data.GetString("sku_id") if len(sku_id) > 0 { sku_id, vcpuCount, vmemSize, err := validateSkuData(sku_id) - if err != nil { + if err == sql.ErrNoRows { + return nil, httperrors.NewResourceNotFoundError2("sku_id", sku_id) + } else if err != nil { return nil, err } diff --git a/pkg/compute/models/skus.go b/pkg/compute/models/skus.go index 5a9ddf37f5..adcab231a2 100644 --- a/pkg/compute/models/skus.go +++ b/pkg/compute/models/skus.go @@ -48,15 +48,15 @@ type SServerSku struct { // SkuId string `width:"64" charset:"ascii" nullable:"false" list:"user" create:"admin_required"` // x2.large InstanceTypeFamily string `width:"32" charset:"ascii" nullable:"false" list:"user" create:"admin_optional" update:"admin"` // x2 - InstanceTypeCategory string `width:"32" charset:"utf8" nullable:"false" list:"user" create:"admin_optional" update:"admin"` // 通用型 + InstanceTypeCategory string `width:"32" charset:"utf8" nullable:"false" list:"user" create:"admin_optional" update:"admin"` // 通用型 CpuCoreCount int `nullable:"false" list:"user" create:"admin_required" update:"admin"` MemorySizeMB int `nullable:"false" list:"user" create:"admin_required" update:"admin"` - OsName string `width:"32" charset:"ascii" nullable:"false" list:"user" create:"admin_required" update:"admin"` // windows|linux|any + OsName string `width:"32" charset:"ascii" nullable:"false" list:"user" create:"admin_required" update:"admin" default:"Any"` // Windows|Linux|Any SysDiskResizable bool `default:"true" nullable:"false" list:"user" create:"admin_optional" update:"admin"` - SysDiskType string `width:"32" charset:"ascii" nullable:"false" list:"user" create:"admin_required" update:"admin"` + SysDiskType string `width:"32" charset:"ascii" nullable:"false" list:"user" create:"admin_required" update:"admin" default:"local"` SysDiskMinSizeGB int `nullable:"false" list:"user" create:"admin_optional" update:"admin"` // not required。 windows比较新的版本都是50G左右。 SysDiskMaxSizeGB int `nullable:"false" list:"user" create:"admin_optional" update:"admin"` // not required From 8d4266afad4f0174ed88f6586857a070de921a5f Mon Sep 17 00:00:00 2001 From: TangBin Date: Sat, 1 Dec 2018 12:52:40 +0800 Subject: [PATCH 3/3] bugfix --- pkg/compute/models/guests.go | 3 +-- pkg/compute/models/skus.go | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index a2ba90e945..950445c3ad 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -8,7 +8,6 @@ import ( "strconv" "strings" "time" - "yunion.io/x/jsonutils" "yunion.io/x/log" "yunion.io/x/pkg/tristate" @@ -798,7 +797,7 @@ func (manager *SGuestManager) ValidateCreateData(ctx context.Context, userCred m if len(sku_id) > 0 { sku_id, vcpuCount, vmemSize, err := validateSkuData(sku_id) if err == sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError2("sku_id", sku_id) + return nil, httperrors.NewResourceNotFoundError2(ServerSkuManager.Keyword(), sku_id) } else if err != nil { return nil, err } diff --git a/pkg/compute/models/skus.go b/pkg/compute/models/skus.go index adcab231a2..ebcbcc3fa8 100644 --- a/pkg/compute/models/skus.go +++ b/pkg/compute/models/skus.go @@ -56,7 +56,7 @@ type SServerSku struct { OsName string `width:"32" charset:"ascii" nullable:"false" list:"user" create:"admin_required" update:"admin" default:"Any"` // Windows|Linux|Any SysDiskResizable bool `default:"true" nullable:"false" list:"user" create:"admin_optional" update:"admin"` - SysDiskType string `width:"32" charset:"ascii" nullable:"false" list:"user" create:"admin_required" update:"admin" default:"local"` + SysDiskType string `width:"32" charset:"ascii" nullable:"false" list:"user" create:"admin_required" update:"admin"` SysDiskMinSizeGB int `nullable:"false" list:"user" create:"admin_optional" update:"admin"` // not required。 windows比较新的版本都是50G左右。 SysDiskMaxSizeGB int `nullable:"false" list:"user" create:"admin_optional" update:"admin"` // not required