From ce04b4d4a92b1aba57172f2c7d89d7c649f6f785 Mon Sep 17 00:00:00 2001 From: wanyaoqi Date: Tue, 19 Mar 2019 21:40:29 +0800 Subject: [PATCH] servers filter by vpc --- pkg/compute/models/guests.go | 28 ++++++++++++++++++++++++++++ pkg/mcclient/options/servers.go | 1 + 2 files changed, 29 insertions(+) diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 0f2f09831c..b80e2d875b 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -395,6 +395,23 @@ func (manager *SGuestManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQ q = q.In("host_id", sq) } + vpcFilter, err := queryDict.GetString("vpc") + if err == nil { + IVpc, err := VpcManager.FetchByIdOrName(userCred, vpcFilter) + if err != nil { + return nil, httperrors.NewResourceNotFoundError("Vpc %s not found", vpcFilter) + } + vpc := IVpc.(*SVpc) + guestnetwork := GuestnetworkManager.Query().SubQuery() + network := NetworkManager.Query().SubQuery() + wire := WireManager.Query().SubQuery() + sq := guestnetwork.Query(guestnetwork.Field("guest_id")).Join(network, + sqlchemy.Equals(guestnetwork.Field("network_id"), network.Field("id"))). + Join(wire, sqlchemy.Equals(network.Field("wire_id"), wire.Field("id"))). + Filter(sqlchemy.Equals(wire.Field("vpc_id"), vpc.Id)).SubQuery() + q = q.In("id", sq) + } + diskFilter, _ := queryDict.GetString("disk") if len(diskFilter) > 0 { diskI, _ := DiskManager.FetchByIdOrName(userCred, diskFilter) @@ -1366,6 +1383,17 @@ func (self *SGuest) moreExtraInfo(extra *jsonutils.JSONDict) *jsonutils.JSONDict extra.Add(jsonutils.JSONTrue, "can_recycle") } + guestnetworks, _ := self.GetNetworks("") + if len(guestnetworks) > 0 { + guestnetwork := guestnetworks[0] + network := guestnetwork.GetNetwork() + if network != nil { + vpc := network.GetVpc() + extra.Set("vpc_id", jsonutils.NewString(vpc.Id)) + extra.Set("vpc", jsonutils.NewString(vpc.Name)) + } + } + return extra } diff --git a/pkg/mcclient/options/servers.go b/pkg/mcclient/options/servers.go index 179304db20..97ac175e31 100644 --- a/pkg/mcclient/options/servers.go +++ b/pkg/mcclient/options/servers.go @@ -24,6 +24,7 @@ type ServerListOptions struct { WithoutEip *bool `help:"Show Servers without EIP"` OsType string `help:"OS Type" choices:"linux|windows|vmware"` OrderByDisk string `help:"Order by disk" choices:"asc|desc"` + Vpc string `help:"Vpc id or name"` ResourceType string `help:"Resource type" choices:"shared|prepaid|dedicated"`