@@ -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