@@ -23,7 +23,6 @@ import (
23
23
"github.com/google/go-cmp/cmp"
24
24
v1 "k8s.io/api/core/v1"
25
25
"k8s.io/apimachinery/pkg/api/resource"
26
- metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
27
26
"k8s.io/klog/v2/ktesting"
28
27
"k8s.io/kubernetes/pkg/scheduler/apis/config"
29
28
"k8s.io/kubernetes/pkg/scheduler/backend/cache"
@@ -57,14 +56,6 @@ func TestNodeResourcesBalancedAllocation(t *testing.T) {
57
56
},
58
57
NodeName : "node1" ,
59
58
}
60
- labels1 := map [string ]string {
61
- "foo" : "bar" ,
62
- "baz" : "blah" ,
63
- }
64
- labels2 := map [string ]string {
65
- "bar" : "foo" ,
66
- "baz" : "blah" ,
67
- }
68
59
cpuOnly := v1.PodSpec {
69
60
NodeName : "node1" ,
70
61
Containers : []v1.Container {
@@ -119,29 +110,23 @@ func TestNodeResourcesBalancedAllocation(t *testing.T) {
119
110
}
120
111
121
112
tests := []struct {
122
- pod * v1.Pod
123
- pods []* v1.Pod
124
- nodes []* v1.Node
125
- expectedList framework.NodeScoreList
126
- name string
127
- args config.NodeResourcesBalancedAllocationArgs
128
- runPreScore bool
113
+ pod * v1.Pod
114
+ pods []* v1.Pod
115
+ nodes []* v1.Node
116
+ expectedList framework.NodeScoreList
117
+ name string
118
+ args config.NodeResourcesBalancedAllocationArgs
119
+ runPreScore bool
120
+ wantPreScoreStatusCode framework.Code
129
121
}{
130
122
{
131
- // Node1 scores (remaining resources) on 0-MaxNodeScore scale
132
- // CPU Fraction: 0 / 4000 = 0%
133
- // Memory Fraction: 0 / 10000 = 0%
134
- // Node1 Score: (1-0) * MaxNodeScore = MaxNodeScore
135
- // Node2 scores (remaining resources) on 0-MaxNodeScore scale
136
- // CPU Fraction: 0 / 4000 = 0 %
137
- // Memory Fraction: 0 / 10000 = 0%
138
- // Node2 Score: (1-0) * MaxNodeScore = MaxNodeScore
139
- pod : st .MakePod ().Obj (),
140
- nodes : []* v1.Node {makeNode ("node1" , 4000 , 10000 , nil ), makeNode ("node2" , 4000 , 10000 , nil )},
141
- expectedList : []framework.NodeScore {{Name : "node1" , Score : framework .MaxNodeScore }, {Name : "node2" , Score : framework .MaxNodeScore }},
142
- name : "nothing scheduled, nothing requested" ,
143
- args : config.NodeResourcesBalancedAllocationArgs {Resources : defaultResourceBalancedAllocationSet },
144
- runPreScore : true ,
123
+ // bestEffort pods, skip in PreScore
124
+ pod : st .MakePod ().Obj (),
125
+ nodes : []* v1.Node {makeNode ("node1" , 4000 , 10000 , nil ), makeNode ("node2" , 4000 , 10000 , nil )},
126
+ name : "nothing scheduled, nothing requested, skip in PreScore" ,
127
+ args : config.NodeResourcesBalancedAllocationArgs {Resources : defaultResourceBalancedAllocationSet },
128
+ runPreScore : true ,
129
+ wantPreScoreStatusCode : framework .Skip ,
145
130
},
146
131
{
147
132
// Node1 scores on 0-MaxNodeScore scale
@@ -161,76 +146,6 @@ func TestNodeResourcesBalancedAllocation(t *testing.T) {
161
146
args : config.NodeResourcesBalancedAllocationArgs {Resources : defaultResourceBalancedAllocationSet },
162
147
runPreScore : true ,
163
148
},
164
- {
165
- // Node1 scores on 0-MaxNodeScore scale
166
- // CPU Fraction: 0 / 4000= 0%
167
- // Memory Fraction: 0 / 10000 = 0%
168
- // Node1 std: 0
169
- // Node1 Score: (1-0) * MaxNodeScore = MaxNodeScore
170
- // Node2 scores on 0-MaxNodeScore scale
171
- // CPU Fraction: 0 / 4000= 0%
172
- // Memory Fraction: 0 / 10000 = 0%
173
- // Node2 std: 0
174
- // Node2 Score: (1-0) * MaxNodeScore = MaxNodeScore
175
- pod : st .MakePod ().Obj (),
176
- nodes : []* v1.Node {makeNode ("node1" , 4000 , 10000 , nil ), makeNode ("node2" , 4000 , 10000 , nil )},
177
- expectedList : []framework.NodeScore {{Name : "node2" , Score : framework .MaxNodeScore }, {Name : "node2" , Score : framework .MaxNodeScore }},
178
- name : "no resources requested, pods without container scheduled" ,
179
- pods : []* v1.Pod {
180
- st .MakePod ().Node ("node1" ).Labels (labels2 ).Obj (),
181
- st .MakePod ().Node ("node1" ).Labels (labels1 ).Obj (),
182
- st .MakePod ().Node ("node2" ).Labels (labels1 ).Obj (),
183
- st .MakePod ().Node ("node2" ).Labels (labels1 ).Obj (),
184
- },
185
- args : config.NodeResourcesBalancedAllocationArgs {Resources : defaultResourceBalancedAllocationSet },
186
- runPreScore : true ,
187
- },
188
- {
189
- // Node1 scores on 0-MaxNodeScore scale
190
- // CPU Fraction: 0 / 250 = 0%
191
- // Memory Fraction: 0 / 1000 = 0%
192
- // Node1 std: (0 - 0) / 2 = 0
193
- // Node1 Score: (1 - 0)*MaxNodeScore = 100
194
- // Node2 scores on 0-MaxNodeScore scale
195
- // CPU Fraction: 0 / 250 = 0%
196
- // Memory Fraction: 0 / 1000 = 0%
197
- // Node2 std: (0 - 0) / 2 = 0
198
- // Node2 Score: (1 - 0)*MaxNodeScore = 100
199
- pod : st .MakePod ().Obj (),
200
- nodes : []* v1.Node {makeNode ("node1" , 250 , 1000 * 1024 * 1024 , nil ), makeNode ("node2" , 250 , 1000 * 1024 * 1024 , nil )},
201
- expectedList : []framework.NodeScore {{Name : "node1" , Score : 100 }, {Name : "node2" , Score : 100 }},
202
- name : "no resources requested, pods with container scheduled" ,
203
- pods : []* v1.Pod {
204
- st .MakePod ().Node ("node1" ).Obj (),
205
- st .MakePod ().Node ("node1" ).Obj (),
206
- },
207
- args : config.NodeResourcesBalancedAllocationArgs {Resources : defaultResourceBalancedAllocationSet },
208
- runPreScore : true ,
209
- },
210
- {
211
- // Node1 scores on 0-MaxNodeScore scale
212
- // CPU Fraction: 6000 / 10000 = 60%
213
- // Memory Fraction: 0 / 20000 = 0%
214
- // Node1 std: (0.6 - 0) / 2 = 0.3
215
- // Node1 Score: (1 - 0.3)*MaxNodeScore = 70
216
- // Node2 scores on 0-MaxNodeScore scale
217
- // CPU Fraction: 6000 / 10000 = 60%
218
- // Memory Fraction: 5000 / 20000 = 25%
219
- // Node2 std: (0.6 - 0.25) / 2 = 0.175
220
- // Node2 Score: (1 - 0.175)*MaxNodeScore = 82
221
- pod : st .MakePod ().Obj (),
222
- nodes : []* v1.Node {makeNode ("node1" , 10000 , 20000 , nil ), makeNode ("node2" , 10000 , 20000 , nil )},
223
- expectedList : []framework.NodeScore {{Name : "node1" , Score : 70 }, {Name : "node2" , Score : 82 }},
224
- name : "no resources requested, pods scheduled with resources" ,
225
- pods : []* v1.Pod {
226
- {Spec : cpuOnly , ObjectMeta : metav1.ObjectMeta {Labels : labels2 }},
227
- {Spec : cpuOnly , ObjectMeta : metav1.ObjectMeta {Labels : labels1 }},
228
- {Spec : cpuOnly2 , ObjectMeta : metav1.ObjectMeta {Labels : labels1 }},
229
- {Spec : cpuAndMemory , ObjectMeta : metav1.ObjectMeta {Labels : labels1 }},
230
- },
231
- args : config.NodeResourcesBalancedAllocationArgs {Resources : defaultResourceBalancedAllocationSet },
232
- runPreScore : true ,
233
- },
234
149
{
235
150
// Node1 scores on 0-MaxNodeScore scale
236
151
// CPU Fraction: 6000 / 10000 = 60%
@@ -298,18 +213,6 @@ func TestNodeResourcesBalancedAllocation(t *testing.T) {
298
213
args : config.NodeResourcesBalancedAllocationArgs {Resources : defaultResourceBalancedAllocationSet },
299
214
runPreScore : true ,
300
215
},
301
- {
302
- pod : st .MakePod ().Obj (),
303
- nodes : []* v1.Node {makeNode ("node1" , 0 , 0 , nil ), makeNode ("node2" , 0 , 0 , nil )},
304
- expectedList : []framework.NodeScore {{Name : "node1" , Score : 100 }, {Name : "node2" , Score : 100 }},
305
- name : "zero node resources, pods scheduled with resources" ,
306
- pods : []* v1.Pod {
307
- {Spec : cpuOnly },
308
- {Spec : cpuAndMemory },
309
- },
310
- args : config.NodeResourcesBalancedAllocationArgs {Resources : defaultResourceBalancedAllocationSet },
311
- runPreScore : true ,
312
- },
313
216
// Node1 scores on 0-MaxNodeScore scale
314
217
// CPU Fraction: 3000 / 3500 = 85.71%
315
218
// Memory Fraction: 5000 / 40000 = 12.5%
@@ -342,19 +245,25 @@ func TestNodeResourcesBalancedAllocation(t *testing.T) {
342
245
runPreScore : true ,
343
246
},
344
247
// Only one node (node1) has the scalar resource, pod doesn't request the scalar resource and the scalar resource should be skipped for consideration.
345
- // Node1: std = 0, score = 100
346
- // Node2: std = 0, score = 100
248
+ // Node1 scores on 0-MaxNodeScore scale
249
+ // CPU Fraction: 3000 / 3500 = 85.71%
250
+ // Memory Fraction: 5000 / 40000 = 12.5%
251
+ // Node1 std: (0.8571 - 0.125) / 2 = 0.36605
252
+ // Node1 Score: (1 - 0.22705)*MaxNodeScore = 63
253
+ // Node2 scores on 0-MaxNodeScore scale
254
+ // CPU Fraction: 3000 / 3500 = 85.71%
255
+ // Memory Fraction: 5000 / 40000 = 12.5%
256
+ // Node2 std: (0.8571 - 0.125) / 2 = 0.36605
257
+ // Node2 Score: (1 - 0.22705)*MaxNodeScore = 63
347
258
{
348
- pod : st . MakePod (). Obj () ,
259
+ pod : & v1. Pod { Spec : cpuAndMemory } ,
349
260
nodes : []* v1.Node {makeNode ("node1" , 3500 , 40000 , scalarResource ), makeNode ("node2" , 3500 , 40000 , nil )},
350
- expectedList : []framework.NodeScore {{Name : "node1" , Score : 100 }, {Name : "node2" , Score : 100 }},
351
- name : "node without the scalar resource results to a higher score" ,
352
- pods : []* v1.Pod {
353
- {Spec : cpuOnly },
354
- {Spec : cpuOnly2 },
355
- },
261
+ expectedList : []framework.NodeScore {{Name : "node1" , Score : 63 }, {Name : "node2" , Score : 63 }},
262
+ name : "node without the scalar resource should skip the scalar resource" ,
263
+ pods : []* v1.Pod {},
356
264
args : config.NodeResourcesBalancedAllocationArgs {Resources : []config.ResourceSpec {
357
265
{Name : string (v1 .ResourceCPU ), Weight : 1 },
266
+ {Name : string (v1 .ResourceMemory ), Weight : 1 },
358
267
{Name : "nvidia.com/gpu" , Weight : 1 },
359
268
}},
360
269
runPreScore : true ,
@@ -392,13 +301,17 @@ func TestNodeResourcesBalancedAllocation(t *testing.T) {
392
301
fh , _ := runtime .NewFramework (ctx , nil , nil , runtime .WithSnapshotSharedLister (snapshot ))
393
302
p , _ := NewBalancedAllocation (ctx , & test .args , fh , feature.Features {})
394
303
state := framework .NewCycleState ()
395
- for i := range test .nodes {
396
- if test .runPreScore {
397
- status := p .(framework.PreScorePlugin ).PreScore (ctx , state , test .pod , tf .BuildNodeInfos (test .nodes ))
398
- if ! status .IsSuccess () {
399
- t .Errorf ("PreScore is expected to return success, but didn't. Got status: %v" , status )
400
- }
304
+ if test .runPreScore {
305
+ status := p .(framework.PreScorePlugin ).PreScore (ctx , state , test .pod , tf .BuildNodeInfos (test .nodes ))
306
+ if status .Code () != test .wantPreScoreStatusCode {
307
+ t .Errorf ("unexpected status code, want: %v, got: %v" , test .wantPreScoreStatusCode , status .Code ())
401
308
}
309
+ if status .Code () == framework .Skip {
310
+ t .Log ("skipping score test as PreScore returned skip" )
311
+ return
312
+ }
313
+ }
314
+ for i := range test .nodes {
402
315
nodeInfo , err := snapshot .Get (test .nodes [i ].Name )
403
316
if err != nil {
404
317
t .Errorf ("failed to get node %q from snapshot: %v" , test .nodes [i ].Name , err )
0 commit comments