2025-02-27 12:49:11 +05:30
|
|
|
package eval
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
"github.com/kyverno/kyverno/api/policies.kyverno.io/v1alpha1"
|
|
|
|
"github.com/kyverno/kyverno/pkg/imageverification/imagedataloader"
|
|
|
|
admissionv1 "k8s.io/api/admission/v1"
|
2025-03-05 03:00:23 +05:30
|
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
2025-02-27 12:49:11 +05:30
|
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
|
|
"k8s.io/apiserver/pkg/admission"
|
|
|
|
k8scorev1 "k8s.io/client-go/kubernetes/typed/core/v1"
|
|
|
|
)
|
|
|
|
|
2025-03-15 07:59:19 +08:00
|
|
|
func Evaluate(ctx context.Context, ivpols []*v1alpha1.ImageVerificationPolicy, request interface{}, admissionAttr admission.Attributes, namespace runtime.Object, lister k8scorev1.SecretInterface, registryOpts ...imagedataloader.Option) (map[string]*EvaluationResult, error) {
|
2025-02-27 12:49:11 +05:30
|
|
|
ictx, err := imagedataloader.NewImageContext(lister, registryOpts...)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2025-03-05 03:00:23 +05:30
|
|
|
isAdmissionRequest := false
|
|
|
|
var gvr *metav1.GroupVersionResource
|
|
|
|
if r, ok := request.(*admissionv1.AdmissionRequest); ok {
|
|
|
|
isAdmissionRequest = true
|
|
|
|
gvr = requestGVR(r)
|
2025-02-27 12:49:11 +05:30
|
|
|
}
|
|
|
|
|
2025-03-03 21:27:07 +05:30
|
|
|
policies := filterPolicies(ivpols, isAdmissionRequest)
|
|
|
|
|
2025-03-05 03:00:23 +05:30
|
|
|
c := NewCompiler(ictx, lister, gvr)
|
2025-03-11 13:08:11 +05:30
|
|
|
results := make(map[string]*EvaluationResult, len(policies))
|
2025-03-03 21:27:07 +05:30
|
|
|
for _, ivpol := range policies {
|
2025-03-15 07:59:19 +08:00
|
|
|
p, errList := c.Compile(ivpol)
|
2025-02-27 12:49:11 +05:30
|
|
|
if errList != nil {
|
2025-02-28 14:39:25 +05:30
|
|
|
return nil, fmt.Errorf("failed to compile policy %v", errList)
|
2025-02-27 12:49:11 +05:30
|
|
|
}
|
|
|
|
|
2025-03-03 21:27:07 +05:30
|
|
|
result, err := p.Evaluate(ctx, ictx, admissionAttr, request, namespace, isAdmissionRequest)
|
2025-02-27 12:49:11 +05:30
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2025-03-11 13:08:11 +05:30
|
|
|
results[ivpol.Name] = result
|
2025-02-27 12:49:11 +05:30
|
|
|
}
|
|
|
|
return results, nil
|
|
|
|
}
|
2025-03-03 21:27:07 +05:30
|
|
|
|
|
|
|
func isK8s(request interface{}) bool {
|
|
|
|
_, ok := request.(*admissionv1.AdmissionRequest)
|
|
|
|
return ok
|
|
|
|
}
|
|
|
|
|
2025-03-05 03:00:23 +05:30
|
|
|
func requestGVR(request *admissionv1.AdmissionRequest) *metav1.GroupVersionResource {
|
|
|
|
if request == nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
return request.RequestResource
|
|
|
|
}
|
|
|
|
|
2025-03-03 21:27:07 +05:30
|
|
|
func filterPolicies(ivpols []*v1alpha1.ImageVerificationPolicy, isK8s bool) []*v1alpha1.ImageVerificationPolicy {
|
|
|
|
filteredPolicies := make([]*v1alpha1.ImageVerificationPolicy, 0)
|
|
|
|
|
|
|
|
for _, v := range ivpols {
|
|
|
|
if v == nil {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
if isK8s && v.Spec.EvaluationMode() == v1alpha1.EvaluationModeKubernetes {
|
|
|
|
filteredPolicies = append(filteredPolicies, v)
|
|
|
|
} else if !isK8s && v.Spec.EvaluationMode() == v1alpha1.EvaluationModeJSON {
|
|
|
|
filteredPolicies = append(filteredPolicies, v)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return filteredPolicies
|
|
|
|
}
|