From 157eb8f29b7cf56ff4ebd9916879d7eeea6ec82f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Mon, 25 Mar 2024 19:23:15 +0800 Subject: [PATCH] fix(region): filter cloudprovider by zone (#19788) --- pkg/compute/models/cloudproviders.go | 22 ++++++++++--------- .../options/compute/cloudproviders.go | 1 + 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/pkg/compute/models/cloudproviders.go b/pkg/compute/models/cloudproviders.go index acac763c50..333d192535 100644 --- a/pkg/compute/models/cloudproviders.go +++ b/pkg/compute/models/cloudproviders.go @@ -1275,18 +1275,20 @@ func (manager *SCloudproviderManager) ListItemFilter( var region *SCloudregion if len(query.ZoneId) > 0 { - zoneObj, err := ZoneManager.FetchByIdOrName(ctx, userCred, query.ZoneId) + _, err := validators.ValidateModel(ctx, userCred, ZoneManager, &query.ZoneId) if err != nil { - if err == sql.ErrNoRows { - return nil, errors.Wrapf(httperrors.ErrResourceNotFound, "%s %s", ZoneManager.Keyword(), query.ZoneId) - } else { - return nil, errors.Wrap(err, "ZoneManager.FetchByIdOrName") - } + return nil, err } - zone = zoneObj.(*SZone) - pr := CloudproviderRegionManager.Query().SubQuery() - sq := pr.Query(pr.Field("cloudprovider_id")).Equals("cloudregion_id", zone.CloudregionId).Distinct() - q = q.In("id", sq) + vpcs := VpcManager.Query("manager_id").Distinct() + wires := WireManager.Query().Equals("zone_id", query.ZoneId).SubQuery() + vpcs = vpcs.Join(wires, sqlchemy.Equals(vpcs.Field("id"), wires.Field("vpc_id"))) + wireManager := WireManager.Query("manager_id").Equals("zone_id", query.ZoneId).Distinct().SubQuery() + q = q.Filter( + sqlchemy.OR( + sqlchemy.In(q.Field("id"), vpcs.SubQuery()), + sqlchemy.In(q.Field("id"), wireManager), //vmware + ), + ) } else if len(query.CloudregionId) > 0 { regionObj, err := CloudregionManager.FetchByIdOrName(ctx, userCred, query.CloudregionId) if err != nil { diff --git a/pkg/mcclient/options/compute/cloudproviders.go b/pkg/mcclient/options/compute/cloudproviders.go index 6d756955b5..73466056f6 100644 --- a/pkg/mcclient/options/compute/cloudproviders.go +++ b/pkg/mcclient/options/compute/cloudproviders.go @@ -32,6 +32,7 @@ type CloudproviderListOptions struct { ReadOnly *bool `help:"filter read only account" negative:"no-read-only"` HostSchedtagId string `help:"filter by host schedtag"` + ZoneId string } func (opts *CloudproviderListOptions) Params() (jsonutils.JSONObject, error) {