From 561d7b0ccaff6f497c791464890fd2e3084be3ba Mon Sep 17 00:00:00 2001 From: wanyaoqi Date: Fri, 19 Jun 2020 15:48:16 +0800 Subject: [PATCH] support filter by cloudaccounts --- pkg/apis/compute/cloudprovider.go | 2 +- pkg/compute/models/cloudaccounts.go | 17 ++++++----------- pkg/compute/models/cloudproviderregions.go | 11 ++++++++--- pkg/compute/models/cloudproviders.go | 19 ++++++++----------- pkg/compute/models/cloudregions.go | 8 ++++---- pkg/compute/models/managedresource.go | 18 ++++++++---------- pkg/compute/models/zones.go | 8 ++++---- pkg/monitor/models/suggestsysalert.go | 8 +++++++- 8 files changed, 46 insertions(+), 45 deletions(-) diff --git a/pkg/apis/compute/cloudprovider.go b/pkg/apis/compute/cloudprovider.go index 6b749f26a6..2e067f4695 100644 --- a/pkg/apis/compute/cloudprovider.go +++ b/pkg/apis/compute/cloudprovider.go @@ -165,7 +165,7 @@ type ManagedResourceListInput struct { CloudproviderResourceInput // 列出关联指定云账号(ID或Name)的资源 - Cloudaccount string `json:"cloudaccount"` + Cloudaccount []string `json:"cloudaccount"` // swagger:ignore // Deprecated // description: this param will be deprecate at 3.0 diff --git a/pkg/compute/models/cloudaccounts.go b/pkg/compute/models/cloudaccounts.go index 907bbc0282..e3315f0a4b 100644 --- a/pkg/compute/models/cloudaccounts.go +++ b/pkg/compute/models/cloudaccounts.go @@ -1939,17 +1939,12 @@ func (manager *SCloudaccountManager) ListItemFilter( userCred mcclient.TokenCredential, query api.CloudaccountListInput, ) (*sqlchemy.SQuery, error) { - accountStr := query.Cloudaccount - if len(accountStr) > 0 { - accountObj, err := manager.FetchByIdOrName(userCred, accountStr) - if err != nil { - if err == sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError2(manager.Keyword(), accountStr) - } else { - return nil, httperrors.NewGeneralError(err) - } - } - q = q.Equals("id", accountObj.GetId()) + accountArr := query.Cloudaccount + if len(accountArr) > 0 { + q = q.Filter(sqlchemy.OR( + sqlchemy.In(q.Field("id"), accountArr), + sqlchemy.In(q.Field("name"), accountArr), + )) } q, err := manager.SEnabledStatusInfrasResourceBaseManager.ListItemFilter(ctx, q, userCred, query.EnabledStatusInfrasResourceBaseListInput) diff --git a/pkg/compute/models/cloudproviderregions.go b/pkg/compute/models/cloudproviderregions.go index f8b79942a8..711ed68e5e 100644 --- a/pkg/compute/models/cloudproviderregions.go +++ b/pkg/compute/models/cloudproviderregions.go @@ -207,17 +207,22 @@ func (self *SCloudproviderregion) Detach(ctx context.Context, userCred mcclient. /* 过滤出指定cloudAccountId || providerIds || cloudAccountId+providerIds关联的region id */ -func (manager *SCloudproviderregionManager) QueryRelatedRegionIds(cloudAccountId string, providerIds ...string) *sqlchemy.SSubQuery { +func (manager *SCloudproviderregionManager) QueryRelatedRegionIds(cloudAccounts []string, providerIds ...string) *sqlchemy.SSubQuery { q := manager.Query("cloudregion_id") if len(providerIds) > 0 { q = q.Filter(sqlchemy.In(q.Field("cloudprovider_id"), providerIds)) } - if len(cloudAccountId) > 0 { + if len(cloudAccounts) > 0 { + cpq := CloudaccountManager.Query().SubQuery() + subcpq := cpq.Query(cpq.Field("id")).Filter(sqlchemy.OR( + sqlchemy.In(cpq.Field("id"), cloudAccounts), + sqlchemy.In(cpq.Field("name"), cloudAccounts), + )).SubQuery() providers := CloudproviderManager.Query().SubQuery() q = q.Join(providers, sqlchemy.Equals(providers.Field("id"), q.Field("cloudprovider_id"))) - q.Filter(sqlchemy.Equals(providers.Field("cloudaccount_id"), cloudAccountId)) + q.Filter(sqlchemy.In(providers.Field("cloudaccount_id"), subcpq)) } return q.Distinct().SubQuery() diff --git a/pkg/compute/models/cloudproviders.go b/pkg/compute/models/cloudproviders.go index 168233f68a..2e85a18b6e 100644 --- a/pkg/compute/models/cloudproviders.go +++ b/pkg/compute/models/cloudproviders.go @@ -1063,17 +1063,14 @@ func (manager *SCloudproviderManager) ListItemFilter( userCred mcclient.TokenCredential, query api.CloudproviderListInput, ) (*sqlchemy.SQuery, error) { - accountStr := query.Cloudaccount - if len(accountStr) > 0 { - accountObj, err := CloudaccountManager.FetchByIdOrName(userCred, accountStr) - if err != nil { - if err == sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError2("cloudaccount", accountStr) - } else { - return nil, httperrors.NewGeneralError(err) - } - } - q = q.Equals("cloudaccount_id", accountObj.GetId()) + accountArr := query.Cloudaccount + if len(accountArr) > 0 { + cpq := CloudaccountManager.Query().SubQuery() + subcpq := cpq.Query(cpq.Field("id")).Filter(sqlchemy.OR( + sqlchemy.In(cpq.Field("id"), accountArr), + sqlchemy.In(cpq.Field("name"), accountArr), + )).SubQuery() + q = q.In("cloudaccount_id", subcpq) } var zone *SZone diff --git a/pkg/compute/models/cloudregions.go b/pkg/compute/models/cloudregions.go index aed8986272..757a612517 100644 --- a/pkg/compute/models/cloudregions.go +++ b/pkg/compute/models/cloudregions.go @@ -704,12 +704,12 @@ func (manager *SCloudregionManager) ListItemFilter( managerStr := query.Cloudprovider if len(managerStr) > 0 { - subq := CloudproviderRegionManager.QueryRelatedRegionIds("", managerStr) + subq := CloudproviderRegionManager.QueryRelatedRegionIds(nil, managerStr) q = q.In("id", subq) } - accountStr := query.Cloudaccount - if len(accountStr) > 0 { - subq := CloudproviderRegionManager.QueryRelatedRegionIds(accountStr) + accountArr := query.Cloudaccount + if len(accountArr) > 0 { + subq := CloudproviderRegionManager.QueryRelatedRegionIds(accountArr) q = q.In("id", subq) } diff --git a/pkg/compute/models/managedresource.go b/pkg/compute/models/managedresource.go index 6129d9d57e..34dbaa7732 100644 --- a/pkg/compute/models/managedresource.go +++ b/pkg/compute/models/managedresource.go @@ -510,16 +510,14 @@ func _managedResourceFilterByAccount(managerIdFieldName string, q *sqlchemy.SQue } } - cloudaccountStr := input.Cloudaccount - if len(cloudaccountStr) > 0 { - account, err := CloudaccountManager.FetchByIdOrName(nil, cloudaccountStr) - if err != nil { - if err == sql.ErrNoRows { - return nil, httperrors.NewResourceNotFoundError2(CloudaccountManager.Keyword(), cloudaccountStr) - } - return nil, httperrors.NewGeneralError(err) - } - subq := CloudproviderManager.Query("id").Equals("cloudaccount_id", account.GetId()).SubQuery() + cloudaccountArr := input.Cloudaccount + if len(cloudaccountArr) > 0 { + cpq := CloudaccountManager.Query().SubQuery() + subcpq := cpq.Query(cpq.Field("id")).Filter(sqlchemy.OR( + sqlchemy.In(cpq.Field("id"), cloudaccountArr), + sqlchemy.In(cpq.Field("name"), cloudaccountArr), + )).SubQuery() + subq := CloudproviderManager.Query("id").In("cloudaccount_id", subcpq).SubQuery() if len(filterField) == 0 { q = q.Filter(sqlchemy.In(q.Field(managerIdFieldName), subq)) } else { diff --git a/pkg/compute/models/zones.go b/pkg/compute/models/zones.go index e9d7a0142e..2f06e5a6e1 100644 --- a/pkg/compute/models/zones.go +++ b/pkg/compute/models/zones.go @@ -573,12 +573,12 @@ func (manager *SZoneManager) ListItemFilter( managerStr := query.Cloudprovider if len(managerStr) > 0 { - subq := CloudproviderRegionManager.QueryRelatedRegionIds("", managerStr) + subq := CloudproviderRegionManager.QueryRelatedRegionIds(nil, managerStr) q = q.In("cloudregion_id", subq) } - accountStr := query.Cloudaccount - if len(accountStr) > 0 { - subq := CloudproviderRegionManager.QueryRelatedRegionIds(accountStr) + accountArr := query.Cloudaccount + if len(accountArr) > 0 { + subq := CloudproviderRegionManager.QueryRelatedRegionIds(accountArr) q = q.In("cloudregion_id", subq) } diff --git a/pkg/monitor/models/suggestsysalert.go b/pkg/monitor/models/suggestsysalert.go index b25c6040a7..ab5871933e 100644 --- a/pkg/monitor/models/suggestsysalert.go +++ b/pkg/monitor/models/suggestsysalert.go @@ -26,6 +26,7 @@ import ( "yunion.io/x/onecloud/pkg/apis/monitor" "yunion.io/x/onecloud/pkg/cloudcommon/db" + computemodels "yunion.io/x/onecloud/pkg/compute/models" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/util/stringutils2" @@ -123,7 +124,12 @@ func (manager *SSuggestSysAlertManager) ListItemFilter( q = q.In("provider", query.Brands) } if len(query.Cloudaccount) > 0 { - q.Equals("cloudaccount", query.Cloudaccount) + cpq := computemodels.CloudaccountManager.Query().SubQuery() + subcpq := cpq.Query(cpq.Field("id")).Filter(sqlchemy.OR( + sqlchemy.In(cpq.Field("id"), query.Cloudaccount), + sqlchemy.In(cpq.Field("name"), query.Cloudaccount), + )).SubQuery() + q.In("cloudaccount", subcpq) } if len(query.CloudEnv) > 0 { q = q.Equals("cloud_env", query.CloudEnv)