From 50f55c299c4aa81589cc737514276b500276a156 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Tue, 19 May 2020 16:42:25 +0800 Subject: [PATCH] fix: cloudprovider list support filter by zone and cloudregion --- pkg/apis/compute/cloudprovider.go | 2 ++ pkg/compute/models/cloudproviders.go | 48 ++++++++++++++++++++-------- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/pkg/apis/compute/cloudprovider.go b/pkg/apis/compute/cloudprovider.go index b3d188f3dd..6b749f26a6 100644 --- a/pkg/apis/compute/cloudprovider.go +++ b/pkg/apis/compute/cloudprovider.go @@ -224,6 +224,8 @@ type CloudproviderListInput struct { CloudregionResourceInput + ZoneResourceInput + CapabilityListInput SyncableBaseResourceListInput diff --git a/pkg/compute/models/cloudproviders.go b/pkg/compute/models/cloudproviders.go index ee04aaa6cd..1eb787561c 100644 --- a/pkg/compute/models/cloudproviders.go +++ b/pkg/compute/models/cloudproviders.go @@ -1076,6 +1076,36 @@ func (manager *SCloudproviderManager) ListItemFilter( q = q.Equals("cloudaccount_id", accountObj.GetId()) } + var zone *SZone + var region *SCloudregion + + if len(query.Zone) > 0 { + zoneObj, err := ZoneManager.FetchByIdOrName(userCred, query.Zone) + if err != nil { + if err == sql.ErrNoRows { + return nil, errors.Wrapf(httperrors.ErrResourceNotFound, "%s %s", ZoneManager.Keyword(), query.Zone) + } else { + return nil, errors.Wrap(err, "ZoneManager.FetchByIdOrName") + } + } + 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) + } else if len(query.Cloudregion) > 0 { + regionObj, err := CloudregionManager.FetchByIdOrName(userCred, query.Cloudregion) + if err != nil { + if err == sql.ErrNoRows { + return nil, httperrors.NewResourceNotFoundError2("cloudregion", query.Cloudregion) + } + return nil, httperrors.NewGeneralError(err) + } + 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 { providers := CloudproviderManager.Query().SubQuery() networks := NetworkManager.Query().SubQuery() @@ -1097,23 +1127,15 @@ func (manager *SCloudproviderManager) ListItemFilter( sqlchemy.IsNullOrEmpty(vpcs.Field("manager_id")), sqlchemy.Equals(vpcs.Field("manager_id"), providers.Field("id")), )) + if zone != nil { + sq = sq.Filter(sqlchemy.Equals(wires.Field("zone_id"), zone.GetId())) + } else if region != nil { + sq = sq.Filter(sqlchemy.Equals(vpcs.Field("cloudregion_id"), region.GetId())) + } q = q.Filter(sqlchemy.In(q.Field("id"), sq.SubQuery())) } - if len(query.Cloudregion) > 0 { - region, err := CloudregionManager.FetchByIdOrName(userCred, query.Cloudregion) - if err != nil { - if err == sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError2("cloudregion", query.Cloudregion) - } - return nil, httperrors.NewGeneralError(err) - } - pr := CloudproviderRegionManager.Query().SubQuery() - sq := pr.Query(pr.Field("cloudprovider_id")).Equals("cloudregion_id", region.GetId()).Distinct() - q = q.In("id", sq) - } - q, err := manager.SEnabledStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.EnabledStatusStandaloneResourceListInput) if err != nil { return nil, errors.Wrap(err, "SEnabledStatusStandaloneResourceBaseManager.ListItemFilter")