3
0

Fix missing role references for namespace export

This commit is contained in:
Tomaž Jerman
2022-03-23 11:05:27 +01:00
parent a9b6ea6605
commit 46eb0f1749

View File

@@ -252,8 +252,14 @@ func (ctrl Namespace) Export(ctx context.Context, r *request.NamespaceExport) (o
// Tweak exported resources
resources = ctrl.tweakExport(ctx, resources, nsII)
var roleIndex map[uint64]*systemTypes.Role
resources, roleIndex, err = ctrl.preparePlaceholders(ctx, resources)
if err != nil {
return
}
// RBAC
auxRBAC, err := ctrl.exportRBAC(ctx, resources)
auxRBAC, err := ctrl.exportRBAC(ctx, roleIndex, resources)
if err != nil {
return
}
@@ -452,22 +458,11 @@ func (ctrl Namespace) exportCompose(ctx context.Context, namespaceID uint64) (re
return
}
func (ctrl Namespace) exportRBAC(ctx context.Context, base resource.InterfaceSet) (resources resource.InterfaceSet, err error) {
// get all roles; we'll filter as needed later
roleIndex := make(map[uint64]*systemTypes.Role)
rr, _, err := ctrl.role.Find(ctx, systemTypes.RoleFilter{})
if err != nil {
return
}
for _, r := range rr {
roleIndex[r.ID] = r
}
func (ctrl Namespace) exportRBAC(ctx context.Context, roleIndex map[uint64]*systemTypes.Role, base resource.InterfaceSet) (resources resource.InterfaceSet, err error) {
// get all rbac rules
rules := rbac.Global().Rules()
// Match up
dupRoleIndex := make(map[uint64]bool)
dupRuleIndex := make(map[string]bool)
for _, res := range base {
// Skip if we can't handle
@@ -493,13 +488,6 @@ func (ctrl Namespace) exportRBAC(ctx context.Context, base resource.InterfaceSet
if !ok {
continue
}
if !dupRoleIndex[role.ID] {
// Add a placeholder role so Envoy can resolve dependencies
r := resource.NewRole(role)
r.MarkPlaceholder()
resources = append(resources, r)
dupRoleIndex[role.ID] = true
}
roleRef := role.Handle
if roleRef == "" {
@@ -587,3 +575,24 @@ func (ctrl Namespace) tweakExport(ctx context.Context, resources resource.Interf
return resources
}
func (ctrl Namespace) preparePlaceholders(ctx context.Context, base resource.InterfaceSet) (resources resource.InterfaceSet, roleIndex map[uint64]*systemTypes.Role, err error) {
resources = base
// Get roles as we'll need them later for some resources
roleIndex = make(map[uint64]*systemTypes.Role)
rr, _, err := ctrl.role.Find(ctx, systemTypes.RoleFilter{})
if err != nil {
return
}
for _, role := range rr {
roleIndex[role.ID] = role
// Add them as placeholders since we don't want to export them
r := resource.NewRole(role)
r.MarkPlaceholder()
resources = append(resources, r)
}
return
}