From 77716076d5120f38d05b09dfd711b5c159668b5a Mon Sep 17 00:00:00 2001 From: ioito Date: Sat, 15 Jun 2019 14:27:46 +0800 Subject: [PATCH] secgroup-list remove rules --- cmd/climc/shell/secgroups.go | 10 ++++++++- pkg/compute/models/secgroups.go | 37 +++++++++++++++++++++++++++++++-- 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/cmd/climc/shell/secgroups.go b/cmd/climc/shell/secgroups.go index 6005ed9e3a..00d1b5ce23 100644 --- a/cmd/climc/shell/secgroups.go +++ b/cmd/climc/shell/secgroups.go @@ -26,7 +26,9 @@ import ( func init() { type SecGroupsListOptions struct { - Equals string `help:"Secgroup ID or Name, filter secgroups whose rules equals the specified one"` + Equals string `help:"Secgroup ID or Name, filter secgroups whose rules equals the specified one"` + OrderByCache string `help:"Order by cache count" choices:"desc|asc"` + OrderByGuest string `help:"Order by guest count" choices:"desc|asc"` options.BaseListOptions } @@ -43,6 +45,12 @@ func init() { if len(args.Equals) > 0 { params.Add(jsonutils.NewString(args.Equals), "equals") } + if len(args.OrderByCache) > 0 { + params.Add(jsonutils.NewString(args.OrderByCache), "order_by_cache") + } + if len(args.OrderByGuest) > 0 { + params.Add(jsonutils.NewString(args.OrderByGuest), "order_by_guest") + } result, err := modules.SecGroups.List(s, params) if err != nil { return err diff --git a/pkg/compute/models/secgroups.go b/pkg/compute/models/secgroups.go index 4f193e9092..3ac052cd00 100644 --- a/pkg/compute/models/secgroups.go +++ b/pkg/compute/models/secgroups.go @@ -91,6 +91,41 @@ func (manager *SSecurityGroupManager) ListItemFilter(ctx context.Context, q *sql } q = q.In("id", secgroupIds) } + + orderByCache, _ := query.GetString("order_by_cache") + if orderByCache == "asc" || orderByCache == "desc" { + caches := SecurityGroupCacheManager.Query().SubQuery() + cacheQ := caches.Query( + caches.Field("secgroup_id"), + sqlchemy.COUNT("cache_cnt"), + ) + cacheSQ := cacheQ.GroupBy(caches.Field("secgroup_id")).SubQuery() + q = q.LeftJoin(cacheSQ, sqlchemy.Equals(q.Field("id"), cacheSQ.Field("secgroup_id"))) + switch orderByCache { + case "asc": + q = q.Asc(cacheSQ.Field("cache_cnt")) + case "desc": + q = q.Desc(cacheSQ.Field("cache_cnt")) + } + } + + orderByGuest, _ := query.GetString("order_by_guest") + if orderByGuest == "asc" || orderByGuest == "desc" { + guests := GuestManager.Query().SubQuery() + guestQ := guests.Query( + guests.Field("secgrp_id"), + sqlchemy.COUNT("guest_cnt"), + ) + guestSQ := guestQ.GroupBy(guests.Field("secgrp_id")).SubQuery() + q = q.LeftJoin(guestSQ, sqlchemy.Equals(q.Field("id"), guestSQ.Field("secgrp_id"))) + switch orderByGuest { + case "asc": + q = q.Asc(guestSQ.Field("guest_cnt")) + case "desc": + q = q.Desc(guestSQ.Field("guest_cnt")) + } + } + return q, nil } @@ -158,8 +193,6 @@ func (self *SSecurityGroup) GetCustomizeColumns(ctx context.Context, userCred mc extra.Add(jsonutils.NewInt(int64(cnt)), "cache_cnt") extra.Add(jsonutils.NewTimeString(self.CreatedAt), "created_at") extra.Add(jsonutils.NewString(self.Description), "description") - extra.Add(jsonutils.NewString(self.getSecurityRuleString("in")), "in_rules") - extra.Add(jsonutils.NewString(self.getSecurityRuleString("out")), "out_rules") return extra }