@@ -271,6 +271,248 @@ func TestNUMANodesRequired(t *testing.T) {
271
271
expectedErr : nil ,
272
272
expectedMinDistance : false ,
273
273
},
274
+ {
275
+ description : "8 NUMA node optimal distance, not sorted ids" ,
276
+ numaNodes : NUMANodeList {
277
+ {
278
+ NUMAID : 0 ,
279
+ Resources : v1.ResourceList {
280
+ gpuResource : resource .MustParse ("1" ),
281
+ v1 .ResourceCPU : * resource .NewQuantity (4 , resource .DecimalSI ),
282
+ v1 .ResourceMemory : resource .MustParse ("5Gi" ),
283
+ },
284
+ Costs : map [int ]int {
285
+ 0 : 10 , 1 : 20 , 2 : 40 , 3 : 30 , 4 : 20 , 5 : 30 , 6 : 50 , 7 : 40 ,
286
+ },
287
+ },
288
+ {
289
+ NUMAID : 3 ,
290
+ Resources : v1.ResourceList {
291
+ gpuResource : resource .MustParse ("1" ),
292
+ v1 .ResourceCPU : * resource .NewQuantity (4 , resource .DecimalSI ),
293
+ v1 .ResourceMemory : resource .MustParse ("5Gi" ),
294
+ },
295
+ Costs : map [int ]int {
296
+ 0 : 30 , 1 : 40 , 2 : 20 , 3 : 10 , 4 : 30 , 5 : 20 , 6 : 40 , 7 : 50 ,
297
+ },
298
+ },
299
+ {
300
+ NUMAID : 5 ,
301
+ Resources : v1.ResourceList {
302
+ gpuResource : resource .MustParse ("1" ),
303
+ v1 .ResourceCPU : * resource .NewQuantity (4 , resource .DecimalSI ),
304
+ v1 .ResourceMemory : resource .MustParse ("5Gi" ),
305
+ },
306
+ Costs : map [int ]int {
307
+ 0 : 30 , 1 : 20 , 2 : 50 , 3 : 20 , 4 : 50 , 5 : 10 , 6 : 50 , 7 : 40 ,
308
+ },
309
+ },
310
+ {
311
+ NUMAID : 7 ,
312
+ Resources : v1.ResourceList {
313
+ gpuResource : resource .MustParse ("1" ),
314
+ v1 .ResourceCPU : * resource .NewQuantity (4 , resource .DecimalSI ),
315
+ v1 .ResourceMemory : resource .MustParse ("5Gi" ),
316
+ },
317
+ Costs : map [int ]int {
318
+ 0 : 40 , 1 : 50 , 2 : 30 , 3 : 50 , 4 : 20 , 5 : 40 , 6 : 30 , 7 : 10 ,
319
+ },
320
+ },
321
+ {
322
+ NUMAID : 1 ,
323
+ Resources : v1.ResourceList {
324
+ gpuResource : resource .MustParse ("1" ),
325
+ v1 .ResourceCPU : * resource .NewQuantity (4 , resource .DecimalSI ),
326
+ v1 .ResourceMemory : resource .MustParse ("5Gi" ),
327
+ },
328
+ Costs : map [int ]int {
329
+ 0 : 20 , 1 : 10 , 2 : 30 , 3 : 40 , 4 : 50 , 5 : 20 , 6 : 40 , 7 : 50 ,
330
+ },
331
+ },
332
+ {
333
+ NUMAID : 6 ,
334
+ Resources : v1.ResourceList {
335
+ gpuResource : resource .MustParse ("1" ),
336
+ v1 .ResourceCPU : * resource .NewQuantity (4 , resource .DecimalSI ),
337
+ v1 .ResourceMemory : resource .MustParse ("5Gi" ),
338
+ },
339
+ Costs : map [int ]int {
340
+ 0 : 50 , 1 : 40 , 2 : 20 , 3 : 40 , 4 : 30 , 5 : 50 , 6 : 10 , 7 : 30 ,
341
+ },
342
+ },
343
+ {
344
+ NUMAID : 2 ,
345
+ Resources : v1.ResourceList {
346
+ gpuResource : resource .MustParse ("1" ),
347
+ v1 .ResourceCPU : * resource .NewQuantity (4 , resource .DecimalSI ),
348
+ v1 .ResourceMemory : resource .MustParse ("5Gi" ),
349
+ },
350
+ Costs : map [int ]int {
351
+ 0 : 40 , 1 : 30 , 2 : 10 , 3 : 20 , 4 : 40 , 5 : 50 , 6 : 20 , 7 : 30 ,
352
+ },
353
+ },
354
+ {
355
+ NUMAID : 4 ,
356
+ Resources : v1.ResourceList {
357
+ gpuResource : resource .MustParse ("1" ),
358
+ v1 .ResourceCPU : * resource .NewQuantity (4 , resource .DecimalSI ),
359
+ v1 .ResourceMemory : resource .MustParse ("5Gi" ),
360
+ },
361
+ Costs : map [int ]int {
362
+ 0 : 20 , 1 : 50 , 2 : 40 , 3 : 30 , 4 : 10 , 5 : 50 , 6 : 30 , 7 : 20 ,
363
+ },
364
+ },
365
+ },
366
+ podResources : v1.ResourceList {
367
+ v1 .ResourceCPU : * resource .NewQuantity (3 , resource .DecimalSI ),
368
+ v1 .ResourceMemory : resource .MustParse ("2Gi" ),
369
+ gpuResource : resource .MustParse ("3" ),
370
+ },
371
+ node : node ,
372
+ expectedBitmask : NewTestBitmask (0 , 1 , 5 ),
373
+ expectedErr : nil ,
374
+ expectedMinDistance : true ,
375
+ },
376
+ {
377
+ description : "4 NUMA node optimal distance, non sequential ids" ,
378
+ numaNodes : NUMANodeList {
379
+ {
380
+ NUMAID : 0 ,
381
+ Resources : v1.ResourceList {
382
+ gpuResource : resource .MustParse ("1" ),
383
+ v1 .ResourceCPU : * resource .NewQuantity (4 , resource .DecimalSI ),
384
+ v1 .ResourceMemory : resource .MustParse ("5Gi" ),
385
+ },
386
+ Costs : map [int ]int {
387
+ 0 : 10 ,
388
+ 2 : 12 ,
389
+ 4 : 20 ,
390
+ 6 : 20 ,
391
+ },
392
+ },
393
+ {
394
+ NUMAID : 2 ,
395
+ Resources : v1.ResourceList {
396
+ gpuResource : resource .MustParse ("1" ),
397
+ v1 .ResourceCPU : * resource .NewQuantity (4 , resource .DecimalSI ),
398
+ v1 .ResourceMemory : resource .MustParse ("5Gi" ),
399
+ },
400
+ Costs : map [int ]int {
401
+ 0 : 12 ,
402
+ 2 : 10 ,
403
+ 4 : 20 ,
404
+ 6 : 20 ,
405
+ },
406
+ },
407
+ {
408
+ NUMAID : 4 ,
409
+ Resources : v1.ResourceList {
410
+ gpuResource : resource .MustParse ("0" ),
411
+ v1 .ResourceCPU : * resource .NewQuantity (4 , resource .DecimalSI ),
412
+ v1 .ResourceMemory : resource .MustParse ("5Gi" ),
413
+ },
414
+ Costs : map [int ]int {
415
+ 0 : 20 ,
416
+ 2 : 20 ,
417
+ 4 : 10 ,
418
+ 6 : 12 ,
419
+ },
420
+ },
421
+ {
422
+ NUMAID : 6 ,
423
+ Resources : v1.ResourceList {
424
+ gpuResource : resource .MustParse ("0" ),
425
+ v1 .ResourceCPU : * resource .NewQuantity (4 , resource .DecimalSI ),
426
+ v1 .ResourceMemory : resource .MustParse ("5Gi" ),
427
+ },
428
+ Costs : map [int ]int {
429
+ 0 : 20 ,
430
+ 2 : 20 ,
431
+ 4 : 12 ,
432
+ 6 : 10 ,
433
+ },
434
+ },
435
+ },
436
+ podResources : v1.ResourceList {
437
+ v1 .ResourceCPU : * resource .NewQuantity (2 , resource .DecimalSI ),
438
+ v1 .ResourceMemory : resource .MustParse ("2Gi" ),
439
+ gpuResource : resource .MustParse ("2" ),
440
+ },
441
+ node : node ,
442
+ expectedBitmask : NewTestBitmask (0 , 2 ),
443
+ expectedErr : nil ,
444
+ expectedMinDistance : true ,
445
+ },
446
+ {
447
+ description : "4 NUMA node non optimal distance, non sequential ids" ,
448
+ numaNodes : NUMANodeList {
449
+ {
450
+ NUMAID : 0 ,
451
+ Resources : v1.ResourceList {
452
+ gpuResource : resource .MustParse ("1" ),
453
+ v1 .ResourceCPU : * resource .NewQuantity (4 , resource .DecimalSI ),
454
+ v1 .ResourceMemory : resource .MustParse ("5Gi" ),
455
+ },
456
+ Costs : map [int ]int {
457
+ 0 : 10 ,
458
+ 2 : 12 ,
459
+ 4 : 20 ,
460
+ 6 : 20 ,
461
+ },
462
+ },
463
+ {
464
+ NUMAID : 2 ,
465
+ Resources : v1.ResourceList {
466
+ gpuResource : resource .MustParse ("0" ),
467
+ v1 .ResourceCPU : * resource .NewQuantity (4 , resource .DecimalSI ),
468
+ v1 .ResourceMemory : resource .MustParse ("5Gi" ),
469
+ },
470
+ Costs : map [int ]int {
471
+ 0 : 12 ,
472
+ 2 : 10 ,
473
+ 4 : 20 ,
474
+ 6 : 20 ,
475
+ },
476
+ },
477
+ {
478
+ NUMAID : 4 ,
479
+ Resources : v1.ResourceList {
480
+ gpuResource : resource .MustParse ("0" ),
481
+ v1 .ResourceCPU : * resource .NewQuantity (4 , resource .DecimalSI ),
482
+ v1 .ResourceMemory : resource .MustParse ("5Gi" ),
483
+ },
484
+ Costs : map [int ]int {
485
+ 0 : 20 ,
486
+ 2 : 20 ,
487
+ 4 : 10 ,
488
+ 6 : 12 ,
489
+ },
490
+ },
491
+ {
492
+ NUMAID : 6 ,
493
+ Resources : v1.ResourceList {
494
+ gpuResource : resource .MustParse ("1" ),
495
+ v1 .ResourceCPU : * resource .NewQuantity (4 , resource .DecimalSI ),
496
+ v1 .ResourceMemory : resource .MustParse ("5Gi" ),
497
+ },
498
+ Costs : map [int ]int {
499
+ 0 : 20 ,
500
+ 2 : 20 ,
501
+ 4 : 12 ,
502
+ 6 : 10 ,
503
+ },
504
+ },
505
+ },
506
+ podResources : v1.ResourceList {
507
+ v1 .ResourceCPU : * resource .NewQuantity (2 , resource .DecimalSI ),
508
+ v1 .ResourceMemory : resource .MustParse ("2Gi" ),
509
+ gpuResource : resource .MustParse ("2" ),
510
+ },
511
+ node : node ,
512
+ expectedBitmask : NewTestBitmask (0 , 6 ),
513
+ expectedErr : nil ,
514
+ expectedMinDistance : false ,
515
+ },
274
516
}
275
517
276
518
for _ , tc := range testCases {
0 commit comments