@@ -24,6 +24,7 @@ import (
24
24
"github.com/stretchr/testify/require"
25
25
26
26
v1 "k8s.io/api/core/v1"
27
+ "k8s.io/apimachinery/pkg/api/resource"
27
28
utilfeature "k8s.io/apiserver/pkg/util/feature"
28
29
featuregatetesting "k8s.io/component-base/featuregate/testing"
29
30
runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1"
@@ -494,3 +495,230 @@ func TestQuotaToMilliCPU(t *testing.T) {
494
495
})
495
496
}
496
497
}
498
+
499
+ func TestSubtractOverheadFromResourceConfig (t * testing.T ) {
500
+ podCPUMilli := resource .MustParse ("200m" )
501
+ podMemory := resource .MustParse ("256Mi" )
502
+ podOverheadCPUMilli := resource .MustParse ("100m" )
503
+ podOverheadMemory := resource .MustParse ("64Mi" )
504
+
505
+ resCfg := & cm.ResourceConfig {
506
+ Memory : int64Ptr (335544320 ),
507
+ CPUShares : uint64Ptr (306 ),
508
+ CPUPeriod : uint64Ptr (100000 ),
509
+ CPUQuota : int64Ptr (30000 ),
510
+ }
511
+
512
+ for _ , tc := range []struct {
513
+ name string
514
+ cfgInput * cm.ResourceConfig
515
+ pod * v1.Pod
516
+ expected * cm.ResourceConfig
517
+ }{
518
+ {
519
+ name : "withoutOverhead" ,
520
+ cfgInput : resCfg ,
521
+ pod : & v1.Pod {
522
+ Spec : v1.PodSpec {
523
+ Containers : []v1.Container {
524
+ {
525
+ Name : "foo" ,
526
+ Resources : v1.ResourceRequirements {
527
+ Requests : v1.ResourceList {
528
+ v1 .ResourceCPU : podCPUMilli ,
529
+ },
530
+ Limits : v1.ResourceList {
531
+ v1 .ResourceCPU : podCPUMilli ,
532
+ v1 .ResourceMemory : podMemory ,
533
+ },
534
+ },
535
+ },
536
+ },
537
+ },
538
+ },
539
+ expected : & cm.ResourceConfig {
540
+ Memory : int64Ptr (335544320 ),
541
+ CPUShares : uint64Ptr (306 ),
542
+ CPUPeriod : uint64Ptr (100000 ),
543
+ CPUQuota : int64Ptr (30000 ),
544
+ },
545
+ },
546
+ {
547
+ name : "withoutCPUOverhead" ,
548
+ cfgInput : resCfg ,
549
+ pod : & v1.Pod {
550
+ Spec : v1.PodSpec {
551
+ Containers : []v1.Container {
552
+ {
553
+ Name : "foo" ,
554
+ Resources : v1.ResourceRequirements {
555
+ Requests : v1.ResourceList {
556
+ v1 .ResourceCPU : podCPUMilli ,
557
+ },
558
+ Limits : v1.ResourceList {
559
+ v1 .ResourceCPU : podCPUMilli ,
560
+ v1 .ResourceMemory : podMemory ,
561
+ },
562
+ },
563
+ },
564
+ },
565
+ Overhead : v1.ResourceList {
566
+ v1 .ResourceMemory : podOverheadMemory ,
567
+ },
568
+ },
569
+ },
570
+ expected : & cm.ResourceConfig {
571
+ Memory : int64Ptr (268435456 ),
572
+ CPUShares : uint64Ptr (306 ),
573
+ CPUPeriod : uint64Ptr (100000 ),
574
+ CPUQuota : int64Ptr (30000 ),
575
+ },
576
+ },
577
+ {
578
+ name : "withoutMemoryOverhead" ,
579
+ cfgInput : resCfg ,
580
+ pod : & v1.Pod {
581
+ Spec : v1.PodSpec {
582
+ Containers : []v1.Container {
583
+ {
584
+ Name : "foo" ,
585
+ Resources : v1.ResourceRequirements {
586
+ Requests : v1.ResourceList {
587
+ v1 .ResourceCPU : podCPUMilli ,
588
+ },
589
+ Limits : v1.ResourceList {
590
+ v1 .ResourceCPU : podCPUMilli ,
591
+ v1 .ResourceMemory : podMemory ,
592
+ },
593
+ },
594
+ },
595
+ },
596
+ Overhead : v1.ResourceList {
597
+ v1 .ResourceCPU : podOverheadCPUMilli ,
598
+ },
599
+ },
600
+ },
601
+ expected : & cm.ResourceConfig {
602
+ Memory : int64Ptr (335544320 ),
603
+ CPUShares : uint64Ptr (203 ),
604
+ CPUPeriod : uint64Ptr (100000 ),
605
+ CPUQuota : int64Ptr (20000 ),
606
+ },
607
+ },
608
+ {
609
+ name : "withoutCPUPeriod" ,
610
+ cfgInput : & cm.ResourceConfig {
611
+ Memory : int64Ptr (335544320 ),
612
+ CPUShares : uint64Ptr (306 ),
613
+ },
614
+ pod : & v1.Pod {
615
+ Spec : v1.PodSpec {
616
+ Containers : []v1.Container {
617
+ {
618
+ Name : "foo" ,
619
+ Resources : v1.ResourceRequirements {
620
+ Requests : v1.ResourceList {
621
+ v1 .ResourceCPU : podCPUMilli ,
622
+ },
623
+ Limits : v1.ResourceList {
624
+ v1 .ResourceCPU : podCPUMilli ,
625
+ v1 .ResourceMemory : podMemory ,
626
+ },
627
+ },
628
+ },
629
+ },
630
+ Overhead : v1.ResourceList {
631
+ v1 .ResourceCPU : podOverheadCPUMilli ,
632
+ },
633
+ },
634
+ },
635
+ expected : & cm.ResourceConfig {
636
+ Memory : int64Ptr (335544320 ),
637
+ CPUShares : uint64Ptr (203 ),
638
+ },
639
+ },
640
+ {
641
+ name : "withoutCPUShares" ,
642
+ cfgInput : & cm.ResourceConfig {
643
+ Memory : int64Ptr (335544320 ),
644
+ CPUPeriod : uint64Ptr (100000 ),
645
+ CPUQuota : int64Ptr (30000 ),
646
+ },
647
+ pod : & v1.Pod {
648
+ Spec : v1.PodSpec {
649
+ Containers : []v1.Container {
650
+ {
651
+ Name : "foo" ,
652
+ Resources : v1.ResourceRequirements {
653
+ Requests : v1.ResourceList {
654
+ v1 .ResourceCPU : podCPUMilli ,
655
+ },
656
+ Limits : v1.ResourceList {
657
+ v1 .ResourceCPU : podCPUMilli ,
658
+ v1 .ResourceMemory : podMemory ,
659
+ },
660
+ },
661
+ },
662
+ },
663
+ Overhead : v1.ResourceList {
664
+ v1 .ResourceCPU : podOverheadCPUMilli ,
665
+ },
666
+ },
667
+ },
668
+ expected : & cm.ResourceConfig {
669
+ Memory : int64Ptr (335544320 ),
670
+ CPUPeriod : uint64Ptr (100000 ),
671
+ CPUQuota : int64Ptr (20000 ),
672
+ },
673
+ },
674
+ {
675
+ name : "withOverhead" ,
676
+ cfgInput : resCfg ,
677
+ pod : & v1.Pod {
678
+ Spec : v1.PodSpec {
679
+ Containers : []v1.Container {
680
+ {
681
+ Name : "foo" ,
682
+ Resources : v1.ResourceRequirements {
683
+ Requests : v1.ResourceList {
684
+ v1 .ResourceCPU : podCPUMilli ,
685
+ },
686
+ Limits : v1.ResourceList {
687
+ v1 .ResourceCPU : podCPUMilli ,
688
+ v1 .ResourceMemory : podMemory ,
689
+ },
690
+ },
691
+ },
692
+ },
693
+ Overhead : v1.ResourceList {
694
+ v1 .ResourceCPU : podOverheadCPUMilli ,
695
+ v1 .ResourceMemory : podOverheadMemory ,
696
+ },
697
+ },
698
+ },
699
+ expected : & cm.ResourceConfig {
700
+ Memory : int64Ptr (268435456 ),
701
+ CPUShares : uint64Ptr (203 ),
702
+ CPUPeriod : uint64Ptr (100000 ),
703
+ CPUQuota : int64Ptr (20000 ),
704
+ },
705
+ },
706
+ } {
707
+ t .Run (tc .name , func (t * testing.T ) {
708
+ gotCfg := subtractOverheadFromResourceConfig (tc .cfgInput , tc .pod )
709
+
710
+ if tc .expected .CPUPeriod != nil && * gotCfg .CPUPeriod != * tc .expected .CPUPeriod {
711
+ t .Errorf ("Test %s: expected CPUPeriod %v, but got %v" , tc .name , * tc .expected .CPUPeriod , * gotCfg .CPUPeriod )
712
+ }
713
+ if tc .expected .CPUQuota != nil && * gotCfg .CPUQuota != * tc .expected .CPUQuota {
714
+ t .Errorf ("Test %s: expected CPUQuota %v, but got %v" , tc .name , * tc .expected .CPUQuota , * gotCfg .CPUQuota )
715
+ }
716
+ if tc .expected .CPUShares != nil && * gotCfg .CPUShares != * tc .expected .CPUShares {
717
+ t .Errorf ("Test %s: expected CPUShares %v, but got %v" , tc .name , * tc .expected .CPUShares , * gotCfg .CPUShares )
718
+ }
719
+ if tc .expected .Memory != nil && * gotCfg .Memory != * tc .expected .Memory {
720
+ t .Errorf ("Test %s: expected Memory %v, but got %v" , tc .name , * tc .expected .Memory , * gotCfg .Memory )
721
+ }
722
+ })
723
+ }
724
+ }
0 commit comments