From ae92b25707816ed751bd48a2f8e4d1a3a9387bc0 Mon Sep 17 00:00:00 2001 From: mhf Date: Thu, 11 Aug 2022 19:01:12 +0800 Subject: [PATCH] =?UTF-8?q?=E8=99=9A=E6=8B=9F=E6=9C=BA=E3=80=81=E7=A3=81?= =?UTF-8?q?=E7=9B=98=E6=8E=92=E5=BA=8F=E4=B8=8E=E8=BF=87=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/climc/shell/compute/disks.go | 16 +++++++++------- pkg/apis/compute/disk.go | 1 + pkg/apis/compute/guests.go | 1 + pkg/compute/models/disks.go | 18 +++++++++++++++++- pkg/compute/models/guests.go | 10 ++++++++-- pkg/mcclient/options/compute/servers.go | 1 + 6 files changed, 37 insertions(+), 10 deletions(-) diff --git a/cmd/climc/shell/compute/disks.go b/cmd/climc/shell/compute/disks.go index 84896d96e0..aff29860f0 100644 --- a/cmd/climc/shell/compute/disks.go +++ b/cmd/climc/shell/compute/disks.go @@ -45,13 +45,15 @@ func init() { type DiskListOptions struct { options.BaseListOptions - Unused *bool `help:"Show unused disks"` - Share *bool `help:"Show Share storage disks"` - Local *bool `help:"Show Local storage disks"` - Guest string `help:"Guest ID or name"` - Storage string `help:"Storage ID or name"` - Type string `help:"Disk type" choices:"sys|data|swap|volume"` - CloudType string `help:"Public cloud or private cloud" choices:"Public|Private"` + Unused *bool `help:"Show unused disks"` + Share *bool `help:"Show Share storage disks"` + Local *bool `help:"Show Local storage disks"` + Guest string `help:"Guest ID or name"` + GuestStatus string `help:"Guest Status"` + OrderByServer string `help:"Order By Server"` + Storage string `help:"Storage ID or name"` + Type string `help:"Disk type" choices:"sys|data|swap|volume"` + CloudType string `help:"Public cloud or private cloud" choices:"Public|Private"` BillingType string `help:"billing type" choices:"postpaid|prepaid"` diff --git a/pkg/apis/compute/disk.go b/pkg/apis/compute/disk.go index 445a0fd5c6..f810182772 100644 --- a/pkg/apis/compute/disk.go +++ b/pkg/apis/compute/disk.go @@ -143,6 +143,7 @@ type DiskListInput struct { FsFormat string `json:"fs_format"` + OrderByServer string `json:"order_by_server" choices:"asc|desc"` // 镜像 ImageId string `json:"image_id"` // swagger:ignore diff --git a/pkg/apis/compute/guests.go b/pkg/apis/compute/guests.go index 1a87998fb1..6f41a1c5e9 100644 --- a/pkg/apis/compute/guests.go +++ b/pkg/apis/compute/guests.go @@ -74,6 +74,7 @@ type ServerListInput struct { // enum: asc,desc OrderByDisk string `json:"order_by_disk"` + OrderByIp string `json:"order_by_ip"` // 根据ip查找机器 IpAddr string `json:"ip_addr"` diff --git a/pkg/compute/models/disks.go b/pkg/compute/models/disks.go index f0b251e27e..042249cc63 100644 --- a/pkg/compute/models/disks.go +++ b/pkg/compute/models/disks.go @@ -280,7 +280,15 @@ func (manager *SDiskManager) OrderByExtraFields( if err != nil { return nil, errors.Wrap(err, "SBillingResourceBaseManager.OrderByExtraFields") } - + if db.NeedOrderQuery([]string{query.OrderByServer}) { + guestDiskQuery := GuestdiskManager.Query("disk_id", "guest_id").SubQuery() + q = q.LeftJoin(guestDiskQuery, sqlchemy.Equals(q.Field("id"), guestDiskQuery.Field("disk_id"))) + guestQuery := GuestManager.Query().SubQuery() + q.AppendField(q.QueryFields()...) + q.AppendField(guestQuery.Field("name", "guest_name")) + q.Join(guestQuery, sqlchemy.Equals(guestQuery.Field("id"), guestDiskQuery.Field("guest_id"))) + db.OrderByFields(q, []string{query.OrderByServer}, []sqlchemy.IQueryField{guestQuery.Field("name")}) + } q, err = manager.SVirtualResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.VirtualResourceListInput) if err != nil { return nil, errors.Wrap(err, "SVirtualResourceBaseManager.OrderByExtraFields") @@ -296,6 +304,14 @@ func (manager *SDiskManager) QueryDistinctExtraField(q *sqlchemy.SQuery, field s if err == nil { return q, nil } + if field == "guest_status" { + guestDiskQuery := GuestdiskManager.Query("disk_id", "guest_id").SubQuery() + q = q.LeftJoin(guestDiskQuery, sqlchemy.Equals(q.Field("id"), guestDiskQuery.Field("disk_id"))) + guestQuery := GuestManager.Query().SubQuery() + q.AppendField(guestQuery.Field("status", field)).Distinct() + q.Join(guestQuery, sqlchemy.Equals(guestQuery.Field("id"), guestDiskQuery.Field("guest_id"))) + return q, nil + } q, err = manager.SStorageResourceBaseManager.QueryDistinctExtraField(q, field) if err == nil { return q, nil diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 529f4cfa97..d4952b8246 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -167,7 +167,7 @@ type SGuest struct { IsDaemon tristate.TriState `default:"false" list:"admin" create:"admin_optional" update:"admin"` // 最大内网带宽 - InternetMaxBandwidthOut int `nullable:"false" list:"user" create:"optional"` + InternetMaxBandwidthOut int `nullable:"true" list:"user" create:"optional"` // 磁盘吞吐量 Throughput int `nullable:"true" list:"user" create:"optional"` } @@ -671,6 +671,13 @@ func (manager *SGuestManager) OrderByExtraFields(ctx context.Context, q *sqlchem q = q.LeftJoin(guestdiskSQ, sqlchemy.Equals(q.Field("id"), guestdiskSQ.Field("guest_id"))) db.OrderByFields(q, []string{query.OrderByDisk}, []sqlchemy.IQueryField{guestdiskSQ.Field("disks_size")}) } + if db.NeedOrderQuery([]string{query.OrderByIp}) { + guestnet := GuestnetworkManager.Query("guest_id", "ip_addr").SubQuery() + q.AppendField(q.QueryFields()...) + q.AppendField(guestnet.Field("ip_addr")) + q = q.LeftJoin(guestnet, sqlchemy.Equals(q.Field("id"), guestnet.Field("guest_id"))) + db.OrderByFields(q, []string{query.OrderByIp}, []sqlchemy.IQueryField{sqlchemy.INET_ATON(q.Field("ip_addr"))}) + } return q, nil } @@ -3601,7 +3608,6 @@ func _guestResourceCountQuery( } else { gq = GuestManager.Query() } - if len(rangeObjs) > 0 || len(hostTypes) > 0 || len(resourceTypes) > 0 || len(providers) > 0 || len(brands) > 0 || len(cloudEnv) > 0 { gq = filterGuestByRange(gq, rangeObjs, hostTypes, resourceTypes, providers, brands, cloudEnv) } diff --git a/pkg/mcclient/options/compute/servers.go b/pkg/mcclient/options/compute/servers.go index d740610232..6276d5d548 100644 --- a/pkg/mcclient/options/compute/servers.go +++ b/pkg/mcclient/options/compute/servers.go @@ -60,6 +60,7 @@ type ServerListOptions struct { OrderByDisk string `help:"Order by disk size" choices:"asc|desc"` OrderByHost string `help:"Order by host name" choices:"asc|desc"` OrderByNetwork string `help:"Order by network name" choices:"asc|desc"` + OrderByIp string `help:"Order by ip" choices:"asc|desc"` ResourceType string `help:"Resource type" choices:"shared|prepaid|dedicated"`