2022-09-08 14:07:18 +02:00
|
|
|
package utils
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/go-logr/logr"
|
|
|
|
kyvernov1beta1 "github.com/kyverno/kyverno/api/kyverno/v1beta1"
|
2023-02-10 21:26:51 +08:00
|
|
|
"github.com/kyverno/kyverno/pkg/background/generate"
|
2022-09-08 14:07:18 +02:00
|
|
|
"github.com/kyverno/kyverno/pkg/client/clientset/versioned"
|
|
|
|
"github.com/kyverno/kyverno/pkg/client/clientset/versioned/fake"
|
|
|
|
kyvernoinformers "github.com/kyverno/kyverno/pkg/client/informers/externalversions"
|
|
|
|
kyvernov1beta1listers "github.com/kyverno/kyverno/pkg/client/listers/kyverno/v1beta1"
|
|
|
|
"github.com/kyverno/kyverno/pkg/config"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestNewUpdateRequestUpdater(t *testing.T) {
|
|
|
|
type args struct {
|
|
|
|
client versioned.Interface
|
|
|
|
lister kyvernov1beta1listers.UpdateRequestNamespaceLister
|
|
|
|
}
|
|
|
|
tests := []struct {
|
|
|
|
name string
|
|
|
|
args args
|
|
|
|
want UpdateRequestUpdater
|
|
|
|
}{{
|
|
|
|
name: "nil",
|
|
|
|
args: args{nil, nil},
|
|
|
|
want: &updateRequestUpdater{nil, nil},
|
|
|
|
}}
|
|
|
|
for _, tt := range tests {
|
|
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
|
|
got := NewUpdateRequestUpdater(tt.args.client, tt.args.lister)
|
|
|
|
assert.Equal(t, tt.want, got)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func Test_updateRequestUpdater_updateAnnotation(t *testing.T) {
|
|
|
|
type data struct {
|
|
|
|
objects []runtime.Object
|
|
|
|
}
|
|
|
|
tests := []struct {
|
|
|
|
name string
|
|
|
|
data data
|
|
|
|
urName string
|
|
|
|
updated bool
|
|
|
|
}{{
|
|
|
|
name: "success",
|
|
|
|
data: data{
|
|
|
|
[]runtime.Object{
|
|
|
|
&kyvernov1beta1.UpdateRequest{
|
|
|
|
ObjectMeta: v1.ObjectMeta{
|
|
|
|
Name: "test",
|
|
|
|
Namespace: config.KyvernoNamespace(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
urName: "test",
|
|
|
|
updated: true,
|
|
|
|
}, {
|
|
|
|
name: "not found",
|
|
|
|
data: data{
|
|
|
|
[]runtime.Object{
|
|
|
|
&kyvernov1beta1.UpdateRequest{
|
|
|
|
ObjectMeta: v1.ObjectMeta{
|
|
|
|
Name: "dummy",
|
|
|
|
Namespace: config.KyvernoNamespace(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
urName: "dummy",
|
|
|
|
updated: false,
|
|
|
|
}}
|
|
|
|
for _, tt := range tests {
|
|
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
|
|
done := ctx.Done()
|
|
|
|
t.Cleanup(cancel)
|
|
|
|
client := fake.NewSimpleClientset(tt.data.objects...)
|
|
|
|
kyvernoInformers := kyvernoinformers.NewSharedInformerFactory(client, 0)
|
|
|
|
lister := kyvernoInformers.Kyverno().V1beta1().UpdateRequests().Lister().UpdateRequests(config.KyvernoNamespace())
|
|
|
|
kyvernoInformers.Start(done)
|
|
|
|
kyvernoInformers.WaitForCacheSync(done)
|
|
|
|
h := &updateRequestUpdater{
|
|
|
|
client: client,
|
|
|
|
lister: lister,
|
|
|
|
}
|
|
|
|
h.updateAnnotation(logr.Discard(), "test")
|
|
|
|
ur, err := client.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).Get(ctx, tt.urName, v1.GetOptions{})
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.NotNil(t, ur)
|
|
|
|
if tt.updated {
|
|
|
|
annotations := ur.GetAnnotations()
|
|
|
|
assert.NotNil(t, annotations)
|
2023-02-10 21:26:51 +08:00
|
|
|
assert.NotNil(t, annotations[generate.AnnotationUpdateTime])
|
2022-09-08 14:07:18 +02:00
|
|
|
} else {
|
|
|
|
annotations := ur.GetAnnotations()
|
|
|
|
assert.Nil(t, annotations)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
2022-09-08 15:59:51 +02:00
|
|
|
|
|
|
|
func Test_updateRequestUpdater_setPendingStatus(t *testing.T) {
|
|
|
|
type data struct {
|
|
|
|
objects []runtime.Object
|
|
|
|
}
|
|
|
|
tests := []struct {
|
|
|
|
name string
|
|
|
|
data data
|
|
|
|
urName string
|
|
|
|
updated bool
|
|
|
|
}{{
|
|
|
|
name: "success",
|
|
|
|
data: data{
|
|
|
|
[]runtime.Object{
|
|
|
|
&kyvernov1beta1.UpdateRequest{
|
|
|
|
ObjectMeta: v1.ObjectMeta{
|
|
|
|
Name: "test",
|
|
|
|
Namespace: config.KyvernoNamespace(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
urName: "test",
|
|
|
|
updated: true,
|
|
|
|
}, {
|
|
|
|
name: "not found",
|
|
|
|
data: data{
|
|
|
|
[]runtime.Object{
|
|
|
|
&kyvernov1beta1.UpdateRequest{
|
|
|
|
ObjectMeta: v1.ObjectMeta{
|
|
|
|
Name: "dummy",
|
|
|
|
Namespace: config.KyvernoNamespace(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
urName: "dummy",
|
|
|
|
updated: false,
|
|
|
|
}}
|
|
|
|
for _, tt := range tests {
|
|
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
|
|
done := ctx.Done()
|
|
|
|
t.Cleanup(cancel)
|
|
|
|
client := fake.NewSimpleClientset(tt.data.objects...)
|
|
|
|
kyvernoInformers := kyvernoinformers.NewSharedInformerFactory(client, 0)
|
|
|
|
lister := kyvernoInformers.Kyverno().V1beta1().UpdateRequests().Lister().UpdateRequests(config.KyvernoNamespace())
|
|
|
|
kyvernoInformers.Start(done)
|
|
|
|
kyvernoInformers.WaitForCacheSync(done)
|
|
|
|
h := &updateRequestUpdater{
|
|
|
|
client: client,
|
|
|
|
lister: lister,
|
|
|
|
}
|
|
|
|
h.setPendingStatus(logr.Discard(), "test")
|
|
|
|
ur, err := client.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).Get(ctx, tt.urName, v1.GetOptions{})
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.NotNil(t, ur)
|
|
|
|
if tt.updated {
|
|
|
|
assert.Equal(t, kyvernov1beta1.Pending, ur.Status.State)
|
|
|
|
} else {
|
|
|
|
assert.NotEqual(t, kyvernov1beta1.Pending, ur.Status.State)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|