Skip to content

Commit 2f01b88

Browse files
authored
Merge pull request #292 from /issues/291
fix: added own cluster role binding per authorino instance.
2 parents b0d76fd + 5209535 commit 2f01b88

9 files changed

Lines changed: 38 additions & 16 deletions

File tree

bundle/manifests/authorino-operator.clusterserviceversion.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ metadata:
8383
capabilities: Basic Install
8484
categories: Integration & Delivery
8585
containerImage: quay.io/kuadrant/authorino-operator:latest
86-
createdAt: "2025-12-12T16:47:17Z"
86+
createdAt: "2026-01-29T13:06:15Z"
8787
operators.operatorframework.io/builder: operator-sdk-v1.32.0
8888
operators.operatorframework.io/project_layout: go.kubebuilder.io/v3
8989
repository: https://github.com/Kuadrant/authorino-operator
@@ -259,6 +259,7 @@ spec:
259259
- roles
260260
verbs:
261261
- create
262+
- delete
262263
- get
263264
- list
264265
- patch

config/deploy/manifests.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5974,6 +5974,7 @@ rules:
59745974
- roles
59755975
verbs:
59765976
- create
5977+
- delete
59775978
- get
59785979
- list
59795980
- patch

config/install/manifests.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,7 @@ rules:
457457
- roles
458458
verbs:
459459
- create
460+
- delete
460461
- get
461462
- list
462463
- patch

config/rbac/role.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ rules:
139139
- roles
140140
verbs:
141141
- create
142+
- delete
142143
- get
143144
- list
144145
- patch

controllers/authorino_controller.go

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,10 @@ type AuthorinoReconciler struct {
4545
// +kubebuilder:rbac:groups="apps",resources=deployments,verbs=get;list;watch;create;update;patch;delete
4646
// +kubebuilder:rbac:groups="",resources=services,verbs=get;list;watch;create;update;patch
4747
// +kubebuilder:rbac:groups="rbac.authorization.k8s.io",resources=clusterroles,verbs=get;list;watch;create;update;
48-
// +kubebuilder:rbac:groups="rbac.authorization.k8s.io",resources=rolebindings,verbs=get;list;watch;create;update;patch
49-
// +kubebuilder:rbac:groups="rbac.authorization.k8s.io",resources=clusterrolebindings,verbs=get;list;watch;create;update;patch
48+
// +kubebuilder:rbac:groups="rbac.authorization.k8s.io",resources=rolebindings,verbs=get;list;watch;create;update;patch;delete
49+
// +kubebuilder:rbac:groups="rbac.authorization.k8s.io",resources=clusterrolebindings,verbs=get;list;watch;create;update;patch;delete
5050
// +kubebuilder:rbac:groups="",resources=serviceaccounts,verbs=get;list;watch;create;update;patch
51-
// +kubebuilder:rbac:groups="rbac.authorization.k8s.io",resources=roles,verbs=get;list;watch;create;update;patch
51+
// +kubebuilder:rbac:groups="rbac.authorization.k8s.io",resources=roles,verbs=get;list;watch;create;update;patch;delete
5252
// +kubebuilder:rbac:groups="authentication.k8s.io",resources=tokenreviews,verbs=create;
5353
// +kubebuilder:rbac:groups="authorization.k8s.io",resources=subjectaccessreviews,verbs=create;
5454
// +kubebuilder:rbac:groups="",resources=configmaps,verbs=get;list;watch;create;update;patch;delete
@@ -149,8 +149,17 @@ func (r *AuthorinoReconciler) cleanupClusterScopedPermissions(ctx context.Contex
149149

150150
// we only care about cluster-scoped role bindings for the cleanup
151151
// namespaced ones are garbage collected automatically by k8s because of the owner reference
152-
r.UnboundAuthorinoServiceAccountFromClusterRole(ctx, reconcilers.AuthorinoManagerClusterRoleBindingName, sa)
153-
r.UnboundAuthorinoServiceAccountFromClusterRole(ctx, reconcilers.AuthorinoK8sAuthClusterRoleBindingName, sa)
152+
153+
// Delete instance-specific ClusterRoleBindings
154+
managerBinding := authorinoResources.GetAuthorinoClusterRoleBinding(crName, reconcilers.AuthorinoManagerClusterRoleBindingName, reconcilers.AuthorinoManagerClusterRoleName, sa, labels)
155+
if err := r.Client.Delete(ctx, managerBinding); err != nil && !errors.IsNotFound(err) {
156+
r.Log.Error(err, "failed to delete ClusterRoleBinding", "name", managerBinding.Name)
157+
}
158+
159+
k8sAuthBinding := authorinoResources.GetAuthorinoClusterRoleBinding(crName, reconcilers.AuthorinoK8sAuthClusterRoleBindingName, reconcilers.AuthorinoK8sAuthClusterRoleName, sa, labels)
160+
if err := r.Client.Delete(ctx, k8sAuthBinding); err != nil && !errors.IsNotFound(err) {
161+
r.Log.Error(err, "failed to delete ClusterRoleBinding", "name", k8sAuthBinding.Name)
162+
}
154163
}
155164

156165
func (r *AuthorinoReconciler) installationPreflightCheck(authorino *api.Authorino) error {

controllers/authorino_controller_test.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ var _ = Describe("Authorino controller", func() {
120120
var bindingNsdName types.NamespacedName
121121
if authorinoInstance.Spec.ClusterWide {
122122
binding = &k8srbac.ClusterRoleBinding{}
123-
bindingNsdName = types.NamespacedName{Name: "authorino"}
123+
bindingNsdName = types.NamespacedName{Name: authorinoInstance.Name + "-" + reconcilers.AuthorinoManagerClusterRoleBindingName}
124124
} else {
125125
binding = &k8srbac.RoleBinding{}
126126
bindingNsdName = namespacedName(testAuthorinoNamespace, authorinoInstance.Name+"-authorino")
@@ -132,7 +132,7 @@ var _ = Describe("Authorino controller", func() {
132132

133133
// Authorino Auth ClusterRoleBinding
134134
k8sAuthBinding := &k8srbac.ClusterRoleBinding{}
135-
k8sAuthBindingNsdName := types.NamespacedName{Name: reconcilers.AuthorinoK8sAuthClusterRoleBindingName}
135+
k8sAuthBindingNsdName := types.NamespacedName{Name: authorinoInstance.Name + "-" + reconcilers.AuthorinoK8sAuthClusterRoleBindingName}
136136

137137
Eventually(func(ctx context.Context) error {
138138
return k8sClient.Get(ctx, k8sAuthBindingNsdName, k8sAuthBinding)
@@ -378,7 +378,7 @@ var _ = Describe("Authorino controller", func() {
378378

379379
// Authorino ClusterRoleBinding
380380
binding := &k8srbac.ClusterRoleBinding{}
381-
bindingNsdName := types.NamespacedName{Name: "authorino"}
381+
bindingNsdName := types.NamespacedName{Name: authorinoInstance.Name + "-" + reconcilers.AuthorinoManagerClusterRoleBindingName}
382382

383383
Eventually(func(g Gomega, ctx context.Context) {
384384
g.Expect(k8sClient.Get(ctx, bindingNsdName, binding)).ToNot(HaveOccurred())
@@ -389,7 +389,7 @@ var _ = Describe("Authorino controller", func() {
389389

390390
// Authorino Auth ClusterRoleBinding
391391
k8sAuthBinding := &k8srbac.ClusterRoleBinding{}
392-
k8sAuthBindingNsdName := types.NamespacedName{Name: reconcilers.AuthorinoK8sAuthClusterRoleBindingName}
392+
k8sAuthBindingNsdName := types.NamespacedName{Name: authorinoInstance.Name + "-" + reconcilers.AuthorinoK8sAuthClusterRoleBindingName}
393393

394394
Eventually(func(g Gomega, ctx context.Context) {
395395
g.Expect(k8sClient.Get(ctx, k8sAuthBindingNsdName, k8sAuthBinding)).ToNot(HaveOccurred())
@@ -416,6 +416,9 @@ var _ = Describe("Authorino controller", func() {
416416
authorinoInstance.Spec.ClusterWide = true
417417
Expect(k8sClient.Create(ctx, authorinoInstance)).Should(Succeed())
418418

419+
// Update binding name for the new instance
420+
bindingNsdName = types.NamespacedName{Name: authorinoInstance.Name + "-" + reconcilers.AuthorinoManagerClusterRoleBindingName}
421+
419422
// manager cluster role binding should get service account added
420423
Eventually(func(g Gomega, ctx context.Context) {
421424
sa := authorinoResources.GetAuthorinoServiceAccount(testAuthorinoNamespace, authorinoInstance.Name, authorinoInstance.Labels)

pkg/reconcilers/authorino_reconciler.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -156,13 +156,15 @@ func (r *AuthorinoReconciler) reconcileManagerClusterRoleBinding(ctx context.Con
156156

157157
// if cluster scoped, ensure service account is in the binding
158158
if authorinoInstance.Spec.ClusterWide {
159-
binding := authorinoResources.GetAuthorinoClusterRoleBinding(AuthorinoManagerClusterRoleBindingName, AuthorinoManagerClusterRoleName, sa)
159+
binding := authorinoResources.GetAuthorinoClusterRoleBinding(authorinoInstance.Name, AuthorinoManagerClusterRoleBindingName, AuthorinoManagerClusterRoleName, sa, authorinoInstance.Labels)
160160
return r.reconcileClusterRoleBinding(ctx, binding, authorinoInstance)
161161
}
162162

163163
// local namespace scope
164-
// ensure the service account is NOT in the binding
165-
r.UnboundAuthorinoServiceAccountFromClusterRole(ctx, AuthorinoManagerClusterRoleBindingName, sa)
164+
// if switching from cluster-wide to namespaced, delete the ClusterRoleBinding
165+
binding := authorinoResources.GetAuthorinoClusterRoleBinding(authorinoInstance.Name, AuthorinoManagerClusterRoleBindingName, AuthorinoManagerClusterRoleName, sa, authorinoInstance.Labels)
166+
TagObjectToDelete(binding)
167+
r.reconcileClusterRoleBinding(ctx, binding, authorinoInstance)
166168

167169
return nil
168170
}
@@ -192,7 +194,7 @@ func (r *AuthorinoReconciler) reconcileManagerAuthClusterRoleBinding(ctx context
192194

193195
sa := authorinoResources.GetAuthorinoServiceAccount(authorinoInstance.Namespace, authorinoInstance.Name, authorinoInstance.Labels)
194196

195-
binding := authorinoResources.GetAuthorinoClusterRoleBinding(AuthorinoK8sAuthClusterRoleBindingName, AuthorinoK8sAuthClusterRoleName, sa)
197+
binding := authorinoResources.GetAuthorinoClusterRoleBinding(authorinoInstance.Name, AuthorinoK8sAuthClusterRoleBindingName, AuthorinoK8sAuthClusterRoleName, sa, authorinoInstance.Labels)
196198
return r.reconcileClusterRoleBinding(ctx, binding, authorinoInstance)
197199
}
198200

pkg/resources/k8s_rbac.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ func GetAuthorinoServiceAccount(namespace, crName string, labels map[string]stri
1313
}
1414
}
1515

16-
func GetAuthorinoClusterRoleBinding(roleBindingName, clusterRoleName string, serviceAccount *k8score.ServiceAccount) *k8srbac.ClusterRoleBinding {
16+
func GetAuthorinoClusterRoleBinding(crName, clusterRoleBindingNameSuffix, clusterRoleName string, serviceAccount *k8score.ServiceAccount, labels map[string]string) *k8srbac.ClusterRoleBinding {
1717
roleRef, roleSubject := getRoleRefAndSubject(clusterRoleName, "ClusterRole", serviceAccount)
1818
return &k8srbac.ClusterRoleBinding{
1919
TypeMeta: k8smeta.TypeMeta{APIVersion: k8srbac.SchemeGroupVersion.String(), Kind: "ClusterRoleBinding"},
20-
ObjectMeta: k8smeta.ObjectMeta{Name: roleBindingName},
20+
ObjectMeta: k8smeta.ObjectMeta{Name: authorinoClusterRoleBindingName(crName, clusterRoleBindingNameSuffix), Labels: labels},
2121
RoleRef: roleRef,
2222
Subjects: []k8srbac.Subject{roleSubject},
2323
}

pkg/resources/k8s_util.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,7 @@ func authorinoServiceAccountName(crName string) string {
2424
func authorinoRoleBindingName(crName, roleBindingNameSuffix string) string {
2525
return fmt.Sprintf("%s-%s", crName, roleBindingNameSuffix)
2626
}
27+
28+
func authorinoClusterRoleBindingName(crName, clusterRoleBindingNameSuffix string) string {
29+
return fmt.Sprintf("%s-%s", crName, clusterRoleBindingNameSuffix)
30+
}

0 commit comments

Comments
 (0)