@@ -84,6 +84,34 @@ def _parse_permission_rules(self, perms):
8484 rule_list .append (rule_group )
8585 return rule_list , resources
8686
87+ def _parse_update_rules_legacy (self , perms ):
88+ """Legacy update permission parse; runtime source of truth for update."""
89+ rule_list = []
90+ resources = []
91+ for api_group , res_actions in perms .items ():
92+ for res in res_actions :
93+ for resource , verbs in res .items ():
94+ if resource not in resources :
95+ resources .append (resource .strip ())
96+ rule_group = {}
97+ if api_group == "non-apigroup" :
98+ if "nonResourceURL" in resource :
99+ parts = resource .split ("nonResourceURL::" )
100+ non_res = parts [1 ].strip () if len (parts ) > 1 else parts [0 ].strip ()
101+ rule_group ["nonResourceURLs" ] = [non_res ]
102+ rule_group ["verbs" ] = verbs
103+ else :
104+ rule_group ["apiGroups" ] = [api_group ]
105+ rule_group ["verbs" ] = verbs
106+ if "resourceName" in resource :
107+ parts = resource .split ("/resourceName::" )
108+ rule_group ["resources" ] = [parts [0 ].strip ()]
109+ rule_group ["resourceNames" ] = [parts [1 ].strip ()]
110+ else :
111+ rule_group ["resources" ] = [resource ]
112+ rule_list .append (rule_group )
113+ return rule_list , resources
114+
87115 def _read_perm_configmap_resources (self , sa , namespace , kubeconfig ):
88116 cfg_map_name = sa + "-perms"
89117 cfg_map_filename = sa + "-perms.txt"
@@ -650,30 +678,11 @@ def _apply_provider_rbac(self, sa, namespace, kubeconfig):
650678 def _update_rbac (self , permissionfile , sa , namespace , kubeconfig ):
651679 """Add permissions from JSON/YAML file to provider (update command)."""
652680 perms = self ._load_permission_data (permissionfile )
653- rule_list = []
654- new_resources = []
655- for api_group , res_actions in perms .items ():
656- for res in res_actions :
657- for resource , verbs in res .items ():
658- if resource not in new_resources :
659- new_resources .append (resource .strip ())
660- rule_group = {}
661- if api_group == "non-apigroup" :
662- if "nonResourceURL" in resource :
663- parts = resource .split ("nonResourceURL::" )
664- non_res = parts [1 ].strip () if len (parts ) > 1 else parts [0 ].strip ()
665- rule_group ["nonResourceURLs" ] = [non_res ]
666- rule_group ["verbs" ] = verbs
667- else :
668- rule_group ["apiGroups" ] = [api_group ]
669- rule_group ["verbs" ] = verbs
670- if "resourceName" in resource :
671- parts = resource .split ("/resourceName::" )
672- rule_group ["resources" ] = [parts [0 ].strip ()]
673- rule_group ["resourceNames" ] = [parts [1 ].strip ()]
674- else :
675- rule_group ["resources" ] = [resource ]
676- rule_list .append (rule_group )
681+ rule_list , new_resources = self ._parse_update_rules_legacy (perms )
682+ if os .getenv ("KUBEPLUS_UPDATE_EQ_CHECK" , "0" ) == "1" :
683+ pq_rules , pq_resources = self ._parse_permission_rules (perms )
684+ self ._assert_rule_parity ("update-parser" , rule_list , pq_rules )
685+ self ._assert_all_resources_parity ("update-parser" , new_resources , pq_resources )
677686
678687 role = {
679688 "apiVersion" : "rbac.authorization.k8s.io/v1" ,
0 commit comments