278 lines
6.4 KiB
Go
278 lines
6.4 KiB
Go
package validation
|
|
|
|
import (
|
|
"testing"
|
|
|
|
corev1 "k8s.io/api/core/v1"
|
|
|
|
policyv1alpha1 "github.com/karmada-io/karmada/pkg/apis/policy/v1alpha1"
|
|
"github.com/karmada-io/karmada/pkg/util"
|
|
)
|
|
|
|
func TestValidateOverrideSpec(t *testing.T) {
|
|
var tests = []struct {
|
|
name string
|
|
overrideSpec policyv1alpha1.OverrideSpec
|
|
expectError bool
|
|
}{
|
|
{
|
|
name: "overrideRules is set, overriders and targetCluster aren't set",
|
|
overrideSpec: policyv1alpha1.OverrideSpec{
|
|
OverrideRules: []policyv1alpha1.RuleWithCluster{
|
|
{
|
|
TargetCluster: &policyv1alpha1.ClusterAffinity{
|
|
ClusterNames: []string{"cluster-name"},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
expectError: false,
|
|
},
|
|
{
|
|
name: "overriders and targetCluster are set, overrideRules isn't set",
|
|
overrideSpec: policyv1alpha1.OverrideSpec{
|
|
TargetCluster: &policyv1alpha1.ClusterAffinity{
|
|
ClusterNames: []string{"cluster-name"},
|
|
},
|
|
Overriders: policyv1alpha1.Overriders{
|
|
Plaintext: []policyv1alpha1.PlaintextOverrider{
|
|
{
|
|
Path: "spec/image",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
expectError: false,
|
|
},
|
|
{
|
|
name: "overrideRules and targetCluster can't co-exist",
|
|
overrideSpec: policyv1alpha1.OverrideSpec{
|
|
OverrideRules: []policyv1alpha1.RuleWithCluster{
|
|
{
|
|
TargetCluster: &policyv1alpha1.ClusterAffinity{
|
|
ClusterNames: []string{"cluster-name"},
|
|
},
|
|
},
|
|
},
|
|
TargetCluster: &policyv1alpha1.ClusterAffinity{
|
|
ClusterNames: []string{"cluster-name"},
|
|
},
|
|
},
|
|
expectError: true,
|
|
},
|
|
{
|
|
name: "overrideRules and overriders can't co-exist",
|
|
overrideSpec: policyv1alpha1.OverrideSpec{
|
|
OverrideRules: []policyv1alpha1.RuleWithCluster{
|
|
{
|
|
TargetCluster: &policyv1alpha1.ClusterAffinity{
|
|
ClusterNames: []string{"cluster-name"},
|
|
},
|
|
},
|
|
},
|
|
Overriders: policyv1alpha1.Overriders{
|
|
Plaintext: []policyv1alpha1.PlaintextOverrider{
|
|
{
|
|
Path: "spec/image",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
expectError: true,
|
|
},
|
|
{
|
|
name: "overrideRules, targetCluster and overriders can't co-exist",
|
|
overrideSpec: policyv1alpha1.OverrideSpec{
|
|
OverrideRules: []policyv1alpha1.RuleWithCluster{
|
|
{
|
|
TargetCluster: &policyv1alpha1.ClusterAffinity{
|
|
ClusterNames: []string{"cluster-name"},
|
|
},
|
|
},
|
|
},
|
|
TargetCluster: &policyv1alpha1.ClusterAffinity{
|
|
ClusterNames: []string{"cluster-name"},
|
|
},
|
|
Overriders: policyv1alpha1.Overriders{
|
|
Plaintext: []policyv1alpha1.PlaintextOverrider{
|
|
{
|
|
Path: "spec/image",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
expectError: true,
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
tc := test
|
|
err := ValidateOverrideSpec(&tc.overrideSpec)
|
|
if err != nil && tc.expectError != true {
|
|
t.Fatalf("expect no error but got: %v", err)
|
|
}
|
|
if err == nil && tc.expectError == true {
|
|
t.Fatalf("expect an error but got none")
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestValidatePolicyFieldSelector(t *testing.T) {
|
|
fakeProvider := []string{"fooCloud"}
|
|
fakeRegion := []string{"fooRegion"}
|
|
fakeZone := []string{"fooZone"}
|
|
|
|
tests := []struct {
|
|
name string
|
|
filedSelector *policyv1alpha1.FieldSelector
|
|
expectError bool
|
|
}{
|
|
{
|
|
name: "supported key",
|
|
filedSelector: &policyv1alpha1.FieldSelector{
|
|
MatchExpressions: []corev1.NodeSelectorRequirement{
|
|
{
|
|
Key: util.ProviderField,
|
|
Operator: corev1.NodeSelectorOpIn,
|
|
Values: fakeProvider,
|
|
},
|
|
{
|
|
Key: util.RegionField,
|
|
Operator: corev1.NodeSelectorOpNotIn,
|
|
Values: fakeRegion,
|
|
},
|
|
{
|
|
Key: util.ZoneField,
|
|
Operator: corev1.NodeSelectorOpNotIn,
|
|
Values: fakeZone,
|
|
},
|
|
},
|
|
},
|
|
expectError: false,
|
|
},
|
|
{
|
|
name: "unsupported key",
|
|
filedSelector: &policyv1alpha1.FieldSelector{
|
|
MatchExpressions: []corev1.NodeSelectorRequirement{
|
|
{
|
|
Key: "foo",
|
|
Operator: corev1.NodeSelectorOpIn,
|
|
Values: fakeProvider,
|
|
},
|
|
{
|
|
Key: util.RegionField,
|
|
Operator: corev1.NodeSelectorOpNotIn,
|
|
Values: fakeRegion,
|
|
},
|
|
},
|
|
},
|
|
expectError: true,
|
|
},
|
|
{
|
|
name: "supported operator",
|
|
filedSelector: &policyv1alpha1.FieldSelector{
|
|
MatchExpressions: []corev1.NodeSelectorRequirement{
|
|
{
|
|
Key: util.ProviderField,
|
|
Operator: corev1.NodeSelectorOpIn,
|
|
Values: fakeProvider,
|
|
},
|
|
{
|
|
Key: util.RegionField,
|
|
Operator: corev1.NodeSelectorOpNotIn,
|
|
Values: fakeRegion,
|
|
},
|
|
},
|
|
},
|
|
expectError: false,
|
|
},
|
|
{
|
|
name: "unsupported operator",
|
|
filedSelector: &policyv1alpha1.FieldSelector{
|
|
MatchExpressions: []corev1.NodeSelectorRequirement{
|
|
{
|
|
Key: util.ProviderField,
|
|
Operator: corev1.NodeSelectorOpExists,
|
|
Values: fakeProvider,
|
|
},
|
|
{
|
|
Key: util.RegionField,
|
|
Operator: corev1.NodeSelectorOpNotIn,
|
|
Values: fakeRegion,
|
|
},
|
|
},
|
|
},
|
|
expectError: true,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
err := ValidatePolicyFieldSelector(tt.filedSelector)
|
|
if err != nil && tt.expectError != true {
|
|
t.Fatalf("expect no error but got: %v", err)
|
|
}
|
|
if err == nil && tt.expectError == true {
|
|
t.Fatalf("expect an error but got none")
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestEmptyOverrides(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
overriders policyv1alpha1.Overriders
|
|
want bool
|
|
}{
|
|
{
|
|
name: "empty overrides",
|
|
overriders: policyv1alpha1.Overriders{},
|
|
want: true,
|
|
},
|
|
{
|
|
name: "non-empty overrides",
|
|
overriders: policyv1alpha1.Overriders{
|
|
Plaintext: []policyv1alpha1.PlaintextOverrider{
|
|
{
|
|
Path: "spec/image",
|
|
},
|
|
},
|
|
},
|
|
want: false,
|
|
},
|
|
{
|
|
name: "non-empty overrides",
|
|
overriders: policyv1alpha1.Overriders{
|
|
Plaintext: []policyv1alpha1.PlaintextOverrider{
|
|
{
|
|
Path: "spec/image",
|
|
},
|
|
},
|
|
ImageOverrider: []policyv1alpha1.ImageOverrider{
|
|
{
|
|
Component: "Registry",
|
|
Operator: "remove",
|
|
Value: "fictional.registry.us",
|
|
},
|
|
},
|
|
CommandOverrider: []policyv1alpha1.CommandArgsOverrider{
|
|
{
|
|
ContainerName: "nginx",
|
|
Operator: "add",
|
|
Value: []string{"echo 'hello karmada'"},
|
|
},
|
|
},
|
|
},
|
|
want: false,
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
if got := EmptyOverrides(tt.overriders); got != tt.want {
|
|
t.Errorf("EmptyOverrides() = %v, want %v", got, tt.want)
|
|
}
|
|
})
|
|
}
|
|
}
|