mirror of
https://github.com/kyverno/kyverno.git
synced 2025-03-31 03:45:17 +00:00
refactor: more engine interface (#6199)
* refactor: more engine interface Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com> * fixes Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com> * fix Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com> * fix Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com> --------- Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>
This commit is contained in:
parent
0020a7c749
commit
6c0549febe
32 changed files with 216 additions and 240 deletions
|
@ -80,7 +80,6 @@ func createNonLeaderControllers(
|
||||||
kyvernoClient,
|
kyvernoClient,
|
||||||
dynamicClient,
|
dynamicClient,
|
||||||
eng,
|
eng,
|
||||||
engine.LegacyContextLoaderFactory(rclient),
|
|
||||||
kyvernoInformer.Kyverno().V1().ClusterPolicies(),
|
kyvernoInformer.Kyverno().V1().ClusterPolicies(),
|
||||||
kyvernoInformer.Kyverno().V1().Policies(),
|
kyvernoInformer.Kyverno().V1().Policies(),
|
||||||
kyvernoInformer.Kyverno().V1beta1().UpdateRequests(),
|
kyvernoInformer.Kyverno().V1beta1().UpdateRequests(),
|
||||||
|
@ -94,6 +93,7 @@ func createNonLeaderControllers(
|
||||||
}
|
}
|
||||||
|
|
||||||
func createrLeaderControllers(
|
func createrLeaderControllers(
|
||||||
|
eng engineapi.Engine,
|
||||||
kubeInformer kubeinformers.SharedInformerFactory,
|
kubeInformer kubeinformers.SharedInformerFactory,
|
||||||
kyvernoInformer kyvernoinformer.SharedInformerFactory,
|
kyvernoInformer kyvernoinformer.SharedInformerFactory,
|
||||||
kyvernoClient versioned.Interface,
|
kyvernoClient versioned.Interface,
|
||||||
|
@ -107,7 +107,7 @@ func createrLeaderControllers(
|
||||||
policyCtrl, err := policy.NewPolicyController(
|
policyCtrl, err := policy.NewPolicyController(
|
||||||
kyvernoClient,
|
kyvernoClient,
|
||||||
dynamicClient,
|
dynamicClient,
|
||||||
engine.LegacyContextLoaderFactory(rclient),
|
eng,
|
||||||
kyvernoInformer.Kyverno().V1().ClusterPolicies(),
|
kyvernoInformer.Kyverno().V1().ClusterPolicies(),
|
||||||
kyvernoInformer.Kyverno().V1().Policies(),
|
kyvernoInformer.Kyverno().V1().Policies(),
|
||||||
kyvernoInformer.Kyverno().V1beta1().UpdateRequests(),
|
kyvernoInformer.Kyverno().V1beta1().UpdateRequests(),
|
||||||
|
@ -226,7 +226,10 @@ func main() {
|
||||||
kyvernoInformer.Kyverno().V1().ClusterPolicies(),
|
kyvernoInformer.Kyverno().V1().ClusterPolicies(),
|
||||||
kyvernoInformer.Kyverno().V1().Policies(),
|
kyvernoInformer.Kyverno().V1().Policies(),
|
||||||
)
|
)
|
||||||
engine := engine.NewEgine()
|
engine := engine.NewEngine(
|
||||||
|
configuration,
|
||||||
|
engine.LegacyContextLoaderFactory(rclient, configMapResolver),
|
||||||
|
)
|
||||||
// create non leader controllers
|
// create non leader controllers
|
||||||
nonLeaderControllers := createNonLeaderControllers(
|
nonLeaderControllers := createNonLeaderControllers(
|
||||||
engine,
|
engine,
|
||||||
|
@ -263,6 +266,7 @@ func main() {
|
||||||
kyvernoInformer := kyvernoinformer.NewSharedInformerFactory(kyvernoClient, resyncPeriod)
|
kyvernoInformer := kyvernoinformer.NewSharedInformerFactory(kyvernoClient, resyncPeriod)
|
||||||
// create leader controllers
|
// create leader controllers
|
||||||
leaderControllers, err := createrLeaderControllers(
|
leaderControllers, err := createrLeaderControllers(
|
||||||
|
engine,
|
||||||
kubeInformer,
|
kubeInformer,
|
||||||
kyvernoInformer,
|
kyvernoInformer,
|
||||||
kyvernoClient,
|
kyvernoClient,
|
||||||
|
|
|
@ -474,7 +474,10 @@ OuterLoop:
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
eng := engine.NewEgine()
|
eng := engine.NewEngine(
|
||||||
|
cfg,
|
||||||
|
engine.LegacyContextLoaderFactory(registryclient.NewOrDie(), nil),
|
||||||
|
)
|
||||||
policyContext := engine.NewPolicyContextWithJsonContext(ctx).
|
policyContext := engine.NewPolicyContextWithJsonContext(ctx).
|
||||||
WithPolicy(c.Policy).
|
WithPolicy(c.Policy).
|
||||||
WithNewResource(*updatedResource).
|
WithNewResource(*updatedResource).
|
||||||
|
@ -485,7 +488,6 @@ OuterLoop:
|
||||||
|
|
||||||
mutateResponse := eng.Mutate(
|
mutateResponse := eng.Mutate(
|
||||||
context.Background(),
|
context.Background(),
|
||||||
engine.LegacyContextLoaderFactory(registryclient.NewOrDie()),
|
|
||||||
policyContext,
|
policyContext,
|
||||||
)
|
)
|
||||||
if mutateResponse != nil {
|
if mutateResponse != nil {
|
||||||
|
@ -513,9 +515,7 @@ OuterLoop:
|
||||||
if policyHasValidate {
|
if policyHasValidate {
|
||||||
validateResponse = eng.Validate(
|
validateResponse = eng.Validate(
|
||||||
context.Background(),
|
context.Background(),
|
||||||
engine.LegacyContextLoaderFactory(registryclient.NewOrDie()),
|
|
||||||
policyContext,
|
policyContext,
|
||||||
cfg,
|
|
||||||
)
|
)
|
||||||
info = ProcessValidateEngineResponse(c.Policy, validateResponse, resPath, c.Rc, c.PolicyReport, c.AuditWarn)
|
info = ProcessValidateEngineResponse(c.Policy, validateResponse, resPath, c.Rc, c.PolicyReport, c.AuditWarn)
|
||||||
}
|
}
|
||||||
|
@ -526,10 +526,8 @@ OuterLoop:
|
||||||
|
|
||||||
verifyImageResponse, _ := eng.VerifyAndPatchImages(
|
verifyImageResponse, _ := eng.VerifyAndPatchImages(
|
||||||
context.Background(),
|
context.Background(),
|
||||||
engine.LegacyContextLoaderFactory(registryclient.NewOrDie()),
|
|
||||||
registryclient.NewOrDie(),
|
registryclient.NewOrDie(),
|
||||||
policyContext,
|
policyContext,
|
||||||
cfg,
|
|
||||||
)
|
)
|
||||||
if verifyImageResponse != nil && !verifyImageResponse.IsEmpty() {
|
if verifyImageResponse != nil && !verifyImageResponse.IsEmpty() {
|
||||||
engineResponses = append(engineResponses, verifyImageResponse)
|
engineResponses = append(engineResponses, verifyImageResponse)
|
||||||
|
@ -544,8 +542,7 @@ OuterLoop:
|
||||||
}
|
}
|
||||||
|
|
||||||
if policyHasGenerate {
|
if policyHasGenerate {
|
||||||
generateResponse := engine.ApplyBackgroundChecks(
|
generateResponse := eng.ApplyBackgroundChecks(
|
||||||
engine.LegacyContextLoaderFactory(registryclient.NewOrDie()),
|
|
||||||
policyContext,
|
policyContext,
|
||||||
)
|
)
|
||||||
if generateResponse != nil && !generateResponse.IsEmpty() {
|
if generateResponse != nil && !generateResponse.IsEmpty() {
|
||||||
|
@ -1080,7 +1077,10 @@ func initializeMockController(objects []runtime.Object) (*generate.GenerateContr
|
||||||
}
|
}
|
||||||
|
|
||||||
client.SetDiscovery(dclient.NewFakeDiscoveryClient(nil))
|
client.SetDiscovery(dclient.NewFakeDiscoveryClient(nil))
|
||||||
c := generate.NewGenerateControllerWithOnlyClient(client, engine.LegacyContextLoaderFactory(nil))
|
c := generate.NewGenerateControllerWithOnlyClient(client, engine.NewEngine(
|
||||||
|
config.NewDefaultConfiguration(),
|
||||||
|
engine.LegacyContextLoaderFactory(nil, nil),
|
||||||
|
))
|
||||||
return c, nil
|
return c, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -355,7 +355,10 @@ func main() {
|
||||||
kubeKyvernoInformer.Apps().V1().Deployments(),
|
kubeKyvernoInformer.Apps().V1().Deployments(),
|
||||||
certRenewer,
|
certRenewer,
|
||||||
)
|
)
|
||||||
eng := engine.NewEgine()
|
eng := engine.NewEngine(
|
||||||
|
configuration,
|
||||||
|
engine.LegacyContextLoaderFactory(rclient, configMapResolver),
|
||||||
|
)
|
||||||
// create non leader controllers
|
// create non leader controllers
|
||||||
nonLeaderControllers, nonLeaderBootstrap := createNonLeaderControllers(
|
nonLeaderControllers, nonLeaderBootstrap := createNonLeaderControllers(
|
||||||
eng,
|
eng,
|
||||||
|
@ -476,14 +479,12 @@ func main() {
|
||||||
}
|
}
|
||||||
resourceHandlers := webhooksresource.NewHandlers(
|
resourceHandlers := webhooksresource.NewHandlers(
|
||||||
eng,
|
eng,
|
||||||
engine.LegacyContextLoaderFactory(rclient),
|
|
||||||
dClient,
|
dClient,
|
||||||
kyvernoClient,
|
kyvernoClient,
|
||||||
rclient,
|
rclient,
|
||||||
configuration,
|
configuration,
|
||||||
metricsConfig,
|
metricsConfig,
|
||||||
policyCache,
|
policyCache,
|
||||||
configMapResolver,
|
|
||||||
kubeInformer.Core().V1().Namespaces().Lister(),
|
kubeInformer.Core().V1().Namespaces().Lister(),
|
||||||
kubeInformer.Rbac().V1().RoleBindings().Lister(),
|
kubeInformer.Rbac().V1().RoleBindings().Lister(),
|
||||||
kubeInformer.Rbac().V1().ClusterRoleBindings().Lister(),
|
kubeInformer.Rbac().V1().ClusterRoleBindings().Lister(),
|
||||||
|
|
|
@ -132,7 +132,6 @@ func createReportControllers(
|
||||||
kyvernoClient,
|
kyvernoClient,
|
||||||
rclient,
|
rclient,
|
||||||
eng,
|
eng,
|
||||||
engine.LegacyContextLoaderFactory(rclient),
|
|
||||||
metadataFactory,
|
metadataFactory,
|
||||||
kyvernoV1.Policies(),
|
kyvernoV1.Policies(),
|
||||||
kyvernoV1.ClusterPolicies(),
|
kyvernoV1.ClusterPolicies(),
|
||||||
|
@ -302,7 +301,10 @@ func main() {
|
||||||
}
|
}
|
||||||
// start event generator
|
// start event generator
|
||||||
go eventGenerator.Run(ctx, 3)
|
go eventGenerator.Run(ctx, 3)
|
||||||
eng := engine.NewEgine()
|
eng := engine.NewEngine(
|
||||||
|
configuration,
|
||||||
|
engine.LegacyContextLoaderFactory(rclient, configMapResolver),
|
||||||
|
)
|
||||||
// setup leader election
|
// setup leader election
|
||||||
le, err := leaderelection.New(
|
le, err := leaderelection.New(
|
||||||
logger.WithName("leader-election"),
|
logger.WithName("leader-election"),
|
||||||
|
|
|
@ -10,7 +10,6 @@ import (
|
||||||
"github.com/kyverno/kyverno/pkg/clients/dclient"
|
"github.com/kyverno/kyverno/pkg/clients/dclient"
|
||||||
"github.com/kyverno/kyverno/pkg/config"
|
"github.com/kyverno/kyverno/pkg/config"
|
||||||
"github.com/kyverno/kyverno/pkg/engine"
|
"github.com/kyverno/kyverno/pkg/engine"
|
||||||
engineapi "github.com/kyverno/kyverno/pkg/engine/api"
|
|
||||||
"github.com/kyverno/kyverno/pkg/engine/context"
|
"github.com/kyverno/kyverno/pkg/engine/context"
|
||||||
admissionutils "github.com/kyverno/kyverno/pkg/utils/admission"
|
admissionutils "github.com/kyverno/kyverno/pkg/utils/admission"
|
||||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||||
|
@ -20,7 +19,6 @@ func NewBackgroundContext(dclient dclient.Interface, ur *kyvernov1beta1.UpdateRe
|
||||||
policy kyvernov1.PolicyInterface,
|
policy kyvernov1.PolicyInterface,
|
||||||
trigger *unstructured.Unstructured,
|
trigger *unstructured.Unstructured,
|
||||||
cfg config.Configuration,
|
cfg config.Configuration,
|
||||||
informerCacheResolvers engineapi.ConfigmapResolver,
|
|
||||||
namespaceLabels map[string]string,
|
namespaceLabels map[string]string,
|
||||||
logger logr.Logger,
|
logger logr.Logger,
|
||||||
) (*engine.PolicyContext, bool, error) {
|
) (*engine.PolicyContext, bool, error) {
|
||||||
|
@ -85,8 +83,7 @@ func NewBackgroundContext(dclient dclient.Interface, ur *kyvernov1beta1.UpdateRe
|
||||||
WithAdmissionInfo(ur.Spec.Context.UserRequestInfo).
|
WithAdmissionInfo(ur.Spec.Context.UserRequestInfo).
|
||||||
WithConfiguration(cfg).
|
WithConfiguration(cfg).
|
||||||
WithNamespaceLabels(namespaceLabels).
|
WithNamespaceLabels(namespaceLabels).
|
||||||
WithClient(dclient).
|
WithClient(dclient)
|
||||||
WithInformerCacheResolver(informerCacheResolvers)
|
|
||||||
|
|
||||||
return policyContext, false, nil
|
return policyContext, false, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,7 +42,7 @@ type GenerateController struct {
|
||||||
client dclient.Interface
|
client dclient.Interface
|
||||||
kyvernoClient versioned.Interface
|
kyvernoClient versioned.Interface
|
||||||
statusControl common.StatusControlInterface
|
statusControl common.StatusControlInterface
|
||||||
contextLoader engineapi.ContextLoaderFactory
|
engine engineapi.Engine
|
||||||
|
|
||||||
// listers
|
// listers
|
||||||
urLister kyvernov1beta1listers.UpdateRequestNamespaceLister
|
urLister kyvernov1beta1listers.UpdateRequestNamespaceLister
|
||||||
|
@ -51,7 +51,6 @@ type GenerateController struct {
|
||||||
npolicyLister kyvernov1listers.PolicyLister
|
npolicyLister kyvernov1listers.PolicyLister
|
||||||
|
|
||||||
configuration config.Configuration
|
configuration config.Configuration
|
||||||
informerCacheResolvers engineapi.ConfigmapResolver
|
|
||||||
eventGen event.Interface
|
eventGen event.Interface
|
||||||
|
|
||||||
log logr.Logger
|
log logr.Logger
|
||||||
|
@ -62,27 +61,25 @@ func NewGenerateController(
|
||||||
client dclient.Interface,
|
client dclient.Interface,
|
||||||
kyvernoClient versioned.Interface,
|
kyvernoClient versioned.Interface,
|
||||||
statusControl common.StatusControlInterface,
|
statusControl common.StatusControlInterface,
|
||||||
contextLoader engineapi.ContextLoaderFactory,
|
engine engineapi.Engine,
|
||||||
policyLister kyvernov1listers.ClusterPolicyLister,
|
policyLister kyvernov1listers.ClusterPolicyLister,
|
||||||
npolicyLister kyvernov1listers.PolicyLister,
|
npolicyLister kyvernov1listers.PolicyLister,
|
||||||
urLister kyvernov1beta1listers.UpdateRequestNamespaceLister,
|
urLister kyvernov1beta1listers.UpdateRequestNamespaceLister,
|
||||||
nsLister corev1listers.NamespaceLister,
|
nsLister corev1listers.NamespaceLister,
|
||||||
dynamicConfig config.Configuration,
|
dynamicConfig config.Configuration,
|
||||||
informerCacheResolvers engineapi.ConfigmapResolver,
|
|
||||||
eventGen event.Interface,
|
eventGen event.Interface,
|
||||||
log logr.Logger,
|
log logr.Logger,
|
||||||
) *GenerateController {
|
) *GenerateController {
|
||||||
c := GenerateController{
|
c := GenerateController{
|
||||||
client: client,
|
client: client,
|
||||||
contextLoader: contextLoader,
|
|
||||||
kyvernoClient: kyvernoClient,
|
kyvernoClient: kyvernoClient,
|
||||||
statusControl: statusControl,
|
statusControl: statusControl,
|
||||||
|
engine: engine,
|
||||||
policyLister: policyLister,
|
policyLister: policyLister,
|
||||||
npolicyLister: npolicyLister,
|
npolicyLister: npolicyLister,
|
||||||
urLister: urLister,
|
urLister: urLister,
|
||||||
nsLister: nsLister,
|
nsLister: nsLister,
|
||||||
configuration: dynamicConfig,
|
configuration: dynamicConfig,
|
||||||
informerCacheResolvers: informerCacheResolvers,
|
|
||||||
eventGen: eventGen,
|
eventGen: eventGen,
|
||||||
log: log,
|
log: log,
|
||||||
}
|
}
|
||||||
|
@ -194,13 +191,13 @@ func (c *GenerateController) applyGenerate(resource unstructured.Unstructured, u
|
||||||
return nil, false, err
|
return nil, false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
policyContext, precreatedResource, err := common.NewBackgroundContext(c.client, &ur, &policy, &resource, c.configuration, c.informerCacheResolvers, namespaceLabels, logger)
|
policyContext, precreatedResource, err := common.NewBackgroundContext(c.client, &ur, &policy, &resource, c.configuration, namespaceLabels, logger)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, precreatedResource, err
|
return nil, precreatedResource, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if the policy still applies to the resource
|
// check if the policy still applies to the resource
|
||||||
engineResponse := engine.GenerateResponse(c.contextLoader, policyContext, ur)
|
engineResponse := c.engine.GenerateResponse(policyContext, ur)
|
||||||
if len(engineResponse.PolicyResponse.Rules) == 0 {
|
if len(engineResponse.PolicyResponse.Rules) == 0 {
|
||||||
logger.V(4).Info(doesNotApply)
|
logger.V(4).Info(doesNotApply)
|
||||||
return nil, false, errors.New(doesNotApply)
|
return nil, false, errors.New(doesNotApply)
|
||||||
|
@ -346,7 +343,7 @@ func (c *GenerateController) ApplyGeneratePolicy(log logr.Logger, policyContext
|
||||||
}
|
}
|
||||||
|
|
||||||
// add configmap json data to context
|
// add configmap json data to context
|
||||||
if err := engine.LoadContext(context.TODO(), c.contextLoader, rule.Context, policyContext, rule.Name); err != nil {
|
if err := c.engine.ContextLoader(policyContext, rule.Name).Load(context.TODO(), rule.Context, policyContext.JSONContext()); err != nil {
|
||||||
log.Error(err, "cannot add configmaps to context")
|
log.Error(err, "cannot add configmaps to context")
|
||||||
return nil, processExisting, err
|
return nil, processExisting, err
|
||||||
}
|
}
|
||||||
|
@ -828,10 +825,10 @@ func (c *GenerateController) ApplyResource(resource *unstructured.Unstructured)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewGenerateControllerWithOnlyClient returns an instance of Controller with only the client.
|
// NewGenerateControllerWithOnlyClient returns an instance of Controller with only the client.
|
||||||
func NewGenerateControllerWithOnlyClient(client dclient.Interface, contextLoader engineapi.ContextLoaderFactory) *GenerateController {
|
func NewGenerateControllerWithOnlyClient(client dclient.Interface, engine engineapi.Engine) *GenerateController {
|
||||||
c := GenerateController{
|
c := GenerateController{
|
||||||
client: client,
|
client: client,
|
||||||
contextLoader: contextLoader,
|
engine: engine,
|
||||||
}
|
}
|
||||||
return &c
|
return &c
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,6 @@ type MutateExistingController struct {
|
||||||
client dclient.Interface
|
client dclient.Interface
|
||||||
statusControl common.StatusControlInterface
|
statusControl common.StatusControlInterface
|
||||||
engine engineapi.Engine
|
engine engineapi.Engine
|
||||||
contextLoader engineapi.ContextLoaderFactory
|
|
||||||
|
|
||||||
// listers
|
// listers
|
||||||
policyLister kyvernov1listers.ClusterPolicyLister
|
policyLister kyvernov1listers.ClusterPolicyLister
|
||||||
|
@ -39,7 +38,6 @@ type MutateExistingController struct {
|
||||||
nsLister corev1listers.NamespaceLister
|
nsLister corev1listers.NamespaceLister
|
||||||
|
|
||||||
configuration config.Configuration
|
configuration config.Configuration
|
||||||
informerCacheResolvers engineapi.ConfigmapResolver
|
|
||||||
eventGen event.Interface
|
eventGen event.Interface
|
||||||
|
|
||||||
log logr.Logger
|
log logr.Logger
|
||||||
|
@ -50,12 +48,10 @@ func NewMutateExistingController(
|
||||||
client dclient.Interface,
|
client dclient.Interface,
|
||||||
statusControl common.StatusControlInterface,
|
statusControl common.StatusControlInterface,
|
||||||
engine engineapi.Engine,
|
engine engineapi.Engine,
|
||||||
contextLoader engineapi.ContextLoaderFactory,
|
|
||||||
policyLister kyvernov1listers.ClusterPolicyLister,
|
policyLister kyvernov1listers.ClusterPolicyLister,
|
||||||
npolicyLister kyvernov1listers.PolicyLister,
|
npolicyLister kyvernov1listers.PolicyLister,
|
||||||
nsLister corev1listers.NamespaceLister,
|
nsLister corev1listers.NamespaceLister,
|
||||||
dynamicConfig config.Configuration,
|
dynamicConfig config.Configuration,
|
||||||
informerCacheResolvers engineapi.ConfigmapResolver,
|
|
||||||
eventGen event.Interface,
|
eventGen event.Interface,
|
||||||
log logr.Logger,
|
log logr.Logger,
|
||||||
) *MutateExistingController {
|
) *MutateExistingController {
|
||||||
|
@ -63,12 +59,10 @@ func NewMutateExistingController(
|
||||||
client: client,
|
client: client,
|
||||||
statusControl: statusControl,
|
statusControl: statusControl,
|
||||||
engine: engine,
|
engine: engine,
|
||||||
contextLoader: contextLoader,
|
|
||||||
policyLister: policyLister,
|
policyLister: policyLister,
|
||||||
npolicyLister: npolicyLister,
|
npolicyLister: npolicyLister,
|
||||||
nsLister: nsLister,
|
nsLister: nsLister,
|
||||||
configuration: dynamicConfig,
|
configuration: dynamicConfig,
|
||||||
informerCacheResolvers: informerCacheResolvers,
|
|
||||||
eventGen: eventGen,
|
eventGen: eventGen,
|
||||||
log: log,
|
log: log,
|
||||||
}
|
}
|
||||||
|
@ -98,14 +92,14 @@ func (c *MutateExistingController) ProcessUR(ur *kyvernov1beta1.UpdateRequest) e
|
||||||
}
|
}
|
||||||
|
|
||||||
namespaceLabels := engineutils.GetNamespaceSelectorsFromNamespaceLister(trigger.GetKind(), trigger.GetNamespace(), c.nsLister, logger)
|
namespaceLabels := engineutils.GetNamespaceSelectorsFromNamespaceLister(trigger.GetKind(), trigger.GetNamespace(), c.nsLister, logger)
|
||||||
policyContext, _, err := common.NewBackgroundContext(c.client, ur, policy, trigger, c.configuration, c.informerCacheResolvers, namespaceLabels, logger)
|
policyContext, _, err := common.NewBackgroundContext(c.client, ur, policy, trigger, c.configuration, namespaceLabels, logger)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.WithName(rule.Name).Error(err, "failed to build policy context")
|
logger.WithName(rule.Name).Error(err, "failed to build policy context")
|
||||||
errs = append(errs, err)
|
errs = append(errs, err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
er := c.engine.Mutate(context.TODO(), c.contextLoader, policyContext)
|
er := c.engine.Mutate(context.TODO(), policyContext)
|
||||||
for _, r := range er.PolicyResponse.Rules {
|
for _, r := range er.PolicyResponse.Rules {
|
||||||
patched := r.PatchedTarget
|
patched := r.PatchedTarget
|
||||||
patchedTargetSubresourceName := r.PatchedTargetSubresourceName
|
patchedTargetSubresourceName := r.PatchedTargetSubresourceName
|
||||||
|
|
|
@ -48,7 +48,6 @@ type controller struct {
|
||||||
client dclient.Interface
|
client dclient.Interface
|
||||||
kyvernoClient versioned.Interface
|
kyvernoClient versioned.Interface
|
||||||
engine engineapi.Engine
|
engine engineapi.Engine
|
||||||
contextLoader engineapi.ContextLoaderFactory
|
|
||||||
|
|
||||||
// listers
|
// listers
|
||||||
cpolLister kyvernov1listers.ClusterPolicyLister
|
cpolLister kyvernov1listers.ClusterPolicyLister
|
||||||
|
@ -72,7 +71,6 @@ func NewController(
|
||||||
kyvernoClient versioned.Interface,
|
kyvernoClient versioned.Interface,
|
||||||
client dclient.Interface,
|
client dclient.Interface,
|
||||||
engine engineapi.Engine,
|
engine engineapi.Engine,
|
||||||
contextLoader engineapi.ContextLoaderFactory,
|
|
||||||
cpolInformer kyvernov1informers.ClusterPolicyInformer,
|
cpolInformer kyvernov1informers.ClusterPolicyInformer,
|
||||||
polInformer kyvernov1informers.PolicyInformer,
|
polInformer kyvernov1informers.PolicyInformer,
|
||||||
urInformer kyvernov1beta1informers.UpdateRequestInformer,
|
urInformer kyvernov1beta1informers.UpdateRequestInformer,
|
||||||
|
@ -87,7 +85,6 @@ func NewController(
|
||||||
client: client,
|
client: client,
|
||||||
kyvernoClient: kyvernoClient,
|
kyvernoClient: kyvernoClient,
|
||||||
engine: engine,
|
engine: engine,
|
||||||
contextLoader: contextLoader,
|
|
||||||
cpolLister: cpolInformer.Lister(),
|
cpolLister: cpolInformer.Lister(),
|
||||||
polLister: polInformer.Lister(),
|
polLister: polInformer.Lister(),
|
||||||
urLister: urLister,
|
urLister: urLister,
|
||||||
|
@ -421,10 +418,10 @@ func (c *controller) processUR(ur *kyvernov1beta1.UpdateRequest) error {
|
||||||
statusControl := common.NewStatusControl(c.kyvernoClient, c.urLister)
|
statusControl := common.NewStatusControl(c.kyvernoClient, c.urLister)
|
||||||
switch ur.Spec.Type {
|
switch ur.Spec.Type {
|
||||||
case kyvernov1beta1.Mutate:
|
case kyvernov1beta1.Mutate:
|
||||||
ctrl := mutate.NewMutateExistingController(c.client, statusControl, c.engine, c.contextLoader, c.cpolLister, c.polLister, c.nsLister, c.configuration, c.informerCacheResolvers, c.eventGen, logger)
|
ctrl := mutate.NewMutateExistingController(c.client, statusControl, c.engine, c.cpolLister, c.polLister, c.nsLister, c.configuration, c.eventGen, logger)
|
||||||
return ctrl.ProcessUR(ur)
|
return ctrl.ProcessUR(ur)
|
||||||
case kyvernov1beta1.Generate:
|
case kyvernov1beta1.Generate:
|
||||||
ctrl := generate.NewGenerateController(c.client, c.kyvernoClient, statusControl, c.contextLoader, c.cpolLister, c.polLister, c.urLister, c.nsLister, c.configuration, c.informerCacheResolvers, c.eventGen, logger)
|
ctrl := generate.NewGenerateController(c.client, c.kyvernoClient, statusControl, c.engine, c.cpolLister, c.polLister, c.urLister, c.nsLister, c.configuration, c.eventGen, logger)
|
||||||
return ctrl.ProcessUR(ur)
|
return ctrl.ProcessUR(ur)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -50,7 +50,6 @@ type controller struct {
|
||||||
kyvernoClient versioned.Interface
|
kyvernoClient versioned.Interface
|
||||||
rclient registryclient.Client
|
rclient registryclient.Client
|
||||||
engine engineapi.Engine
|
engine engineapi.Engine
|
||||||
contextLoader engineapi.ContextLoaderFactory
|
|
||||||
|
|
||||||
// listers
|
// listers
|
||||||
polLister kyvernov1listers.PolicyLister
|
polLister kyvernov1listers.PolicyLister
|
||||||
|
@ -78,7 +77,6 @@ func NewController(
|
||||||
kyvernoClient versioned.Interface,
|
kyvernoClient versioned.Interface,
|
||||||
rclient registryclient.Client,
|
rclient registryclient.Client,
|
||||||
engine engineapi.Engine,
|
engine engineapi.Engine,
|
||||||
contextLoader engineapi.ContextLoaderFactory,
|
|
||||||
metadataFactory metadatainformers.SharedInformerFactory,
|
metadataFactory metadatainformers.SharedInformerFactory,
|
||||||
polInformer kyvernov1informers.PolicyInformer,
|
polInformer kyvernov1informers.PolicyInformer,
|
||||||
cpolInformer kyvernov1informers.ClusterPolicyInformer,
|
cpolInformer kyvernov1informers.ClusterPolicyInformer,
|
||||||
|
@ -98,7 +96,6 @@ func NewController(
|
||||||
kyvernoClient: kyvernoClient,
|
kyvernoClient: kyvernoClient,
|
||||||
rclient: rclient,
|
rclient: rclient,
|
||||||
engine: engine,
|
engine: engine,
|
||||||
contextLoader: contextLoader,
|
|
||||||
polLister: polInformer.Lister(),
|
polLister: polInformer.Lister(),
|
||||||
cpolLister: cpolInformer.Lister(),
|
cpolLister: cpolInformer.Lister(),
|
||||||
bgscanrLister: bgscanr.Lister(),
|
bgscanrLister: bgscanr.Lister(),
|
||||||
|
@ -315,7 +312,7 @@ func (c *controller) reconcileReport(
|
||||||
// calculate necessary results
|
// calculate necessary results
|
||||||
for _, policy := range backgroundPolicies {
|
for _, policy := range backgroundPolicies {
|
||||||
if full || actual[reportutils.PolicyLabel(policy)] != policy.GetResourceVersion() {
|
if full || actual[reportutils.PolicyLabel(policy)] != policy.GetResourceVersion() {
|
||||||
scanner := utils.NewScanner(logger, c.engine, c.contextLoader, c.client, c.rclient, c.informerCacheResolvers, c.polexLister, c.config)
|
scanner := utils.NewScanner(logger, c.engine, c.client, c.rclient, c.polexLister, c.config)
|
||||||
for _, result := range scanner.ScanResource(ctx, *target, nsLabels, policy) {
|
for _, result := range scanner.ScanResource(ctx, *target, nsLabels, policy) {
|
||||||
if result.Error != nil {
|
if result.Error != nil {
|
||||||
return result.Error
|
return result.Error
|
||||||
|
|
|
@ -18,10 +18,8 @@ import (
|
||||||
type scanner struct {
|
type scanner struct {
|
||||||
logger logr.Logger
|
logger logr.Logger
|
||||||
engine engineapi.Engine
|
engine engineapi.Engine
|
||||||
contextLoader engineapi.ContextLoaderFactory
|
|
||||||
client dclient.Interface
|
client dclient.Interface
|
||||||
rclient registryclient.Client
|
rclient registryclient.Client
|
||||||
informerCacheResolvers engineapi.ConfigmapResolver
|
|
||||||
polexLister engine.PolicyExceptionLister
|
polexLister engine.PolicyExceptionLister
|
||||||
excludeGroupRole []string
|
excludeGroupRole []string
|
||||||
config config.Configuration
|
config config.Configuration
|
||||||
|
@ -39,10 +37,8 @@ type Scanner interface {
|
||||||
func NewScanner(
|
func NewScanner(
|
||||||
logger logr.Logger,
|
logger logr.Logger,
|
||||||
engine engineapi.Engine,
|
engine engineapi.Engine,
|
||||||
contextLoader engineapi.ContextLoaderFactory,
|
|
||||||
client dclient.Interface,
|
client dclient.Interface,
|
||||||
rclient registryclient.Client,
|
rclient registryclient.Client,
|
||||||
informerCacheResolvers engineapi.ConfigmapResolver,
|
|
||||||
polexLister engine.PolicyExceptionLister,
|
polexLister engine.PolicyExceptionLister,
|
||||||
config config.Configuration,
|
config config.Configuration,
|
||||||
excludeGroupRole ...string,
|
excludeGroupRole ...string,
|
||||||
|
@ -50,10 +46,8 @@ func NewScanner(
|
||||||
return &scanner{
|
return &scanner{
|
||||||
logger: logger,
|
logger: logger,
|
||||||
engine: engine,
|
engine: engine,
|
||||||
contextLoader: contextLoader,
|
|
||||||
client: client,
|
client: client,
|
||||||
rclient: rclient,
|
rclient: rclient,
|
||||||
informerCacheResolvers: informerCacheResolvers,
|
|
||||||
polexLister: polexLister,
|
polexLister: polexLister,
|
||||||
config: config,
|
config: config,
|
||||||
excludeGroupRole: excludeGroupRole,
|
excludeGroupRole: excludeGroupRole,
|
||||||
|
@ -107,9 +101,8 @@ func (s *scanner) validateResource(ctx context.Context, resource unstructured.Un
|
||||||
WithClient(s.client).
|
WithClient(s.client).
|
||||||
WithNamespaceLabels(nsLabels).
|
WithNamespaceLabels(nsLabels).
|
||||||
WithExcludeGroupRole(s.excludeGroupRole...).
|
WithExcludeGroupRole(s.excludeGroupRole...).
|
||||||
WithInformerCacheResolver(s.informerCacheResolvers).
|
|
||||||
WithExceptions(s.polexLister)
|
WithExceptions(s.polexLister)
|
||||||
return s.engine.Validate(ctx, s.contextLoader, policyCtx, s.config), nil
|
return s.engine.Validate(ctx, policyCtx), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *scanner) validateImages(ctx context.Context, resource unstructured.Unstructured, nsLabels map[string]string, policy kyvernov1.PolicyInterface) (*engineapi.EngineResponse, error) {
|
func (s *scanner) validateImages(ctx context.Context, resource unstructured.Unstructured, nsLabels map[string]string, policy kyvernov1.PolicyInterface) (*engineapi.EngineResponse, error) {
|
||||||
|
@ -132,9 +125,8 @@ func (s *scanner) validateImages(ctx context.Context, resource unstructured.Unst
|
||||||
WithClient(s.client).
|
WithClient(s.client).
|
||||||
WithNamespaceLabels(nsLabels).
|
WithNamespaceLabels(nsLabels).
|
||||||
WithExcludeGroupRole(s.excludeGroupRole...).
|
WithExcludeGroupRole(s.excludeGroupRole...).
|
||||||
WithInformerCacheResolver(s.informerCacheResolvers).
|
|
||||||
WithExceptions(s.polexLister)
|
WithExceptions(s.polexLister)
|
||||||
response, _ := s.engine.VerifyAndPatchImages(ctx, s.contextLoader, s.rclient, policyCtx, s.config)
|
response, _ := s.engine.VerifyAndPatchImages(ctx, s.rclient, policyCtx)
|
||||||
if len(response.PolicyResponse.Rules) > 0 {
|
if len(response.PolicyResponse.Rules) > 0 {
|
||||||
s.logger.Info("validateImages", "policy", policy, "response", response)
|
s.logger.Info("validateImages", "policy", policy, "response", response)
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@ package api
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/kyverno/kyverno/pkg/config"
|
kyvernov1beta1 "github.com/kyverno/kyverno/api/kyverno/v1beta1"
|
||||||
"github.com/kyverno/kyverno/pkg/registryclient"
|
"github.com/kyverno/kyverno/pkg/registryclient"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -11,24 +11,39 @@ type Engine interface {
|
||||||
// Validate applies validation rules from policy on the resource
|
// Validate applies validation rules from policy on the resource
|
||||||
Validate(
|
Validate(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
contextLoader ContextLoaderFactory,
|
|
||||||
policyContext PolicyContext,
|
policyContext PolicyContext,
|
||||||
cfg config.Configuration,
|
|
||||||
) *EngineResponse
|
) *EngineResponse
|
||||||
|
|
||||||
// Mutate performs mutation. Overlay first and then mutation patches
|
// Mutate performs mutation. Overlay first and then mutation patches
|
||||||
Mutate(
|
Mutate(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
contextLoader ContextLoaderFactory,
|
|
||||||
policyContext PolicyContext,
|
policyContext PolicyContext,
|
||||||
) *EngineResponse
|
) *EngineResponse
|
||||||
|
|
||||||
// VerifyAndPatchImages ...
|
// VerifyAndPatchImages ...
|
||||||
VerifyAndPatchImages(
|
VerifyAndPatchImages(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
contextLoader ContextLoaderFactory,
|
|
||||||
rclient registryclient.Client,
|
rclient registryclient.Client,
|
||||||
policyContext PolicyContext,
|
policyContext PolicyContext,
|
||||||
cfg config.Configuration,
|
|
||||||
) (*EngineResponse, *ImageVerificationMetadata)
|
) (*EngineResponse, *ImageVerificationMetadata)
|
||||||
|
|
||||||
|
// ApplyBackgroundChecks checks for validity of generate and mutateExisting rules on the resource
|
||||||
|
// 1. validate variables to be substitute in the general ruleInfo (match,exclude,condition)
|
||||||
|
// - the caller has to check the ruleResponse to determine whether the path exist
|
||||||
|
//
|
||||||
|
// 2. returns the list of rules that are applicable on this policy and resource, if 1 succeed
|
||||||
|
ApplyBackgroundChecks(
|
||||||
|
policyContext PolicyContext,
|
||||||
|
) *EngineResponse
|
||||||
|
|
||||||
|
// GenerateResponse checks for validity of generate rule on the resource
|
||||||
|
GenerateResponse(
|
||||||
|
policyContext PolicyContext,
|
||||||
|
gr kyvernov1beta1.UpdateRequest,
|
||||||
|
) *EngineResponse
|
||||||
|
|
||||||
|
ContextLoader(
|
||||||
|
policyContext PolicyContext,
|
||||||
|
ruleName string,
|
||||||
|
) ContextLoader
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +1,11 @@
|
||||||
package api
|
package api
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
|
|
||||||
kyvernov1 "github.com/kyverno/kyverno/api/kyverno/v1"
|
kyvernov1 "github.com/kyverno/kyverno/api/kyverno/v1"
|
||||||
kyvernov1beta1 "github.com/kyverno/kyverno/api/kyverno/v1beta1"
|
kyvernov1beta1 "github.com/kyverno/kyverno/api/kyverno/v1beta1"
|
||||||
kyvernov2alpha1 "github.com/kyverno/kyverno/api/kyverno/v2alpha1"
|
kyvernov2alpha1 "github.com/kyverno/kyverno/api/kyverno/v2alpha1"
|
||||||
"github.com/kyverno/kyverno/pkg/clients/dclient"
|
"github.com/kyverno/kyverno/pkg/clients/dclient"
|
||||||
enginecontext "github.com/kyverno/kyverno/pkg/engine/context"
|
enginecontext "github.com/kyverno/kyverno/pkg/engine/context"
|
||||||
corev1 "k8s.io/api/core/v1"
|
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||||
)
|
)
|
||||||
|
@ -41,5 +38,4 @@ type PolicyContext interface {
|
||||||
|
|
||||||
FindExceptions(rule string) ([]*kyvernov2alpha1.PolicyException, error)
|
FindExceptions(rule string) ([]*kyvernov2alpha1.PolicyException, error)
|
||||||
ExcludeResourceFunc() ExcludeFunc
|
ExcludeResourceFunc() ExcludeFunc
|
||||||
ResolveConfigMap(ctx context.Context, namespace string, name string) (*corev1.ConfigMap, error)
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@ import (
|
||||||
// - the caller has to check the ruleResponse to determine whether the path exist
|
// - the caller has to check the ruleResponse to determine whether the path exist
|
||||||
//
|
//
|
||||||
// 2. returns the list of rules that are applicable on this policy and resource, if 1 succeed
|
// 2. returns the list of rules that are applicable on this policy and resource, if 1 succeed
|
||||||
func ApplyBackgroundChecks(
|
func doApplyBackgroundChecks(
|
||||||
contextLoader engineapi.ContextLoaderFactory,
|
contextLoader engineapi.ContextLoaderFactory,
|
||||||
policyContext engineapi.PolicyContext,
|
policyContext engineapi.PolicyContext,
|
||||||
) (resp *engineapi.EngineResponse) {
|
) (resp *engineapi.EngineResponse) {
|
||||||
|
|
|
@ -4,7 +4,7 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"github.com/kyverno/kyverno/pkg/engine/api"
|
engineapi "github.com/kyverno/kyverno/pkg/engine/api"
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/client-go/kubernetes"
|
"k8s.io/client-go/kubernetes"
|
||||||
|
@ -15,7 +15,7 @@ type informerBasedResolver struct {
|
||||||
lister corev1listers.ConfigMapLister
|
lister corev1listers.ConfigMapLister
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewInformerBasedResolver(lister corev1listers.ConfigMapLister) (api.ConfigmapResolver, error) {
|
func NewInformerBasedResolver(lister corev1listers.ConfigMapLister) (engineapi.ConfigmapResolver, error) {
|
||||||
if lister == nil {
|
if lister == nil {
|
||||||
return nil, errors.New("lister must not be nil")
|
return nil, errors.New("lister must not be nil")
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,7 @@ type clientBasedResolver struct {
|
||||||
kubeClient kubernetes.Interface
|
kubeClient kubernetes.Interface
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewClientBasedResolver(client kubernetes.Interface) (api.ConfigmapResolver, error) {
|
func NewClientBasedResolver(client kubernetes.Interface) (engineapi.ConfigmapResolver, error) {
|
||||||
if client == nil {
|
if client == nil {
|
||||||
return nil, errors.New("client must not be nil")
|
return nil, errors.New("client must not be nil")
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,40 +3,65 @@ package engine
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
|
kyvernov1beta1 "github.com/kyverno/kyverno/api/kyverno/v1beta1"
|
||||||
"github.com/kyverno/kyverno/pkg/config"
|
"github.com/kyverno/kyverno/pkg/config"
|
||||||
engineapi "github.com/kyverno/kyverno/pkg/engine/api"
|
engineapi "github.com/kyverno/kyverno/pkg/engine/api"
|
||||||
"github.com/kyverno/kyverno/pkg/registryclient"
|
"github.com/kyverno/kyverno/pkg/registryclient"
|
||||||
)
|
)
|
||||||
|
|
||||||
type engine struct{}
|
type engine struct {
|
||||||
|
configuration config.Configuration
|
||||||
|
contextLoader engineapi.ContextLoaderFactory
|
||||||
|
}
|
||||||
|
|
||||||
func NewEgine() engineapi.Engine {
|
func NewEngine(
|
||||||
return &engine{}
|
configuration config.Configuration,
|
||||||
|
contextLoader engineapi.ContextLoaderFactory,
|
||||||
|
) engineapi.Engine {
|
||||||
|
return &engine{
|
||||||
|
configuration: configuration,
|
||||||
|
contextLoader: contextLoader,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *engine) Validate(
|
func (e *engine) Validate(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
contextLoader engineapi.ContextLoaderFactory,
|
|
||||||
policyContext engineapi.PolicyContext,
|
policyContext engineapi.PolicyContext,
|
||||||
cfg config.Configuration,
|
|
||||||
) *engineapi.EngineResponse {
|
) *engineapi.EngineResponse {
|
||||||
return doValidate(ctx, contextLoader, policyContext, cfg)
|
return doValidate(ctx, e.contextLoader, policyContext, e.configuration)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *engine) Mutate(
|
func (e *engine) Mutate(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
contextLoader engineapi.ContextLoaderFactory,
|
|
||||||
policyContext engineapi.PolicyContext,
|
policyContext engineapi.PolicyContext,
|
||||||
) *engineapi.EngineResponse {
|
) *engineapi.EngineResponse {
|
||||||
return doMutate(ctx, contextLoader, policyContext)
|
return doMutate(ctx, e.contextLoader, policyContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *engine) VerifyAndPatchImages(
|
func (e *engine) VerifyAndPatchImages(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
contextLoader engineapi.ContextLoaderFactory,
|
|
||||||
rclient registryclient.Client,
|
rclient registryclient.Client,
|
||||||
policyContext engineapi.PolicyContext,
|
policyContext engineapi.PolicyContext,
|
||||||
cfg config.Configuration,
|
|
||||||
) (*engineapi.EngineResponse, *engineapi.ImageVerificationMetadata) {
|
) (*engineapi.EngineResponse, *engineapi.ImageVerificationMetadata) {
|
||||||
return doVerifyAndPatchImages(ctx, contextLoader, rclient, policyContext, cfg)
|
return doVerifyAndPatchImages(ctx, e.contextLoader, rclient, policyContext, e.configuration)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *engine) ApplyBackgroundChecks(
|
||||||
|
policyContext engineapi.PolicyContext,
|
||||||
|
) *engineapi.EngineResponse {
|
||||||
|
return doApplyBackgroundChecks(e.contextLoader, policyContext)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *engine) GenerateResponse(
|
||||||
|
policyContext engineapi.PolicyContext,
|
||||||
|
gr kyvernov1beta1.UpdateRequest,
|
||||||
|
) *engineapi.EngineResponse {
|
||||||
|
return doGenerateResponse(e.contextLoader, policyContext, gr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *engine) ContextLoader(
|
||||||
|
policyContext engineapi.PolicyContext,
|
||||||
|
ruleName string,
|
||||||
|
) engineapi.ContextLoader {
|
||||||
|
return e.contextLoader(policyContext, ruleName)
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// GenerateResponse checks for validity of generate rule on the resource
|
// GenerateResponse checks for validity of generate rule on the resource
|
||||||
func GenerateResponse(
|
func doGenerateResponse(
|
||||||
contextLoader engineapi.ContextLoaderFactory,
|
contextLoader engineapi.ContextLoaderFactory,
|
||||||
policyContext engineapi.PolicyContext,
|
policyContext engineapi.PolicyContext,
|
||||||
gr kyvernov1beta1.UpdateRequest,
|
gr kyvernov1beta1.UpdateRequest,
|
||||||
|
|
|
@ -163,12 +163,13 @@ var cfg = config.NewDefaultConfiguration()
|
||||||
func testVerifyAndPatchImages(
|
func testVerifyAndPatchImages(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
rclient registryclient.Client,
|
rclient registryclient.Client,
|
||||||
|
cmResolver engineapi.ConfigmapResolver,
|
||||||
pContext engineapi.PolicyContext,
|
pContext engineapi.PolicyContext,
|
||||||
cfg config.Configuration,
|
cfg config.Configuration,
|
||||||
) (*engineapi.EngineResponse, *engineapi.ImageVerificationMetadata) {
|
) (*engineapi.EngineResponse, *engineapi.ImageVerificationMetadata) {
|
||||||
return doVerifyAndPatchImages(
|
return doVerifyAndPatchImages(
|
||||||
ctx,
|
ctx,
|
||||||
LegacyContextLoaderFactory(rclient),
|
LegacyContextLoaderFactory(rclient, cmResolver),
|
||||||
rclient,
|
rclient,
|
||||||
pContext,
|
pContext,
|
||||||
cfg,
|
cfg,
|
||||||
|
@ -181,7 +182,7 @@ func Test_CosignMockAttest(t *testing.T) {
|
||||||
err := cosign.SetMock("ghcr.io/jimbugwadia/pause2:latest", attestationPayloads)
|
err := cosign.SetMock("ghcr.io/jimbugwadia/pause2:latest", attestationPayloads)
|
||||||
assert.NilError(t, err)
|
assert.NilError(t, err)
|
||||||
|
|
||||||
er, ivm := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), policyContext, cfg)
|
er, ivm := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), nil, policyContext, cfg)
|
||||||
assert.Equal(t, len(er.PolicyResponse.Rules), 1)
|
assert.Equal(t, len(er.PolicyResponse.Rules), 1)
|
||||||
assert.Equal(t, er.PolicyResponse.Rules[0].Status, engineapi.RuleStatusPass,
|
assert.Equal(t, er.PolicyResponse.Rules[0].Status, engineapi.RuleStatusPass,
|
||||||
fmt.Sprintf("expected: %v, got: %v, failure: %v",
|
fmt.Sprintf("expected: %v, got: %v, failure: %v",
|
||||||
|
@ -195,7 +196,7 @@ func Test_CosignMockAttest_fail(t *testing.T) {
|
||||||
err := cosign.SetMock("ghcr.io/jimbugwadia/pause2:latest", attestationPayloads)
|
err := cosign.SetMock("ghcr.io/jimbugwadia/pause2:latest", attestationPayloads)
|
||||||
assert.NilError(t, err)
|
assert.NilError(t, err)
|
||||||
|
|
||||||
er, _ := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), policyContext, cfg)
|
er, _ := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), nil, policyContext, cfg)
|
||||||
assert.Equal(t, len(er.PolicyResponse.Rules), 1)
|
assert.Equal(t, len(er.PolicyResponse.Rules), 1)
|
||||||
assert.Equal(t, er.PolicyResponse.Rules[0].Status, engineapi.RuleStatusFail)
|
assert.Equal(t, er.PolicyResponse.Rules[0].Status, engineapi.RuleStatusFail)
|
||||||
}
|
}
|
||||||
|
@ -444,7 +445,7 @@ var (
|
||||||
func Test_ConfigMapMissingSuccess(t *testing.T) {
|
func Test_ConfigMapMissingSuccess(t *testing.T) {
|
||||||
policyContext := buildContext(t, testConfigMapMissing, testConfigMapMissingResource, "")
|
policyContext := buildContext(t, testConfigMapMissing, testConfigMapMissingResource, "")
|
||||||
cosign.ClearMock()
|
cosign.ClearMock()
|
||||||
err, _ := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), policyContext, cfg)
|
err, _ := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), nil, policyContext, cfg)
|
||||||
assert.Equal(t, len(err.PolicyResponse.Rules), 1)
|
assert.Equal(t, len(err.PolicyResponse.Rules), 1)
|
||||||
assert.Equal(t, err.PolicyResponse.Rules[0].Status, engineapi.RuleStatusSkip, err.PolicyResponse.Rules[0].Message)
|
assert.Equal(t, err.PolicyResponse.Rules[0].Status, engineapi.RuleStatusSkip, err.PolicyResponse.Rules[0].Message)
|
||||||
}
|
}
|
||||||
|
@ -454,9 +455,8 @@ func Test_ConfigMapMissingFailure(t *testing.T) {
|
||||||
policyContext := buildContext(t, testConfigMapMissing, ghcrImage, "")
|
policyContext := buildContext(t, testConfigMapMissing, ghcrImage, "")
|
||||||
resolver, err := resolvers.NewClientBasedResolver(kubefake.NewSimpleClientset())
|
resolver, err := resolvers.NewClientBasedResolver(kubefake.NewSimpleClientset())
|
||||||
assert.NilError(t, err)
|
assert.NilError(t, err)
|
||||||
policyContext.informerCacheResolvers = resolver
|
|
||||||
cosign.ClearMock()
|
cosign.ClearMock()
|
||||||
resp, _ := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), policyContext, cfg)
|
resp, _ := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), resolver, policyContext, cfg)
|
||||||
assert.Equal(t, len(resp.PolicyResponse.Rules), 1)
|
assert.Equal(t, len(resp.PolicyResponse.Rules), 1)
|
||||||
assert.Equal(t, resp.PolicyResponse.Rules[0].Status, engineapi.RuleStatusError, resp.PolicyResponse.Rules[0].Message)
|
assert.Equal(t, resp.PolicyResponse.Rules[0].Status, engineapi.RuleStatusError, resp.PolicyResponse.Rules[0].Message)
|
||||||
}
|
}
|
||||||
|
@ -465,7 +465,7 @@ func Test_SignatureGoodSigned(t *testing.T) {
|
||||||
policyContext := buildContext(t, testSampleSingleKeyPolicy, testSampleResource, "")
|
policyContext := buildContext(t, testSampleSingleKeyPolicy, testSampleResource, "")
|
||||||
policyContext.policy.GetSpec().Rules[0].VerifyImages[0].MutateDigest = true
|
policyContext.policy.GetSpec().Rules[0].VerifyImages[0].MutateDigest = true
|
||||||
cosign.ClearMock()
|
cosign.ClearMock()
|
||||||
engineResp, _ := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), policyContext, cfg)
|
engineResp, _ := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), nil, policyContext, cfg)
|
||||||
assert.Equal(t, len(engineResp.PolicyResponse.Rules), 1)
|
assert.Equal(t, len(engineResp.PolicyResponse.Rules), 1)
|
||||||
assert.Equal(t, engineResp.PolicyResponse.Rules[0].Status, engineapi.RuleStatusPass, engineResp.PolicyResponse.Rules[0].Message)
|
assert.Equal(t, engineResp.PolicyResponse.Rules[0].Status, engineapi.RuleStatusPass, engineResp.PolicyResponse.Rules[0].Message)
|
||||||
assert.Equal(t, len(engineResp.PolicyResponse.Rules[0].Patches), 1)
|
assert.Equal(t, len(engineResp.PolicyResponse.Rules[0].Patches), 1)
|
||||||
|
@ -477,7 +477,7 @@ func Test_SignatureUnsigned(t *testing.T) {
|
||||||
cosign.ClearMock()
|
cosign.ClearMock()
|
||||||
unsigned := strings.Replace(testSampleResource, ":signed", ":unsigned", -1)
|
unsigned := strings.Replace(testSampleResource, ":signed", ":unsigned", -1)
|
||||||
policyContext := buildContext(t, testSampleSingleKeyPolicy, unsigned, "")
|
policyContext := buildContext(t, testSampleSingleKeyPolicy, unsigned, "")
|
||||||
engineResp, _ := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), policyContext, cfg)
|
engineResp, _ := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), nil, policyContext, cfg)
|
||||||
assert.Equal(t, len(engineResp.PolicyResponse.Rules), 1)
|
assert.Equal(t, len(engineResp.PolicyResponse.Rules), 1)
|
||||||
assert.Equal(t, engineResp.PolicyResponse.Rules[0].Status, engineapi.RuleStatusFail, engineResp.PolicyResponse.Rules[0].Message)
|
assert.Equal(t, engineResp.PolicyResponse.Rules[0].Status, engineapi.RuleStatusFail, engineResp.PolicyResponse.Rules[0].Message)
|
||||||
}
|
}
|
||||||
|
@ -486,7 +486,7 @@ func Test_SignatureWrongKey(t *testing.T) {
|
||||||
cosign.ClearMock()
|
cosign.ClearMock()
|
||||||
otherKey := strings.Replace(testSampleResource, ":signed", ":signed-by-someone-else", -1)
|
otherKey := strings.Replace(testSampleResource, ":signed", ":signed-by-someone-else", -1)
|
||||||
policyContext := buildContext(t, testSampleSingleKeyPolicy, otherKey, "")
|
policyContext := buildContext(t, testSampleSingleKeyPolicy, otherKey, "")
|
||||||
engineResp, _ := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), policyContext, cfg)
|
engineResp, _ := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), nil, policyContext, cfg)
|
||||||
assert.Equal(t, len(engineResp.PolicyResponse.Rules), 1)
|
assert.Equal(t, len(engineResp.PolicyResponse.Rules), 1)
|
||||||
assert.Equal(t, engineResp.PolicyResponse.Rules[0].Status, engineapi.RuleStatusFail, engineResp.PolicyResponse.Rules[0].Message)
|
assert.Equal(t, engineResp.PolicyResponse.Rules[0].Status, engineapi.RuleStatusFail, engineResp.PolicyResponse.Rules[0].Message)
|
||||||
}
|
}
|
||||||
|
@ -497,7 +497,7 @@ func Test_SignaturesMultiKey(t *testing.T) {
|
||||||
policy = strings.Replace(policy, "KEY2", testVerifyImageKey, -1)
|
policy = strings.Replace(policy, "KEY2", testVerifyImageKey, -1)
|
||||||
policy = strings.Replace(policy, "COUNT", "0", -1)
|
policy = strings.Replace(policy, "COUNT", "0", -1)
|
||||||
policyContext := buildContext(t, policy, testSampleResource, "")
|
policyContext := buildContext(t, policy, testSampleResource, "")
|
||||||
engineResp, _ := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), policyContext, cfg)
|
engineResp, _ := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), nil, policyContext, cfg)
|
||||||
assert.Equal(t, len(engineResp.PolicyResponse.Rules), 1)
|
assert.Equal(t, len(engineResp.PolicyResponse.Rules), 1)
|
||||||
assert.Equal(t, engineResp.PolicyResponse.Rules[0].Status, engineapi.RuleStatusPass, engineResp.PolicyResponse.Rules[0].Message)
|
assert.Equal(t, engineResp.PolicyResponse.Rules[0].Status, engineapi.RuleStatusPass, engineResp.PolicyResponse.Rules[0].Message)
|
||||||
}
|
}
|
||||||
|
@ -507,7 +507,7 @@ func Test_SignaturesMultiKeyFail(t *testing.T) {
|
||||||
policy := strings.Replace(testSampleMultipleKeyPolicy, "KEY1", testVerifyImageKey, -1)
|
policy := strings.Replace(testSampleMultipleKeyPolicy, "KEY1", testVerifyImageKey, -1)
|
||||||
policy = strings.Replace(policy, "COUNT", "0", -1)
|
policy = strings.Replace(policy, "COUNT", "0", -1)
|
||||||
policyContext := buildContext(t, policy, testSampleResource, "")
|
policyContext := buildContext(t, policy, testSampleResource, "")
|
||||||
engineResp, _ := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), policyContext, cfg)
|
engineResp, _ := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), nil, policyContext, cfg)
|
||||||
assert.Equal(t, len(engineResp.PolicyResponse.Rules), 1)
|
assert.Equal(t, len(engineResp.PolicyResponse.Rules), 1)
|
||||||
assert.Equal(t, engineResp.PolicyResponse.Rules[0].Status, engineapi.RuleStatusFail, engineResp.PolicyResponse.Rules[0].Message)
|
assert.Equal(t, engineResp.PolicyResponse.Rules[0].Status, engineapi.RuleStatusFail, engineResp.PolicyResponse.Rules[0].Message)
|
||||||
}
|
}
|
||||||
|
@ -518,7 +518,7 @@ func Test_SignaturesMultiKeyOneGoodKey(t *testing.T) {
|
||||||
policy = strings.Replace(policy, "KEY2", testOtherKey, -1)
|
policy = strings.Replace(policy, "KEY2", testOtherKey, -1)
|
||||||
policy = strings.Replace(policy, "COUNT", "1", -1)
|
policy = strings.Replace(policy, "COUNT", "1", -1)
|
||||||
policyContext := buildContext(t, policy, testSampleResource, "")
|
policyContext := buildContext(t, policy, testSampleResource, "")
|
||||||
engineResp, _ := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), policyContext, cfg)
|
engineResp, _ := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), nil, policyContext, cfg)
|
||||||
assert.Equal(t, len(engineResp.PolicyResponse.Rules), 1)
|
assert.Equal(t, len(engineResp.PolicyResponse.Rules), 1)
|
||||||
assert.Equal(t, engineResp.PolicyResponse.Rules[0].Status, engineapi.RuleStatusPass, engineResp.PolicyResponse.Rules[0].Message)
|
assert.Equal(t, engineResp.PolicyResponse.Rules[0].Status, engineapi.RuleStatusPass, engineResp.PolicyResponse.Rules[0].Message)
|
||||||
}
|
}
|
||||||
|
@ -529,7 +529,7 @@ func Test_SignaturesMultiKeyZeroGoodKey(t *testing.T) {
|
||||||
policy = strings.Replace(policy, "KEY2", testOtherKey, -1)
|
policy = strings.Replace(policy, "KEY2", testOtherKey, -1)
|
||||||
policy = strings.Replace(policy, "COUNT", "1", -1)
|
policy = strings.Replace(policy, "COUNT", "1", -1)
|
||||||
policyContext := buildContext(t, policy, testSampleResource, "")
|
policyContext := buildContext(t, policy, testSampleResource, "")
|
||||||
resp, _ := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), policyContext, cfg)
|
resp, _ := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), nil, policyContext, cfg)
|
||||||
assert.Equal(t, len(resp.PolicyResponse.Rules), 1)
|
assert.Equal(t, len(resp.PolicyResponse.Rules), 1)
|
||||||
assert.Equal(t, resp.PolicyResponse.Rules[0].Status, engineapi.RuleStatusFail, resp.PolicyResponse.Rules[0].Message)
|
assert.Equal(t, resp.PolicyResponse.Rules[0].Status, engineapi.RuleStatusFail, resp.PolicyResponse.Rules[0].Message)
|
||||||
}
|
}
|
||||||
|
@ -545,14 +545,14 @@ func Test_RuleSelectorImageVerify(t *testing.T) {
|
||||||
applyAll := kyverno.ApplyAll
|
applyAll := kyverno.ApplyAll
|
||||||
spec.ApplyRules = &applyAll
|
spec.ApplyRules = &applyAll
|
||||||
|
|
||||||
resp, _ := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), policyContext, cfg)
|
resp, _ := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), nil, policyContext, cfg)
|
||||||
assert.Equal(t, len(resp.PolicyResponse.Rules), 2)
|
assert.Equal(t, len(resp.PolicyResponse.Rules), 2)
|
||||||
assert.Equal(t, resp.PolicyResponse.Rules[0].Status, engineapi.RuleStatusPass, resp.PolicyResponse.Rules[0].Message)
|
assert.Equal(t, resp.PolicyResponse.Rules[0].Status, engineapi.RuleStatusPass, resp.PolicyResponse.Rules[0].Message)
|
||||||
assert.Equal(t, resp.PolicyResponse.Rules[1].Status, engineapi.RuleStatusFail, resp.PolicyResponse.Rules[1].Message)
|
assert.Equal(t, resp.PolicyResponse.Rules[1].Status, engineapi.RuleStatusFail, resp.PolicyResponse.Rules[1].Message)
|
||||||
|
|
||||||
applyOne := kyverno.ApplyOne
|
applyOne := kyverno.ApplyOne
|
||||||
spec.ApplyRules = &applyOne
|
spec.ApplyRules = &applyOne
|
||||||
resp, _ = testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), policyContext, cfg)
|
resp, _ = testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), nil, policyContext, cfg)
|
||||||
assert.Equal(t, len(resp.PolicyResponse.Rules), 1)
|
assert.Equal(t, len(resp.PolicyResponse.Rules), 1)
|
||||||
assert.Equal(t, resp.PolicyResponse.Rules[0].Status, engineapi.RuleStatusPass, resp.PolicyResponse.Rules[0].Message)
|
assert.Equal(t, resp.PolicyResponse.Rules[0].Status, engineapi.RuleStatusPass, resp.PolicyResponse.Rules[0].Message)
|
||||||
}
|
}
|
||||||
|
@ -656,7 +656,7 @@ func Test_NestedAttestors(t *testing.T) {
|
||||||
policy = strings.Replace(policy, "KEY2", testVerifyImageKey, -1)
|
policy = strings.Replace(policy, "KEY2", testVerifyImageKey, -1)
|
||||||
policy = strings.Replace(policy, "COUNT", "0", -1)
|
policy = strings.Replace(policy, "COUNT", "0", -1)
|
||||||
policyContext := buildContext(t, policy, testSampleResource, "")
|
policyContext := buildContext(t, policy, testSampleResource, "")
|
||||||
err, _ := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), policyContext, cfg)
|
err, _ := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), nil, policyContext, cfg)
|
||||||
assert.Equal(t, len(err.PolicyResponse.Rules), 1)
|
assert.Equal(t, len(err.PolicyResponse.Rules), 1)
|
||||||
assert.Equal(t, err.PolicyResponse.Rules[0].Status, engineapi.RuleStatusPass)
|
assert.Equal(t, err.PolicyResponse.Rules[0].Status, engineapi.RuleStatusPass)
|
||||||
|
|
||||||
|
@ -664,7 +664,7 @@ func Test_NestedAttestors(t *testing.T) {
|
||||||
policy = strings.Replace(policy, "KEY2", testOtherKey, -1)
|
policy = strings.Replace(policy, "KEY2", testOtherKey, -1)
|
||||||
policy = strings.Replace(policy, "COUNT", "0", -1)
|
policy = strings.Replace(policy, "COUNT", "0", -1)
|
||||||
policyContext = buildContext(t, policy, testSampleResource, "")
|
policyContext = buildContext(t, policy, testSampleResource, "")
|
||||||
err, _ = testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), policyContext, cfg)
|
err, _ = testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), nil, policyContext, cfg)
|
||||||
assert.Equal(t, len(err.PolicyResponse.Rules), 1)
|
assert.Equal(t, len(err.PolicyResponse.Rules), 1)
|
||||||
assert.Equal(t, err.PolicyResponse.Rules[0].Status, engineapi.RuleStatusFail)
|
assert.Equal(t, err.PolicyResponse.Rules[0].Status, engineapi.RuleStatusFail)
|
||||||
|
|
||||||
|
@ -672,7 +672,7 @@ func Test_NestedAttestors(t *testing.T) {
|
||||||
policy = strings.Replace(policy, "KEY2", testOtherKey, -1)
|
policy = strings.Replace(policy, "KEY2", testOtherKey, -1)
|
||||||
policy = strings.Replace(policy, "COUNT", "1", -1)
|
policy = strings.Replace(policy, "COUNT", "1", -1)
|
||||||
policyContext = buildContext(t, policy, testSampleResource, "")
|
policyContext = buildContext(t, policy, testSampleResource, "")
|
||||||
err, _ = testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), policyContext, cfg)
|
err, _ = testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), nil, policyContext, cfg)
|
||||||
assert.Equal(t, len(err.PolicyResponse.Rules), 1)
|
assert.Equal(t, len(err.PolicyResponse.Rules), 1)
|
||||||
assert.Equal(t, err.PolicyResponse.Rules[0].Status, engineapi.RuleStatusPass)
|
assert.Equal(t, err.PolicyResponse.Rules[0].Status, engineapi.RuleStatusPass)
|
||||||
}
|
}
|
||||||
|
@ -765,7 +765,7 @@ func Test_MarkImageVerified(t *testing.T) {
|
||||||
err := cosign.SetMock(image, attestationPayloads)
|
err := cosign.SetMock(image, attestationPayloads)
|
||||||
assert.NilError(t, err)
|
assert.NilError(t, err)
|
||||||
|
|
||||||
engineResponse, verifiedImages := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), policyContext, cfg)
|
engineResponse, verifiedImages := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), nil, policyContext, cfg)
|
||||||
assert.Assert(t, engineResponse != nil)
|
assert.Assert(t, engineResponse != nil)
|
||||||
assert.Equal(t, len(engineResponse.PolicyResponse.Rules), 1)
|
assert.Equal(t, len(engineResponse.PolicyResponse.Rules), 1)
|
||||||
assert.Equal(t, engineResponse.PolicyResponse.Rules[0].Status, engineapi.RuleStatusPass)
|
assert.Equal(t, engineResponse.PolicyResponse.Rules[0].Status, engineapi.RuleStatusPass)
|
||||||
|
@ -858,7 +858,7 @@ func Test_ParsePEMDelimited(t *testing.T) {
|
||||||
err := cosign.SetMock(image, signaturePayloads)
|
err := cosign.SetMock(image, signaturePayloads)
|
||||||
assert.NilError(t, err)
|
assert.NilError(t, err)
|
||||||
|
|
||||||
engineResponse, verifiedImages := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), policyContext, cfg)
|
engineResponse, verifiedImages := testVerifyAndPatchImages(context.TODO(), registryclient.NewOrDie(), nil, policyContext, cfg)
|
||||||
assert.Assert(t, engineResponse != nil)
|
assert.Assert(t, engineResponse != nil)
|
||||||
assert.Equal(t, len(engineResponse.PolicyResponse.Rules), 1)
|
assert.Equal(t, len(engineResponse.PolicyResponse.Rules), 1)
|
||||||
assert.Equal(t, engineResponse.PolicyResponse.Rules[0].Status, engineapi.RuleStatusPass)
|
assert.Equal(t, engineResponse.PolicyResponse.Rules[0].Status, engineapi.RuleStatusPass)
|
||||||
|
|
|
@ -16,10 +16,12 @@ import (
|
||||||
"github.com/kyverno/kyverno/pkg/engine/variables"
|
"github.com/kyverno/kyverno/pkg/engine/variables"
|
||||||
"github.com/kyverno/kyverno/pkg/logging"
|
"github.com/kyverno/kyverno/pkg/logging"
|
||||||
"github.com/kyverno/kyverno/pkg/registryclient"
|
"github.com/kyverno/kyverno/pkg/registryclient"
|
||||||
corev1 "k8s.io/api/core/v1"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func LegacyContextLoaderFactory(rclient registryclient.Client) engineapi.ContextLoaderFactory {
|
func LegacyContextLoaderFactory(
|
||||||
|
rclient registryclient.Client,
|
||||||
|
cmResolver engineapi.ConfigmapResolver,
|
||||||
|
) engineapi.ContextLoaderFactory {
|
||||||
if store.IsMock() {
|
if store.IsMock() {
|
||||||
return func(pContext engineapi.PolicyContext, ruleName string) engineapi.ContextLoader {
|
return func(pContext engineapi.PolicyContext, ruleName string) engineapi.ContextLoader {
|
||||||
policy := pContext.Policy()
|
policy := pContext.Policy()
|
||||||
|
@ -29,7 +31,7 @@ func LegacyContextLoaderFactory(rclient registryclient.Client) engineapi.Context
|
||||||
ruleName: ruleName,
|
ruleName: ruleName,
|
||||||
client: pContext.Client(),
|
client: pContext.Client(),
|
||||||
rclient: rclient,
|
rclient: rclient,
|
||||||
cmResolver: pContext.ResolveConfigMap,
|
cmResolver: cmResolver,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -38,7 +40,7 @@ func LegacyContextLoaderFactory(rclient registryclient.Client) engineapi.Context
|
||||||
logger: logging.WithName("LegacyContextLoaderFactory"),
|
logger: logging.WithName("LegacyContextLoaderFactory"),
|
||||||
client: pContext.Client(),
|
client: pContext.Client(),
|
||||||
rclient: rclient,
|
rclient: rclient,
|
||||||
cmResolver: pContext.ResolveConfigMap,
|
cmResolver: cmResolver,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -47,7 +49,7 @@ type contextLoader struct {
|
||||||
logger logr.Logger
|
logger logr.Logger
|
||||||
rclient registryclient.Client
|
rclient registryclient.Client
|
||||||
client dclient.Interface
|
client dclient.Interface
|
||||||
cmResolver func(context.Context, string, string) (*corev1.ConfigMap, error)
|
cmResolver engineapi.ConfigmapResolver
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *contextLoader) Load(ctx context.Context, contextEntries []kyvernov1.ContextEntry, enginectx enginecontext.Interface) error {
|
func (l *contextLoader) Load(ctx context.Context, contextEntries []kyvernov1.ContextEntry, enginectx enginecontext.Interface) error {
|
||||||
|
@ -79,7 +81,7 @@ type mockContextLoader struct {
|
||||||
ruleName string
|
ruleName string
|
||||||
rclient registryclient.Client
|
rclient registryclient.Client
|
||||||
client dclient.Interface
|
client dclient.Interface
|
||||||
cmResolver func(context.Context, string, string) (*corev1.ConfigMap, error)
|
cmResolver engineapi.ConfigmapResolver
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *mockContextLoader) Load(ctx context.Context, contextEntries []kyvernov1.ContextEntry, enginectx enginecontext.Interface) error {
|
func (l *mockContextLoader) Load(ctx context.Context, contextEntries []kyvernov1.ContextEntry, enginectx enginecontext.Interface) error {
|
||||||
|
@ -298,7 +300,7 @@ func applyJMESPath(jmesPath string, data interface{}) (interface{}, error) {
|
||||||
return jp.Search(data)
|
return jp.Search(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadConfigMap(ctx context.Context, logger logr.Logger, entry kyvernov1.ContextEntry, enginectx enginecontext.Interface, resolver func(context.Context, string, string) (*corev1.ConfigMap, error)) error {
|
func loadConfigMap(ctx context.Context, logger logr.Logger, entry kyvernov1.ContextEntry, enginectx enginecontext.Interface, resolver engineapi.ConfigmapResolver) error {
|
||||||
data, err := fetchConfigMap(ctx, logger, entry, enginectx, resolver)
|
data, err := fetchConfigMap(ctx, logger, entry, enginectx, resolver)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to retrieve config map for context entry %s: %v", entry.Name, err)
|
return fmt.Errorf("failed to retrieve config map for context entry %s: %v", entry.Name, err)
|
||||||
|
@ -310,7 +312,7 @@ func loadConfigMap(ctx context.Context, logger logr.Logger, entry kyvernov1.Cont
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func fetchConfigMap(ctx context.Context, logger logr.Logger, entry kyvernov1.ContextEntry, enginectx enginecontext.Interface, resolver func(context.Context, string, string) (*corev1.ConfigMap, error)) ([]byte, error) {
|
func fetchConfigMap(ctx context.Context, logger logr.Logger, entry kyvernov1.ContextEntry, enginectx enginecontext.Interface, resolver engineapi.ConfigmapResolver) ([]byte, error) {
|
||||||
contextData := make(map[string]interface{})
|
contextData := make(map[string]interface{})
|
||||||
|
|
||||||
name, err := variables.SubstituteAll(logger, enginectx, entry.ConfigMap.Name)
|
name, err := variables.SubstituteAll(logger, enginectx, entry.ConfigMap.Name)
|
||||||
|
@ -327,7 +329,7 @@ func fetchConfigMap(ctx context.Context, logger logr.Logger, entry kyvernov1.Con
|
||||||
namespace = "default"
|
namespace = "default"
|
||||||
}
|
}
|
||||||
|
|
||||||
obj, err := resolver(ctx, namespace.(string), name.(string))
|
obj, err := resolver.Get(ctx, namespace.(string), name.(string))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to get configmap %s/%s : %v", namespace, name, err)
|
return nil, fmt.Errorf("failed to get configmap %s/%s : %v", namespace, name, err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@ func testMutate(
|
||||||
) *engineapi.EngineResponse {
|
) *engineapi.EngineResponse {
|
||||||
return doMutate(
|
return doMutate(
|
||||||
ctx,
|
ctx,
|
||||||
LegacyContextLoaderFactory(rclient),
|
LegacyContextLoaderFactory(rclient, nil),
|
||||||
pContext,
|
pContext,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package engine
|
package engine
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
kyvernov1 "github.com/kyverno/kyverno/api/kyverno/v1"
|
kyvernov1 "github.com/kyverno/kyverno/api/kyverno/v1"
|
||||||
|
@ -13,7 +12,6 @@ import (
|
||||||
enginectx "github.com/kyverno/kyverno/pkg/engine/context"
|
enginectx "github.com/kyverno/kyverno/pkg/engine/context"
|
||||||
admissionutils "github.com/kyverno/kyverno/pkg/utils/admission"
|
admissionutils "github.com/kyverno/kyverno/pkg/utils/admission"
|
||||||
admissionv1 "k8s.io/api/admission/v1"
|
admissionv1 "k8s.io/api/admission/v1"
|
||||||
corev1 "k8s.io/api/core/v1"
|
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||||
"k8s.io/apimachinery/pkg/labels"
|
"k8s.io/apimachinery/pkg/labels"
|
||||||
|
@ -70,9 +68,6 @@ type PolicyContext struct {
|
||||||
// admissionOperation represents if the caller is from the webhook server
|
// admissionOperation represents if the caller is from the webhook server
|
||||||
admissionOperation bool
|
admissionOperation bool
|
||||||
|
|
||||||
// informerCacheResolvers - used to get resources from informer cache
|
|
||||||
informerCacheResolvers engineapi.ConfigmapResolver
|
|
||||||
|
|
||||||
// subresource is the subresource being requested, if any (for example, "status" or "scale")
|
// subresource is the subresource being requested, if any (for example, "status" or "scale")
|
||||||
subresource string
|
subresource string
|
||||||
|
|
||||||
|
@ -172,10 +167,6 @@ func (c *PolicyContext) ExcludeResourceFunc() engineapi.ExcludeFunc {
|
||||||
return c.excludeResourceFunc
|
return c.excludeResourceFunc
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *PolicyContext) ResolveConfigMap(ctx context.Context, namespace string, name string) (*corev1.ConfigMap, error) {
|
|
||||||
return c.informerCacheResolvers.Get(ctx, namespace, name)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mutators
|
// Mutators
|
||||||
|
|
||||||
func (c *PolicyContext) WithPolicy(policy kyvernov1.PolicyInterface) *PolicyContext {
|
func (c *PolicyContext) WithPolicy(policy kyvernov1.PolicyInterface) *PolicyContext {
|
||||||
|
@ -246,12 +237,6 @@ func (c *PolicyContext) WithAdmissionOperation(admissionOperation bool) *PolicyC
|
||||||
return copy
|
return copy
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *PolicyContext) WithInformerCacheResolver(informerCacheResolver engineapi.ConfigmapResolver) *PolicyContext {
|
|
||||||
copy := c.copy()
|
|
||||||
copy.informerCacheResolvers = informerCacheResolver
|
|
||||||
return copy
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *PolicyContext) WithSubresource(subresource string) *PolicyContext {
|
func (c *PolicyContext) WithSubresource(subresource string) *PolicyContext {
|
||||||
copy := c.copy()
|
copy := c.copy()
|
||||||
copy.subresource = subresource
|
copy.subresource = subresource
|
||||||
|
@ -294,7 +279,6 @@ func NewPolicyContextFromAdmissionRequest(
|
||||||
admissionInfo kyvernov1beta1.RequestInfo,
|
admissionInfo kyvernov1beta1.RequestInfo,
|
||||||
configuration config.Configuration,
|
configuration config.Configuration,
|
||||||
client dclient.Interface,
|
client dclient.Interface,
|
||||||
informerCacheResolver engineapi.ConfigmapResolver,
|
|
||||||
polexLister PolicyExceptionLister,
|
polexLister PolicyExceptionLister,
|
||||||
) (*PolicyContext, error) {
|
) (*PolicyContext, error) {
|
||||||
ctx, err := newVariablesContext(request, &admissionInfo)
|
ctx, err := newVariablesContext(request, &admissionInfo)
|
||||||
|
@ -316,7 +300,6 @@ func NewPolicyContextFromAdmissionRequest(
|
||||||
WithConfiguration(configuration).
|
WithConfiguration(configuration).
|
||||||
WithClient(client).
|
WithClient(client).
|
||||||
WithAdmissionOperation(true).
|
WithAdmissionOperation(true).
|
||||||
WithInformerCacheResolver(informerCacheResolver).
|
|
||||||
WithRequestResource(*requestResource).
|
WithRequestResource(*requestResource).
|
||||||
WithSubresource(request.SubResource).
|
WithSubresource(request.SubResource).
|
||||||
WithExceptions(polexLister)
|
WithExceptions(polexLister)
|
||||||
|
|
|
@ -22,7 +22,7 @@ import (
|
||||||
func testValidate(ctx context.Context, rclient registryclient.Client, pContext *PolicyContext, cfg config.Configuration) *engineapi.EngineResponse {
|
func testValidate(ctx context.Context, rclient registryclient.Client, pContext *PolicyContext, cfg config.Configuration) *engineapi.EngineResponse {
|
||||||
return doValidate(
|
return doValidate(
|
||||||
ctx,
|
ctx,
|
||||||
LegacyContextLoaderFactory(rclient),
|
LegacyContextLoaderFactory(rclient, nil),
|
||||||
pContext,
|
pContext,
|
||||||
cfg,
|
cfg,
|
||||||
)
|
)
|
||||||
|
|
|
@ -21,7 +21,6 @@ import (
|
||||||
kyvernov1beta1listers "github.com/kyverno/kyverno/pkg/client/listers/kyverno/v1beta1"
|
kyvernov1beta1listers "github.com/kyverno/kyverno/pkg/client/listers/kyverno/v1beta1"
|
||||||
"github.com/kyverno/kyverno/pkg/clients/dclient"
|
"github.com/kyverno/kyverno/pkg/clients/dclient"
|
||||||
"github.com/kyverno/kyverno/pkg/config"
|
"github.com/kyverno/kyverno/pkg/config"
|
||||||
"github.com/kyverno/kyverno/pkg/engine"
|
|
||||||
engineapi "github.com/kyverno/kyverno/pkg/engine/api"
|
engineapi "github.com/kyverno/kyverno/pkg/engine/api"
|
||||||
"github.com/kyverno/kyverno/pkg/event"
|
"github.com/kyverno/kyverno/pkg/event"
|
||||||
"github.com/kyverno/kyverno/pkg/metrics"
|
"github.com/kyverno/kyverno/pkg/metrics"
|
||||||
|
@ -57,7 +56,7 @@ const (
|
||||||
type PolicyController struct {
|
type PolicyController struct {
|
||||||
client dclient.Interface
|
client dclient.Interface
|
||||||
kyvernoClient versioned.Interface
|
kyvernoClient versioned.Interface
|
||||||
contextLoader engineapi.ContextLoaderFactory
|
engine engineapi.Engine
|
||||||
|
|
||||||
pInformer kyvernov1informers.ClusterPolicyInformer
|
pInformer kyvernov1informers.ClusterPolicyInformer
|
||||||
npInformer kyvernov1informers.PolicyInformer
|
npInformer kyvernov1informers.PolicyInformer
|
||||||
|
@ -98,7 +97,7 @@ type PolicyController struct {
|
||||||
func NewPolicyController(
|
func NewPolicyController(
|
||||||
kyvernoClient versioned.Interface,
|
kyvernoClient versioned.Interface,
|
||||||
client dclient.Interface,
|
client dclient.Interface,
|
||||||
contextLoader engineapi.ContextLoaderFactory,
|
engine engineapi.Engine,
|
||||||
pInformer kyvernov1informers.ClusterPolicyInformer,
|
pInformer kyvernov1informers.ClusterPolicyInformer,
|
||||||
npInformer kyvernov1informers.PolicyInformer,
|
npInformer kyvernov1informers.PolicyInformer,
|
||||||
urInformer kyvernov1beta1informers.UpdateRequestInformer,
|
urInformer kyvernov1beta1informers.UpdateRequestInformer,
|
||||||
|
@ -119,7 +118,7 @@ func NewPolicyController(
|
||||||
pc := PolicyController{
|
pc := PolicyController{
|
||||||
client: client,
|
client: client,
|
||||||
kyvernoClient: kyvernoClient,
|
kyvernoClient: kyvernoClient,
|
||||||
contextLoader: contextLoader,
|
engine: engine,
|
||||||
pInformer: pInformer,
|
pInformer: pInformer,
|
||||||
npInformer: npInformer,
|
npInformer: npInformer,
|
||||||
eventGen: eventGen,
|
eventGen: eventGen,
|
||||||
|
@ -509,12 +508,12 @@ func (pc *PolicyController) updateUR(policyKey string, policy kyvernov1.PolicyIn
|
||||||
|
|
||||||
func (pc *PolicyController) handleUpdateRequest(ur *kyvernov1beta1.UpdateRequest, triggerResource *unstructured.Unstructured, rule kyvernov1.Rule, policy kyvernov1.PolicyInterface) (skip bool, err error) {
|
func (pc *PolicyController) handleUpdateRequest(ur *kyvernov1beta1.UpdateRequest, triggerResource *unstructured.Unstructured, rule kyvernov1.Rule, policy kyvernov1.PolicyInterface) (skip bool, err error) {
|
||||||
namespaceLabels := engineutils.GetNamespaceSelectorsFromNamespaceLister(triggerResource.GetKind(), triggerResource.GetNamespace(), pc.nsLister, pc.log)
|
namespaceLabels := engineutils.GetNamespaceSelectorsFromNamespaceLister(triggerResource.GetKind(), triggerResource.GetNamespace(), pc.nsLister, pc.log)
|
||||||
policyContext, _, err := backgroundcommon.NewBackgroundContext(pc.client, ur, policy, triggerResource, pc.configHandler, pc.informerCacheResolvers, namespaceLabels, pc.log)
|
policyContext, _, err := backgroundcommon.NewBackgroundContext(pc.client, ur, policy, triggerResource, pc.configHandler, namespaceLabels, pc.log)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, fmt.Errorf("failed to build policy context for rule %s: %w", rule.Name, err)
|
return false, fmt.Errorf("failed to build policy context for rule %s: %w", rule.Name, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
engineResponse := engine.ApplyBackgroundChecks(pc.contextLoader, policyContext)
|
engineResponse := pc.engine.ApplyBackgroundChecks(policyContext)
|
||||||
if len(engineResponse.PolicyResponse.Rules) == 0 {
|
if len(engineResponse.PolicyResponse.Rules) == 0 {
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -146,10 +146,9 @@ func runTestCase(t *testing.T, tc TestCase) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
policyContext := engine.NewPolicyContext().WithPolicy(policy).WithNewResource(*resource)
|
policyContext := engine.NewPolicyContext().WithPolicy(policy).WithNewResource(*resource)
|
||||||
eng := engine.NewEgine()
|
eng := engine.NewEngine(config.NewDefaultConfiguration(), engine.LegacyContextLoaderFactory(registryclient.NewOrDie(), nil))
|
||||||
er := eng.Mutate(
|
er := eng.Mutate(
|
||||||
context.TODO(),
|
context.TODO(),
|
||||||
engine.LegacyContextLoaderFactory(registryclient.NewOrDie()),
|
|
||||||
policyContext,
|
policyContext,
|
||||||
)
|
)
|
||||||
t.Log("---Mutation---")
|
t.Log("---Mutation---")
|
||||||
|
@ -163,12 +162,9 @@ func runTestCase(t *testing.T, tc TestCase) bool {
|
||||||
|
|
||||||
policyContext = policyContext.WithNewResource(*resource)
|
policyContext = policyContext.WithNewResource(*resource)
|
||||||
|
|
||||||
cfg := config.NewDefaultConfiguration()
|
|
||||||
er = eng.Validate(
|
er = eng.Validate(
|
||||||
context.TODO(),
|
context.TODO(),
|
||||||
engine.LegacyContextLoaderFactory(registryclient.NewOrDie()),
|
|
||||||
policyContext,
|
policyContext,
|
||||||
cfg,
|
|
||||||
)
|
)
|
||||||
t.Log("---Validation---")
|
t.Log("---Validation---")
|
||||||
validateResponse(t, er.PolicyResponse, tc.Expected.Validation.PolicyResponse)
|
validateResponse(t, er.PolicyResponse, tc.Expected.Validation.PolicyResponse)
|
||||||
|
@ -185,8 +181,7 @@ func runTestCase(t *testing.T, tc TestCase) bool {
|
||||||
} else {
|
} else {
|
||||||
policyContext := policyContext.WithClient(client)
|
policyContext := policyContext.WithClient(client)
|
||||||
|
|
||||||
er = engine.ApplyBackgroundChecks(
|
er = eng.ApplyBackgroundChecks(
|
||||||
engine.LegacyContextLoaderFactory(registryclient.NewOrDie()),
|
|
||||||
policyContext,
|
policyContext,
|
||||||
)
|
)
|
||||||
t.Log(("---Generation---"))
|
t.Log(("---Generation---"))
|
||||||
|
|
|
@ -54,9 +54,8 @@ func NewFakeHandlers(ctx context.Context, policyCache policycache.Cache) webhook
|
||||||
urGenerator: updaterequest.NewFake(),
|
urGenerator: updaterequest.NewFake(),
|
||||||
eventGen: event.NewFake(),
|
eventGen: event.NewFake(),
|
||||||
openApiManager: openapi.NewFake(),
|
openApiManager: openapi.NewFake(),
|
||||||
pcBuilder: webhookutils.NewPolicyContextBuilder(configuration, dclient, rbLister, crbLister, configMapResolver, peLister),
|
pcBuilder: webhookutils.NewPolicyContextBuilder(configuration, dclient, rbLister, crbLister, peLister),
|
||||||
urUpdater: webhookutils.NewUpdateRequestUpdater(kyvernoclient, urLister),
|
urUpdater: webhookutils.NewUpdateRequestUpdater(kyvernoclient, urLister),
|
||||||
engine: engine.NewEgine(),
|
engine: engine.NewEngine(configuration, engine.LegacyContextLoaderFactory(rclient, configMapResolver)),
|
||||||
contextLoader: engine.LegacyContextLoaderFactory(rclient),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,9 +37,9 @@ type GenerationHandler interface {
|
||||||
|
|
||||||
func NewGenerationHandler(
|
func NewGenerationHandler(
|
||||||
log logr.Logger,
|
log logr.Logger,
|
||||||
|
engine engineapi.Engine,
|
||||||
client dclient.Interface,
|
client dclient.Interface,
|
||||||
kyvernoClient versioned.Interface,
|
kyvernoClient versioned.Interface,
|
||||||
contextLoader engineapi.ContextLoaderFactory,
|
|
||||||
nsLister corev1listers.NamespaceLister,
|
nsLister corev1listers.NamespaceLister,
|
||||||
urLister kyvernov1beta1listers.UpdateRequestNamespaceLister,
|
urLister kyvernov1beta1listers.UpdateRequestNamespaceLister,
|
||||||
urGenerator webhookgenerate.Generator,
|
urGenerator webhookgenerate.Generator,
|
||||||
|
@ -49,9 +49,9 @@ func NewGenerationHandler(
|
||||||
) GenerationHandler {
|
) GenerationHandler {
|
||||||
return &generationHandler{
|
return &generationHandler{
|
||||||
log: log,
|
log: log,
|
||||||
|
engine: engine,
|
||||||
client: client,
|
client: client,
|
||||||
kyvernoClient: kyvernoClient,
|
kyvernoClient: kyvernoClient,
|
||||||
contextLoader: contextLoader,
|
|
||||||
nsLister: nsLister,
|
nsLister: nsLister,
|
||||||
urLister: urLister,
|
urLister: urLister,
|
||||||
urGenerator: urGenerator,
|
urGenerator: urGenerator,
|
||||||
|
@ -63,9 +63,9 @@ func NewGenerationHandler(
|
||||||
|
|
||||||
type generationHandler struct {
|
type generationHandler struct {
|
||||||
log logr.Logger
|
log logr.Logger
|
||||||
|
engine engineapi.Engine
|
||||||
client dclient.Interface
|
client dclient.Interface
|
||||||
kyvernoClient versioned.Interface
|
kyvernoClient versioned.Interface
|
||||||
contextLoader engineapi.ContextLoaderFactory
|
|
||||||
nsLister corev1listers.NamespaceLister
|
nsLister corev1listers.NamespaceLister
|
||||||
urLister kyvernov1beta1listers.UpdateRequestNamespaceLister
|
urLister kyvernov1beta1listers.UpdateRequestNamespaceLister
|
||||||
urGenerator webhookgenerate.Generator
|
urGenerator webhookgenerate.Generator
|
||||||
|
@ -92,7 +92,7 @@ func (h *generationHandler) Handle(
|
||||||
if request.Kind.Kind != "Namespace" && request.Namespace != "" {
|
if request.Kind.Kind != "Namespace" && request.Namespace != "" {
|
||||||
policyContext = policyContext.WithNamespaceLabels(engineutils.GetNamespaceSelectorsFromNamespaceLister(request.Kind.Kind, request.Namespace, h.nsLister, h.log))
|
policyContext = policyContext.WithNamespaceLabels(engineutils.GetNamespaceSelectorsFromNamespaceLister(request.Kind.Kind, request.Namespace, h.nsLister, h.log))
|
||||||
}
|
}
|
||||||
engineResponse := engine.ApplyBackgroundChecks(h.contextLoader, policyContext)
|
engineResponse := h.engine.ApplyBackgroundChecks(policyContext)
|
||||||
for _, rule := range engineResponse.PolicyResponse.Rules {
|
for _, rule := range engineResponse.PolicyResponse.Rules {
|
||||||
if rule.Status != engineapi.RuleStatusPass {
|
if rule.Status != engineapi.RuleStatusPass {
|
||||||
h.deleteGR(ctx, engineResponse)
|
h.deleteGR(ctx, engineResponse)
|
||||||
|
|
|
@ -42,7 +42,6 @@ type handlers struct {
|
||||||
kyvernoClient versioned.Interface
|
kyvernoClient versioned.Interface
|
||||||
rclient registryclient.Client
|
rclient registryclient.Client
|
||||||
engine engineapi.Engine
|
engine engineapi.Engine
|
||||||
contextLoader engineapi.ContextLoaderFactory
|
|
||||||
|
|
||||||
// config
|
// config
|
||||||
configuration config.Configuration
|
configuration config.Configuration
|
||||||
|
@ -69,14 +68,12 @@ type handlers struct {
|
||||||
|
|
||||||
func NewHandlers(
|
func NewHandlers(
|
||||||
engine engineapi.Engine,
|
engine engineapi.Engine,
|
||||||
contextLoader engineapi.ContextLoaderFactory,
|
|
||||||
client dclient.Interface,
|
client dclient.Interface,
|
||||||
kyvernoClient versioned.Interface,
|
kyvernoClient versioned.Interface,
|
||||||
rclient registryclient.Client,
|
rclient registryclient.Client,
|
||||||
configuration config.Configuration,
|
configuration config.Configuration,
|
||||||
metricsConfig metrics.MetricsConfigManager,
|
metricsConfig metrics.MetricsConfigManager,
|
||||||
pCache policycache.Cache,
|
pCache policycache.Cache,
|
||||||
informerCacheResolvers engineapi.ConfigmapResolver,
|
|
||||||
nsLister corev1listers.NamespaceLister,
|
nsLister corev1listers.NamespaceLister,
|
||||||
rbLister rbacv1listers.RoleBindingLister,
|
rbLister rbacv1listers.RoleBindingLister,
|
||||||
crbLister rbacv1listers.ClusterRoleBindingLister,
|
crbLister rbacv1listers.ClusterRoleBindingLister,
|
||||||
|
@ -89,7 +86,6 @@ func NewHandlers(
|
||||||
) webhooks.ResourceHandlers {
|
) webhooks.ResourceHandlers {
|
||||||
return &handlers{
|
return &handlers{
|
||||||
engine: engine,
|
engine: engine,
|
||||||
contextLoader: contextLoader,
|
|
||||||
client: client,
|
client: client,
|
||||||
kyvernoClient: kyvernoClient,
|
kyvernoClient: kyvernoClient,
|
||||||
rclient: rclient,
|
rclient: rclient,
|
||||||
|
@ -104,7 +100,7 @@ func NewHandlers(
|
||||||
urGenerator: urGenerator,
|
urGenerator: urGenerator,
|
||||||
eventGen: eventGen,
|
eventGen: eventGen,
|
||||||
openApiManager: openApiManager,
|
openApiManager: openApiManager,
|
||||||
pcBuilder: webhookutils.NewPolicyContextBuilder(configuration, client, rbLister, crbLister, informerCacheResolvers, polexLister),
|
pcBuilder: webhookutils.NewPolicyContextBuilder(configuration, client, rbLister, crbLister, polexLister),
|
||||||
urUpdater: webhookutils.NewUpdateRequestUpdater(kyvernoClient, urLister),
|
urUpdater: webhookutils.NewUpdateRequestUpdater(kyvernoClient, urLister),
|
||||||
admissionReports: admissionReports,
|
admissionReports: admissionReports,
|
||||||
}
|
}
|
||||||
|
@ -127,7 +123,7 @@ func (h *handlers) Validate(ctx context.Context, logger logr.Logger, request *ad
|
||||||
}
|
}
|
||||||
if len(generatePolicies) == 0 && request.Operation == admissionv1.Update {
|
if len(generatePolicies) == 0 && request.Operation == admissionv1.Update {
|
||||||
// handle generate source resource updates
|
// handle generate source resource updates
|
||||||
gh := generation.NewGenerationHandler(logger, h.client, h.kyvernoClient, h.contextLoader, h.nsLister, h.urLister, h.urGenerator, h.urUpdater, h.eventGen, h.metricsConfig)
|
gh := generation.NewGenerationHandler(logger, h.engine, h.client, h.kyvernoClient, h.nsLister, h.urLister, h.urGenerator, h.urUpdater, h.eventGen, h.metricsConfig)
|
||||||
go gh.HandleUpdatesForGenerateRules(context.TODO(), request, []kyvernov1.PolicyInterface{})
|
go gh.HandleUpdatesForGenerateRules(context.TODO(), request, []kyvernov1.PolicyInterface{})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -143,7 +139,7 @@ func (h *handlers) Validate(ctx context.Context, logger logr.Logger, request *ad
|
||||||
namespaceLabels = engineutils.GetNamespaceSelectorsFromNamespaceLister(request.Kind.Kind, request.Namespace, h.nsLister, logger)
|
namespaceLabels = engineutils.GetNamespaceSelectorsFromNamespaceLister(request.Kind.Kind, request.Namespace, h.nsLister, logger)
|
||||||
}
|
}
|
||||||
policyContext = policyContext.WithNamespaceLabels(namespaceLabels)
|
policyContext = policyContext.WithNamespaceLabels(namespaceLabels)
|
||||||
vh := validation.NewValidationHandler(logger, h.kyvernoClient, h.engine, h.contextLoader, h.pCache, h.pcBuilder, h.eventGen, h.admissionReports, h.metricsConfig, h.configuration)
|
vh := validation.NewValidationHandler(logger, h.kyvernoClient, h.engine, h.pCache, h.pcBuilder, h.eventGen, h.admissionReports, h.metricsConfig, h.configuration)
|
||||||
|
|
||||||
ok, msg, warnings := vh.HandleValidation(ctx, request, policies, policyContext, startTime)
|
ok, msg, warnings := vh.HandleValidation(ctx, request, policies, policyContext, startTime)
|
||||||
if !ok {
|
if !ok {
|
||||||
|
@ -177,7 +173,7 @@ func (h *handlers) Mutate(ctx context.Context, logger logr.Logger, request *admi
|
||||||
if err := enginectx.MutateResourceWithImageInfo(request.Object.Raw, policyContext.JSONContext()); err != nil {
|
if err := enginectx.MutateResourceWithImageInfo(request.Object.Raw, policyContext.JSONContext()); err != nil {
|
||||||
logger.Error(err, "failed to patch images info to resource, policies that mutate images may be impacted")
|
logger.Error(err, "failed to patch images info to resource, policies that mutate images may be impacted")
|
||||||
}
|
}
|
||||||
mh := mutation.NewMutationHandler(logger, h.engine, h.contextLoader, h.eventGen, h.openApiManager, h.nsLister, h.metricsConfig)
|
mh := mutation.NewMutationHandler(logger, h.engine, h.eventGen, h.openApiManager, h.nsLister, h.metricsConfig)
|
||||||
mutatePatches, mutateWarnings, err := mh.HandleMutation(ctx, request, mutatePolicies, policyContext, startTime)
|
mutatePatches, mutateWarnings, err := mh.HandleMutation(ctx, request, mutatePolicies, policyContext, startTime)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error(err, "mutation failed")
|
logger.Error(err, "mutation failed")
|
||||||
|
@ -190,7 +186,7 @@ func (h *handlers) Mutate(ctx context.Context, logger logr.Logger, request *admi
|
||||||
logger.Error(err, "failed to build policy context")
|
logger.Error(err, "failed to build policy context")
|
||||||
return admissionutils.Response(request.UID, err)
|
return admissionutils.Response(request.UID, err)
|
||||||
}
|
}
|
||||||
ivh := imageverification.NewImageVerificationHandler(logger, h.kyvernoClient, h.engine, h.contextLoader, h.rclient, h.eventGen, h.admissionReports, h.configuration)
|
ivh := imageverification.NewImageVerificationHandler(logger, h.kyvernoClient, h.engine, h.rclient, h.eventGen, h.admissionReports, h.configuration)
|
||||||
imagePatches, imageVerifyWarnings, err := ivh.Handle(ctx, newRequest, verifyImagesPolicies, policyContext)
|
imagePatches, imageVerifyWarnings, err := ivh.Handle(ctx, newRequest, verifyImagesPolicies, policyContext)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error(err, "image verification failed")
|
logger.Error(err, "image verification failed")
|
||||||
|
|
|
@ -33,7 +33,6 @@ type ImageVerificationHandler interface {
|
||||||
type imageVerificationHandler struct {
|
type imageVerificationHandler struct {
|
||||||
kyvernoClient versioned.Interface
|
kyvernoClient versioned.Interface
|
||||||
engine engineapi.Engine
|
engine engineapi.Engine
|
||||||
contextLoader engineapi.ContextLoaderFactory
|
|
||||||
rclient registryclient.Client
|
rclient registryclient.Client
|
||||||
log logr.Logger
|
log logr.Logger
|
||||||
eventGen event.Interface
|
eventGen event.Interface
|
||||||
|
@ -45,7 +44,6 @@ func NewImageVerificationHandler(
|
||||||
log logr.Logger,
|
log logr.Logger,
|
||||||
kyvernoClient versioned.Interface,
|
kyvernoClient versioned.Interface,
|
||||||
engine engineapi.Engine,
|
engine engineapi.Engine,
|
||||||
contextLoader engineapi.ContextLoaderFactory,
|
|
||||||
rclient registryclient.Client,
|
rclient registryclient.Client,
|
||||||
eventGen event.Interface,
|
eventGen event.Interface,
|
||||||
admissionReports bool,
|
admissionReports bool,
|
||||||
|
@ -54,7 +52,6 @@ func NewImageVerificationHandler(
|
||||||
return &imageVerificationHandler{
|
return &imageVerificationHandler{
|
||||||
kyvernoClient: kyvernoClient,
|
kyvernoClient: kyvernoClient,
|
||||||
engine: engine,
|
engine: engine,
|
||||||
contextLoader: contextLoader,
|
|
||||||
rclient: rclient,
|
rclient: rclient,
|
||||||
log: log,
|
log: log,
|
||||||
eventGen: eventGen,
|
eventGen: eventGen,
|
||||||
|
@ -97,7 +94,7 @@ func (h *imageVerificationHandler) handleVerifyImages(
|
||||||
fmt.Sprintf("POLICY %s/%s", policy.GetNamespace(), policy.GetName()),
|
fmt.Sprintf("POLICY %s/%s", policy.GetNamespace(), policy.GetName()),
|
||||||
func(ctx context.Context, span trace.Span) {
|
func(ctx context.Context, span trace.Span) {
|
||||||
policyContext := policyContext.WithPolicy(policy)
|
policyContext := policyContext.WithPolicy(policy)
|
||||||
resp, ivm := h.engine.VerifyAndPatchImages(ctx, h.contextLoader, h.rclient, policyContext, h.cfg)
|
resp, ivm := h.engine.VerifyAndPatchImages(ctx, h.rclient, policyContext)
|
||||||
|
|
||||||
engineResponses = append(engineResponses, resp)
|
engineResponses = append(engineResponses, resp)
|
||||||
patches = append(patches, resp.GetPatches()...)
|
patches = append(patches, resp.GetPatches()...)
|
||||||
|
|
|
@ -35,7 +35,6 @@ type MutationHandler interface {
|
||||||
func NewMutationHandler(
|
func NewMutationHandler(
|
||||||
log logr.Logger,
|
log logr.Logger,
|
||||||
engine engineapi.Engine,
|
engine engineapi.Engine,
|
||||||
contextLoader engineapi.ContextLoaderFactory,
|
|
||||||
eventGen event.Interface,
|
eventGen event.Interface,
|
||||||
openApiManager openapi.ValidateInterface,
|
openApiManager openapi.ValidateInterface,
|
||||||
nsLister corev1listers.NamespaceLister,
|
nsLister corev1listers.NamespaceLister,
|
||||||
|
@ -44,7 +43,6 @@ func NewMutationHandler(
|
||||||
return &mutationHandler{
|
return &mutationHandler{
|
||||||
log: log,
|
log: log,
|
||||||
engine: engine,
|
engine: engine,
|
||||||
contextLoader: contextLoader,
|
|
||||||
eventGen: eventGen,
|
eventGen: eventGen,
|
||||||
openApiManager: openApiManager,
|
openApiManager: openApiManager,
|
||||||
nsLister: nsLister,
|
nsLister: nsLister,
|
||||||
|
@ -55,7 +53,6 @@ func NewMutationHandler(
|
||||||
type mutationHandler struct {
|
type mutationHandler struct {
|
||||||
log logr.Logger
|
log logr.Logger
|
||||||
engine engineapi.Engine
|
engine engineapi.Engine
|
||||||
contextLoader engineapi.ContextLoaderFactory
|
|
||||||
eventGen event.Interface
|
eventGen event.Interface
|
||||||
openApiManager openapi.ValidateInterface
|
openApiManager openapi.ValidateInterface
|
||||||
nsLister corev1listers.NamespaceLister
|
nsLister corev1listers.NamespaceLister
|
||||||
|
@ -159,7 +156,7 @@ func (h *mutationHandler) applyMutation(ctx context.Context, request *admissionv
|
||||||
policyContext = policyContext.WithNamespaceLabels(engineutils.GetNamespaceSelectorsFromNamespaceLister(request.Kind.Kind, request.Namespace, h.nsLister, h.log))
|
policyContext = policyContext.WithNamespaceLabels(engineutils.GetNamespaceSelectorsFromNamespaceLister(request.Kind.Kind, request.Namespace, h.nsLister, h.log))
|
||||||
}
|
}
|
||||||
|
|
||||||
engineResponse := h.engine.Mutate(ctx, h.contextLoader, policyContext)
|
engineResponse := h.engine.Mutate(ctx, policyContext)
|
||||||
policyPatches := engineResponse.GetPatches()
|
policyPatches := engineResponse.GetPatches()
|
||||||
|
|
||||||
if !engineResponse.IsSuccessful() {
|
if !engineResponse.IsSuccessful() {
|
||||||
|
|
|
@ -18,7 +18,7 @@ import (
|
||||||
|
|
||||||
// createUpdateRequests applies generate and mutateExisting policies, and creates update requests for background reconcile
|
// createUpdateRequests applies generate and mutateExisting policies, and creates update requests for background reconcile
|
||||||
func (h *handlers) createUpdateRequests(logger logr.Logger, request *admissionv1.AdmissionRequest, policyContext *engine.PolicyContext, generatePolicies, mutatePolicies []kyvernov1.PolicyInterface, ts time.Time) {
|
func (h *handlers) createUpdateRequests(logger logr.Logger, request *admissionv1.AdmissionRequest, policyContext *engine.PolicyContext, generatePolicies, mutatePolicies []kyvernov1.PolicyInterface, ts time.Time) {
|
||||||
gh := generation.NewGenerationHandler(logger, h.client, h.kyvernoClient, h.contextLoader, h.nsLister, h.urLister, h.urGenerator, h.urUpdater, h.eventGen, h.metricsConfig)
|
gh := generation.NewGenerationHandler(logger, h.engine, h.client, h.kyvernoClient, h.nsLister, h.urLister, h.urGenerator, h.urUpdater, h.eventGen, h.metricsConfig)
|
||||||
go h.handleMutateExisting(context.TODO(), logger, request, mutatePolicies, policyContext, ts)
|
go h.handleMutateExisting(context.TODO(), logger, request, mutatePolicies, policyContext, ts)
|
||||||
go gh.Handle(context.TODO(), request, generatePolicies, policyContext, ts)
|
go gh.Handle(context.TODO(), request, generatePolicies, policyContext, ts)
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,7 @@ func (h *handlers) handleMutateExisting(ctx context.Context, logger logr.Logger,
|
||||||
|
|
||||||
var rules []engineapi.RuleResponse
|
var rules []engineapi.RuleResponse
|
||||||
policyContext := policyContext.WithPolicy(policy)
|
policyContext := policyContext.WithPolicy(policy)
|
||||||
engineResponse := engine.ApplyBackgroundChecks(h.contextLoader, policyContext)
|
engineResponse := h.engine.ApplyBackgroundChecks(policyContext)
|
||||||
|
|
||||||
for _, rule := range engineResponse.PolicyResponse.Rules {
|
for _, rule := range engineResponse.PolicyResponse.Rules {
|
||||||
if rule.Status == engineapi.RuleStatusPass {
|
if rule.Status == engineapi.RuleStatusPass {
|
||||||
|
|
|
@ -38,7 +38,6 @@ func NewValidationHandler(
|
||||||
log logr.Logger,
|
log logr.Logger,
|
||||||
kyvernoClient versioned.Interface,
|
kyvernoClient versioned.Interface,
|
||||||
engine engineapi.Engine,
|
engine engineapi.Engine,
|
||||||
contextLoader engineapi.ContextLoaderFactory,
|
|
||||||
pCache policycache.Cache,
|
pCache policycache.Cache,
|
||||||
pcBuilder webhookutils.PolicyContextBuilder,
|
pcBuilder webhookutils.PolicyContextBuilder,
|
||||||
eventGen event.Interface,
|
eventGen event.Interface,
|
||||||
|
@ -50,7 +49,6 @@ func NewValidationHandler(
|
||||||
log: log,
|
log: log,
|
||||||
kyvernoClient: kyvernoClient,
|
kyvernoClient: kyvernoClient,
|
||||||
engine: engine,
|
engine: engine,
|
||||||
contextLoader: contextLoader,
|
|
||||||
pCache: pCache,
|
pCache: pCache,
|
||||||
pcBuilder: pcBuilder,
|
pcBuilder: pcBuilder,
|
||||||
eventGen: eventGen,
|
eventGen: eventGen,
|
||||||
|
@ -64,7 +62,6 @@ type validationHandler struct {
|
||||||
log logr.Logger
|
log logr.Logger
|
||||||
kyvernoClient versioned.Interface
|
kyvernoClient versioned.Interface
|
||||||
engine engineapi.Engine
|
engine engineapi.Engine
|
||||||
contextLoader engineapi.ContextLoaderFactory
|
|
||||||
pCache policycache.Cache
|
pCache policycache.Cache
|
||||||
pcBuilder webhookutils.PolicyContextBuilder
|
pcBuilder webhookutils.PolicyContextBuilder
|
||||||
eventGen event.Interface
|
eventGen event.Interface
|
||||||
|
@ -109,7 +106,7 @@ func (v *validationHandler) HandleValidation(
|
||||||
failurePolicy = kyvernov1.Fail
|
failurePolicy = kyvernov1.Fail
|
||||||
}
|
}
|
||||||
|
|
||||||
engineResponse := v.engine.Validate(ctx, v.contextLoader, policyContext, v.cfg)
|
engineResponse := v.engine.Validate(ctx, policyContext)
|
||||||
if engineResponse.IsNil() {
|
if engineResponse.IsNil() {
|
||||||
// we get an empty response if old and new resources created the same response
|
// we get an empty response if old and new resources created the same response
|
||||||
// allow updates if resource update doesnt change the policy evaluation
|
// allow updates if resource update doesnt change the policy evaluation
|
||||||
|
@ -167,7 +164,7 @@ func (v *validationHandler) buildAuditResponses(
|
||||||
fmt.Sprintf("POLICY %s/%s", policy.GetNamespace(), policy.GetName()),
|
fmt.Sprintf("POLICY %s/%s", policy.GetNamespace(), policy.GetName()),
|
||||||
func(ctx context.Context, span trace.Span) {
|
func(ctx context.Context, span trace.Span) {
|
||||||
policyContext := policyContext.WithPolicy(policy)
|
policyContext := policyContext.WithPolicy(policy)
|
||||||
responses = append(responses, v.engine.Validate(ctx, v.contextLoader, policyContext, v.cfg))
|
responses = append(responses, v.engine.Validate(ctx, policyContext))
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1049,8 +1049,10 @@ func TestValidate_failure_action_overrides(t *testing.T) {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg := config.NewDefaultConfiguration()
|
eng := engine.NewEngine(
|
||||||
eng := engine.NewEgine()
|
config.NewDefaultConfiguration(),
|
||||||
|
engine.LegacyContextLoaderFactory(registryclient.NewOrDie(), nil),
|
||||||
|
)
|
||||||
for i, tc := range testcases {
|
for i, tc := range testcases {
|
||||||
t.Run(fmt.Sprintf("case %d", i), func(t *testing.T) {
|
t.Run(fmt.Sprintf("case %d", i), func(t *testing.T) {
|
||||||
var policy kyvernov1.ClusterPolicy
|
var policy kyvernov1.ClusterPolicy
|
||||||
|
@ -1062,9 +1064,7 @@ func TestValidate_failure_action_overrides(t *testing.T) {
|
||||||
ctx := engine.NewPolicyContext().WithPolicy(&policy).WithNewResource(*resourceUnstructured).WithNamespaceLabels(tc.rawResourceNamespaceLabels)
|
ctx := engine.NewPolicyContext().WithPolicy(&policy).WithNewResource(*resourceUnstructured).WithNamespaceLabels(tc.rawResourceNamespaceLabels)
|
||||||
er := eng.Validate(
|
er := eng.Validate(
|
||||||
context.TODO(),
|
context.TODO(),
|
||||||
engine.LegacyContextLoaderFactory(registryclient.NewOrDie()),
|
|
||||||
ctx,
|
ctx,
|
||||||
cfg,
|
|
||||||
)
|
)
|
||||||
if tc.blocked && tc.messages != nil {
|
if tc.blocked && tc.messages != nil {
|
||||||
for _, r := range er.PolicyResponse.Rules {
|
for _, r := range er.PolicyResponse.Rules {
|
||||||
|
@ -1125,13 +1125,13 @@ func Test_RuleSelector(t *testing.T) {
|
||||||
|
|
||||||
ctx := engine.NewPolicyContext().WithPolicy(&policy).WithNewResource(*resourceUnstructured)
|
ctx := engine.NewPolicyContext().WithPolicy(&policy).WithNewResource(*resourceUnstructured)
|
||||||
|
|
||||||
cfg := config.NewDefaultConfiguration()
|
eng := engine.NewEngine(
|
||||||
eng := engine.NewEgine()
|
config.NewDefaultConfiguration(),
|
||||||
|
engine.LegacyContextLoaderFactory(registryclient.NewOrDie(), nil),
|
||||||
|
)
|
||||||
resp := eng.Validate(
|
resp := eng.Validate(
|
||||||
context.TODO(),
|
context.TODO(),
|
||||||
engine.LegacyContextLoaderFactory(registryclient.NewOrDie()),
|
|
||||||
ctx,
|
ctx,
|
||||||
cfg,
|
|
||||||
)
|
)
|
||||||
assert.Assert(t, resp.PolicyResponse.RulesAppliedCount == 2)
|
assert.Assert(t, resp.PolicyResponse.RulesAppliedCount == 2)
|
||||||
assert.Assert(t, resp.PolicyResponse.RulesErrorCount == 0)
|
assert.Assert(t, resp.PolicyResponse.RulesErrorCount == 0)
|
||||||
|
@ -1144,9 +1144,7 @@ func Test_RuleSelector(t *testing.T) {
|
||||||
policy.Spec.ApplyRules = &applyOne
|
policy.Spec.ApplyRules = &applyOne
|
||||||
resp = eng.Validate(
|
resp = eng.Validate(
|
||||||
context.TODO(),
|
context.TODO(),
|
||||||
engine.LegacyContextLoaderFactory(registryclient.NewOrDie()),
|
|
||||||
ctx,
|
ctx,
|
||||||
cfg,
|
|
||||||
)
|
)
|
||||||
assert.Assert(t, resp.PolicyResponse.RulesAppliedCount == 1)
|
assert.Assert(t, resp.PolicyResponse.RulesAppliedCount == 1)
|
||||||
assert.Assert(t, resp.PolicyResponse.RulesErrorCount == 0)
|
assert.Assert(t, resp.PolicyResponse.RulesErrorCount == 0)
|
||||||
|
|
|
@ -7,7 +7,6 @@ import (
|
||||||
"github.com/kyverno/kyverno/pkg/clients/dclient"
|
"github.com/kyverno/kyverno/pkg/clients/dclient"
|
||||||
"github.com/kyverno/kyverno/pkg/config"
|
"github.com/kyverno/kyverno/pkg/config"
|
||||||
"github.com/kyverno/kyverno/pkg/engine"
|
"github.com/kyverno/kyverno/pkg/engine"
|
||||||
engineapi "github.com/kyverno/kyverno/pkg/engine/api"
|
|
||||||
"github.com/kyverno/kyverno/pkg/userinfo"
|
"github.com/kyverno/kyverno/pkg/userinfo"
|
||||||
admissionv1 "k8s.io/api/admission/v1"
|
admissionv1 "k8s.io/api/admission/v1"
|
||||||
rbacv1listers "k8s.io/client-go/listers/rbac/v1"
|
rbacv1listers "k8s.io/client-go/listers/rbac/v1"
|
||||||
|
@ -22,7 +21,6 @@ type policyContextBuilder struct {
|
||||||
client dclient.Interface
|
client dclient.Interface
|
||||||
rbLister rbacv1listers.RoleBindingLister
|
rbLister rbacv1listers.RoleBindingLister
|
||||||
crbLister rbacv1listers.ClusterRoleBindingLister
|
crbLister rbacv1listers.ClusterRoleBindingLister
|
||||||
informerCacheResolvers engineapi.ConfigmapResolver
|
|
||||||
polexLister engine.PolicyExceptionLister
|
polexLister engine.PolicyExceptionLister
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,7 +29,6 @@ func NewPolicyContextBuilder(
|
||||||
client dclient.Interface,
|
client dclient.Interface,
|
||||||
rbLister rbacv1listers.RoleBindingLister,
|
rbLister rbacv1listers.RoleBindingLister,
|
||||||
crbLister rbacv1listers.ClusterRoleBindingLister,
|
crbLister rbacv1listers.ClusterRoleBindingLister,
|
||||||
informerCacheResolvers engineapi.ConfigmapResolver,
|
|
||||||
polexLister engine.PolicyExceptionLister,
|
polexLister engine.PolicyExceptionLister,
|
||||||
) PolicyContextBuilder {
|
) PolicyContextBuilder {
|
||||||
return &policyContextBuilder{
|
return &policyContextBuilder{
|
||||||
|
@ -39,7 +36,6 @@ func NewPolicyContextBuilder(
|
||||||
client: client,
|
client: client,
|
||||||
rbLister: rbLister,
|
rbLister: rbLister,
|
||||||
crbLister: crbLister,
|
crbLister: crbLister,
|
||||||
informerCacheResolvers: informerCacheResolvers,
|
|
||||||
polexLister: polexLister,
|
polexLister: polexLister,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -54,5 +50,5 @@ func (b *policyContextBuilder) Build(request *admissionv1.AdmissionRequest) (*en
|
||||||
userRequestInfo.Roles = roles
|
userRequestInfo.Roles = roles
|
||||||
userRequestInfo.ClusterRoles = clusterRoles
|
userRequestInfo.ClusterRoles = clusterRoles
|
||||||
}
|
}
|
||||||
return engine.NewPolicyContextFromAdmissionRequest(request, userRequestInfo, b.configuration, b.client, b.informerCacheResolvers, b.polexLister)
|
return engine.NewPolicyContextFromAdmissionRequest(request, userRequestInfo, b.configuration, b.client, b.polexLister)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue