fix(region): support filter cloudprovider by regions (#25461)

This commit is contained in:
屈轩
2026-09-01 16:05:51 +08:00
committed by GitHub
parent e8d289e2b3
commit c03cd96d78
3 changed files with 20 additions and 15 deletions
+1 -1
View File
@@ -249,7 +249,7 @@ type CloudproviderListInput struct {
UsableResourceListInput
CloudregionResourceInput
CloudregionResourceListInput
ZoneResourceInput
+18 -13
View File
@@ -1251,7 +1251,7 @@ func (manager *SCloudproviderManager) ListItemFilter(
}
var zone *SZone
var region *SCloudregion
regionIds := make([]string, 0)
if len(query.ZoneId) > 0 {
zoneObj, err := validators.ValidateModel(ctx, userCred, ZoneManager, &query.ZoneId)
@@ -1259,10 +1259,11 @@ func (manager *SCloudproviderManager) ListItemFilter(
return nil, err
}
zone = zoneObj.(*SZone)
region, err = zone.GetRegion()
region, err := zone.GetRegion()
if err != nil {
return nil, err
}
regionIds = append(regionIds, region.Id)
vpcs := VpcManager.Query("manager_id").Equals("cloudregion_id", region.Id).Distinct()
if !utils.IsInStringArray(region.Provider, api.REGIONAL_NETWORK_PROVIDERS) {
wires := WireManager.Query().Equals("zone_id", query.ZoneId).SubQuery()
@@ -1276,17 +1277,21 @@ func (manager *SCloudproviderManager) ListItemFilter(
),
)
} else if len(query.CloudregionId) > 0 {
regionObj, err := CloudregionManager.FetchByIdOrName(ctx, userCred, query.CloudregionId)
if err != nil {
if err == sql.ErrNoRows {
return nil, httperrors.NewResourceNotFoundError2("cloudregion", query.CloudregionId)
for _, regionId := range query.CloudregionId {
if len(regionId) == 0 {
continue
}
return nil, httperrors.NewGeneralError(err)
regionObj, err := ValidateCloudregionId(ctx, userCred, regionId)
if err != nil {
return nil, errors.Wrapf(err, "ValidateCloudregionId %s", regionId)
}
regionIds = append(regionIds, regionObj.GetId())
}
if len(regionIds) > 0 {
pr := CloudproviderRegionManager.Query().SubQuery()
sq := pr.Query(pr.Field("cloudprovider_id")).In("cloudregion_id", regionIds).Distinct()
q = q.In("id", sq)
}
region = regionObj.(*SCloudregion)
pr := CloudproviderRegionManager.Query().SubQuery()
sq := pr.Query(pr.Field("cloudprovider_id")).Equals("cloudregion_id", region.Id).Distinct()
q = q.In("id", sq)
}
if query.Usable != nil && *query.Usable {
@@ -1310,8 +1315,8 @@ func (manager *SCloudproviderManager) ListItemFilter(
if zone != nil {
zoneFilter := sqlchemy.OR(sqlchemy.Equals(wires.Field("zone_id"), zone.GetId()), sqlchemy.IsNullOrEmpty(wires.Field("zone_id")))
sq = sq.Filter(zoneFilter)
} else if region != nil {
sq = sq.Filter(sqlchemy.Equals(vpcs.Field("cloudregion_id"), region.GetId()))
} else if len(regionIds) > 0 {
sq = sq.Filter(sqlchemy.In(vpcs.Field("cloudregion_id"), regionIds))
}
q = q.Filter(sqlchemy.In(q.Field("id"), sq.SubQuery()))
@@ -27,7 +27,7 @@ type CloudproviderListOptions struct {
HasObjectStorage bool `help:"filter cloudproviders that has object storage" negative:"no-object-storage"`
Capability []string `help:"capability filter" choices:"project|compute|network|loadbalancer|objectstore|rds|cache|event"`
Cloudregion string `help:"filter cloudproviders by cloudregion"`
Cloudregion []string `help:"filter cloudproviders by cloudregion id or name" json:"cloudregion_id"`
ReadOnly *bool `help:"filter read only account" negative:"no-read-only"`