2023-02-08 14:19:56 +01:00
|
|
|
package store
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
|
|
|
|
kyvernov1 "github.com/kyverno/kyverno/api/kyverno/v1"
|
|
|
|
engineapi "github.com/kyverno/kyverno/pkg/engine/api"
|
|
|
|
enginecontext "github.com/kyverno/kyverno/pkg/engine/context"
|
2023-06-16 19:07:08 +05:30
|
|
|
"github.com/kyverno/kyverno/pkg/engine/factories"
|
2023-04-13 13:29:40 +02:00
|
|
|
"github.com/kyverno/kyverno/pkg/engine/jmespath"
|
2023-02-08 14:19:56 +01:00
|
|
|
)
|
|
|
|
|
2023-12-19 15:45:53 +01:00
|
|
|
func ContextLoaderFactory(s *Store, cmResolver engineapi.ConfigmapResolver) engineapi.ContextLoaderFactory {
|
|
|
|
if !s.IsLocal() {
|
2023-06-26 22:46:30 +02:00
|
|
|
return factories.DefaultContextLoaderFactory(cmResolver)
|
|
|
|
}
|
2023-02-08 14:19:56 +01:00
|
|
|
return func(policy kyvernov1.PolicyInterface, rule kyvernov1.Rule) engineapi.ContextLoader {
|
2023-06-26 22:46:30 +02:00
|
|
|
init := func(jsonContext enginecontext.Interface) error {
|
2023-12-19 15:45:53 +01:00
|
|
|
rule := s.GetPolicyRule(policy.GetName(), rule.Name)
|
2023-06-26 22:46:30 +02:00
|
|
|
if rule != nil && len(rule.Values) > 0 {
|
|
|
|
variables := rule.Values
|
|
|
|
for key, value := range variables {
|
|
|
|
if err := jsonContext.AddVariable(key, value); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if rule != nil && len(rule.ForEachValues) > 0 {
|
|
|
|
for key, value := range rule.ForEachValues {
|
2023-12-19 15:45:53 +01:00
|
|
|
if err := jsonContext.AddVariable(key, value[s.GetForeachElement()]); err != nil {
|
2023-06-26 22:46:30 +02:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
2023-02-08 14:19:56 +01:00
|
|
|
}
|
2023-06-26 22:46:30 +02:00
|
|
|
return nil
|
2023-02-08 14:19:56 +01:00
|
|
|
}
|
2023-06-26 22:46:30 +02:00
|
|
|
factory := factories.DefaultContextLoaderFactory(cmResolver, factories.WithInitializer(init))
|
2023-12-19 15:45:53 +01:00
|
|
|
return wrapper{
|
|
|
|
store: s,
|
|
|
|
inner: factory(policy, rule),
|
|
|
|
}
|
2023-02-08 14:19:56 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-06-26 22:46:30 +02:00
|
|
|
type wrapper struct {
|
2023-12-19 15:45:53 +01:00
|
|
|
store *Store
|
2023-06-26 22:46:30 +02:00
|
|
|
inner engineapi.ContextLoader
|
2023-02-08 14:19:56 +01:00
|
|
|
}
|
|
|
|
|
2023-06-26 22:46:30 +02:00
|
|
|
func (w wrapper) Load(
|
2023-02-08 14:19:56 +01:00
|
|
|
ctx context.Context,
|
2023-04-13 13:29:40 +02:00
|
|
|
jp jmespath.Interface,
|
2023-06-12 18:03:17 +02:00
|
|
|
client engineapi.RawClient,
|
2023-06-26 22:46:30 +02:00
|
|
|
rclientFactory engineapi.RegistryClientFactory,
|
2023-02-08 14:19:56 +01:00
|
|
|
contextEntries []kyvernov1.ContextEntry,
|
|
|
|
jsonContext enginecontext.Interface,
|
|
|
|
) error {
|
2023-12-19 15:45:53 +01:00
|
|
|
if !w.store.IsApiCallAllowed() {
|
2023-06-26 22:46:30 +02:00
|
|
|
client = nil
|
2023-02-08 14:19:56 +01:00
|
|
|
}
|
2023-12-19 15:45:53 +01:00
|
|
|
if !w.store.GetRegistryAccess() {
|
2023-06-26 22:46:30 +02:00
|
|
|
rclientFactory = nil
|
2023-02-08 14:19:56 +01:00
|
|
|
}
|
2023-09-22 12:40:16 +02:00
|
|
|
return w.inner.Load(ctx, jp, client, rclientFactory, contextEntries, jsonContext)
|
2023-02-08 14:19:56 +01:00
|
|
|
}
|