From d99c4776e904f393e5940efbab58b808b86a8530 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Tue, 7 Apr 2020 16:19:48 +0800 Subject: [PATCH] feature: add API to retrieve resource's change owner candidate domains --- cmd/climc/shell/hosts.go | 12 +++++++++ pkg/apis/compute/cloudprovider.go | 4 +++ pkg/compute/models/managedresource.go | 37 +++++++++++++++++++++++++++ pkg/keystone/models/domains.go | 3 +++ pkg/keystone/models/projects.go | 3 +++ 5 files changed, 59 insertions(+) diff --git a/cmd/climc/shell/hosts.go b/cmd/climc/shell/hosts.go index 33ba0d8593..837386f593 100644 --- a/cmd/climc/shell/hosts.go +++ b/cmd/climc/shell/hosts.go @@ -752,4 +752,16 @@ func init() { printObject(result) return nil }) + + type HostChangeOwnerCandidateDomainsOptions struct { + ID string `help:"ID or name of host"` + } + R(&HostChangeOwnerCandidateDomainsOptions{}, "host-change-owner-candidate-domains", "Get change owner candidate domain list", func(s *mcclient.ClientSession, args *HostChangeOwnerCandidateDomainsOptions) error { + result, err := modules.Hosts.GetSpecific(s, args.ID, "change-owner-candidate-domains", nil) + if err != nil { + return err + } + printObject(result) + return nil + }) } diff --git a/pkg/apis/compute/cloudprovider.go b/pkg/apis/compute/cloudprovider.go index 2ad34576c3..e251b58197 100644 --- a/pkg/apis/compute/cloudprovider.go +++ b/pkg/apis/compute/cloudprovider.go @@ -247,3 +247,7 @@ type CloudproviderUpdateInput struct { type CloudproviderCreateInput struct { } + +type ChangeOwnerCandidateDomainsOutput struct { + Candidates []apis.SharedDomain `json:"candidates"` +} diff --git a/pkg/compute/models/managedresource.go b/pkg/compute/models/managedresource.go index 4d27206cb6..a699373884 100644 --- a/pkg/compute/models/managedresource.go +++ b/pkg/compute/models/managedresource.go @@ -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 { diff --git a/pkg/keystone/models/domains.go b/pkg/keystone/models/domains.go index 06fb82b23c..594c6c45b8 100644 --- a/pkg/keystone/models/domains.go +++ b/pkg/keystone/models/domains.go @@ -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) } diff --git a/pkg/keystone/models/projects.go b/pkg/keystone/models/projects.go index 6cb5b9e0bd..05b0f9e004 100644 --- a/pkg/keystone/models/projects.go +++ b/pkg/keystone/models/projects.go @@ -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) }