From ac491f4f58dfa86c8ce7ac842020779013db65fa Mon Sep 17 00:00:00 2001 From: Zexi Li Date: Thu, 6 May 2021 20:53:04 +0800 Subject: [PATCH] feat(region): host list order by server count --- cmd/climc/shell/compute/hosts.go | 2 ++ pkg/apis/compute/host.go | 4 ++++ pkg/compute/models/hosts.go | 11 +++++++++++ 3 files changed, 17 insertions(+) diff --git a/cmd/climc/shell/compute/hosts.go b/cmd/climc/shell/compute/hosts.go index 972e9bc213..2035edd6c1 100644 --- a/cmd/climc/shell/compute/hosts.go +++ b/cmd/climc/shell/compute/hosts.go @@ -60,6 +60,8 @@ func init() { Sn string `help:"find host by sn"` + OrderByServerCount string `help:"Order by server count" choices:"desc|asc"` + options.BaseListOptions } R(&HostListOptions{}, "host-list", "List hosts", func(s *mcclient.ClientSession, opts *HostListOptions) error { diff --git a/pkg/apis/compute/host.go b/pkg/apis/compute/host.go index 45e43731dc..1cb9eeac70 100644 --- a/pkg/apis/compute/host.go +++ b/pkg/apis/compute/host.go @@ -124,6 +124,10 @@ type HostListInput struct { ServerIdForNetwork string `json:"server_id_for_network"` // 宿主机 cpu 架构 CpuArchitecture string `json:"cpu_architecture"` + + // 按虚拟机数量排序 + // enum: asc,desc + OrderByServerCount string `json:"order_by_server_count"` } type HostDetails struct { diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index aa9791cb6a..63d567bdd5 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -490,6 +490,17 @@ func (manager *SHostManager) OrderByExtraFields( if err != nil { return nil, errors.Wrap(err, "SZoneResourceBaseManager.OrderByExtraFields") } + + if db.NeedOrderQuery([]string{query.OrderByServerCount}) { + guests := GuestManager.Query().SubQuery() + guestCounts := guests.Query( + guests.Field("host_id"), + sqlchemy.COUNT("id").Label("guest_count"), + ).GroupBy("host_id").SubQuery() + q = q.LeftJoin(guestCounts, sqlchemy.Equals(q.Field("id"), guestCounts.Field("host_id"))) + db.OrderByFields(q, []string{query.OrderByServerCount}, []sqlchemy.IQueryField{guestCounts.Field("guest_count")}) + } + return q, nil }