From 52bd9525f317b6c71cdeb2697c340851e9ef7f19 Mon Sep 17 00:00:00 2001 From: ioito Date: Tue, 9 Jul 2019 17:36:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=BC=E5=AE=B9zone=E5=8F=8Ausable=E5=8F=82?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/apis/compute/network_const.go | 5 +++++ pkg/compute/models/networks.go | 18 +++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/pkg/apis/compute/network_const.go b/pkg/apis/compute/network_const.go index a6c86bea30..f35926e05c 100644 --- a/pkg/apis/compute/network_const.go +++ b/pkg/apis/compute/network_const.go @@ -49,4 +49,9 @@ var ( NETWORK_TYPE_PXE, NETWORK_TYPE_IPMI, } + + REGINAL_NETWORK_PROVIDERS = []string{ + CLOUD_PROVIDER_HUAWEI, + CLOUD_PROVIDER_UCLOUD, + } ) diff --git a/pkg/compute/models/networks.go b/pkg/compute/models/networks.go index a26dc1af48..8cc12eae62 100644 --- a/pkg/compute/models/networks.go +++ b/pkg/compute/models/networks.go @@ -1506,8 +1506,20 @@ func (manager *SNetworkManager) ListItemFilter(ctx context.Context, q *sqlchemy. if err != nil { return nil, httperrors.NewNotFoundError("Zone %s not found", zoneStr) } - sq := WireManager.Query("id").Equals("zone_id", zoneObj.GetId()) - q = q.Filter(sqlchemy.In(q.Field("wire_id"), sq.SubQuery())) + zone := zoneObj.(*SZone) + region := zone.GetRegion() + if utils.IsInStringArray(region.Provider, api.REGINAL_NETWORK_PROVIDERS) { + 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"))). + Filter(sqlchemy.Equals(vpcs.Field("cloudregion_id"), region.Id)) + q = q.Filter(sqlchemy.In(q.Field("wire_id"), sq.SubQuery())) + } else { + sq := WireManager.Query("id").Equals("zone_id", zoneObj.GetId()) + q = q.Filter(sqlchemy.In(q.Field("wire_id"), sq.SubQuery())) + } } vpcStr, _ := query.GetString("vpc") @@ -1547,7 +1559,7 @@ func (manager *SNetworkManager) ListItemFilter(ctx context.Context, q *sqlchemy. sq := wires.Query(wires.Field("id")). Join(vpcs, sqlchemy.Equals(wires.Field("vpc_id"), vpcs.Field("id"))). - Join(zones, sqlchemy.Equals(wires.Field("zone_id"), zones.Field("id"))). + Join(zones, sqlchemy.OR(sqlchemy.Equals(wires.Field("zone_id"), zones.Field("id")), sqlchemy.IsNullOrEmpty(wires.Field("zone_id")))). Join(regions, sqlchemy.Equals(zones.Field("cloudregion_id"), regions.Field("id"))). Filter(sqlchemy.AND( sqlchemy.Equals(vpcs.Field("status"), api.VPC_STATUS_AVAILABLE),