@@ -160,160 +160,3 @@ func (r *Manager) syncAdditionalRoleBinding(ctx context.Context, tenant *capsule
160
160
161
161
return nil
162
162
}
163
-
164
- // ownerClusterRoleBindings generates a Capsule AdditionalRoleBinding object for the Owner dynamic clusterrole in order
165
- // to take advantage of the additional role binding feature.
166
- func (r * Manager ) ownerClusterRoleBindingsToPermissions (owner capsulev1beta2.OwnerSpec , clusterRoles []string ) capsulev1beta2.PermissionSpec {
167
- var subject capsulev1beta2.ExtendedSubject
168
-
169
- if owner .Kind == "ServiceAccount" {
170
- splitName := strings .Split (owner .Name , ":" )
171
-
172
- subject = capsulev1beta2.ExtendedSubject {
173
- Subject : rbacv1.Subject {
174
- Kind : owner .Kind .String (),
175
- Name : splitName [len (splitName )- 1 ],
176
- Namespace : splitName [len (splitName )- 2 ],
177
- },
178
- // The owner should by default act as owner
179
- ActAsOwner : true ,
180
- }
181
- } else {
182
- subject = capsulev1beta2.ExtendedSubject {
183
- Subject : rbacv1.Subject {
184
- APIGroup : rbacv1 .GroupName ,
185
- Kind : owner .Kind .String (),
186
- Name : owner .Name ,
187
- },
188
- // The owner should by default act as owner
189
- ActAsOwner : true ,
190
- }
191
- }
192
-
193
- return capsulev1beta2.PermissionSpec {
194
- RoleBindings : clusterRoles ,
195
- Subjects : []capsulev1beta2.ExtendedSubject {
196
- subject ,
197
- },
198
- }
199
- }
200
-
201
- // Sync the dynamic Permissions specific cluster-roles and role bindings.
202
- func (r * Manager ) syncPermissions (ctx context.Context , tenant * capsulev1beta2.Tenant ) (err error ) {
203
-
204
- // hashing the RoleBinding name due to DNS RFC-1123 applied to Kubernetes labels
205
- hashFn := func (binding capsulev1beta2.PermissionSpec ) string {
206
- h := fnv .New64a ()
207
-
208
- for _ , cr := range binding .RoleBindings {
209
- _ , _ = h .Write ([]byte (cr ))
210
- }
211
-
212
- for _ , sub := range binding .Subjects {
213
- _ , _ = h .Write ([]byte (sub .Kind + sub .Name ))
214
- }
215
-
216
- return fmt .Sprintf ("%x" , h .Sum64 ())
217
- }
218
- // getting requested Role Binding keys
219
- keys := make ([]string , 0 , len (tenant .Spec .Owners ))
220
- // Generating for dynamic tenant owners cluster roles
221
- for _ , owner := range tenant .Spec .Owners {
222
- cr := r .ownerClusterRoleBindingsToPermissions (owner , owner .ClusterRoles )
223
-
224
- keys = append (keys , hashFn (cr ))
225
- }
226
-
227
- // Generating hash of additional role bindings
228
- for _ , i := range tenant .Spec .Permissions {
229
- keys = append (keys , hashFn (i ))
230
- }
231
-
232
- group := new (errgroup.Group )
233
-
234
- for _ , ns := range tenant .Status .Namespaces {
235
- namespace := ns
236
-
237
- group .Go (func () error {
238
- return r .syncPermissionsRoleBindings (ctx , tenant , namespace , keys , hashFn )
239
- })
240
- }
241
-
242
- return group .Wait ()
243
- }
244
-
245
- //nolint:nakedret
246
- func (r * Manager ) syncPermissionsRoleBindings (ctx context.Context , tenant * capsulev1beta2.Tenant , ns string , keys []string , hashFn func (binding capsulev1beta2.PermissionSpec ) string ) (err error ) {
247
-
248
- var tenantLabel , roleBindingLabel string
249
-
250
- if tenantLabel , err = utils .GetTypeLabel (& capsulev1beta2.Tenant {}); err != nil {
251
- return
252
- }
253
-
254
- if roleBindingLabel , err = utils .GetTypeLabel (& rbacv1.RoleBinding {}); err != nil {
255
- return
256
- }
257
-
258
- if err = r .pruningResources (ctx , ns , keys , & rbacv1.RoleBinding {}); err != nil {
259
- return
260
- }
261
-
262
- var roleBindings []capsulev1beta2.PermissionSpec
263
-
264
- for _ , owner := range tenant .Spec .Owners {
265
- roleBindings = append (roleBindings , r .ownerClusterRoleBindingsToPermissions (owner , owner .ClusterRoles ))
266
- }
267
-
268
- for i , roleBinding := range roleBindings {
269
- roleBindingHashLabel := hashFn (roleBinding )
270
-
271
- for _ , clusterRole := range roleBinding .RoleBindings {
272
-
273
- target := & rbacv1.RoleBinding {
274
- ObjectMeta : metav1.ObjectMeta {
275
- Name : fmt .Sprintf ("capsule-%s-%d-%s" , tenant .Name , i , clusterRole ),
276
- Namespace : ns ,
277
- },
278
- }
279
-
280
- var res controllerutil.OperationResult
281
- res , err = controllerutil .CreateOrUpdate (ctx , r .Client , target , func () error {
282
- if target .Labels == nil {
283
- target .Labels = map [string ]string {}
284
- }
285
-
286
- target .Labels [tenantLabel ] = tenant .Name
287
- target .Labels [roleBindingLabel ] = roleBindingHashLabel
288
- target .RoleRef = rbacv1.RoleRef {
289
- APIGroup : rbacv1 .GroupName ,
290
- Kind : "ClusterRole" ,
291
- Name : clusterRole ,
292
- }
293
-
294
- // Extract rbacv1 Subjects from ExtendedSubjects
295
- subs := make ([]rbacv1.Subject , len (roleBinding .Subjects ))
296
- for i , extendedSubject := range roleBinding .Subjects {
297
- subs [i ] = extendedSubject .Subject
298
- }
299
- target .Subjects = subs
300
-
301
- return controllerutil .SetControllerReference (tenant , target , r .Scheme ())
302
- })
303
-
304
- r .emitEvent (tenant , target .GetNamespace (), res , fmt .Sprintf ("Ensuring RoleBinding %s" , target .GetName ()), err )
305
-
306
- if err != nil {
307
- r .Log .Error (err , "Cannot sync RoleBinding" )
308
- }
309
-
310
- r .Log .Info (fmt .Sprintf ("RoleBinding sync result: %s" , string (res )), "name" , target .Name , "namespace" , target .Namespace )
311
-
312
- if err != nil {
313
- return
314
- }
315
- }
316
- }
317
-
318
- return nil
319
- }
0 commit comments