From 18e1b5877324f08e48d7bf79d20fb2f5579696ae Mon Sep 17 00:00:00 2001 From: TangBin Date: Thu, 27 Dec 2018 19:55:48 +0800 Subject: [PATCH 1/4] bufix & add skus guest count --- pkg/compute/models/skus.go | 73 ++++++++++++++++++++++++++++++-- pkg/mcclient/modules/mod_skus.go | 2 +- 2 files changed, 70 insertions(+), 5 deletions(-) diff --git a/pkg/compute/models/skus.go b/pkg/compute/models/skus.go index 309719686e..4e356416aa 100644 --- a/pkg/compute/models/skus.go +++ b/pkg/compute/models/skus.go @@ -4,6 +4,7 @@ import ( "context" "database/sql" "fmt" + "sort" "strconv" "yunion.io/x/jsonutils" @@ -101,6 +102,23 @@ type SServerSku struct { Provider string `width:"64" charset:"ascii" nullable:"true" list:"user" create:"admin_optional" update:"admin"` } +func sliceToJsonObject(items []int) jsonutils.JSONObject { + sort.Slice(items, func(i, j int) bool { + if items[i] < items[j] { + return true + } + + return false + }) + + ret := jsonutils.NewArray() + for _, item := range items { + ret.Add(jsonutils.NewInt(int64(item))) + } + + return ret +} + func inWhiteList(provider string) bool { // provider 字段为空时表示私有云套餐 if len(provider) == 0 { @@ -130,6 +148,44 @@ func (self *SServerSku) AllowGetDetails(ctx context.Context, userCred mcclient.T return true } +func (self *SServerSku) GetCustomizeColumns(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) *jsonutils.JSONDict { + extra := self.SStandaloneResourceBase.GetCustomizeColumns(ctx, userCred, query) + + var q *sqlchemy.SQuery + if len(self.ZoneId) > 0 { + hostTable := HostManager.Query().SubQuery() + guestTable := GuestManager.Query().SubQuery() + q = guestTable.Query().LeftJoin(hostTable, sqlchemy.Equals(hostTable.Field("id"), guestTable.Field("host_id"))) + q = q.Filter(sqlchemy.Equals(hostTable.Field("zone_id"), self.ZoneId)) + } else { + q = GuestManager.Query() + } + + q = q.Equals("instance_type", self.GetName()) + count := q.Count() + extra.Add(jsonutils.NewInt(int64(count)), "total_guest_count") + return extra +} + +func (self *SServerSku) GetExtraDetails(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) *jsonutils.JSONDict { + extra := self.SStandaloneResourceBase.GetExtraDetails(ctx, userCred, query) + + var q *sqlchemy.SQuery + if len(self.ZoneId) > 0 { + hostTable := HostManager.Query().SubQuery() + guestTable := GuestManager.Query().SubQuery() + q = guestTable.Query().LeftJoin(hostTable, sqlchemy.Equals(hostTable.Field("id"), guestTable.Field("host_id"))) + q = q.Filter(sqlchemy.Equals(hostTable.Field("zone_id"), self.ZoneId)) + } else { + q = GuestManager.Query() + } + + q = q.Equals("instance_type", self.GetName()) + count := q.Count() + extra.Add(jsonutils.NewInt(int64(count)), "total_guest_count") + return extra +} + func (manager *SServerSkuManager) AllowCreateItem(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool { return db.IsAdminAllowCreate(userCred, manager) } @@ -282,6 +338,15 @@ func (self *SServerSkuManager) GetPropertyInstanceSpecs(ctx context.Context, use } skus := make([]SServerSku, 0) + postpaid, _ := query.GetString("postpaid_status") + if len(postpaid) > 0 { + q.Equals("postpaid_status", postpaid) + } + + prepaid, _ := query.GetString("prepaid_status") + if len(prepaid) > 0 { + q.Equals("prepaid_status", prepaid) + } q = q.GroupBy(q.Field("cpu_core_count"), q.Field("memory_size_mb")) q = q.Asc(q.Field("cpu_core_count"), q.Field("memory_size_mb")) err := q.All(&skus) @@ -291,7 +356,7 @@ func (self *SServerSkuManager) GetPropertyInstanceSpecs(ctx context.Context, use } cpus := jsonutils.NewArray() - mems_mb := jsonutils.NewArray() + mems_mb := []int{} cpu_mems_mb := map[string][]int{} mems := map[int]bool{} @@ -306,7 +371,7 @@ func (self *SServerSkuManager) GetPropertyInstanceSpecs(ctx context.Context, use } if _, exists := mems[nm]; !exists { - mems_mb.Add(jsonutils.NewInt(int64(nm))) + mems_mb = append(mems_mb, nm) mems[nm] = true } @@ -320,7 +385,7 @@ func (self *SServerSkuManager) GetPropertyInstanceSpecs(ctx context.Context, use ret := jsonutils.NewDict() ret.Add(cpus, "cpus") - ret.Add(mems_mb, "mems_mb") + ret.Add(sliceToJsonObject(mems_mb), "mems_mb") r_obj := jsonutils.Marshal(&cpu_mems_mb) ret.Add(r_obj, "cpu_mems_mb") @@ -497,7 +562,7 @@ func (manager *SServerSkuManager) ListItemFilter(ctx context.Context, q *sqlchem prepaid, _ := query.GetString("prepaid_status") if len(prepaid) > 0 { - q.Equals("prepaid_status", postpaid) + q.Equals("prepaid_status", prepaid) } // 当查询私有云时,需要忽略zone参数 diff --git a/pkg/mcclient/modules/mod_skus.go b/pkg/mcclient/modules/mod_skus.go index 9a21846592..38446597af 100644 --- a/pkg/mcclient/modules/mod_skus.go +++ b/pkg/mcclient/modules/mod_skus.go @@ -32,7 +32,7 @@ func init() { "Attached_disk_size_gb", "Attached_disk_count", "Data_disk_types", "Data_disk_max_count", "Nic_max_count", "Cloudregion_id", "Zone_id", "Provider", "Postpaid_status", "Prepaid_status"}, - []string{})} + []string{"Total_guest_count"})} register(&CloudmetaSkus) registerCompute(&ServerSkus) From e757fdd5929f0da272171d89258476642b682c79 Mon Sep 17 00:00:00 2001 From: TangBin Date: Thu, 27 Dec 2018 20:00:31 +0800 Subject: [PATCH 2/4] move duplicate code to util func --- pkg/compute/models/skus.go | 43 +++++++++++++++----------------------- 1 file changed, 17 insertions(+), 26 deletions(-) diff --git a/pkg/compute/models/skus.go b/pkg/compute/models/skus.go index 4e356416aa..c16c672df6 100644 --- a/pkg/compute/models/skus.go +++ b/pkg/compute/models/skus.go @@ -140,6 +140,21 @@ func genInstanceType(family string, cpu, mem_mb int64) (string, error) { return fmt.Sprintf("ecs.%s.c%dm%d", family, cpu, mem_mb/1024), nil } +func instanceRelatedGuestCount(self *SServerSku) int { + var q *sqlchemy.SQuery + if len(self.ZoneId) > 0 { + hostTable := HostManager.Query().SubQuery() + guestTable := GuestManager.Query().SubQuery() + q = guestTable.Query().LeftJoin(hostTable, sqlchemy.Equals(hostTable.Field("id"), guestTable.Field("host_id"))) + q = q.Filter(sqlchemy.Equals(hostTable.Field("zone_id"), self.ZoneId)) + } else { + q = GuestManager.Query() + } + + q = q.Equals("instance_type", self.GetName()) + return q.Count() +} + func (self *SServerSkuManager) AllowListItems(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) bool { return true } @@ -150,38 +165,14 @@ func (self *SServerSku) AllowGetDetails(ctx context.Context, userCred mcclient.T func (self *SServerSku) GetCustomizeColumns(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) *jsonutils.JSONDict { extra := self.SStandaloneResourceBase.GetCustomizeColumns(ctx, userCred, query) - - var q *sqlchemy.SQuery - if len(self.ZoneId) > 0 { - hostTable := HostManager.Query().SubQuery() - guestTable := GuestManager.Query().SubQuery() - q = guestTable.Query().LeftJoin(hostTable, sqlchemy.Equals(hostTable.Field("id"), guestTable.Field("host_id"))) - q = q.Filter(sqlchemy.Equals(hostTable.Field("zone_id"), self.ZoneId)) - } else { - q = GuestManager.Query() - } - - q = q.Equals("instance_type", self.GetName()) - count := q.Count() + count := instanceRelatedGuestCount(self) extra.Add(jsonutils.NewInt(int64(count)), "total_guest_count") return extra } func (self *SServerSku) GetExtraDetails(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) *jsonutils.JSONDict { extra := self.SStandaloneResourceBase.GetExtraDetails(ctx, userCred, query) - - var q *sqlchemy.SQuery - if len(self.ZoneId) > 0 { - hostTable := HostManager.Query().SubQuery() - guestTable := GuestManager.Query().SubQuery() - q = guestTable.Query().LeftJoin(hostTable, sqlchemy.Equals(hostTable.Field("id"), guestTable.Field("host_id"))) - q = q.Filter(sqlchemy.Equals(hostTable.Field("zone_id"), self.ZoneId)) - } else { - q = GuestManager.Query() - } - - q = q.Equals("instance_type", self.GetName()) - count := q.Count() + count := instanceRelatedGuestCount(self) extra.Add(jsonutils.NewInt(int64(count)), "total_guest_count") return extra } From 17db0eeb6f2ed4c92cebace1831c2ba41f83cfb6 Mon Sep 17 00:00:00 2001 From: TangBin Date: Thu, 27 Dec 2018 20:02:37 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=9B=B4=E6=96=B0sku=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E5=85=B3=E8=81=94=E4=B8=BB=E6=9C=BA=E6=95=B0=E9=87=8F=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/compute/models/skus.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/compute/models/skus.go b/pkg/compute/models/skus.go index c16c672df6..aa52e448cc 100644 --- a/pkg/compute/models/skus.go +++ b/pkg/compute/models/skus.go @@ -140,7 +140,7 @@ func genInstanceType(family string, cpu, mem_mb int64) (string, error) { return fmt.Sprintf("ecs.%s.c%dm%d", family, cpu, mem_mb/1024), nil } -func instanceRelatedGuestCount(self *SServerSku) int { +func skuRelatedGuestCount(self *SServerSku) int { var q *sqlchemy.SQuery if len(self.ZoneId) > 0 { hostTable := HostManager.Query().SubQuery() @@ -165,14 +165,14 @@ func (self *SServerSku) AllowGetDetails(ctx context.Context, userCred mcclient.T func (self *SServerSku) GetCustomizeColumns(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) *jsonutils.JSONDict { extra := self.SStandaloneResourceBase.GetCustomizeColumns(ctx, userCred, query) - count := instanceRelatedGuestCount(self) + count := skuRelatedGuestCount(self) extra.Add(jsonutils.NewInt(int64(count)), "total_guest_count") return extra } func (self *SServerSku) GetExtraDetails(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) *jsonutils.JSONDict { extra := self.SStandaloneResourceBase.GetExtraDetails(ctx, userCred, query) - count := instanceRelatedGuestCount(self) + count := skuRelatedGuestCount(self) extra.Add(jsonutils.NewInt(int64(count)), "total_guest_count") return extra } From 896e6dc79e97ebda39b6b596ae0bd975863baeac Mon Sep 17 00:00:00 2001 From: TangBin Date: Fri, 28 Dec 2018 10:38:07 +0800 Subject: [PATCH 4/4] fix sql query --- pkg/compute/models/skus.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/compute/models/skus.go b/pkg/compute/models/skus.go index aa52e448cc..5f1cd01476 100644 --- a/pkg/compute/models/skus.go +++ b/pkg/compute/models/skus.go @@ -145,7 +145,7 @@ func skuRelatedGuestCount(self *SServerSku) int { if len(self.ZoneId) > 0 { hostTable := HostManager.Query().SubQuery() guestTable := GuestManager.Query().SubQuery() - q = guestTable.Query().LeftJoin(hostTable, sqlchemy.Equals(hostTable.Field("id"), guestTable.Field("host_id"))) + q = guestTable.Query().Join(hostTable, sqlchemy.Equals(hostTable.Field("id"), guestTable.Field("host_id"))) q = q.Filter(sqlchemy.Equals(hostTable.Field("zone_id"), self.ZoneId)) } else { q = GuestManager.Query()