Skip to content

Commit 32ebc09

Browse files
committed
Restore update parser parity checks.
Add _parse_update_rules_legacy for a single legacy implementation, optional KUBEPLUS_UPDATE_EQ_CHECK assertion against _parse_permission_rules in _update_rbac, and a unit test including non-apigroup edge cases. Made-with: Cursor
1 parent 3405b38 commit 32ebc09

File tree

2 files changed

+52
-24
lines changed

2 files changed

+52
-24
lines changed

provider-kubeconfig.py

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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",

tests/test_provider_kubeconfig.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,25 @@ def test_load_permission_data_accepts_yaml(self):
133133
finally:
134134
os.remove(path)
135135

136+
def test_update_legacy_parser_matches_shared_parser(self):
137+
"""_parse_permission_rules must match legacy update parse (used by revoke vs update)."""
138+
perms = {
139+
"apps": [
140+
{"deployments": ["get", "create"]},
141+
{"deployments/resourceName::sample": ["get"]},
142+
],
143+
"non-apigroup": [
144+
{"nonResourceURL::/metrics": ["get"]},
145+
{"invalid-without-nonResourceURL-marker": ["get"]},
146+
],
147+
}
148+
legacy_rules, legacy_resources = self.generator._parse_update_rules_legacy(perms)
149+
shared_rules, shared_resources = self.generator._parse_permission_rules(perms)
150+
self.generator._assert_rule_parity("update-parser", legacy_rules, shared_rules)
151+
self.generator._assert_all_resources_parity(
152+
"update-parser", legacy_resources, shared_resources
153+
)
154+
136155

137156
class TestKubeconfigIntegration(unittest.TestCase):
138157
"""

0 commit comments

Comments
 (0)