diff --git a/cmd/climc/shell/networks.go b/cmd/climc/shell/networks.go index 8c476d8955..f907ff3450 100644 --- a/cmd/climc/shell/networks.go +++ b/cmd/climc/shell/networks.go @@ -34,6 +34,7 @@ func init() { Host string `help:"search networks attached to a host"` Vpc string `help:"search networks belongs to a VPC"` Region string `help:"search networks belongs to a CloudRegion" json:"cloudregion"` + City string `help:"search networks belongs to a city"` ServerType string `help:"search networks belongs to a ServerType" choices:"guest|baremetal|container|pxe|ipmi"` } R(&NetworkListOptions{}, "network-list", "List networks", func(s *mcclient.ClientSession, opts *NetworkListOptions) error { diff --git a/pkg/compute/models/networks.go b/pkg/compute/models/networks.go index d8193eb493..2ecfeb46a6 100644 --- a/pkg/compute/models/networks.go +++ b/pkg/compute/models/networks.go @@ -1430,6 +1430,18 @@ func (manager *SNetworkManager) ListItemFilter(ctx context.Context, q *sqlchemy. q = q.Filter(sqlchemy.In(q.Field("wire_id"), sq.SubQuery())) } + cityStr, _ := query.GetString("city") + if len(cityStr) > 0 { + regions := CloudregionManager.Query().SubQuery() + wires := WireManager.Query().SubQuery() + vpcs := VpcManager.Query().SubQuery() + sq := wires.Query(wires.Field("id")). + Join(vpcs, sqlchemy.Equals(wires.Field("vpc_id"), vpcs.Field("id"))). + Join(regions, sqlchemy.Equals(regions.Field("id"), vpcs.Field("cloudregion_id"))). + Filter(sqlchemy.Equals(regions.Field("city"), cityStr)) + q = q.Filter(sqlchemy.In(q.Field("wire_id"), sq.SubQuery())) + } + return q, nil }