fix(region): including domain info in project-role results

This commit is contained in:
Qiu Jian
2021-03-18 00:29:41 +08:00
parent 42ee3751d3
commit 42b40b8e25
+86 -28
View File
@@ -31,35 +31,59 @@ type RoleAssignmentManagerV3 struct {
}
type role struct {
id string
name string
id string
name string
domain struct {
id string
name string
}
}
type projectRoles struct {
id string
name string
id string
name string
domain struct {
id string
name string
}
typ string
roles []role
}
func newProjectRoles(projectId, projectName, roleId, roleName, typ string) *projectRoles {
return &projectRoles{id: projectId, name: projectName, typ: typ, roles: []role{{id: roleId, name: roleName}}}
func newProjectRoles(projectId, projectName, projectDomainId, projectDomainName, roleId, roleName, roleDomainId, roleDomainName, typ string) *projectRoles {
r := role{
id: roleId,
name: roleName,
}
r.domain.id = roleDomainId
r.domain.name = roleDomainName
pr := &projectRoles{id: projectId, name: projectName, typ: typ, roles: []role{r}}
pr.domain.id = projectDomainId
pr.domain.name = projectDomainName
return pr
}
func (this *projectRoles) add(roleId, roleName string) {
this.roles = append(this.roles, role{id: roleId, name: roleName})
func (this *projectRoles) add(roleId, roleName, roleDomainId, roleDomainName string) {
r := role{id: roleId, name: roleName}
r.domain.id = roleDomainId
r.domain.name = roleDomainName
this.roles = append(this.roles, r)
}
func (this *projectRoles) json() jsonutils.JSONObject {
obj := jsonutils.NewDict()
obj.Add(jsonutils.NewString(this.id), "id")
obj.Add(jsonutils.NewString(this.name), "name")
obj.Add(jsonutils.NewString(this.domain.id), "domain", "id")
obj.Add(jsonutils.NewString(this.domain.name), "domain", "name")
obj.Add(jsonutils.NewString(this.typ), "type")
roles := jsonutils.NewArray()
for _, r := range this.roles {
role := jsonutils.NewDict()
role.Add(jsonutils.NewString(r.id), "id")
role.Add(jsonutils.NewString(r.name), "name")
role.Add(jsonutils.NewString(r.domain.id), "domain", "id")
role.Add(jsonutils.NewString(r.domain.name), "domain", "name")
roles.Add(role)
}
obj.Add(roles, "roles")
@@ -67,13 +91,21 @@ func (this *projectRoles) json() jsonutils.JSONObject {
}
type sRole struct {
Id string `json:"id"`
Name string `json:"name"`
Id string `json:"id"`
Name string `json:"name"`
Domain struct {
Id string `json:"id"`
Name string `json:"name"`
} `json:"domain"`
}
type sGroupRole struct {
Id string `json:"id"`
Name string `json:"name"`
Id string `json:"id"`
Name string `json:"name"`
Domain struct {
Id string `json:"id"`
Name string `json:"name"`
} `json:"domain"`
Roles []sRole `json:"roles"`
Policies struct {
Project []string `json:"project"`
@@ -83,12 +115,16 @@ type sGroupRole struct {
}
type sProjectGroupRole struct {
Id string `json:"id"`
Name string `json:"name"`
Id string `json:"id"`
Name string `json:"name"`
Domain struct {
Id string `json:"id"`
Name string `json:"name"`
} `json:"domain"`
Groups []sGroupRole `json:"groups"`
}
func (pgr *sProjectGroupRole) add(groupId, groupName, roleId, roleName string, projectPolicies, domainPolicies, systemPolicies []string) {
func (pgr *sProjectGroupRole) add(groupId, groupName, groupDomainId, groupDomainName, roleId, roleName, roleDomainId, roleDomainName string, projectPolicies, domainPolicies, systemPolicies []string) {
groupIdx := -1
for i := range pgr.Groups {
if pgr.Groups[i].Id == groupId {
@@ -98,19 +134,25 @@ func (pgr *sProjectGroupRole) add(groupId, groupName, roleId, roleName string, p
}
if groupIdx < 0 {
groupIdx = len(pgr.Groups)
pgr.Groups = append(pgr.Groups, sGroupRole{
gr := sGroupRole{
Id: groupId,
Name: groupName,
})
}
gr.Domain.Id = groupDomainId
gr.Domain.Name = groupDomainName
pgr.Groups = append(pgr.Groups, gr)
}
pgr.Groups[groupIdx].add(roleId, roleName, projectPolicies, domainPolicies, systemPolicies)
pgr.Groups[groupIdx].add(roleId, roleName, roleDomainId, roleDomainName, projectPolicies, domainPolicies, systemPolicies)
}
func (gr *sGroupRole) add(roleId, roleName string, projectPolicies, domainPolicies, systemPolicies []string) {
gr.Roles = append(gr.Roles, sRole{
func (gr *sGroupRole) add(roleId, roleName, roleDomainId, roleDomainName string, projectPolicies, domainPolicies, systemPolicies []string) {
sr := sRole{
Id: roleId,
Name: roleName,
})
}
sr.Domain.Id = roleDomainId
sr.Domain.Name = roleDomainName
gr.Roles = append(gr.Roles, sr)
for _, p := range projectPolicies {
if !utils.IsInStringArray(p, gr.Policies.Project) {
gr.Policies.Project = append(gr.Policies.Project, p)
@@ -189,21 +231,27 @@ func (this *RoleAssignmentManagerV3) GetProjectUsers(s *mcclient.ClientSession,
roleId, _ := roleAssign.GetString("role", "id")
roleName, _ := roleAssign.GetString("role", "name")
roleDomainId, _ := roleAssign.GetString("role", "domain", "id")
roleDomainName, _ := roleAssign.GetString("role", "domain", "name")
userId, _ := roleAssign.GetString("user", "id")
userName, _ := roleAssign.GetString("user", "name")
userDomainId, _ := roleAssign.GetString("user", "domain", "id")
userDomainName, _ := roleAssign.GetString("user", "domain", "name")
if len(userName) == 0 {
typ = "group"
userName, _ = roleAssign.GetString("group", "name")
userId, _ = roleAssign.GetString("group", "id")
userDomainId, _ = roleAssign.GetString("group", "domain", "id")
userDomainName, _ = roleAssign.GetString("group", "domain", "name")
}
_, ok := projects[userId]
if ok {
projects[userId].add(roleId, roleName)
projects[userId].add(roleId, roleName, roleDomainId, roleDomainName)
} else {
projects[userId] = newProjectRoles(userId, userName, roleId, roleName, typ)
projects[userId] = newProjectRoles(userId, userName, userDomainId, userDomainName, roleId, roleName, roleDomainId, roleDomainName, typ)
}
}
@@ -291,20 +339,27 @@ func (this *RoleAssignmentManagerV3) GetProjectRole(s *mcclient.ClientSession, i
for _, roleAssign := range result.Data {
roleId, _ := roleAssign.GetString("role", "id")
roleName, _ := roleAssign.GetString("role", "name")
roleDomainId, _ := roleAssign.GetString("role", "domain", "id")
roleDomainName, _ := roleAssign.GetString("role", "domain", "name")
var groupById string
var groupByName string
var groupById, groupByName, groupByDomainId, groupByDomainName string
if groupBy == "project" {
groupById, _ = roleAssign.GetString("scope", "project", "id")
groupByName, _ = roleAssign.GetString("scope", "project", "name")
groupByDomainId, _ = roleAssign.GetString("scope", "project", "domain", "id")
groupByDomainName, _ = roleAssign.GetString("scope", "project", "domain", "name")
} else if groupBy == "user" {
groupById, _ = roleAssign.GetString("user", "id")
groupByName, _ = roleAssign.GetString("user", "name")
groupByDomainId, _ = roleAssign.GetString("user", "domain", "id")
groupByDomainName, _ = roleAssign.GetString("user", "domain", "name")
}
groupId, _ := roleAssign.GetString("group", "id")
groupName, _ := roleAssign.GetString("group", "name")
groupDomainId, _ := roleAssign.GetString("group", "domain", "id")
groupDomainName, _ := roleAssign.GetString("group", "domain", "name")
projPolicies, _ := jsonutils.GetStringArray(roleAssign, "policies", "project")
domPolicies, _ := jsonutils.GetStringArray(roleAssign, "policies", "domain")
sysPolicies, _ := jsonutils.GetStringArray(roleAssign, "policies", "system")
@@ -319,13 +374,16 @@ func (this *RoleAssignmentManagerV3) GetProjectRole(s *mcclient.ClientSession, i
if lineIdx < 0 {
lineIdx = len(lines)
lines = append(lines, sProjectGroupRole{
pgr := sProjectGroupRole{
Id: groupById,
Name: groupByName,
})
}
pgr.Domain.Id = groupByDomainId
pgr.Domain.Name = groupByDomainName
lines = append(lines, pgr)
}
lines[lineIdx].add(groupId, groupName, roleId, roleName, projPolicies, domPolicies, sysPolicies)
lines[lineIdx].add(groupId, groupName, groupDomainId, groupDomainName, roleId, roleName, roleDomainId, roleDomainName, projPolicies, domPolicies, sysPolicies)
}
lineJson := jsonutils.NewArray()