From 9b7796bb60503f04476017f01dd99cd2c06a368d Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Thu, 11 Mar 2021 01:04:39 +0800 Subject: [PATCH] fix(region): cloud provider filter by domain --- pkg/compute/models/cloudproviders.go | 54 +++++++++++++++++++--------- pkg/compute/models/cloudregions.go | 19 +++------- 2 files changed, 42 insertions(+), 31 deletions(-) diff --git a/pkg/compute/models/cloudproviders.go b/pkg/compute/models/cloudproviders.go index 35b37fb762..d2b4cfe6ec 100644 --- a/pkg/compute/models/cloudproviders.go +++ b/pkg/compute/models/cloudproviders.go @@ -1497,27 +1497,49 @@ func (self *SCloudprovider) PerformDisable(ctx context.Context, userCred mcclien return nil, nil } +func (manager *SCloudproviderManager) filterByDomainId(q *sqlchemy.SQuery, domainId string) *sqlchemy.SQuery { + subq := db.SharedResourceManager.Query("resource_id") + subq = subq.Equals("resource_type", CloudaccountManager.Keyword()) + subq = subq.Equals("target_project_id", domainId) + subq = subq.Equals("target_type", db.SharedTargetDomain) + + cloudaccounts := CloudaccountManager.Query().SubQuery() + q = q.Join(cloudaccounts, sqlchemy.Equals( + q.Field("cloudaccount_id"), + cloudaccounts.Field("id"), + )) + q = q.Filter(sqlchemy.OR( + sqlchemy.AND( + sqlchemy.Equals(q.Field("domain_id"), domainId), + sqlchemy.Equals(cloudaccounts.Field("share_mode"), api.CLOUD_ACCOUNT_SHARE_MODE_PROVIDER_DOMAIN), + ), + sqlchemy.AND( + sqlchemy.Equals(cloudaccounts.Field("share_mode"), api.CLOUD_ACCOUNT_SHARE_MODE_SYSTEM), + sqlchemy.OR( + sqlchemy.AND( + sqlchemy.Equals(cloudaccounts.Field("public_scope"), rbacutils.ScopeDomain), + sqlchemy.OR( + sqlchemy.Equals(cloudaccounts.Field("domain_id"), domainId), + sqlchemy.In(cloudaccounts.Field("id"), subq.SubQuery()), + ), + ), + sqlchemy.Equals(cloudaccounts.Field("public_scope"), rbacutils.ScopeSystem), + ), + ), + sqlchemy.AND( + sqlchemy.Equals(cloudaccounts.Field("domain_id"), domainId), + sqlchemy.Equals(cloudaccounts.Field("share_mode"), api.CLOUD_ACCOUNT_SHARE_MODE_ACCOUNT_DOMAIN), + ), + )) + return q +} + func (manager *SCloudproviderManager) FilterByOwner(q *sqlchemy.SQuery, owner mcclient.IIdentityProvider, scope rbacutils.TRbacScope) *sqlchemy.SQuery { if owner != nil { switch scope { case rbacutils.ScopeProject, rbacutils.ScopeDomain: if len(owner.GetProjectDomainId()) > 0 { - cloudaccounts := CloudaccountManager.Query().SubQuery() - q = q.Join(cloudaccounts, sqlchemy.Equals( - q.Field("cloudaccount_id"), - cloudaccounts.Field("id"), - )) - q = q.Filter(sqlchemy.OR( - sqlchemy.AND( - sqlchemy.Equals(q.Field("domain_id"), owner.GetProjectDomainId()), - sqlchemy.Equals(cloudaccounts.Field("share_mode"), api.CLOUD_ACCOUNT_SHARE_MODE_PROVIDER_DOMAIN), - ), - sqlchemy.Equals(cloudaccounts.Field("share_mode"), api.CLOUD_ACCOUNT_SHARE_MODE_SYSTEM), - sqlchemy.AND( - sqlchemy.Equals(cloudaccounts.Field("domain_id"), owner.GetProjectDomainId()), - sqlchemy.Equals(cloudaccounts.Field("share_mode"), api.CLOUD_ACCOUNT_SHARE_MODE_ACCOUNT_DOMAIN), - ), - )) + q = manager.filterByDomainId(q, owner.GetProjectDomainId()) } } } diff --git a/pkg/compute/models/cloudregions.go b/pkg/compute/models/cloudregions.go index 27426671e4..d0b0eaa3aa 100644 --- a/pkg/compute/models/cloudregions.go +++ b/pkg/compute/models/cloudregions.go @@ -629,28 +629,17 @@ func (manager *SCloudregionManager) InitializeData() error { } func getCloudRegionIdByDomainId(domainId string) *sqlchemy.SSubQuery { - accounts := CloudaccountManager.Query().SubQuery() cloudproviderregions := CloudproviderRegionManager.Query().SubQuery() - providers := CloudproviderManager.Query().SubQuery() // not managed region q1 := CloudregionManager.Query("id").Equals("provider", api.CLOUD_PROVIDER_ONECLOUD) // managed region q2 := cloudproviderregions.Query(cloudproviderregions.Field("cloudregion_id", "id")) - q2 = q2.Join(providers, sqlchemy.Equals(providers.Field("id"), cloudproviderregions.Field("cloudprovider_id"))) - q2 = q2.Join(accounts, sqlchemy.Equals(providers.Field("cloudaccount_id"), accounts.Field("id"))) - q2 = q2.Filter(sqlchemy.OR( - sqlchemy.AND( - sqlchemy.Equals(providers.Field("domain_id"), domainId), - sqlchemy.Equals(accounts.Field("share_mode"), api.CLOUD_ACCOUNT_SHARE_MODE_PROVIDER_DOMAIN), - ), - sqlchemy.Equals(accounts.Field("share_mode"), api.CLOUD_ACCOUNT_SHARE_MODE_SYSTEM), - sqlchemy.AND( - sqlchemy.Equals(accounts.Field("domain_id"), domainId), - sqlchemy.Equals(accounts.Field("share_mode"), api.CLOUD_ACCOUNT_SHARE_MODE_ACCOUNT_DOMAIN), - ), - )) + providerIds := CloudproviderManager.Query("id") + providerIds = CloudproviderManager.filterByDomainId(providerIds, domainId) + providersIdsQ := providerIds.Distinct().SubQuery() + q2 = q2.Join(providersIdsQ, sqlchemy.Equals(providersIdsQ.Field("id"), cloudproviderregions.Field("cloudprovider_id"))) return sqlchemy.Union(q1, q2).Query().SubQuery() }