Merge pull request #5709 from swordqiu/feature/qj-change-owner-candiate-domains

feature: add API to retrieve resource's change owner candidate domains
This commit is contained in:
Zexi Li
2020-04-07 21:46:50 +08:00
committed by GitHub
5 changed files with 59 additions and 0 deletions
+4
View File
@@ -247,3 +247,7 @@ type CloudproviderUpdateInput struct {
type CloudproviderCreateInput struct {
}
type ChangeOwnerCandidateDomainsOutput struct {
Candidates []apis.SharedDomain `json:"candidates"`
}
+37
View File
@@ -348,6 +348,43 @@ func (manager *SManagedResourceBaseManager) GetOrderByFields(query api.ManagedRe
return []string{query.OrderByManager, query.OrderByAccount, query.OrderByProvider, query.OrderByBrand}
}
func (model *SManagedResourceBase) GetDetailsChangeOwnerCandidateDomains(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (api.ChangeOwnerCandidateDomainsOutput, error) {
output := api.ChangeOwnerCandidateDomainsOutput{}
provider := model.GetCloudprovider()
if provider == nil {
return output, nil
}
account := model.GetCloudaccount()
if account == nil {
return output, nil
}
var candidateIds []string
switch account.ShareMode {
case api.CLOUD_ACCOUNT_SHARE_MODE_ACCOUNT_DOMAIN:
candidateIds = append(candidateIds, account.DomainId)
case api.CLOUD_ACCOUNT_SHARE_MODE_PROVIDER_DOMAIN:
candidateIds = append(candidateIds, provider.DomainId)
case api.CLOUD_ACCOUNT_SHARE_MODE_SYSTEM:
if account.PublicScope != string(rbacutils.ScopeSystem) {
candidateIds = account.GetSharedDomains()
candidateIds = append(candidateIds, account.DomainId)
}
}
domainMap := make(map[string]db.STenant)
err := db.FetchQueryObjectsByIds(db.TenantCacheManager.GetDomainQuery(), "id", candidateIds, &domainMap)
if err != nil {
return output, errors.Wrap(err, "FetchQueryObjectsByIds")
}
output.Candidates = make([]apis.SharedDomain, len(candidateIds))
for i := range candidateIds {
output.Candidates[i].Id = candidateIds[i]
if domain, ok := domainMap[candidateIds[i]]; ok {
output.Candidates[i].Name = domain.Name
}
}
return output, nil
}
func _managedResourceFilterByDomain(managerIdFieldName string, q *sqlchemy.SQuery, query apis.DomainizedResourceListInput, filterField string, subqFunc func() *sqlchemy.SQuery) (*sqlchemy.SQuery, error) {
domainStr := query.ProjectDomain
if len(domainStr) > 0 {
+3
View File
@@ -225,6 +225,9 @@ func (domain *SDomain) CustomizeCreate(ctx context.Context, userCred mcclient.To
// domain.ParentId = api.KeystoneDomainRoot
domain.DomainId = api.KeystoneDomainRoot
domain.IsDomain = tristate.True
if len(domain.Displayname) == 0 {
domain.Displayname = domain.Name
}
return domain.SStandaloneResourceBase.CustomizeCreate(ctx, userCred, ownerId, query, data)
}
+3
View File
@@ -283,6 +283,9 @@ func (manager *SProjectManager) QueryDistinctExtraField(q *sqlchemy.SQuery, fiel
func (model *SProject) CustomizeCreate(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data jsonutils.JSONObject) error {
model.ParentId = ownerId.GetProjectDomainId()
model.IsDomain = tristate.False
if len(model.Displayname) == 0 {
model.Displayname = model.Name
}
return model.SIdentityBaseResource.CustomizeCreate(ctx, userCred, ownerId, query, data)
}