@@ -20,7 +20,11 @@ import (
20
20
"testing"
21
21
22
22
"github.com/google/go-cmp/cmp"
23
+ "k8s.io/component-base/featuregate"
23
24
25
+ utilfeature "k8s.io/apiserver/pkg/util/feature"
26
+ featuregatetesting "k8s.io/component-base/featuregate/testing"
27
+ "k8s.io/kubernetes/pkg/features"
24
28
schedulerapi "k8s.io/kubernetes/pkg/scheduler/apis/config"
25
29
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultbinder"
26
30
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultpodtopologyspread"
@@ -79,8 +83,8 @@ func TestClusterAutoscalerProvider(t *testing.T) {
79
83
Enabled : []schedulerapi.Plugin {
80
84
{Name : interpodaffinity .Name },
81
85
{Name : podtopologyspread .Name },
82
- {Name : defaultpodtopologyspread .Name },
83
86
{Name : tainttoleration .Name },
87
+ {Name : defaultpodtopologyspread .Name },
84
88
},
85
89
},
86
90
Score : & schedulerapi.PluginSet {
@@ -92,8 +96,8 @@ func TestClusterAutoscalerProvider(t *testing.T) {
92
96
{Name : nodeaffinity .Name , Weight : 1 },
93
97
{Name : nodepreferavoidpods .Name , Weight : 10000 },
94
98
{Name : podtopologyspread .Name , Weight : 2 },
95
- {Name : defaultpodtopologyspread .Name , Weight : 1 },
96
99
{Name : tainttoleration .Name , Weight : 1 },
100
+ {Name : defaultpodtopologyspread .Name , Weight : 1 },
97
101
},
98
102
},
99
103
Reserve : & schedulerapi.PluginSet {
@@ -129,3 +133,191 @@ func TestClusterAutoscalerProvider(t *testing.T) {
129
133
t .Errorf ("unexpected config diff (-want, +got): %s" , diff )
130
134
}
131
135
}
136
+
137
+ func TestApplyFeatureGates (t * testing.T ) {
138
+ tests := []struct {
139
+ name string
140
+ feature featuregate.Feature
141
+ wantConfig * schedulerapi.Plugins
142
+ }{
143
+ {
144
+ name : "Feature gates disabled" ,
145
+ wantConfig : & schedulerapi.Plugins {
146
+ QueueSort : & schedulerapi.PluginSet {
147
+ Enabled : []schedulerapi.Plugin {
148
+ {Name : queuesort .Name },
149
+ },
150
+ },
151
+ PreFilter : & schedulerapi.PluginSet {
152
+ Enabled : []schedulerapi.Plugin {
153
+ {Name : noderesources .FitName },
154
+ {Name : nodeports .Name },
155
+ {Name : podtopologyspread .Name },
156
+ {Name : interpodaffinity .Name },
157
+ },
158
+ },
159
+ Filter : & schedulerapi.PluginSet {
160
+ Enabled : []schedulerapi.Plugin {
161
+ {Name : nodeunschedulable .Name },
162
+ {Name : noderesources .FitName },
163
+ {Name : nodename .Name },
164
+ {Name : nodeports .Name },
165
+ {Name : nodeaffinity .Name },
166
+ {Name : volumerestrictions .Name },
167
+ {Name : tainttoleration .Name },
168
+ {Name : nodevolumelimits .EBSName },
169
+ {Name : nodevolumelimits .GCEPDName },
170
+ {Name : nodevolumelimits .CSIName },
171
+ {Name : nodevolumelimits .AzureDiskName },
172
+ {Name : volumebinding .Name },
173
+ {Name : volumezone .Name },
174
+ {Name : podtopologyspread .Name },
175
+ {Name : interpodaffinity .Name },
176
+ },
177
+ },
178
+ PreScore : & schedulerapi.PluginSet {
179
+ Enabled : []schedulerapi.Plugin {
180
+ {Name : interpodaffinity .Name },
181
+ {Name : podtopologyspread .Name },
182
+ {Name : tainttoleration .Name },
183
+ {Name : defaultpodtopologyspread .Name },
184
+ },
185
+ },
186
+ Score : & schedulerapi.PluginSet {
187
+ Enabled : []schedulerapi.Plugin {
188
+ {Name : noderesources .BalancedAllocationName , Weight : 1 },
189
+ {Name : imagelocality .Name , Weight : 1 },
190
+ {Name : interpodaffinity .Name , Weight : 1 },
191
+ {Name : noderesources .LeastAllocatedName , Weight : 1 },
192
+ {Name : nodeaffinity .Name , Weight : 1 },
193
+ {Name : nodepreferavoidpods .Name , Weight : 10000 },
194
+ {Name : podtopologyspread .Name , Weight : 2 },
195
+ {Name : tainttoleration .Name , Weight : 1 },
196
+ {Name : defaultpodtopologyspread .Name , Weight : 1 },
197
+ },
198
+ },
199
+ Reserve : & schedulerapi.PluginSet {
200
+ Enabled : []schedulerapi.Plugin {
201
+ {Name : volumebinding .Name },
202
+ },
203
+ },
204
+ Unreserve : & schedulerapi.PluginSet {
205
+ Enabled : []schedulerapi.Plugin {
206
+ {Name : volumebinding .Name },
207
+ },
208
+ },
209
+ PreBind : & schedulerapi.PluginSet {
210
+ Enabled : []schedulerapi.Plugin {
211
+ {Name : volumebinding .Name },
212
+ },
213
+ },
214
+ Bind : & schedulerapi.PluginSet {
215
+ Enabled : []schedulerapi.Plugin {
216
+ {Name : defaultbinder .Name },
217
+ },
218
+ },
219
+ PostBind : & schedulerapi.PluginSet {
220
+ Enabled : []schedulerapi.Plugin {
221
+ {Name : volumebinding .Name },
222
+ },
223
+ },
224
+ },
225
+ },
226
+ {
227
+ name : "NewDefaultPodTopologySpread enabled" ,
228
+ feature : features .DefaultPodTopologySpread ,
229
+ wantConfig : & schedulerapi.Plugins {
230
+ QueueSort : & schedulerapi.PluginSet {
231
+ Enabled : []schedulerapi.Plugin {
232
+ {Name : queuesort .Name },
233
+ },
234
+ },
235
+ PreFilter : & schedulerapi.PluginSet {
236
+ Enabled : []schedulerapi.Plugin {
237
+ {Name : noderesources .FitName },
238
+ {Name : nodeports .Name },
239
+ {Name : podtopologyspread .Name },
240
+ {Name : interpodaffinity .Name },
241
+ },
242
+ },
243
+ Filter : & schedulerapi.PluginSet {
244
+ Enabled : []schedulerapi.Plugin {
245
+ {Name : nodeunschedulable .Name },
246
+ {Name : noderesources .FitName },
247
+ {Name : nodename .Name },
248
+ {Name : nodeports .Name },
249
+ {Name : nodeaffinity .Name },
250
+ {Name : volumerestrictions .Name },
251
+ {Name : tainttoleration .Name },
252
+ {Name : nodevolumelimits .EBSName },
253
+ {Name : nodevolumelimits .GCEPDName },
254
+ {Name : nodevolumelimits .CSIName },
255
+ {Name : nodevolumelimits .AzureDiskName },
256
+ {Name : volumebinding .Name },
257
+ {Name : volumezone .Name },
258
+ {Name : podtopologyspread .Name },
259
+ {Name : interpodaffinity .Name },
260
+ },
261
+ },
262
+ PreScore : & schedulerapi.PluginSet {
263
+ Enabled : []schedulerapi.Plugin {
264
+ {Name : interpodaffinity .Name },
265
+ {Name : podtopologyspread .Name },
266
+ {Name : tainttoleration .Name },
267
+ },
268
+ },
269
+ Score : & schedulerapi.PluginSet {
270
+ Enabled : []schedulerapi.Plugin {
271
+ {Name : noderesources .BalancedAllocationName , Weight : 1 },
272
+ {Name : imagelocality .Name , Weight : 1 },
273
+ {Name : interpodaffinity .Name , Weight : 1 },
274
+ {Name : noderesources .LeastAllocatedName , Weight : 1 },
275
+ {Name : nodeaffinity .Name , Weight : 1 },
276
+ {Name : nodepreferavoidpods .Name , Weight : 10000 },
277
+ {Name : podtopologyspread .Name , Weight : 2 },
278
+ {Name : tainttoleration .Name , Weight : 1 },
279
+ },
280
+ },
281
+ Reserve : & schedulerapi.PluginSet {
282
+ Enabled : []schedulerapi.Plugin {
283
+ {Name : volumebinding .Name },
284
+ },
285
+ },
286
+ Unreserve : & schedulerapi.PluginSet {
287
+ Enabled : []schedulerapi.Plugin {
288
+ {Name : volumebinding .Name },
289
+ },
290
+ },
291
+ PreBind : & schedulerapi.PluginSet {
292
+ Enabled : []schedulerapi.Plugin {
293
+ {Name : volumebinding .Name },
294
+ },
295
+ },
296
+ Bind : & schedulerapi.PluginSet {
297
+ Enabled : []schedulerapi.Plugin {
298
+ {Name : defaultbinder .Name },
299
+ },
300
+ },
301
+ PostBind : & schedulerapi.PluginSet {
302
+ Enabled : []schedulerapi.Plugin {
303
+ {Name : volumebinding .Name },
304
+ },
305
+ },
306
+ },
307
+ },
308
+ }
309
+
310
+ for _ , test := range tests {
311
+ t .Run (test .name , func (t * testing.T ) {
312
+ if test .feature != "" {
313
+ defer featuregatetesting .SetFeatureGateDuringTest (t , utilfeature .DefaultFeatureGate , test .feature , true )()
314
+ }
315
+
316
+ r := NewRegistry ()
317
+ gotConfig := r [schedulerapi .SchedulerDefaultProviderName ]
318
+ if diff := cmp .Diff (test .wantConfig , gotConfig ); diff != "" {
319
+ t .Errorf ("unexpected config diff (-want, +got): %s" , diff )
320
+ }
321
+ })
322
+ }
323
+ }
0 commit comments