diff --git a/pkg/api/validation/validation_test.go b/pkg/api/validation/validation_test.go index 72fa9bf7de1..ec46b1565a1 100644 --- a/pkg/api/validation/validation_test.go +++ b/pkg/api/validation/validation_test.go @@ -26,6 +26,7 @@ import ( "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/validation/field" + utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/helper" "k8s.io/kubernetes/pkg/api/service" @@ -4316,6 +4317,124 @@ func TestValidatePod(t *testing.T) { } } +func TestValidatePodWithDisabledAffinityInAnnotations(t *testing.T) { + validPodSpec := func(affinity *api.Affinity) api.PodSpec { + spec := api.PodSpec{ + Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent", TerminationMessagePolicy: "File"}}, + RestartPolicy: api.RestartPolicyAlways, + DNSPolicy: api.DNSClusterFirst, + } + if affinity != nil { + spec.Affinity = affinity + } + return spec + } + + utilfeature.DefaultFeatureGate.Set("AffinityInAnnotations=False") + errorCases := []api.Pod{ + { + ObjectMeta: metav1.ObjectMeta{Name: "123", Namespace: "ns"}, + Spec: validPodSpec(&api.Affinity{ + PodAffinity: &api.PodAffinity{ + RequiredDuringSchedulingIgnoredDuringExecution: []api.PodAffinityTerm{ + { + LabelSelector: &metav1.LabelSelector{ + MatchExpressions: []metav1.LabelSelectorRequirement{ + { + Key: "key2", + Operator: metav1.LabelSelectorOpIn, + Values: []string{"value1", "value2"}, + }, + }, + }, + TopologyKey: "", + Namespaces: []string{"ns"}, + }, + }, + }, + }), + }, + { + ObjectMeta: metav1.ObjectMeta{Name: "123", Namespace: "ns"}, + Spec: validPodSpec(&api.Affinity{ + PodAffinity: &api.PodAffinity{ + PreferredDuringSchedulingIgnoredDuringExecution: []api.WeightedPodAffinityTerm{ + { + Weight: 10, + PodAffinityTerm: api.PodAffinityTerm{ + LabelSelector: &metav1.LabelSelector{ + MatchExpressions: []metav1.LabelSelectorRequirement{ + { + Key: "key2", + Operator: metav1.LabelSelectorOpNotIn, + Values: []string{"value1", "value2"}, + }, + }, + }, + Namespaces: []string{"ns"}, + TopologyKey: "", + }, + }, + }, + }, + }), + }, + { + ObjectMeta: metav1.ObjectMeta{Name: "123", Namespace: "ns"}, + Spec: validPodSpec(&api.Affinity{ + PodAntiAffinity: &api.PodAntiAffinity{ + RequiredDuringSchedulingIgnoredDuringExecution: []api.PodAffinityTerm{ + { + LabelSelector: &metav1.LabelSelector{ + MatchExpressions: []metav1.LabelSelectorRequirement{ + { + Key: "key2", + Operator: metav1.LabelSelectorOpIn, + Values: []string{"value1", "value2"}, + }, + }, + }, + TopologyKey: "", + Namespaces: []string{"ns"}, + }, + }, + }, + }), + }, + { + ObjectMeta: metav1.ObjectMeta{Name: "123", Namespace: "ns"}, + Spec: validPodSpec(&api.Affinity{ + PodAntiAffinity: &api.PodAntiAffinity{ + PreferredDuringSchedulingIgnoredDuringExecution: []api.WeightedPodAffinityTerm{ + { + Weight: 10, + PodAffinityTerm: api.PodAffinityTerm{ + LabelSelector: &metav1.LabelSelector{ + MatchExpressions: []metav1.LabelSelectorRequirement{ + { + Key: "key2", + Operator: metav1.LabelSelectorOpNotIn, + Values: []string{"value1", "value2"}, + }, + }, + }, + Namespaces: []string{"ns"}, + TopologyKey: "", + }, + }, + }, + }, + }), + }, + } + + for _, v := range errorCases { + if errs := ValidatePod(&v); len(errs) == 0 { + t.Errorf("expected failure for %v", errs) + } + } +} + func TestValidatePodUpdate(t *testing.T) { var ( activeDeadlineSecondsZero = int64(0)