Skip to content

Commit e856706

Browse files
Tests for empty constraints array when DefaultPodTopologySpread is enabled
An empty array in the configuration signifies that the user operator intends to disable the k8s provided default for TopologyPodSpread. Signed-off-by: Aldo Culquicondor <[email protected]> Change-Id: Ib4696a49f0ba748183aef417b0882d494b89f602
1 parent 73b4f09 commit e856706

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)