1
0
Fork 0
mirror of https://github.com/kyverno/kyverno.git synced 2025-03-27 18:13:17 +00:00
kyverno/pkg/cel/libs/resource/impl_test.go
Charles-Edouard Brétéché c0d7332d14
feat: simplify resource cel lib (#12427)
Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>
2025-03-18 08:58:59 +00:00

143 lines
4 KiB
Go

package resource
import (
"context"
"encoding/json"
"strings"
"testing"
"github.com/google/cel-go/cel"
"github.com/kyverno/kyverno/pkg/imageverification/imagedataloader"
"github.com/stretchr/testify/assert"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
)
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("resource", ContextType),
}
env, err := base.Extend(options...)
assert.NoError(t, err)
assert.NotNil(t, env)
ast, issues := env.Compile(`resource.GetImageData("ghcr.io/kyverno/kyverno:latest").resolvedImage`)
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{
"resource": Context{&MockCtx{
GetImageDataFunc: func(image string) (map[string]interface{}, error) {
idl, err := imagedataloader.New(nil)
assert.NoError(t, err)
data, err := idl.FetchImageData(context.TODO(), image)
if err != nil {
return nil, err
}
raw, err := json.Marshal(data.Data())
if err != nil {
return nil, err
}
apiData := map[string]interface{}{}
err = json.Unmarshal(raw, &apiData)
if err != nil {
return nil, err
}
return apiData, nil
},
},
}}
out, _, err := prog.Eval(data)
assert.NoError(t, err)
resolvedImg := out.Value().(string)
assert.True(t, strings.HasPrefix(resolvedImg, "ghcr.io/kyverno/kyverno:latest@sha256:"))
}
func Test_impl_get_resource_string_string_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("resource", ContextType),
}
env, err := base.Extend(options...)
assert.NoError(t, err)
assert.NotNil(t, env)
ast, issues := env.Compile(`resource.Get("apps/v1", "deployments", "default", "nginx")`)
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{
"resource": Context{&MockCtx{
GetResourceFunc: func(apiVersion, resource, namespace, name string) (*unstructured.Unstructured, error) {
return &unstructured.Unstructured{
Object: map[string]any{
"apiVersion": "apps/v1",
"kind": "Deployment",
"metadata": map[string]any{
"name": name,
"namespace": namespace,
},
},
}, nil
},
},
},
}
out, _, err := prog.Eval(data)
assert.NoError(t, err)
object := out.Value().(map[string]any)
assert.Equal(t, object["apiVersion"].(string), "apps/v1")
assert.Equal(t, object["kind"].(string), "Deployment")
}
func Test_impl_list_resources_string_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("resource", ContextType),
}
env, err := base.Extend(options...)
assert.NoError(t, err)
assert.NotNil(t, env)
ast, issues := env.Compile(`resource.List("apps/v1", "deployments", "default")`)
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{
"resource": Context{&MockCtx{
ListResourcesFunc: func(apiVersion, resource, namespace string) (*unstructured.UnstructuredList, error) {
return &unstructured.UnstructuredList{
Items: []unstructured.Unstructured{
{
Object: map[string]any{
"apiVersion": "apps/v1",
"kind": "Deployment",
"metadata": map[string]any{
"name": "nginx",
"namespace": namespace,
},
},
},
},
}, nil
},
},
}}
out, _, err := prog.Eval(data)
assert.NoError(t, err)
object := out.Value().(map[string]any)
assert.Equal(t, object["items"].([]any)[0].(map[string]any)["apiVersion"].(string), "apps/v1")
assert.Equal(t, object["items"].([]any)[0].(map[string]any)["kind"].(string), "Deployment")
}