1
0
Fork 0
mirror of https://github.com/kyverno/kyverno.git synced 2025-03-06 16:06:56 +00:00
kyverno/pkg/engine/context/resolvers/resolvers_test.go
Charles-Edouard Brétéché 9dd618c13b
chore: move cache enabled label (#7949)
Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>
2023-08-01 16:28:38 +00:00

192 lines
5.8 KiB
Go

package resolvers
import (
"context"
"reflect"
"testing"
"time"
"github.com/kyverno/kyverno/api/kyverno"
"github.com/kyverno/kyverno/pkg/engine/api"
"gotest.tools/assert"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
kubeinformers "k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes"
kubefake "k8s.io/client-go/kubernetes/fake"
corev1listers "k8s.io/client-go/listers/core/v1"
)
const (
namespace = "default"
name = "myconfigmap"
)
func newEmptyFakeClient() *kubefake.Clientset {
return kubefake.NewSimpleClientset()
}
func createConfigMaps(ctx context.Context, client *kubefake.Clientset, addLabel bool) error {
cm := &corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Name: name,
Namespace: namespace,
},
Data: map[string]string{"configmapkey": "key1"},
}
if addLabel {
cm.ObjectMeta.Labels = map[string]string{kyverno.LabelCacheEnabled: "true"}
}
_, err := client.CoreV1().ConfigMaps(namespace).Create(
ctx, cm, metav1.CreateOptions{})
return err
}
func initialiseInformer(client *kubefake.Clientset) kubeinformers.SharedInformerFactory {
selector, err := GetCacheSelector()
if err != nil {
return nil
}
labelOptions := kubeinformers.WithTweakListOptions(func(opts *metav1.ListOptions) {
opts.LabelSelector = selector.String()
})
kubeResourceInformer := kubeinformers.NewSharedInformerFactoryWithOptions(client, 15*time.Minute, labelOptions)
return kubeResourceInformer
}
func Test_InformerCacheSuccess(t *testing.T) {
client := newEmptyFakeClient()
ctx := context.TODO()
err := createConfigMaps(ctx, client, true)
assert.NilError(t, err, "error while creating configmap")
informer := initialiseInformer(client)
informerResolver, err := NewInformerBasedResolver(informer.Core().V1().ConfigMaps().Lister())
assert.NilError(t, err)
informer.Start(make(<-chan struct{}))
time.Sleep(10 * time.Second)
_, err = informerResolver.Get(ctx, namespace, name)
assert.NilError(t, err, "informer didn't have expected configmap")
}
func Test_InformerCacheFailure(t *testing.T) {
client := newEmptyFakeClient()
ctx := context.TODO()
err := createConfigMaps(ctx, client, false)
assert.NilError(t, err, "error while creating configmap")
informer := initialiseInformer(client)
resolver, err := NewInformerBasedResolver(informer.Core().V1().ConfigMaps().Lister())
assert.NilError(t, err)
informer.Start(make(<-chan struct{}))
time.Sleep(10 * time.Second)
_, err = resolver.Get(ctx, namespace, name)
assert.Equal(t, err.Error(), "configmap \"myconfigmap\" not found")
}
func Test_ClientBasedResolver(t *testing.T) {
client := newEmptyFakeClient()
ctx := context.TODO()
err := createConfigMaps(ctx, client, false)
assert.NilError(t, err, "error while creating configmap")
resolver, err := NewClientBasedResolver(client)
assert.NilError(t, err)
_, err = resolver.Get(ctx, namespace, name)
assert.NilError(t, err, "error while getting configmap from client")
}
func Test_ResolverChainWithExistingConfigMap(t *testing.T) {
client := newEmptyFakeClient()
informer := initialiseInformer(client)
lister := informer.Core().V1().ConfigMaps().Lister()
informerBasedResolver, err := NewInformerBasedResolver(lister)
assert.NilError(t, err)
clientBasedResolver, err := NewClientBasedResolver(client)
assert.NilError(t, err)
resolvers, err := api.NewNamespacedResourceResolver(informerBasedResolver, clientBasedResolver)
assert.NilError(t, err)
ctx := context.TODO()
err = createConfigMaps(ctx, client, true)
assert.NilError(t, err, "error while creating configmap")
_, err = resolvers.Get(ctx, namespace, name)
assert.NilError(t, err, "error while getting configmap")
}
func Test_ResolverChainWithNonExistingConfigMap(t *testing.T) {
client := newEmptyFakeClient()
informer := initialiseInformer(client)
lister := informer.Core().V1().ConfigMaps().Lister()
informerBasedResolver, err := NewInformerBasedResolver(lister)
assert.NilError(t, err)
clientBasedResolver, err := NewClientBasedResolver(client)
assert.NilError(t, err)
resolvers, err := api.NewNamespacedResourceResolver(informerBasedResolver, clientBasedResolver)
assert.NilError(t, err)
ctx := context.TODO()
_, err = resolvers.Get(ctx, namespace, name)
assert.Error(t, err, "configmaps \"myconfigmap\" not found")
}
func TestNewInformerBasedResolver(t *testing.T) {
type args struct {
lister corev1listers.ConfigMapLister
}
client := newEmptyFakeClient()
informer := initialiseInformer(client)
lister := informer.Core().V1().ConfigMaps().Lister()
tests := []struct {
name string
args args
want api.ConfigmapResolver
wantErr bool
}{{
name: "nil shoud return an error",
wantErr: true,
}, {
name: "not nil",
args: args{lister},
want: &informerBasedResolver{lister},
}}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := NewInformerBasedResolver(tt.args.lister)
if (err != nil) != tt.wantErr {
t.Errorf("NewInformerBasedResolver() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("NewInformerBasedResolver() = %v, want %v", got, tt.want)
}
})
}
}
func TestNewClientBasedResolver(t *testing.T) {
type args struct {
client kubernetes.Interface
}
client := newEmptyFakeClient()
tests := []struct {
name string
args args
want api.ConfigmapResolver
wantErr bool
}{{
name: "nil shoud return an error",
wantErr: true,
}, {
name: "not nil",
args: args{client},
want: &clientBasedResolver{client},
}}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := NewClientBasedResolver(tt.args.client)
if (err != nil) != tt.wantErr {
t.Errorf("NewClientBasedResolver() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("NewClientBasedResolver() = %v, want %v", got, tt.want)
}
})
}
}