diff --git a/pkg/compute/models/capabilities.go b/pkg/compute/models/capabilities.go index ba47463d5d..a04c3895ce 100644 --- a/pkg/compute/models/capabilities.go +++ b/pkg/compute/models/capabilities.go @@ -126,8 +126,15 @@ func getDomainManagerSubq(domainId string) *sqlchemy.SSubQuery { q := providers.Query(providers.Field("id")) q = q.Join(accounts, sqlchemy.Equals(accounts.Field("id"), providers.Field("cloudaccount_id"))) q = q.Filter(sqlchemy.OR( - sqlchemy.Equals(accounts.Field("domain_id"), domainId), + 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), + ), )) q = q.Filter(sqlchemy.Equals(accounts.Field("status"), api.CLOUD_PROVIDER_CONNECTED)) q = q.Filter(sqlchemy.IsTrue(accounts.Field("enabled"))) diff --git a/pkg/compute/models/cloudproviders.go b/pkg/compute/models/cloudproviders.go index 3092c7ed5f..7be962b12b 100644 --- a/pkg/compute/models/cloudproviders.go +++ b/pkg/compute/models/cloudproviders.go @@ -1311,8 +1311,15 @@ func (manager *SCloudproviderManager) FilterByOwner(q *sqlchemy.SQuery, owner mc cloudaccounts.Field("id"), )) q = q.Filter(sqlchemy.OR( - sqlchemy.Equals(q.Field("domain_id"), owner.GetProjectDomainId()), + 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), + ), )) } } diff --git a/pkg/compute/models/cloudregions.go b/pkg/compute/models/cloudregions.go index d7de742c88..c28eef232e 100644 --- a/pkg/compute/models/cloudregions.go +++ b/pkg/compute/models/cloudregions.go @@ -538,8 +538,15 @@ func getCloudRegionIdByDomainId(domainId string) *sqlchemy.SSubQuery { 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.Equals(accounts.Field("domain_id"), domainId), - sqlchemy.IsTrue(accounts.Field("is_public")), + 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), + ), )) return sqlchemy.Union(q1, q2).Query().SubQuery() diff --git a/pkg/compute/models/managedresource.go b/pkg/compute/models/managedresource.go index f41e92fb31..112ff42e18 100644 --- a/pkg/compute/models/managedresource.go +++ b/pkg/compute/models/managedresource.go @@ -161,8 +161,15 @@ func managedResourceFilterByDomain(q *sqlchemy.SQuery, query jsonutils.JSONObjec subq := providers.Query(providers.Field("id")) subq = subq.Join(accounts, sqlchemy.Equals(providers.Field("cloudaccount_id"), accounts.Field("id"))) subq = subq.Filter(sqlchemy.OR( - sqlchemy.Equals(providers.Field("domain_id"), domain.GetId()), + sqlchemy.AND( + sqlchemy.Equals(providers.Field("domain_id"), domain.GetId()), + 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"), domain.GetId()), + sqlchemy.Equals(accounts.Field("share_mode"), api.CLOUD_ACCOUNT_SHARE_MODE_ACCOUNT_DOMAIN), + ), )) if len(filterField) == 0 { q = q.Filter(sqlchemy.OR(