Skip to content

Commit ffc01d5

Browse files
committed
Tests for aggregated cluster roles
1 parent 8b653af commit ffc01d5

File tree

14 files changed

+3136
-70
lines changed

14 files changed

+3136
-70
lines changed

actions/go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ replace (
5959

6060
require (
6161
github.com/rancher/rancher/pkg/apis v0.0.0
62-
github.com/rancher/shepherd v0.0.0-20251003203259-669abb78af51
62+
github.com/rancher/shepherd v0.0.0-20251015044355-8c54bf0aaf31
6363
github.com/rancher/tfp-automation v0.0.0-20251016221424-5aafbe545b8e
6464
)
6565

@@ -174,7 +174,7 @@ require (
174174
github.com/rancher/aks-operator v1.12.1 // indirect
175175
github.com/rancher/apiserver v0.7.0 // indirect
176176
github.com/rancher/eks-operator v1.12.1 // indirect
177-
github.com/rancher/fleet/pkg/apis v0.13.0 // indirect
177+
github.com/rancher/fleet/pkg/apis v0.14.0-alpha.3 // indirect
178178
github.com/rancher/gke-operator v1.12.1 // indirect
179179
github.com/rancher/lasso v0.2.3 // indirect
180180
github.com/rancher/rke v1.8.0-rc.4 // indirect

actions/go.sum

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -248,8 +248,8 @@ github.com/rancher/apiserver v0.7.0 h1:8N9XQXurELdZ3nfU5WKwgwDcYOoixNfpdpMbLZ4rr
248248
github.com/rancher/apiserver v0.7.0/go.mod h1:9b/n58YT7S8bMFEyr1v7xzL72qwZKQQJK2Ir6lMT8Yk=
249249
github.com/rancher/eks-operator v1.12.1 h1:ZsaDyQa1Ykrf9b1Ux11DICIV4JXRy14kWKqE0JfAZg0=
250250
github.com/rancher/eks-operator v1.12.1/go.mod h1:3hz8e7XqekMw/76TShanMS/iMBcQoom2j7/B9nyKbVQ=
251-
github.com/rancher/fleet/pkg/apis v0.13.0 h1:soXF3cKWD9sMRcX5OlVnOY8aoPr+/FF8DP/zZtLLe3g=
252-
github.com/rancher/fleet/pkg/apis v0.13.0/go.mod h1:LpFIRtWNJe6Tf4EGJ/brPtutyTUlFj2hJDso1/5CO7Y=
251+
github.com/rancher/fleet/pkg/apis v0.14.0-alpha.3 h1:SCy+VCww6APf8n9x31sPi/cE6ji9A+uRmS7Qe7I5dVw=
252+
github.com/rancher/fleet/pkg/apis v0.14.0-alpha.3/go.mod h1:l+30BByeNBbo0AF94+pYW4q/g9U2oM0UkQuriR0bOD4=
253253
github.com/rancher/gke-operator v1.12.1 h1:zH2DEQsea+kG61cN0+1NWDQp0FyN28o2XIm5ieRLCKU=
254254
github.com/rancher/gke-operator v1.12.1/go.mod h1:TbOTInXvdC1fPAxj2BHlRIh2j7ezTVQ7eIJW+udz5Xg=
255255
github.com/rancher/lasso v0.2.3 h1:74/z/C/O3ykhyMrRuEgc9kVyYiSoS7kp5BAijlcyXDg=
@@ -262,8 +262,8 @@ github.com/rancher/rancher/pkg/apis v0.0.0-20250806201723-9a7af3779b9d h1:TZd6Wp
262262
github.com/rancher/rancher/pkg/apis v0.0.0-20250806201723-9a7af3779b9d/go.mod h1:IhaOGqACWRoyF+xXpd5CvGt02XeJyDdOC8W3Rdz1cW0=
263263
github.com/rancher/rke v1.8.0-rc.4 h1:jowVyaF3LsJonC7vNsAwWf3MONHAtEFUD/j3UzNSE5U=
264264
github.com/rancher/rke v1.8.0-rc.4/go.mod h1:x9N1abruzDFMwTpqq2cnaDYpKCptlNoW8VraNWB6Pc4=
265-
github.com/rancher/shepherd v0.0.0-20251003203259-669abb78af51 h1:xi4qsdR2UtySDvU3eNk5kbtbCIf7A4oiCmOCGo/KIfM=
266-
github.com/rancher/shepherd v0.0.0-20251003203259-669abb78af51/go.mod h1:BdEW/H1ZkLUn3/A/73pacOSfgh9nn5ITjg5qj02CyS4=
265+
github.com/rancher/shepherd v0.0.0-20251015044355-8c54bf0aaf31 h1:CKxEoFWtmB9tzsDuFDwaOCJm9CxnzBqHEc58xTEUH1w=
266+
github.com/rancher/shepherd v0.0.0-20251015044355-8c54bf0aaf31/go.mod h1:wZ6Oe7Aa9aam77+4t3lBiixw9JpTTaYQ+Adfi0ICcqQ=
267267
github.com/rancher/system-upgrade-controller/pkg/apis v0.0.0-20250710162344-185ff9f785cd h1:M3oVcVktMhNk8l3ZRW94kroqzWzE/VGbZfLw/F0rw5Y=
268268
github.com/rancher/system-upgrade-controller/pkg/apis v0.0.0-20250710162344-185ff9f785cd/go.mod h1:VfRrgue4yl6O0GYakMGYgyByu7ySooPQWWRxTt2MIEI=
269269
github.com/rancher/tfp-automation v0.0.0-20251016221424-5aafbe545b8e h1:4XpRPzt0C9oB0LsFaC0BoBSR16vp1GSLiZPoJR4KHVs=

actions/projects/projects.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,8 +196,13 @@ func WaitForProjectIDUpdate(client *rancher.Client, clusterID, projectName, name
196196
projectsapi.ProjectIDAnnotation: projectName,
197197
}
198198

199-
err := kwait.PollUntilContextTimeout(context.Background(), defaults.FiveSecondTimeout, defaults.OneMinuteTimeout, false, func(ctx context.Context) (done bool, pollErr error) {
200-
namespace, pollErr := namespaces.GetNamespaceByName(client, clusterID, namespaceName)
199+
downstreamContext, err := clusterapi.GetClusterWranglerContext(client, clusterID)
200+
if err != nil {
201+
return err
202+
}
203+
204+
err = kwait.PollUntilContextTimeout(context.Background(), defaults.FiveSecondTimeout, defaults.OneMinuteTimeout, false, func(ctx context.Context) (done bool, pollErr error) {
205+
namespace, pollErr := downstreamContext.Core.Namespace().Get(namespaceName, metav1.GetOptions{})
201206
if pollErr != nil {
202207
return false, pollErr
203208
}

actions/rbac/rbac.go

Lines changed: 180 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -27,56 +27,98 @@ import (
2727
type Role string
2828

2929
const (
30-
Admin Role = "admin"
31-
BaseUser Role = "user-base"
32-
StandardUser Role = "user"
33-
ClusterOwner Role = "cluster-owner"
34-
ClusterMember Role = "cluster-member"
35-
ProjectOwner Role = "project-owner"
36-
ProjectMember Role = "project-member"
37-
CreateNS Role = "create-ns"
38-
ReadOnly Role = "read-only"
39-
CustomManageProjectMember Role = "projectroletemplatebindings-manage"
40-
CrtbView Role = "clusterroletemplatebindings-view"
41-
PrtbView Role = "projectroletemplatebindings-view"
42-
ProjectsCreate Role = "projects-create"
43-
ProjectsView Role = "projects-view"
44-
ManageWorkloads Role = "workloads-manage"
45-
ActiveStatus = "active"
46-
ForbiddenError = "403 Forbidden"
47-
RancherDeploymentNamespace = "cattle-system"
48-
DefaultNamespace = "fleet-default"
49-
RancherDeploymentName = "rancher"
50-
CattleResyncEnvVarName = "CATTLE_RESYNC_DEFAULT"
51-
LocalCluster = "local"
52-
UserKind = "User"
53-
ImageName = "nginx"
54-
ManageUsersVerb = "manage-users"
55-
UpdatePsaVerb = "updatepsa"
56-
ManagementAPIGroup = "management.cattle.io"
57-
UsersResource = "users"
58-
UserAttributeResource = "userattribute"
59-
GroupsResource = "groups"
60-
GroupMembersResource = "groupmembers"
61-
ProjectResource = "projects"
62-
PrtbResource = "projectroletemplatebindings"
63-
SecretsResource = "secrets"
64-
ClusterContext = "cluster"
65-
ProjectContext = "project"
66-
GrbOwnerLabel = "authz.management.cattle.io/grb-owner"
67-
GlobalDataNS = "cattle-global-data"
68-
MembershipBindingOwnerLabel = "membership-binding-owner"
69-
PSALabelKey = "pod-security.kubernetes.io/"
70-
PSAEnforceLabelKey = "pod-security.kubernetes.io/enforce"
71-
PSAWarnLabelKey = "pod-security.kubernetes.io/warn"
72-
PSAAuditLabelKey = "pod-security.kubernetes.io/audit"
73-
PSAPrivilegedPolicy = "privileged"
74-
PSABaselinePolicy = "baseline"
75-
PSARestrictedPolicy = "restricted"
76-
PSAEnforceVersionLabelKey = "pod-security.kubernetes.io/enforce-version"
77-
PSAWarnVersionLabelKey = "pod-security.kubernetes.io/warn-version"
78-
PSAAuditVersionLabelKey = "pod-security.kubernetes.io/audit-version"
79-
PSALatestValue = "latest"
30+
Admin Role = "admin"
31+
BaseUser Role = "user-base"
32+
StandardUser Role = "user"
33+
ClusterOwner Role = "cluster-owner"
34+
ClusterMember Role = "cluster-member"
35+
ProjectOwner Role = "project-owner"
36+
ProjectMember Role = "project-member"
37+
CreateNS Role = "create-ns"
38+
ReadOnly Role = "read-only"
39+
CustomManageProjectMember Role = "projectroletemplatebindings-manage"
40+
CrtbView Role = "clusterroletemplatebindings-view"
41+
PrtbView Role = "projectroletemplatebindings-view"
42+
ProjectsCreate Role = "projects-create"
43+
ProjectsView Role = "projects-view"
44+
ManageWorkloads Role = "workloads-manage"
45+
ActiveStatus = "active"
46+
ForbiddenError = "403 Forbidden"
47+
RancherDeploymentNamespace = "cattle-system"
48+
DefaultNamespace = "fleet-default"
49+
RancherDeploymentName = "rancher"
50+
CattleResyncEnvVarName = "CATTLE_RESYNC_DEFAULT"
51+
LocalCluster = "local"
52+
UserKind = "User"
53+
ImageName = "nginx"
54+
ManageUsersVerb = "manage-users"
55+
UpdatePsaVerb = "updatepsa"
56+
ManagementAPIGroup = "management.cattle.io"
57+
UsersResource = "users"
58+
UserAttributeResource = "userattribute"
59+
GroupsResource = "groups"
60+
GroupMembersResource = "groupmembers"
61+
ProjectResource = "projects"
62+
PrtbResource = "projectroletemplatebindings"
63+
SecretsResource = "secrets"
64+
ClusterContext = "cluster"
65+
ProjectContext = "project"
66+
GrbOwnerLabel = "authz.management.cattle.io/grb-owner"
67+
GlobalDataNS = "cattle-global-data"
68+
MembershipBindingOwnerLabel = "membership-binding-owner"
69+
PSALabelKey = "pod-security.kubernetes.io/"
70+
PSAEnforceLabelKey = "pod-security.kubernetes.io/enforce"
71+
PSAWarnLabelKey = "pod-security.kubernetes.io/warn"
72+
PSAAuditLabelKey = "pod-security.kubernetes.io/audit"
73+
PSAPrivilegedPolicy = "privileged"
74+
PSABaselinePolicy = "baseline"
75+
PSARestrictedPolicy = "restricted"
76+
PSAEnforceVersionLabelKey = "pod-security.kubernetes.io/enforce-version"
77+
PSAWarnVersionLabelKey = "pod-security.kubernetes.io/warn-version"
78+
PSAAuditVersionLabelKey = "pod-security.kubernetes.io/audit-version"
79+
PSALatestValue = "latest"
80+
RkeCattleAPIGroup = "rke.cattle.io"
81+
ProjectCattleAPIGroup = "project.cattle.io"
82+
AppsAPIGroup = "apps"
83+
CrtbOwnerLabel = "authz.cluster.cattle.io/crtb-owner"
84+
PrtbOwnerLabel = "authz.cluster.cattle.io/prtb-owner"
85+
ClusterNameAnnotationKey = "cluster.cattle.io/name"
86+
RegularResourceAggregator = "-aggregator"
87+
ClusterMgmtResourceAggregator = "-cluster-mgmt-aggregator"
88+
ProjectMgmtResourceAggregator = "-project-mgmt-aggregator"
89+
ClusterMgmtResource = "-cluster-mgmt"
90+
ProjectMgmtResource = "-project-mgmt"
91+
)
92+
93+
var (
94+
ClusterMgmtResources = map[string]string{
95+
"clusterscans": ManagementAPIGroup,
96+
"clusterregistrationtokens": ManagementAPIGroup,
97+
"clusterroletemplatebindings": ManagementAPIGroup,
98+
"etcdbackups": ManagementAPIGroup,
99+
"nodes": ManagementAPIGroup,
100+
"nodepools": ManagementAPIGroup,
101+
"projects": ManagementAPIGroup,
102+
"etcdsnapshots": RkeCattleAPIGroup,
103+
}
104+
105+
ProjectMgmtResources = map[string]string{
106+
"sourcecodeproviderconfigs": ProjectCattleAPIGroup,
107+
"projectroletemplatebindings": ManagementAPIGroup,
108+
"secrets": "",
109+
}
110+
111+
PolicyRules = map[string][]rbacv1.PolicyRule{
112+
"readProjects": definePolicyRules([]string{"get", "list"}, []string{"projects"}, []string{ManagementAPIGroup}),
113+
"editProjects": definePolicyRules([]string{"create", "update", "patch"}, []string{"projects"}, []string{ManagementAPIGroup}),
114+
"manageProjects": definePolicyRules([]string{"create", "update", "patch", "delete"}, []string{"projects"}, []string{ManagementAPIGroup}),
115+
"readPrtbs": definePolicyRules([]string{"get", "list"}, []string{"projectroletemplatebindings"}, []string{ManagementAPIGroup}),
116+
"updatePrtbs": definePolicyRules([]string{"update", "patch"}, []string{"projectroletemplatebindings"}, []string{ManagementAPIGroup}),
117+
"readDeployments": definePolicyRules([]string{"get", "list"}, []string{"deployments"}, []string{AppsAPIGroup}),
118+
"readPods": definePolicyRules([]string{"get", "list"}, []string{"pods"}, []string{""}),
119+
"readNamespaces": definePolicyRules([]string{"get", "list"}, []string{"namespaces"}, []string{""}),
120+
"readSecrets": definePolicyRules([]string{"get", "list"}, []string{"secrets"}, []string{""}),
121+
}
80122
)
81123

82124
func (r Role) String() string {
@@ -761,3 +803,91 @@ func CreateGroupProjectRoleTemplateBinding(client *rancher.Client, projectID str
761803

762804
return prtb, nil
763805
}
806+
807+
// DeleteClusterRoleTemplateBinding deletes the cluster role template binding using wrangler context
808+
func DeleteClusterRoleTemplateBinding(client *rancher.Client, crtbNamespace, crtbName string) error {
809+
err := client.WranglerContext.Mgmt.ClusterRoleTemplateBinding().Delete(crtbNamespace, crtbName, &metav1.DeleteOptions{})
810+
if err != nil {
811+
return fmt.Errorf("failed to delete ClusterRoleTemplateBinding %s: %w", crtbName, err)
812+
}
813+
814+
err = kwait.PollUntilContextTimeout(context.TODO(), defaults.FiveHundredMillisecondTimeout, defaults.OneMinuteTimeout, false, func(ctx context.Context) (done bool, err error) {
815+
_, err = client.WranglerContext.Mgmt.ClusterRoleTemplateBinding().Get(crtbNamespace, crtbName, metav1.GetOptions{})
816+
817+
if apierrors.IsNotFound(err) {
818+
return true, nil
819+
}
820+
821+
if err != nil {
822+
return false, fmt.Errorf("error checking CRTB deletion status: %w", err)
823+
}
824+
825+
return false, nil
826+
})
827+
828+
if err != nil {
829+
return fmt.Errorf("timed out waiting for ClusterRoleTemplateBinding %s to be deleted: %w", crtbName, err)
830+
}
831+
832+
return nil
833+
}
834+
835+
// DeleteProjectRoleTemplateBinding deletes the project role template binding using wrangler context
836+
func DeleteProjectRoleTemplateBinding(client *rancher.Client, prtbNamespace, prtbName string) error {
837+
err := client.WranglerContext.Mgmt.ProjectRoleTemplateBinding().Delete(prtbNamespace, prtbName, &metav1.DeleteOptions{})
838+
if err != nil {
839+
return fmt.Errorf("failed to delete ProjectRoleTemplateBinding %s: %w", prtbName, err)
840+
}
841+
842+
err = kwait.PollUntilContextTimeout(context.TODO(), defaults.FiveHundredMillisecondTimeout, defaults.OneMinuteTimeout, false, func(ctx context.Context) (done bool, err error) {
843+
_, err = client.WranglerContext.Mgmt.ProjectRoleTemplateBinding().Get(prtbNamespace, prtbName, metav1.GetOptions{})
844+
845+
if apierrors.IsNotFound(err) {
846+
return true, nil
847+
}
848+
849+
if err != nil {
850+
return false, fmt.Errorf("error checking PRTB deletion status: %w", err)
851+
}
852+
853+
return false, nil
854+
})
855+
856+
if err != nil {
857+
return fmt.Errorf("timed out waiting for ProjectRoleTemplateBinding %s to be deleted: %w", prtbName, err)
858+
}
859+
860+
return nil
861+
}
862+
863+
// UpdateRoleTemplateInheritance updates the inheritance of a role template using wrangler context
864+
func UpdateRoleTemplateInheritance(client *rancher.Client, roleTemplateName string, inheritedRoles []*v3.RoleTemplate) (*v3.RoleTemplate, error) {
865+
var roleTemplateNames []string
866+
for _, inheritedRole := range inheritedRoles {
867+
if inheritedRole != nil {
868+
roleTemplateNames = append(roleTemplateNames, inheritedRole.Name)
869+
}
870+
}
871+
872+
existingRoleTemplate, err := GetRoleTemplateByName(client, roleTemplateName)
873+
if err != nil {
874+
return nil, fmt.Errorf("failed to get existing RoleTemplate: %w", err)
875+
}
876+
877+
existingRoleTemplate.RoleTemplateNames = roleTemplateNames
878+
879+
updatedRoleTemplate, err := client.WranglerContext.Mgmt.RoleTemplate().Update(existingRoleTemplate)
880+
if err != nil {
881+
return nil, fmt.Errorf("failed to update RoleTemplate inheritance: %w", err)
882+
}
883+
884+
return GetRoleTemplateByName(client, updatedRoleTemplate.Name)
885+
}
886+
887+
func definePolicyRules(verbs, resources, apiGroups []string) []rbacv1.PolicyRule {
888+
return []rbacv1.PolicyRule{{
889+
Verbs: verbs,
890+
Resources: resources,
891+
APIGroups: apiGroups,
892+
}}
893+
}

0 commit comments

Comments
 (0)