@@ -160,160 +160,3 @@ func (r *Manager) syncAdditionalRoleBinding(ctx context.Context, tenant *capsule
160160
161161 return nil
162162}
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