mirror of
https://github.com/kyverno/kyverno.git
synced 2025-03-06 16:06:56 +00:00
63 lines
2 KiB
Go
63 lines
2 KiB
Go
package handlers
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/go-logr/logr"
|
|
"github.com/kyverno/kyverno/pkg/clients/dclient"
|
|
"github.com/kyverno/kyverno/pkg/userinfo"
|
|
admissionutils "github.com/kyverno/kyverno/pkg/utils/admission"
|
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
|
rbacv1listers "k8s.io/client-go/listers/rbac/v1"
|
|
)
|
|
|
|
func (inner AdmissionHandler) WithRoles(
|
|
rbLister rbacv1listers.RoleBindingLister,
|
|
crbLister rbacv1listers.ClusterRoleBindingLister,
|
|
) AdmissionHandler {
|
|
return inner.withRoles(rbLister, crbLister).WithTrace("ROLES")
|
|
}
|
|
|
|
func (inner AdmissionHandler) WithTopLevelGVK(
|
|
client dclient.IDiscovery,
|
|
) AdmissionHandler {
|
|
return inner.withTopLevelGVK(client).WithTrace("GVK")
|
|
}
|
|
|
|
func (inner AdmissionHandler) withRoles(
|
|
rbLister rbacv1listers.RoleBindingLister,
|
|
crbLister rbacv1listers.ClusterRoleBindingLister,
|
|
) AdmissionHandler {
|
|
return func(ctx context.Context, logger logr.Logger, request AdmissionRequest, startTime time.Time) AdmissionResponse {
|
|
roles, clusterRoles, err := userinfo.GetRoleRef(rbLister, crbLister, request.UserInfo)
|
|
if err != nil {
|
|
logger.Error(err, "failed to get roles/cluster roles from user infos")
|
|
return admissionutils.Response(request.UID, err)
|
|
}
|
|
request.Roles = roles
|
|
request.ClusterRoles = clusterRoles
|
|
logger = logger.WithValues(
|
|
"roles", roles,
|
|
"clusterroles", clusterRoles,
|
|
)
|
|
return inner(ctx, logger, request, startTime)
|
|
}
|
|
}
|
|
|
|
func (inner AdmissionHandler) withTopLevelGVK(
|
|
client dclient.IDiscovery,
|
|
) AdmissionHandler {
|
|
return func(ctx context.Context, logger logr.Logger, request AdmissionRequest, startTime time.Time) AdmissionResponse {
|
|
gvk, err := client.GetGVKFromGVR(schema.GroupVersionResource(request.Resource))
|
|
if err != nil {
|
|
logger.Error(err, "failed to get top level GVK from GVR")
|
|
return admissionutils.Response(request.UID, err)
|
|
}
|
|
request.GroupVersionKind = gvk
|
|
logger = logger.WithValues(
|
|
"resource.gvk", gvk,
|
|
)
|
|
return inner(ctx, logger, request, startTime)
|
|
}
|
|
}
|