From 6ee87a7009229d0db65ce318616f35f7ce2a6efe Mon Sep 17 00:00:00 2001 From: Zexi Date: Tue, 30 Jul 2019 17:29:19 +0800 Subject: [PATCH] region capability: fix regional public network not found --- pkg/apis/compute/network_const.go | 2 +- pkg/compute/models/capabilities.go | 20 +++++++++++++++++--- pkg/compute/models/networks.go | 2 +- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/pkg/apis/compute/network_const.go b/pkg/apis/compute/network_const.go index f35926e05c..d1a487d598 100644 --- a/pkg/apis/compute/network_const.go +++ b/pkg/apis/compute/network_const.go @@ -50,7 +50,7 @@ var ( NETWORK_TYPE_IPMI, } - REGINAL_NETWORK_PROVIDERS = []string{ + REGIONAL_NETWORK_PROVIDERS = []string{ CLOUD_PROVIDER_HUAWEI, CLOUD_PROVIDER_UCLOUD, } diff --git a/pkg/compute/models/capabilities.go b/pkg/compute/models/capabilities.go index 72049c07a8..1876cb4188 100644 --- a/pkg/compute/models/capabilities.go +++ b/pkg/compute/models/capabilities.go @@ -350,6 +350,10 @@ func getNetworkPublicCount(region *SCloudregion, zone *SZone, domainId string) ( } func getNetworkCountByFilter(region *SCloudregion, zone *SZone, domainId string, isPublic tristate.TriState) (int, error) { + if zone != nil && region == nil { + region = zone.GetRegion() + } + vpcs := VpcManager.Query().SubQuery() wires := WireManager.Query().SubQuery() networks := NetworkManager.Query().SubQuery() @@ -363,11 +367,21 @@ func getNetworkCountByFilter(region *SCloudregion, zone *SZone, domainId string, } } q = q.Join(wires, sqlchemy.Equals(networks.Field("wire_id"), wires.Field("id"))) + if region != nil { - subq := getRegionZoneSubq(region) - q = q.Filter(sqlchemy.In(wires.Field("zone_id"), subq)) + if utils.IsInStringArray(region.Provider, api.REGIONAL_NETWORK_PROVIDERS) { + wires := WireManager.Query().SubQuery() + vpcs := VpcManager.Query().SubQuery() + subq := 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"), subq)) + } else { + subq := getRegionZoneSubq(region) + q = q.Filter(sqlchemy.In(wires.Field("zone_id"), subq)) + } } - if zone != nil { + if zone != nil && !utils.IsInStringArray(region.Provider, api.REGIONAL_NETWORK_PROVIDERS) { q = q.Filter(sqlchemy.Equals(wires.Field("zone_id"), zone.Id)) } if len(domainId) > 0 { diff --git a/pkg/compute/models/networks.go b/pkg/compute/models/networks.go index aa761070c7..2c73c91572 100644 --- a/pkg/compute/models/networks.go +++ b/pkg/compute/models/networks.go @@ -1580,7 +1580,7 @@ func (manager *SNetworkManager) ListItemFilter(ctx context.Context, q *sqlchemy. } zone := zoneObj.(*SZone) region := zone.GetRegion() - if utils.IsInStringArray(region.Provider, api.REGINAL_NETWORK_PROVIDERS) { + if utils.IsInStringArray(region.Provider, api.REGIONAL_NETWORK_PROVIDERS) { wires := WireManager.Query().SubQuery() vpcs := VpcManager.Query().SubQuery()