Skip to content

Commit 3b209a2

Browse files
committed
rbac: expose NormalizeRules function to use in other generators too
1 parent a9cb030 commit 3b209a2

File tree

1 file changed

+85
-85
lines changed

1 file changed

+85
-85
lines changed

pkg/rbac/parser.go

+85-85
Original file line numberDiff line numberDiff line change
@@ -225,91 +225,6 @@ func GenerateRoles(ctx *genall.GenerationContext, roleName string) ([]interface{
225225
}
226226
}
227227

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

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

0 commit comments

Comments
 (0)