diff --git a/cmd/climc/shell/compute/cloudproviders.go b/cmd/climc/shell/compute/cloudproviders.go index 5c0e61ebd0..69c4057703 100644 --- a/cmd/climc/shell/compute/cloudproviders.go +++ b/cmd/climc/shell/compute/cloudproviders.go @@ -34,6 +34,7 @@ func init() { HasObjectStorage bool `help:"filter cloudproviders that has object storage"` NoObjectStorage bool `help:"filter cloudproviders that has no object storage"` Capability []string `help:"capability filter" choices:"project|compute|network|loadbalancer|objectstore|rds|cache|event"` + Cloudregion string `help:"filter cloudproviders by cloudregion"` } R(&CloudproviderListOptions{}, "cloud-provider-list", "List cloud providers", func(s *mcclient.ClientSession, args *CloudproviderListOptions) error { var params *jsonutils.JSONDict @@ -57,6 +58,10 @@ func init() { if len(args.Capability) > 0 { params.Add(jsonutils.NewStringArray(args.Capability), "capability") } + + if len(args.Cloudregion) > 0 { + params.Add(jsonutils.NewString(args.Cloudregion), "cloudregion") + } } result, err := modules.Cloudproviders.List(s, params) if err != nil { diff --git a/pkg/apis/compute/cloudprovider.go b/pkg/apis/compute/cloudprovider.go index c7ca3183ec..b3d188f3dd 100644 --- a/pkg/apis/compute/cloudprovider.go +++ b/pkg/apis/compute/cloudprovider.go @@ -222,6 +222,8 @@ type CloudproviderListInput struct { UsableResourceListInput + CloudregionResourceInput + CapabilityListInput SyncableBaseResourceListInput diff --git a/pkg/compute/models/cloudproviders.go b/pkg/compute/models/cloudproviders.go index 4bacfbe6c4..0f719442b8 100644 --- a/pkg/compute/models/cloudproviders.go +++ b/pkg/compute/models/cloudproviders.go @@ -1030,7 +1030,7 @@ func (manager *SCloudproviderManager) ListItemFilter( accountObj, err := CloudaccountManager.FetchByIdOrName(userCred, accountStr) if err != nil { if err == sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError2(manager.Keyword(), accountStr) + return nil, httperrors.NewResourceNotFoundError2("cloudaccount", accountStr) } else { return nil, httperrors.NewGeneralError(err) } @@ -1063,6 +1063,19 @@ func (manager *SCloudproviderManager) ListItemFilter( 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")