Merge pull request #6297 from ioito/hotfix/qx-cloudprovider-list-filter

fix: cloud-provider-list support filter by cloudregion
This commit is contained in:
Zexi Li
2020-05-13 12:43:52 +08:00
committed by GitHub
3 changed files with 21 additions and 1 deletions
@@ -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 {
+2
View File
@@ -222,6 +222,8 @@ type CloudproviderListInput struct {
UsableResourceListInput
CloudregionResourceInput
CapabilityListInput
SyncableBaseResourceListInput
+14 -1
View File
@@ -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")