diff --git a/pkg/apis/compute/cloudaccount.go b/pkg/apis/compute/cloudaccount.go index 5320cfae04..011a92de85 100644 --- a/pkg/apis/compute/cloudaccount.go +++ b/pkg/apis/compute/cloudaccount.go @@ -479,5 +479,6 @@ type CloudaccountEnableAutoSyncInput struct { } type CloudaccountProjectMappingInput struct { - ProjectMappingId string + // 同步策略Id, 若不传此参数则解绑 + ProjectMappingId string `json:"project_mapping_id"` } diff --git a/pkg/apis/compute/project_mappings.go b/pkg/apis/compute/project_mappings.go index 5999d1965d..88e2ab718c 100644 --- a/pkg/apis/compute/project_mappings.go +++ b/pkg/apis/compute/project_mappings.go @@ -139,6 +139,11 @@ type ProjectMappingDetails struct { apis.EnabledStatusInfrasResourceBaseDetails Rules []ProjectMappingRuleInfoDetails + + Accounts []struct { + Id string + Name string + } } type ProjectMappingCreateInput struct { diff --git a/pkg/compute/models/cloudaccounts.go b/pkg/compute/models/cloudaccounts.go index 8f68a974f5..8949807bcb 100644 --- a/pkg/compute/models/cloudaccounts.go +++ b/pkg/compute/models/cloudaccounts.go @@ -2863,6 +2863,7 @@ func (self *SCloudaccount) AllowPerformProjectMapping(ctx context.Context, userC return self.IsOwner(userCred) || db.IsAdminAllowPerform(userCred, self, "project-mapping") } +// 绑定同步策略 func (self *SCloudaccount) PerformProjectMapping(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, input api.CloudaccountProjectMappingInput) (jsonutils.JSONObject, error) { if len(input.ProjectMappingId) > 0 { _, err := validators.ValidateModel(userCred, ProjectMappingManager, &input.ProjectMappingId) diff --git a/pkg/compute/models/project_mappings.go b/pkg/compute/models/project_mappings.go index 7be9e10a28..84ccb8db77 100644 --- a/pkg/compute/models/project_mappings.go +++ b/pkg/compute/models/project_mappings.go @@ -175,10 +175,43 @@ func (manager *SProjectMappingManager) FetchCustomizeColumns( for _, proj := range projects { projectMaps[proj.Id] = proj.Name } + accounts := []struct { + Id string + Name string + ProjectMappingId string + }{} + q = CloudaccountManager.Query().In("project_mapping_id", mpIds) + err = q.All(&accounts) + if err != nil { + return rows + } + accountMapping := map[string][]struct { + Id string + Name string + }{} + for i := range accounts { + _, ok := accountMapping[accounts[i].ProjectMappingId] + if !ok { + accountMapping[accounts[i].ProjectMappingId] = []struct { + Id string + Name string + }{} + } + accountMapping[accounts[i].ProjectMappingId] = append(accountMapping[accounts[i].ProjectMappingId], + struct { + Id string + Name string + }{ + Id: accounts[i].Id, + Name: accounts[i].Name, + }) + } + for i := range rows { mp := objs[i].(*SProjectMapping) if mp.Rules != nil { rows[i].Rules = []api.ProjectMappingRuleInfoDetails{} + rows[i].Accounts, _ = accountMapping[mpIds[i]] for i := range *mp.Rules { rules := *mp.Rules rule := api.ProjectMappingRuleInfoDetails{ diff --git a/pkg/mcclient/modules/mod_project_mappings.go b/pkg/mcclient/modules/mod_project_mappings.go index 43c69bc7b6..07789259cf 100644 --- a/pkg/mcclient/modules/mod_project_mappings.go +++ b/pkg/mcclient/modules/mod_project_mappings.go @@ -22,7 +22,7 @@ var ( func init() { ProjectMappings = NewComputeManager("project_mapping", "project_mappings", - []string{"ID", "Name", "Enabled", "Status", "Public_Scope", "Domain_Id", "Domain", "Rules", "Metadata"}, + []string{"ID", "Name", "Enabled", "Status", "Public_Scope", "Domain_Id", "Domain", "Rules", "Accounts", "Metadata"}, []string{}) registerCompute(&ProjectMappings)