2025-01-23 12:02:33 +01:00
|
|
|
package context
|
|
|
|
|
|
|
|
import (
|
2025-02-03 19:12:40 +05:30
|
|
|
"context"
|
|
|
|
"strings"
|
2025-01-23 12:02:33 +01:00
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/google/cel-go/cel"
|
2025-02-03 19:12:40 +05:30
|
|
|
"github.com/kyverno/kyverno/pkg/imagedataloader"
|
2025-01-23 12:02:33 +01:00
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
|
|
|
)
|
|
|
|
|
|
|
|
type ctx struct {
|
2025-01-24 09:37:33 +01:00
|
|
|
GetConfigMapFunc func(string, string) (unstructured.Unstructured, error)
|
|
|
|
GetGlobalReferenceFunc func(string) (any, error)
|
2025-02-03 19:12:40 +05:30
|
|
|
GetImageDataFunc func(string) (*imagedataloader.ImageData, error)
|
2025-01-23 12:02:33 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
func (mock *ctx) GetConfigMap(ns string, n string) (unstructured.Unstructured, error) {
|
|
|
|
return mock.GetConfigMapFunc(ns, n)
|
|
|
|
}
|
|
|
|
|
2025-01-24 09:37:33 +01:00
|
|
|
func (mock *ctx) GetGlobalReference(n string) (any, error) {
|
|
|
|
return mock.GetGlobalReferenceFunc(n)
|
|
|
|
}
|
|
|
|
|
2025-02-03 19:12:40 +05:30
|
|
|
func (mock *ctx) GetImageData(n string) (*imagedataloader.ImageData, error) {
|
2025-01-24 09:37:33 +01:00
|
|
|
return mock.GetImageDataFunc(n)
|
|
|
|
}
|
|
|
|
|
2025-01-23 12:02:33 +01:00
|
|
|
func Test_impl_get_configmap_string_string(t *testing.T) {
|
|
|
|
opts := Lib()
|
|
|
|
base, err := cel.NewEnv(opts)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.NotNil(t, base)
|
|
|
|
options := []cel.EnvOption{
|
|
|
|
cel.Variable("context", ContextType),
|
|
|
|
}
|
|
|
|
env, err := base.Extend(options...)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.NotNil(t, env)
|
|
|
|
ast, issues := env.Compile(`context.GetConfigMap("foo","bar")`)
|
|
|
|
assert.Nil(t, issues)
|
|
|
|
assert.NotNil(t, ast)
|
|
|
|
prog, err := env.Program(ast)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.NotNil(t, prog)
|
|
|
|
called := false
|
|
|
|
data := map[string]any{
|
|
|
|
"context": Context{&ctx{
|
|
|
|
GetConfigMapFunc: func(string, string) (unstructured.Unstructured, error) {
|
|
|
|
called = true
|
|
|
|
return unstructured.Unstructured{}, nil
|
|
|
|
},
|
|
|
|
}},
|
|
|
|
}
|
|
|
|
out, _, err := prog.Eval(data)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.NotNil(t, out)
|
|
|
|
assert.True(t, called)
|
|
|
|
}
|
2025-01-24 09:37:33 +01:00
|
|
|
|
|
|
|
func Test_impl_get_globalreference_string(t *testing.T) {
|
|
|
|
opts := Lib()
|
|
|
|
base, err := cel.NewEnv(opts)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.NotNil(t, base)
|
|
|
|
options := []cel.EnvOption{
|
|
|
|
cel.Variable("context", ContextType),
|
|
|
|
}
|
|
|
|
env, err := base.Extend(options...)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.NotNil(t, env)
|
|
|
|
ast, issues := env.Compile(`context.GetGlobalReference("foo")`)
|
|
|
|
assert.Nil(t, issues)
|
|
|
|
assert.NotNil(t, ast)
|
|
|
|
prog, err := env.Program(ast)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.NotNil(t, prog)
|
|
|
|
called := false
|
|
|
|
data := map[string]any{
|
|
|
|
"context": Context{&ctx{
|
|
|
|
GetGlobalReferenceFunc: func(string) (any, error) {
|
|
|
|
type foo struct {
|
|
|
|
s string
|
|
|
|
}
|
|
|
|
called = true
|
|
|
|
return foo{"bar"}, nil
|
|
|
|
},
|
|
|
|
}},
|
|
|
|
}
|
|
|
|
out, _, err := prog.Eval(data)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.NotNil(t, out)
|
|
|
|
assert.True(t, called)
|
|
|
|
}
|
|
|
|
|
|
|
|
func Test_impl_get_imagedata_string(t *testing.T) {
|
|
|
|
opts := Lib()
|
|
|
|
base, err := cel.NewEnv(opts)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.NotNil(t, base)
|
|
|
|
options := []cel.EnvOption{
|
|
|
|
cel.Variable("context", ContextType),
|
|
|
|
}
|
|
|
|
env, err := base.Extend(options...)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.NotNil(t, env)
|
2025-02-03 19:12:40 +05:30
|
|
|
ast, issues := env.Compile(`context.GetImageData("ghcr.io/kyverno/kyverno:latest")`)
|
2025-01-24 09:37:33 +01:00
|
|
|
assert.Nil(t, issues)
|
|
|
|
assert.NotNil(t, ast)
|
|
|
|
prog, err := env.Program(ast)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.NotNil(t, prog)
|
|
|
|
data := map[string]any{
|
|
|
|
"context": Context{&ctx{
|
2025-02-03 19:12:40 +05:30
|
|
|
GetImageDataFunc: func(image string) (*imagedataloader.ImageData, error) {
|
|
|
|
idl, err := imagedataloader.New(nil)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
return idl.FetchImageData(context.TODO(), image)
|
2025-01-24 09:37:33 +01:00
|
|
|
},
|
|
|
|
}},
|
|
|
|
}
|
|
|
|
out, _, err := prog.Eval(data)
|
|
|
|
assert.NoError(t, err)
|
2025-02-03 19:12:40 +05:30
|
|
|
img := out.Value().(*imagedataloader.ImageData)
|
|
|
|
assert.Equal(t, img.Tag, "latest")
|
|
|
|
assert.True(t, strings.HasPrefix(img.ResolvedImage, "ghcr.io/kyverno/kyverno:latest@sha256:"))
|
2025-01-24 09:37:33 +01:00
|
|
|
}
|