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