Skip to content

Commit

Permalink
support filter by cloudaccounts
Browse files Browse the repository at this point in the history
  • Loading branch information
wanyaoqi committed Jun 19, 2020
1 parent 183180e commit 561d7b0
Show file tree
Hide file tree
Showing 8 changed files with 46 additions and 45 deletions.
2 changes: 1 addition & 1 deletion pkg/apis/compute/cloudprovider.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
17 changes: 6 additions & 11 deletions pkg/compute/models/cloudaccounts.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
11 changes: 8 additions & 3 deletions pkg/compute/models/cloudproviderregions.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
19 changes: 8 additions & 11 deletions pkg/compute/models/cloudproviders.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
8 changes: 4 additions & 4 deletions pkg/compute/models/cloudregions.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}

Expand Down
18 changes: 8 additions & 10 deletions pkg/compute/models/managedresource.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
8 changes: 4 additions & 4 deletions pkg/compute/models/zones.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}

Expand Down
8 changes: 7 additions & 1 deletion pkg/monitor/models/suggestsysalert.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit 561d7b0

Please sign in to comment.