Skip to content

Commit 9aae0ac

Browse files
authored
Merge pull request kubernetes#94864 from alculquicondor/empty-default-constraints
Tests for empty constraints array when DefaultPodTopologySpread is enabled
2 parents 0b8c2bf + e856706 commit 9aae0ac

File tree

3 files changed

+115
-3
lines changed

3 files changed

+115
-3
lines changed

pkg/scheduler/apis/config/scheme/BUILD

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,14 @@ go_test(
3434
srcs = ["scheme_test.go"],
3535
embed = [":go_default_library"],
3636
deps = [
37+
"//pkg/features:go_default_library",
3738
"//pkg/scheduler/apis/config:go_default_library",
3839
"//staging/src/k8s.io/api/core/v1:go_default_library",
3940
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
4041
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
42+
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
43+
"//staging/src/k8s.io/component-base/featuregate:go_default_library",
44+
"//staging/src/k8s.io/component-base/featuregate/testing:go_default_library",
4145
"//staging/src/k8s.io/kube-scheduler/config/v1beta1:go_default_library",
4246
"//vendor/github.com/google/go-cmp/cmp:go_default_library",
4347
"//vendor/k8s.io/utils/pointer:go_default_library",

pkg/scheduler/apis/config/scheme/scheme_test.go

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,11 @@ import (
2424
corev1 "k8s.io/api/core/v1"
2525
"k8s.io/apimachinery/pkg/runtime"
2626
"k8s.io/apimachinery/pkg/runtime/schema"
27+
"k8s.io/apiserver/pkg/util/feature"
28+
"k8s.io/component-base/featuregate"
29+
featuregatetesting "k8s.io/component-base/featuregate/testing"
2730
"k8s.io/kube-scheduler/config/v1beta1"
31+
"k8s.io/kubernetes/pkg/features"
2832
"k8s.io/kubernetes/pkg/scheduler/apis/config"
2933
"k8s.io/utils/pointer"
3034
"sigs.k8s.io/yaml"
@@ -34,6 +38,7 @@ func TestCodecsDecodePluginConfig(t *testing.T) {
3438
testCases := []struct {
3539
name string
3640
data []byte
41+
feature featuregate.Feature
3742
wantErr string
3843
wantProfiles []config.KubeSchedulerProfile
3944
}{
@@ -257,6 +262,7 @@ profiles:
257262
args:
258263
- name: VolumeBinding
259264
args:
265+
- name: PodTopologySpread
260266
`),
261267
wantProfiles: []config.KubeSchedulerProfile{
262268
{
@@ -291,6 +297,73 @@ profiles:
291297
BindTimeoutSeconds: 600,
292298
},
293299
},
300+
{
301+
Name: "PodTopologySpread",
302+
Args: &config.PodTopologySpreadArgs{},
303+
},
304+
},
305+
},
306+
},
307+
},
308+
{
309+
name: "empty PodTopologySpread, feature DefaultPodTopologySpread enabled",
310+
data: []byte(`
311+
apiVersion: kubescheduler.config.k8s.io/v1beta1
312+
kind: KubeSchedulerConfiguration
313+
profiles:
314+
- pluginConfig:
315+
- name: PodTopologySpread
316+
args:
317+
defaultConstraints:
318+
`),
319+
feature: features.DefaultPodTopologySpread,
320+
wantProfiles: []config.KubeSchedulerProfile{
321+
{
322+
SchedulerName: "default-scheduler",
323+
PluginConfig: []config.PluginConfig{
324+
{
325+
Name: "PodTopologySpread",
326+
Args: &config.PodTopologySpreadArgs{
327+
DefaultConstraints: []corev1.TopologySpreadConstraint{
328+
{
329+
MaxSkew: 3,
330+
TopologyKey: corev1.LabelHostname,
331+
WhenUnsatisfiable: corev1.ScheduleAnyway,
332+
},
333+
{
334+
MaxSkew: 5,
335+
TopologyKey: corev1.LabelZoneFailureDomainStable,
336+
WhenUnsatisfiable: corev1.ScheduleAnyway,
337+
},
338+
},
339+
},
340+
},
341+
},
342+
},
343+
},
344+
},
345+
{
346+
name: "empty array PodTopologySpread, feature DefaultPodTopologySpread enabled",
347+
data: []byte(`
348+
apiVersion: kubescheduler.config.k8s.io/v1beta1
349+
kind: KubeSchedulerConfiguration
350+
profiles:
351+
- pluginConfig:
352+
- name: PodTopologySpread
353+
args:
354+
defaultConstraints: []
355+
`),
356+
feature: features.DefaultPodTopologySpread,
357+
wantProfiles: []config.KubeSchedulerProfile{
358+
{
359+
SchedulerName: "default-scheduler",
360+
PluginConfig: []config.PluginConfig{
361+
{
362+
Name: "PodTopologySpread",
363+
Args: &config.PodTopologySpreadArgs{
364+
DefaultConstraints: []corev1.TopologySpreadConstraint{},
365+
},
366+
},
294367
},
295368
},
296369
},
@@ -299,6 +372,9 @@ profiles:
299372
decoder := Codecs.UniversalDecoder()
300373
for _, tt := range testCases {
301374
t.Run(tt.name, func(t *testing.T) {
375+
if tt.feature != "" {
376+
defer featuregatetesting.SetFeatureGateDuringTest(t, feature.DefaultFeatureGate, tt.feature, true)()
377+
}
302378
obj, gvk, err := decoder.Decode(tt.data, nil, nil)
303379
if err != nil {
304380
if tt.wantErr != err.Error() {
@@ -373,6 +449,14 @@ func TestCodecsEncodePluginConfig(t *testing.T) {
373449
},
374450
},
375451
},
452+
{
453+
Name: "PodTopologySpread",
454+
Args: runtime.RawExtension{
455+
Object: &v1beta1.PodTopologySpreadArgs{
456+
DefaultConstraints: []corev1.TopologySpreadConstraint{},
457+
},
458+
},
459+
},
376460
{
377461
Name: "OutOfTreePlugin",
378462
Args: runtime.RawExtension{
@@ -428,6 +512,11 @@ profiles:
428512
- name: mem
429513
weight: 2
430514
name: NodeResourcesLeastAllocated
515+
- args:
516+
apiVersion: kubescheduler.config.k8s.io/v1beta1
517+
defaultConstraints: []
518+
kind: PodTopologySpreadArgs
519+
name: PodTopologySpread
431520
- args:
432521
foo: bar
433522
name: OutOfTreePlugin
@@ -458,6 +547,10 @@ profiles:
458547
BindTimeoutSeconds: 300,
459548
},
460549
},
550+
{
551+
Name: "PodTopologySpread",
552+
Args: &config.PodTopologySpreadArgs{},
553+
},
461554
{
462555
Name: "OutOfTreePlugin",
463556
Args: &runtime.Unknown{
@@ -510,6 +603,11 @@ profiles:
510603
bindTimeoutSeconds: 300
511604
kind: VolumeBindingArgs
512605
name: VolumeBinding
606+
- args:
607+
apiVersion: kubescheduler.config.k8s.io/v1beta1
608+
defaultConstraints: null
609+
kind: PodTopologySpreadArgs
610+
name: PodTopologySpread
513611
- args:
514612
foo: bar
515613
name: OutOfTreePlugin

pkg/scheduler/apis/config/v1beta1/defaults_test.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import (
2525
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2626
"k8s.io/apimachinery/pkg/runtime"
2727
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
28-
utilfeature "k8s.io/apiserver/pkg/util/feature"
28+
"k8s.io/apiserver/pkg/util/feature"
2929
componentbaseconfig "k8s.io/component-base/config/v1alpha1"
3030
"k8s.io/component-base/featuregate"
3131
featuregatetesting "k8s.io/component-base/featuregate/testing"
@@ -391,7 +391,7 @@ func TestPluginArgsDefaults(t *testing.T) {
391391
},
392392
},
393393
{
394-
name: "PodTopologySpreadArgs resources empty, NewPodTopologySpread feature enabled",
394+
name: "PodTopologySpreadArgs resources empty, DefaultPodTopologySpread feature enabled",
395395
feature: features.DefaultPodTopologySpread,
396396
in: &v1beta1.PodTopologySpreadArgs{},
397397
want: &v1beta1.PodTopologySpreadArgs{
@@ -409,13 +409,23 @@ func TestPluginArgsDefaults(t *testing.T) {
409409
},
410410
},
411411
},
412+
{
413+
name: "PodTopologySpreadArgs empty array, DefaultPodTopologySpread feature enabled",
414+
feature: features.DefaultPodTopologySpread,
415+
in: &v1beta1.PodTopologySpreadArgs{
416+
DefaultConstraints: []v1.TopologySpreadConstraint{},
417+
},
418+
want: &v1beta1.PodTopologySpreadArgs{
419+
DefaultConstraints: []v1.TopologySpreadConstraint{},
420+
},
421+
},
412422
}
413423
for _, tc := range tests {
414424
scheme := runtime.NewScheme()
415425
utilruntime.Must(AddToScheme(scheme))
416426
t.Run(tc.name, func(t *testing.T) {
417427
if tc.feature != "" {
418-
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, tc.feature, true)()
428+
defer featuregatetesting.SetFeatureGateDuringTest(t, feature.DefaultFeatureGate, tc.feature, true)()
419429
}
420430
scheme.Default(tc.in)
421431
if diff := cmp.Diff(tc.in, tc.want); diff != "" {

0 commit comments

Comments
 (0)