Skip to content

Commit 5d999b8

Browse files
committed
rbac: expose NormalizeRules function to use in other generators too
1 parent c251c50 commit 5d999b8

File tree

1 file changed

+93
-92
lines changed

1 file changed

+93
-92
lines changed

pkg/rbac/parser.go

Lines changed: 93 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -219,98 +219,6 @@ func GenerateRoles(ctx *genall.GenerationContext, roleName string) ([]interface{
219219
}
220220
}
221221

222-
// NormalizeRules merge Rule with the same ruleKey and sort the Rules
223-
NormalizeRules := func(rules []*Rule) []rbacv1.PolicyRule {
224-
ruleMap := make(map[ruleKey]*Rule)
225-
// all the Rules having the same ruleKey will be merged into the first Rule
226-
for _, rule := range rules {
227-
// fix the group name first, since letting people type "core" is nice
228-
for i, name := range rule.Groups {
229-
if name == "core" {
230-
rule.Groups[i] = ""
231-
}
232-
}
233-
234-
key := rule.key()
235-
if _, ok := ruleMap[key]; !ok {
236-
ruleMap[key] = rule
237-
continue
238-
}
239-
ruleMap[key].addVerbs(rule.Verbs)
240-
}
241-
242-
// deduplicate resources
243-
// 1. create map based on key without resources
244-
ruleMapWithoutResources := make(map[string][]*Rule)
245-
for _, rule := range ruleMap {
246-
// get key without Resources
247-
key := rule.keyWithGroupResourceNamesURLsVerbs()
248-
ruleMapWithoutResources[key] = append(ruleMapWithoutResources[key], rule)
249-
}
250-
// 2. merge to ruleMap
251-
ruleMap = make(map[ruleKey]*Rule)
252-
for _, rules := range ruleMapWithoutResources {
253-
rule := rules[0]
254-
for _, mergeRule := range rules[1:] {
255-
rule.Resources = append(rule.Resources, mergeRule.Resources...)
256-
}
257-
258-
key := rule.key()
259-
ruleMap[key] = rule
260-
}
261-
262-
// deduplicate groups
263-
// 1. create map based on key without group
264-
ruleMapWithoutGroup := make(map[string][]*Rule)
265-
for _, rule := range ruleMap {
266-
// get key without Group
267-
key := rule.keyWithResourcesResourceNamesURLsVerbs()
268-
ruleMapWithoutGroup[key] = append(ruleMapWithoutGroup[key], rule)
269-
}
270-
// 2. merge to ruleMap
271-
ruleMap = make(map[ruleKey]*Rule)
272-
for _, rules := range ruleMapWithoutGroup {
273-
rule := rules[0]
274-
for _, mergeRule := range rules[1:] {
275-
rule.Groups = append(rule.Groups, mergeRule.Groups...)
276-
}
277-
key := rule.key()
278-
ruleMap[key] = rule
279-
}
280-
281-
// deduplicate URLs
282-
// 1. create map based on key without URLs
283-
ruleMapWithoutURLs := make(map[string][]*Rule)
284-
for _, rule := range ruleMap {
285-
// get key without Group
286-
key := rule.keyWitGroupResourcesResourceNamesVerbs()
287-
ruleMapWithoutURLs[key] = append(ruleMapWithoutURLs[key], rule)
288-
}
289-
// 2. merge to ruleMap
290-
ruleMap = make(map[ruleKey]*Rule)
291-
for _, rules := range ruleMapWithoutURLs {
292-
rule := rules[0]
293-
for _, mergeRule := range rules[1:] {
294-
rule.URLs = append(rule.URLs, mergeRule.URLs...)
295-
}
296-
key := rule.key()
297-
ruleMap[key] = rule
298-
}
299-
300-
// sort the Rules in rules according to their ruleKeys
301-
keys := make([]ruleKey, 0, len(ruleMap))
302-
for key := range ruleMap {
303-
keys = append(keys, key)
304-
}
305-
sort.Sort(ruleKeys(keys))
306-
307-
var policyRules []rbacv1.PolicyRule
308-
for _, key := range keys {
309-
policyRules = append(policyRules, ruleMap[key].ToRule())
310-
}
311-
return policyRules
312-
}
313-
314222
// collect all the namespaces and sort them
315223
var namespaces []string
316224
for ns := range rulesByNSResource {
@@ -377,3 +285,96 @@ func (g Generator) Generate(ctx *genall.GenerationContext) error {
377285

378286
return ctx.WriteYAML("role.yaml", headerText, objs, genall.WithTransform(genall.TransformRemoveCreationTimestamp))
379287
}
288+
289+
// NormalizeRules merge Rule with the same ruleKey and sort the Rules
290+
func NormalizeRules(rules []*Rule) []rbacv1.PolicyRule {
291+
292+
ruleMap := make(map[ruleKey]*Rule)
293+
// all the Rules having the same ruleKey will be merged into the first Rule
294+
for _, rule := range rules {
295+
// fix the group name first, since letting people type "core" is nice
296+
for i, name := range rule.Groups {
297+
if name == "core" {
298+
rule.Groups[i] = ""
299+
}
300+
}
301+
302+
key := rule.key()
303+
if _, ok := ruleMap[key]; !ok {
304+
ruleMap[key] = rule
305+
continue
306+
}
307+
ruleMap[key].addVerbs(rule.Verbs)
308+
}
309+
310+
// deduplicate resources
311+
// 1. create map based on key without resources
312+
ruleMapWithoutResources := make(map[string][]*Rule)
313+
for _, rule := range ruleMap {
314+
// get key without Resources
315+
key := rule.keyWithGroupResourceNamesURLsVerbs()
316+
ruleMapWithoutResources[key] = append(ruleMapWithoutResources[key], rule)
317+
}
318+
// 2. merge to ruleMap
319+
ruleMap = make(map[ruleKey]*Rule)
320+
for _, rules := range ruleMapWithoutResources {
321+
rule := rules[0]
322+
for _, mergeRule := range rules[1:] {
323+
rule.Resources = append(rule.Resources, mergeRule.Resources...)
324+
}
325+
326+
key := rule.key()
327+
ruleMap[key] = rule
328+
}
329+
330+
// deduplicate groups
331+
// 1. create map based on key without group
332+
ruleMapWithoutGroup := make(map[string][]*Rule)
333+
for _, rule := range ruleMap {
334+
// get key without Group
335+
key := rule.keyWithResourcesResourceNamesURLsVerbs()
336+
ruleMapWithoutGroup[key] = append(ruleMapWithoutGroup[key], rule)
337+
}
338+
// 2. merge to ruleMap
339+
ruleMap = make(map[ruleKey]*Rule)
340+
for _, rules := range ruleMapWithoutGroup {
341+
rule := rules[0]
342+
for _, mergeRule := range rules[1:] {
343+
rule.Groups = append(rule.Groups, mergeRule.Groups...)
344+
}
345+
key := rule.key()
346+
ruleMap[key] = rule
347+
}
348+
349+
// deduplicate URLs
350+
// 1. create map based on key without URLs
351+
ruleMapWithoutURLs := make(map[string][]*Rule)
352+
for _, rule := range ruleMap {
353+
// get key without Group
354+
key := rule.keyWitGroupResourcesResourceNamesVerbs()
355+
ruleMapWithoutURLs[key] = append(ruleMapWithoutURLs[key], rule)
356+
}
357+
// 2. merge to ruleMap
358+
ruleMap = make(map[ruleKey]*Rule)
359+
for _, rules := range ruleMapWithoutURLs {
360+
rule := rules[0]
361+
for _, mergeRule := range rules[1:] {
362+
rule.URLs = append(rule.URLs, mergeRule.URLs...)
363+
}
364+
key := rule.key()
365+
ruleMap[key] = rule
366+
}
367+
368+
// sort the Rules in rules according to their ruleKeys
369+
keys := make([]ruleKey, 0, len(ruleMap))
370+
for key := range ruleMap {
371+
keys = append(keys, key)
372+
}
373+
sort.Sort(ruleKeys(keys))
374+
375+
var policyRules []rbacv1.PolicyRule
376+
for _, key := range keys {
377+
policyRules = append(policyRules, ruleMap[key].ToRule())
378+
}
379+
return policyRules
380+
}

0 commit comments

Comments
 (0)