karmada/pkg/resourceinterpreter/configurableinterpreter/configmanager/manager_test.go

138 lines
4.8 KiB
Go

package configmanager
import (
"context"
"reflect"
"testing"
"time"
appsv1 "k8s.io/api/apps/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/dynamic/fake"
"k8s.io/client-go/tools/cache"
configv1alpha1 "github.com/karmada-io/karmada/pkg/apis/config/v1alpha1"
"github.com/karmada-io/karmada/pkg/util/fedinformer/genericmanager"
"github.com/karmada-io/karmada/pkg/util/gclient"
)
func Test_interpreterConfigManager_LuaScriptAccessors(t *testing.T) {
customization01 := &configv1alpha1.ResourceInterpreterCustomization{
ObjectMeta: metav1.ObjectMeta{Name: "customization01"},
Spec: configv1alpha1.ResourceInterpreterCustomizationSpec{
Target: configv1alpha1.CustomizationTarget{
APIVersion: appsv1.SchemeGroupVersion.String(),
Kind: "Deployment",
},
Customizations: configv1alpha1.CustomizationRules{
Retention: &configv1alpha1.LocalValueRetention{LuaScript: "a=0"},
ReplicaResource: &configv1alpha1.ReplicaResourceRequirement{LuaScript: "b=0"},
},
},
}
customization02 := &configv1alpha1.ResourceInterpreterCustomization{
ObjectMeta: metav1.ObjectMeta{Name: "customization02"},
Spec: configv1alpha1.ResourceInterpreterCustomizationSpec{
Target: configv1alpha1.CustomizationTarget{
APIVersion: appsv1.SchemeGroupVersion.String(),
Kind: "Deployment",
},
Customizations: configv1alpha1.CustomizationRules{
ReplicaRevision: &configv1alpha1.ReplicaRevision{LuaScript: "c=0"},
StatusReflection: &configv1alpha1.StatusReflection{LuaScript: "d=0"},
},
},
}
customization03 := &configv1alpha1.ResourceInterpreterCustomization{
ObjectMeta: metav1.ObjectMeta{Name: "customization03"},
Spec: configv1alpha1.ResourceInterpreterCustomizationSpec{
Target: configv1alpha1.CustomizationTarget{
APIVersion: appsv1.SchemeGroupVersion.String(),
Kind: "Deployment",
},
Customizations: configv1alpha1.CustomizationRules{
ReplicaResource: &configv1alpha1.ReplicaResourceRequirement{LuaScript: "b=1"},
ReplicaRevision: &configv1alpha1.ReplicaRevision{LuaScript: "c=1"},
},
},
}
deploymentGVK := schema.GroupVersionKind{Group: "apps", Version: "v1", Kind: "Deployment"}
type args struct {
customizations []runtime.Object
}
tests := []struct {
name string
args args
want map[schema.GroupVersionKind]CustomAccessor
}{
{
name: "single ResourceInterpreterCustomization",
args: args{[]runtime.Object{customization01}},
want: map[schema.GroupVersionKind]CustomAccessor{
deploymentGVK: &resourceCustomAccessor{
retention: &configv1alpha1.LocalValueRetention{LuaScript: "a=0"},
replicaResource: &configv1alpha1.ReplicaResourceRequirement{LuaScript: "b=0"},
},
},
},
{
name: "multi ResourceInterpreterCustomization with no redundant operation",
args: args{[]runtime.Object{customization01, customization02}},
want: map[schema.GroupVersionKind]CustomAccessor{
deploymentGVK: &resourceCustomAccessor{
retention: &configv1alpha1.LocalValueRetention{LuaScript: "a=0"},
replicaResource: &configv1alpha1.ReplicaResourceRequirement{LuaScript: "b=0"},
replicaRevision: &configv1alpha1.ReplicaRevision{LuaScript: "c=0"},
statusReflection: &configv1alpha1.StatusReflection{LuaScript: "d=0"},
},
},
},
{
name: "multi ResourceInterpreterCustomization with redundant operation",
args: args{[]runtime.Object{customization03, customization02, customization01}},
want: map[schema.GroupVersionKind]CustomAccessor{
deploymentGVK: &resourceCustomAccessor{
retention: &configv1alpha1.LocalValueRetention{LuaScript: "a=0"},
replicaResource: &configv1alpha1.ReplicaResourceRequirement{LuaScript: "b=0"},
replicaRevision: &configv1alpha1.ReplicaRevision{LuaScript: "c=0"},
statusReflection: &configv1alpha1.StatusReflection{LuaScript: "d=0"},
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ctx, cancel := context.WithTimeout(context.TODO(), time.Second*5)
defer cancel()
stopCh := ctx.Done()
client := fake.NewSimpleDynamicClient(gclient.NewSchema(), tt.args.customizations...)
informer := genericmanager.NewSingleClusterInformerManager(client, 0, stopCh)
configManager := NewInterpreterConfigManager(informer)
informer.Start()
defer informer.Stop()
informer.WaitForCacheSync()
if !cache.WaitForCacheSync(stopCh, configManager.HasSynced) {
t.Errorf("informer has not been synced")
}
gotAccessors := configManager.CustomAccessors()
for gvk, gotAccessor := range gotAccessors {
wantAccessor, ok := tt.want[gvk]
if !ok {
t.Errorf("Can not find the target gvk %v", gvk)
}
if !reflect.DeepEqual(gotAccessor, wantAccessor) {
t.Errorf("LuaScriptAccessors() = %v, want %v", gotAccessor, wantAccessor)
}
}
})
}
}