mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-19 02:37:24 +08:00
support filter by cloudaccounts
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user