@@ -27,6 +27,7 @@ import (
27
27
"k8s.io/kubernetes/pkg/scheduler/framework"
28
28
plugintesting "k8s.io/kubernetes/pkg/scheduler/framework/plugins/testing"
29
29
st "k8s.io/kubernetes/pkg/scheduler/testing"
30
+ "k8s.io/utils/ptr"
30
31
)
31
32
32
33
func Test_isSchedulableAfterNodeChange (t * testing.T ) {
@@ -150,150 +151,192 @@ func Test_isSchedulableAfterNodeChange(t *testing.T) {
150
151
151
152
func Test_isSchedulableAfterPodChange (t * testing.T ) {
152
153
testcases := []struct {
153
- name string
154
- pod * v1.Pod
155
- oldPod , newPod * v1.Pod
156
- expectedHint framework.QueueingHint
157
- expectedErr bool
154
+ name string
155
+ pod * v1.Pod
156
+ oldPod , newPod * v1.Pod
157
+ expectedHint framework.QueueingHint
158
+ expectedErr bool
159
+ enableNodeInclusionPolicyInPodTopologySpread bool
158
160
}{
159
161
{
160
162
name : "add pod with labels match topologySpreadConstraints selector" ,
161
- pod : st .MakePod ().Name ("p" ).Label ("foo" , "" ).
163
+ pod : st .MakePod ().UID ( "p" ). Name ("p" ).Label ("foo" , "" ).
162
164
SpreadConstraint (1 , "zone" , v1 .DoNotSchedule , fooSelector , nil , nil , nil , nil ).
163
165
Obj (),
164
- newPod : st .MakePod ().Node ("fake-node" ).Label ("foo" , "" ).Obj (),
166
+ newPod : st .MakePod ().UID ( "p2" ). Node ("fake-node" ).Label ("foo" , "" ).Obj (),
165
167
expectedHint : framework .Queue ,
166
168
},
167
169
{
168
170
name : "add un-scheduled pod" ,
169
- pod : st .MakePod ().Name ("p" ).Label ("foo" , "" ).
171
+ pod : st .MakePod ().UID ( "p" ). Name ("p" ).Label ("foo" , "" ).
170
172
SpreadConstraint (1 , "zone" , v1 .DoNotSchedule , fooSelector , nil , nil , nil , nil ).
171
173
Obj (),
172
- newPod : st .MakePod ().Label ("foo" , "" ).Obj (),
174
+ newPod : st .MakePod ().UID ( "p2" ). Label ("foo" , "" ).Obj (),
173
175
expectedHint : framework .QueueSkip ,
174
176
},
175
177
{
176
178
name : "update un-scheduled pod" ,
177
- pod : st .MakePod ().Name ("p" ).Label ("foo" , "" ).
179
+ pod : st .MakePod ().UID ( "p" ). Name ("p" ).Label ("foo" , "" ).
178
180
SpreadConstraint (1 , "zone" , v1 .DoNotSchedule , fooSelector , nil , nil , nil , nil ).
179
181
Obj (),
180
- newPod : st .MakePod ().Label ("foo" , "" ).Obj (),
181
- oldPod : st .MakePod ().Label ("bar" , "" ).Obj (),
182
+ newPod : st .MakePod ().UID ( "p2" ). Label ("foo" , "" ).Obj (),
183
+ oldPod : st .MakePod ().UID ( "p2" ). Label ("bar" , "" ).Obj (),
182
184
expectedHint : framework .QueueSkip ,
183
185
},
184
186
{
185
187
name : "delete un-scheduled pod" ,
186
- pod : st .MakePod ().Name ("p" ).Label ("foo" , "" ).
188
+ pod : st .MakePod ().UID ( "p" ). Name ("p" ).Label ("foo" , "" ).
187
189
SpreadConstraint (1 , "zone" , v1 .DoNotSchedule , fooSelector , nil , nil , nil , nil ).
188
190
Obj (),
189
- oldPod : st .MakePod ().Label ("foo" , "" ).Obj (),
191
+ oldPod : st .MakePod ().UID ( "p2" ). Label ("foo" , "" ).Obj (),
190
192
expectedHint : framework .QueueSkip ,
191
193
},
192
194
{
193
195
name : "add pod with different namespace" ,
194
- pod : st .MakePod ().Name ("p" ).Label ("foo" , "" ).
196
+ pod : st .MakePod ().UID ( "p" ). Name ("p" ).Label ("foo" , "" ).
195
197
SpreadConstraint (1 , "zone" , v1 .DoNotSchedule , fooSelector , nil , nil , nil , nil ).
196
198
Obj (),
197
- newPod : st .MakePod ().Node ("fake-node" ).Namespace ("fake-namespace" ).Label ("foo" , "" ).Obj (),
199
+ newPod : st .MakePod ().UID ( "p2" ). Node ("fake-node" ).Namespace ("fake-namespace" ).Label ("foo" , "" ).Obj (),
198
200
expectedHint : framework .QueueSkip ,
199
201
},
200
202
{
201
203
name : "add pod with labels don't match topologySpreadConstraints selector" ,
202
- pod : st .MakePod ().Name ("p" ).Label ("foo" , "" ).
204
+ pod : st .MakePod ().UID ( "p" ). Name ("p" ).Label ("foo" , "" ).
203
205
SpreadConstraint (1 , "zone" , v1 .DoNotSchedule , fooSelector , nil , nil , nil , nil ).
204
206
Obj (),
205
- newPod : st .MakePod ().Node ("fake-node" ).Label ("bar" , "" ).Obj (),
207
+ newPod : st .MakePod ().UID ( "p2" ). Node ("fake-node" ).Label ("bar" , "" ).Obj (),
206
208
expectedHint : framework .QueueSkip ,
207
209
},
208
210
{
209
211
name : "delete pod with labels that match topologySpreadConstraints selector" ,
210
- pod : st .MakePod ().Name ("p" ).Label ("foo" , "" ).
212
+ pod : st .MakePod ().UID ( "p" ). Name ("p" ).Label ("foo" , "" ).
211
213
SpreadConstraint (1 , "zone" , v1 .DoNotSchedule , fooSelector , nil , nil , nil , nil ).
212
214
Obj (),
213
- oldPod : st .MakePod ().Node ("fake-node" ).Label ("foo" , "" ).Obj (),
215
+ oldPod : st .MakePod ().UID ( "p2" ). Node ("fake-node" ).Label ("foo" , "" ).Obj (),
214
216
expectedHint : framework .Queue ,
215
217
},
216
218
{
217
219
name : "delete pod with labels that don't match topologySpreadConstraints selector" ,
218
- pod : st .MakePod ().Name ("p" ).Label ("foo" , "" ).
220
+ pod : st .MakePod ().UID ( "p" ). Name ("p" ).Label ("foo" , "" ).
219
221
SpreadConstraint (1 , "zone" , v1 .DoNotSchedule , fooSelector , nil , nil , nil , nil ).
220
222
Obj (),
221
- oldPod : st .MakePod ().Node ("fake-node" ).Label ("bar" , "" ).Obj (),
223
+ oldPod : st .MakePod ().UID ( "p2" ). Node ("fake-node" ).Label ("bar" , "" ).Obj (),
222
224
expectedHint : framework .QueueSkip ,
223
225
},
224
226
{
225
227
name : "update pod's non-related label" ,
226
- pod : st .MakePod ().Name ("p" ).Label ("foo" , "" ).
228
+ pod : st .MakePod ().UID ( "p" ). Name ("p" ).Label ("foo" , "" ).
227
229
SpreadConstraint (1 , "zone" , v1 .DoNotSchedule , fooSelector , nil , nil , nil , nil ).
228
230
Obj (),
229
- oldPod : st .MakePod ().Node ("fake-node" ).Label ("foo" , "" ).Label ("bar" , "bar1" ).Obj (),
230
- newPod : st .MakePod ().Node ("fake-node" ).Label ("foo" , "" ).Label ("bar" , "bar2" ).Obj (),
231
+ oldPod : st .MakePod ().UID ( "p2" ). Node ("fake-node" ).Label ("foo" , "" ).Label ("bar" , "bar1" ).Obj (),
232
+ newPod : st .MakePod ().UID ( "p2" ). Node ("fake-node" ).Label ("foo" , "" ).Label ("bar" , "bar2" ).Obj (),
231
233
expectedHint : framework .QueueSkip ,
232
234
},
233
235
{
234
236
name : "add pod's label that matches topologySpreadConstraints selector" ,
235
- pod : st .MakePod ().Name ("p" ).Label ("foo" , "" ).
237
+ pod : st .MakePod ().UID ( "p" ). Name ("p" ).Label ("foo" , "" ).
236
238
SpreadConstraint (1 , "zone" , v1 .DoNotSchedule , fooSelector , nil , nil , nil , nil ).
237
239
Obj (),
238
- oldPod : st .MakePod ().Node ("fake-node" ).Obj (),
239
- newPod : st .MakePod ().Node ("fake-node" ).Label ("foo" , "" ).Obj (),
240
+ oldPod : st .MakePod ().UID ( "p2" ). Node ("fake-node" ).Obj (),
241
+ newPod : st .MakePod ().UID ( "p2" ). Node ("fake-node" ).Label ("foo" , "" ).Obj (),
240
242
expectedHint : framework .Queue ,
241
243
},
242
244
{
243
245
name : "delete pod label that matches topologySpreadConstraints selector" ,
244
- pod : st .MakePod ().Name ("p" ).Label ("foo" , "" ).
246
+ pod : st .MakePod ().UID ( "p" ). Name ("p" ).Label ("foo" , "" ).
245
247
SpreadConstraint (1 , "zone" , v1 .DoNotSchedule , fooSelector , nil , nil , nil , nil ).
246
248
Obj (),
247
- oldPod : st .MakePod ().Node ("fake-node" ).Label ("foo" , "" ).Obj (),
248
- newPod : st .MakePod ().Node ("fake-node" ).Obj (),
249
+ oldPod : st .MakePod ().UID ( "p2" ). Node ("fake-node" ).Label ("foo" , "" ).Obj (),
250
+ newPod : st .MakePod ().UID ( "p2" ). Node ("fake-node" ).Obj (),
249
251
expectedHint : framework .Queue ,
250
252
},
251
253
{
252
254
name : "change pod's label that matches topologySpreadConstraints selector" ,
253
- pod : st .MakePod ().Name ("p" ).Label ("foo" , "" ).
255
+ pod : st .MakePod ().UID ( "p" ). Name ("p" ).Label ("foo" , "" ).
254
256
SpreadConstraint (1 , "zone" , v1 .DoNotSchedule , fooSelector , nil , nil , nil , nil ).
255
257
Obj (),
256
- oldPod : st .MakePod ().Node ("fake-node" ).Label ("foo" , "foo1" ).Obj (),
257
- newPod : st .MakePod ().Node ("fake-node" ).Label ("foo" , "foo2" ).Obj (),
258
+ oldPod : st .MakePod ().UID ( "p2" ). Node ("fake-node" ).Label ("foo" , "foo1" ).Obj (),
259
+ newPod : st .MakePod ().UID ( "p2" ). Node ("fake-node" ).Label ("foo" , "foo2" ).Obj (),
258
260
expectedHint : framework .QueueSkip ,
259
261
},
260
262
{
261
263
name : "change pod's label that doesn't match topologySpreadConstraints selector" ,
262
- pod : st .MakePod ().Name ("p" ).Label ("foo" , "" ).
264
+ pod : st .MakePod ().UID ( "p" ). Name ("p" ).Label ("foo" , "" ).
263
265
SpreadConstraint (1 , "zone" , v1 .DoNotSchedule , fooSelector , nil , nil , nil , nil ).
264
266
Obj (),
265
- oldPod : st .MakePod ().Node ("fake-node" ).Label ("foo" , "" ).Label ("bar" , "bar1" ).Obj (),
266
- newPod : st .MakePod ().Node ("fake-node" ).Label ("foo" , "" ).Label ("bar" , "bar2" ).Obj (),
267
+ oldPod : st .MakePod ().UID ( "p2" ). Node ("fake-node" ).Label ("foo" , "" ).Label ("bar" , "bar1" ).Obj (),
268
+ newPod : st .MakePod ().UID ( "p2" ). Node ("fake-node" ).Label ("foo" , "" ).Label ("bar" , "bar2" ).Obj (),
267
269
expectedHint : framework .QueueSkip ,
268
270
},
269
271
{
270
272
name : "add pod's label that matches topologySpreadConstraints selector with multi topologySpreadConstraints" ,
271
- pod : st .MakePod ().Name ("p" ).Label ("foo" , "" ).
273
+ pod : st .MakePod ().UID ( "p" ). Name ("p" ).Label ("foo" , "" ).
272
274
SpreadConstraint (1 , "zone" , v1 .DoNotSchedule , fooSelector , nil , nil , nil , nil ).
273
275
SpreadConstraint (1 , "node" , v1 .DoNotSchedule , barSelector , nil , nil , nil , nil ).
274
276
Obj (),
275
- oldPod : st .MakePod ().Node ("fake-node" ).Label ("foo" , "" ).Obj (),
276
- newPod : st .MakePod ().Node ("fake-node" ).Label ("foo" , "" ).Label ("bar" , "bar2" ).Obj (),
277
+ oldPod : st .MakePod ().UID ( "p2" ). Node ("fake-node" ).Label ("foo" , "" ).Obj (),
278
+ newPod : st .MakePod ().UID ( "p2" ). Node ("fake-node" ).Label ("foo" , "" ).Label ("bar" , "bar2" ).Obj (),
277
279
expectedHint : framework .Queue ,
278
280
},
279
281
{
280
282
name : "change pod's label that doesn't match topologySpreadConstraints selector with multi topologySpreadConstraints" ,
281
- pod : st .MakePod ().Name ("p" ).Label ("foo" , "" ).
283
+ pod : st .MakePod ().UID ( "p" ). Name ("p" ).Label ("foo" , "" ).
282
284
SpreadConstraint (1 , "zone" , v1 .DoNotSchedule , fooSelector , nil , nil , nil , nil ).
283
285
SpreadConstraint (1 , "node" , v1 .DoNotSchedule , barSelector , nil , nil , nil , nil ).
284
286
Obj (),
285
- oldPod : st .MakePod ().Node ("fake-node" ).Label ("foo" , "" ).Obj (),
286
- newPod : st .MakePod ().Node ("fake-node" ).Label ("foo" , "" ).Label ("baz" , "" ).Obj (),
287
+ oldPod : st .MakePod ().UID ( "p2" ). Node ("fake-node" ).Label ("foo" , "" ).Obj (),
288
+ newPod : st .MakePod ().UID ( "p2" ). Node ("fake-node" ).Label ("foo" , "" ).Label ("baz" , "" ).Obj (),
287
289
expectedHint : framework .QueueSkip ,
288
290
},
289
291
{
290
292
name : "change pod's label that match topologySpreadConstraints selector with multi topologySpreadConstraints" ,
291
- pod : st .MakePod ().Name ("p" ).Label ("foo" , "" ).
293
+ pod : st .MakePod ().UID ( "p" ). Name ("p" ).Label ("foo" , "" ).
292
294
SpreadConstraint (1 , "zone" , v1 .DoNotSchedule , fooSelector , nil , nil , nil , nil ).
293
295
SpreadConstraint (1 , "node" , v1 .DoNotSchedule , barSelector , nil , nil , nil , nil ).
294
296
Obj (),
295
- oldPod : st .MakePod ().Node ("fake-node" ).Label ("foo" , "" ).Label ("bar" , "" ).Obj (),
296
- newPod : st .MakePod ().Node ("fake-node" ).Label ("foo" , "" ).Label ("bar" , "bar2" ).Obj (),
297
+ oldPod : st .MakePod ().UID ("p2" ).Node ("fake-node" ).Label ("foo" , "" ).Label ("bar" , "" ).Obj (),
298
+ newPod : st .MakePod ().UID ("p2" ).Node ("fake-node" ).Label ("foo" , "" ).Label ("bar" , "bar2" ).Obj (),
299
+ expectedHint : framework .QueueSkip ,
300
+ },
301
+ {
302
+ name : "the unschedulable Pod has topologySpreadConstraint with NodeTaintsPolicy:Honor and has got a new toleration" ,
303
+ pod : st .MakePod ().UID ("p" ).Name ("p" ).Label ("foo" , "" ).
304
+ SpreadConstraint (1 , "zone" , v1 .DoNotSchedule , fooSelector , nil , nil , ptr .To (v1 .NodeInclusionPolicyHonor ), nil ).
305
+ SpreadConstraint (1 , "node" , v1 .DoNotSchedule , barSelector , nil , nil , nil , nil ).
306
+ Obj (),
307
+ oldPod : st .MakePod ().UID ("p" ).Name ("p" ).Label ("foo" , "" ).Obj (),
308
+ newPod : st .MakePod ().UID ("p" ).Name ("p" ).Label ("foo" , "" ).Toleration (v1 .TaintNodeUnschedulable ).Obj (),
309
+ expectedHint : framework .Queue ,
310
+ enableNodeInclusionPolicyInPodTopologySpread : true ,
311
+ },
312
+ {
313
+ name : "the unschedulable Pod has topologySpreadConstraint without NodeTaintsPolicy:Honor and has got a new toleration" ,
314
+ pod : st .MakePod ().UID ("p" ).Name ("p" ).Label ("foo" , "" ).
315
+ SpreadConstraint (1 , "zone" , v1 .DoNotSchedule , fooSelector , nil , nil , ptr .To (v1 .NodeInclusionPolicyIgnore ), nil ).
316
+ SpreadConstraint (1 , "node" , v1 .DoNotSchedule , barSelector , nil , nil , nil , nil ).
317
+ Obj (),
318
+ oldPod : st .MakePod ().UID ("p" ).Name ("p" ).Label ("foo" , "" ).Obj (),
319
+ newPod : st .MakePod ().UID ("p" ).Name ("p" ).Label ("foo" , "" ).Toleration (v1 .TaintNodeUnschedulable ).Obj (),
320
+ expectedHint : framework .QueueSkip ,
321
+ },
322
+ {
323
+ name : "the unschedulable Pod has topologySpreadConstraint and has got a new label matching the selector of the constraint" ,
324
+ pod : st .MakePod ().UID ("p" ).Name ("p" ).Label ("foo" , "" ).
325
+ SpreadConstraint (1 , "zone" , v1 .DoNotSchedule , fooSelector , nil , nil , ptr .To (v1 .NodeInclusionPolicyIgnore ), nil ).
326
+ SpreadConstraint (1 , "node" , v1 .DoNotSchedule , barSelector , nil , nil , nil , nil ).
327
+ Obj (),
328
+ oldPod : st .MakePod ().UID ("p" ).Name ("p" ).Obj (),
329
+ newPod : st .MakePod ().UID ("p" ).Name ("p" ).Label ("foo" , "" ).Obj (),
330
+ expectedHint : framework .Queue ,
331
+ },
332
+ {
333
+ name : "the unschedulable Pod has topologySpreadConstraint and has got a new unrelated label" ,
334
+ pod : st .MakePod ().UID ("p" ).Name ("p" ).Label ("foo" , "" ).
335
+ SpreadConstraint (1 , "zone" , v1 .DoNotSchedule , fooSelector , nil , nil , ptr .To (v1 .NodeInclusionPolicyIgnore ), nil ).
336
+ SpreadConstraint (1 , "node" , v1 .DoNotSchedule , barSelector , nil , nil , nil , nil ).
337
+ Obj (),
338
+ oldPod : st .MakePod ().UID ("p" ).Name ("p" ).Obj (),
339
+ newPod : st .MakePod ().UID ("p" ).Name ("p" ).Label ("unrelated" , "" ).Obj (),
297
340
expectedHint : framework .QueueSkip ,
298
341
},
299
342
}
@@ -303,6 +346,8 @@ func Test_isSchedulableAfterPodChange(t *testing.T) {
303
346
snapshot := cache .NewSnapshot (nil , nil )
304
347
pl := plugintesting .SetupPlugin (ctx , t , topologySpreadFunc , & config.PodTopologySpreadArgs {DefaultingType : config .ListDefaulting }, snapshot )
305
348
p := pl .(* PodTopologySpread )
349
+ p .enableNodeInclusionPolicyInPodTopologySpread = tc .enableNodeInclusionPolicyInPodTopologySpread
350
+
306
351
actualHint , err := p .isSchedulableAfterPodChange (logger , tc .pod , tc .oldPod , tc .newPod )
307
352
if tc .expectedErr {
308
353
require .Error (t , err )
0 commit comments