Skip to content

Commit 876ba7b

Browse files
committed
feat: Permission API block
1 parent 0cc51a6 commit 876ba7b

File tree

1 file changed

+0
-157
lines changed

1 file changed

+0
-157
lines changed

controllers/tenant/rolebindings.go

Lines changed: 0 additions & 157 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)