mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
Merge pull request #10382 from swordqiu/hotfix/qj-cloud-provider-filter-by-domain
fix(region): cloud provider filter by domain
This commit is contained in:
@@ -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())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user