From ce64d2dcc024940acb6261ea487f6c1bd8306387 Mon Sep 17 00:00:00 2001 From: Qu Xuan Date: Fri, 29 Oct 2021 14:32:28 +0800 Subject: [PATCH] fix(region): filter vpcs by zone --- pkg/apis/compute/vpcs_const.go | 3 +++ pkg/compute/models/vpcs.go | 22 ++++++++++++++++++++++ pkg/mcclient/options/vpc.go | 1 + 3 files changed, 26 insertions(+) diff --git a/pkg/apis/compute/vpcs_const.go b/pkg/apis/compute/vpcs_const.go index f48cefd7cc..20eb7e6549 100644 --- a/pkg/apis/compute/vpcs_const.go +++ b/pkg/apis/compute/vpcs_const.go @@ -62,6 +62,9 @@ type VpcListInput struct { UsableResourceListInput UsableVpcResourceListInput + // 过滤vpc底下有指定zone的ip子网 + ZoneId string `json:"zone_id"` + // filter by globalvpc Globalvpc string `json:"globalvpc"` diff --git a/pkg/compute/models/vpcs.go b/pkg/compute/models/vpcs.go index 67e45da80a..bb7bb750e3 100644 --- a/pkg/compute/models/vpcs.go +++ b/pkg/compute/models/vpcs.go @@ -1146,6 +1146,28 @@ func (manager *SVpcManager) ListItemFilter( } } + if len(query.ZoneId) > 0 { + zoneObj, err := validators.ValidateModel(userCred, ZoneManager, &query.ZoneId) + if err != nil { + return nil, err + } + region, err := zoneObj.(*SZone).GetRegion() + if err != nil { + return nil, errors.Wrapf(err, "get zone %s region", zoneObj.GetName()) + } + q = q.Equals("cloudregion_id", region.Id) + wires := WireManager.Query().SubQuery() + networks := NetworkManager.Query().SubQuery() + sq := wires.Query(wires.Field("vpc_id")).Join(networks, sqlchemy.Equals(wires.Field("id"), networks.Field("wire_id"))).Filter( + sqlchemy.OR( + sqlchemy.Equals(wires.Field("zone_id"), query.ZoneId), + sqlchemy.IsNullOrEmpty(wires.Field("zone_id")), + ), + ) + q = q.In("id", sq.SubQuery()) + + } + if query.IsDefault != nil { if *query.IsDefault { q = q.IsTrue("is_default") diff --git a/pkg/mcclient/options/vpc.go b/pkg/mcclient/options/vpc.go index 32004e6b46..f3a77a3e32 100644 --- a/pkg/mcclient/options/vpc.go +++ b/pkg/mcclient/options/vpc.go @@ -29,6 +29,7 @@ type VpcListOptions struct { DnsZoneId string `help:"Filter by DnsZone"` InterVpcNetworkId string `help:"Filter by InterVpcNetwork"` ExternalAccessMode string `help:"Filter by external access mode" choices:"distgw|eip|eip-distgw"` + ZoneId string `help:"Filter by zone which has networks"` } func (opts *VpcListOptions) GetContextId() string {