1
0
Fork 0
mirror of https://github.com/kyverno/kyverno.git synced 2025-03-26 01:24:26 +00:00
kyverno/pkg/cel/policy/fake_context.go
Charles-Edouard Brétéché 9f70209361
feat: mock list resources in context (#12380)
Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>
2025-03-11 17:21:30 +00:00

95 lines
2.9 KiB
Go

package policy
import (
"fmt"
"github.com/kyverno/kyverno/pkg/imageverification/imagedataloader"
kerrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
)
type FakeContextProvider struct {
resources map[string]map[string]map[string]*unstructured.Unstructured
}
func NewFakeContextProvider() *FakeContextProvider {
return &FakeContextProvider{
resources: map[string]map[string]map[string]*unstructured.Unstructured{},
}
}
func (cp *FakeContextProvider) AddResource(gvr schema.GroupVersionResource, obj runtime.Object) error {
object, err := runtime.DefaultUnstructuredConverter.ToUnstructured(obj)
if err != nil {
return err
}
resource := &unstructured.Unstructured{Object: object}
resources := cp.resources[gvr.String()]
if resources == nil {
resources = map[string]map[string]*unstructured.Unstructured{}
cp.resources[gvr.String()] = resources
}
namespace := resources[resource.GetNamespace()]
if namespace == nil {
namespace = map[string]*unstructured.Unstructured{}
resources[resource.GetNamespace()] = namespace
}
namespace[resource.GetName()] = resource
return nil
}
func (cp *FakeContextProvider) GetConfigMap(ns, n string) (*unstructured.Unstructured, error) {
return cp.GetResource("v1", "configmaps", ns, n)
}
func (cp *FakeContextProvider) GetGlobalReference(string, string) (any, error) {
panic("not implemented")
}
func (cp *FakeContextProvider) GetImageData(string) (*imagedataloader.ImageData, error) {
panic("not implemented")
}
func (cp *FakeContextProvider) ParseImageReference(image string) (imagedataloader.ImageReference, error) {
return imagedataloader.ParseImageReference(image)
}
func (cp *FakeContextProvider) ListResources(apiVersion, resource, namespace string) (*unstructured.UnstructuredList, error) {
gv, err := schema.ParseGroupVersion(apiVersion)
if err != nil {
return nil, err
}
gvr := gv.WithResource(resource)
resources := cp.resources[gvr.String()]
if resources == nil {
return nil, kerrors.NewBadRequest(fmt.Sprintf("%s resource not found", gvr.GroupResource()))
}
var out unstructured.UnstructuredList
for _, obj := range resources[namespace] {
out.Items = append(out.Items, *obj)
}
return &out, nil
}
func (cp *FakeContextProvider) GetResource(apiVersion, resource, namespace, name string) (*unstructured.Unstructured, error) {
gv, err := schema.ParseGroupVersion(apiVersion)
if err != nil {
return nil, err
}
gvr := gv.WithResource(resource)
resources := cp.resources[gvr.String()]
if resources == nil {
return nil, kerrors.NewNotFound(gvr.GroupResource(), name)
}
namespaced := resources[namespace]
if namespaced == nil {
return nil, kerrors.NewNotFound(gvr.GroupResource(), name)
}
resourced := namespaced[name]
if resourced == nil {
return nil, kerrors.NewNotFound(gvr.GroupResource(), name)
}
return resourced, nil
}