@@ -689,6 +689,184 @@ var _ = AdmissionControllerE2eDescribe("Admission-controller", func() {
689689 }
690690 })
691691
692+ ginkgo .It ("raises cpu requests and limits according to pod min limit set in LimitRange" , func () {
693+ d := utils .NewNHamstersDeployment (f , 3 )
694+
695+ d .Spec .Template .Spec .Containers [0 ].Resources .Requests = apiv1.ResourceList {
696+ apiv1 .ResourceCPU : ParseQuantityOrDie ("1m" ),
697+ apiv1 .ResourceMemory : ParseQuantityOrDie ("100Mi" ),
698+ }
699+ d .Spec .Template .Spec .Containers [0 ].Resources .Limits = apiv1.ResourceList {
700+ apiv1 .ResourceCPU : ParseQuantityOrDie ("1m" ),
701+ apiv1 .ResourceMemory : ParseQuantityOrDie ("100Mi" ),
702+ }
703+ d .Spec .Template .Spec .Containers [1 ].Resources .Requests = apiv1.ResourceList {
704+ apiv1 .ResourceCPU : ParseQuantityOrDie ("1m" ),
705+ apiv1 .ResourceMemory : ParseQuantityOrDie ("100Mi" ),
706+ }
707+ d .Spec .Template .Spec .Containers [1 ].Resources .Limits = apiv1.ResourceList {
708+ apiv1 .ResourceCPU : ParseQuantityOrDie ("1m" ),
709+ apiv1 .ResourceMemory : ParseQuantityOrDie ("100Mi" ),
710+ }
711+ d .Spec .Template .Spec .Containers [2 ].Resources .Requests = apiv1.ResourceList {
712+ apiv1 .ResourceCPU : ParseQuantityOrDie ("1m" ),
713+ apiv1 .ResourceMemory : ParseQuantityOrDie ("100Mi" ),
714+ }
715+ d .Spec .Template .Spec .Containers [2 ].Resources .Limits = apiv1.ResourceList {
716+ apiv1 .ResourceCPU : ParseQuantityOrDie ("1m" ),
717+ apiv1 .ResourceMemory : ParseQuantityOrDie ("100Mi" ),
718+ }
719+
720+ container1Name := utils .GetHamsterContainerNameByIndex (0 )
721+ container2Name := utils .GetHamsterContainerNameByIndex (1 )
722+ container3Name := utils .GetHamsterContainerNameByIndex (2 )
723+
724+ ginkgo .By ("Setting up a VPA CRD" )
725+ vpaCRD := test .VerticalPodAutoscaler ().
726+ WithName ("hamster-vpa" ).
727+ WithNamespace (f .Namespace .Name ).
728+ WithTargetRef (utils .HamsterTargetRef ).
729+ WithContainer (container1Name ).
730+ AppendRecommendation (
731+ test .Recommendation ().
732+ WithContainer (container1Name ).
733+ WithTarget ("4m" , "100Mi" ).
734+ WithLowerBound ("4m" , "100Mi" ).
735+ WithUpperBound ("4m" , "100Mi" ).
736+ GetContainerResources ()).
737+ WithContainer (container2Name ).
738+ AppendRecommendation (
739+ test .Recommendation ().
740+ WithContainer (container2Name ).
741+ WithTarget ("21m" , "100Mi" ).
742+ WithLowerBound ("21m" , "100Mi" ).
743+ WithUpperBound ("21m" , "100Mi" ).
744+ GetContainerResources ()).
745+ WithContainer (container3Name ).
746+ AppendRecommendation (
747+ test .Recommendation ().
748+ WithContainer (container3Name ).
749+ WithTarget ("90m" , "100Mi" ).
750+ WithLowerBound ("90m" , "100Mi" ).
751+ WithUpperBound ("90m" , "100Mi" ).
752+ GetContainerResources ()).
753+ Get ()
754+
755+ utils .InstallVPA (f , vpaCRD )
756+
757+ minCpu := ParseQuantityOrDie ("150m" )
758+ installLimitRange (f , & minCpu , nil , nil , nil , apiv1 .LimitTypePod )
759+
760+ ginkgo .By ("Setting up a hamster deployment" )
761+ podList := utils .StartDeploymentPods (f , d )
762+
763+ expectedRequestsLimits := map [string ]string {
764+ container1Name : "6m" , // ceil((4*150)/115) = ceil(5.22) = 6; for more details check PR #8946
765+ container2Name : "28m" , // ceil((21*150)/115)
766+ container3Name : "118m" , // ceil((90*150)/115)
767+ }
768+
769+ for _ , pod := range podList .Items {
770+ for _ , container := range pod .Spec .Containers {
771+ gomega .Expect (* container .Resources .Requests .Cpu ()).To (gomega .Equal (ParseQuantityOrDie (expectedRequestsLimits [container .Name ])))
772+ gomega .Expect (* container .Resources .Requests .Memory ()).To (gomega .Equal (ParseQuantityOrDie ("100Mi" )))
773+ gomega .Expect (* container .Resources .Limits .Cpu ()).To (gomega .Equal (ParseQuantityOrDie (expectedRequestsLimits [container .Name ])))
774+ gomega .Expect (* container .Resources .Limits .Memory ()).To (gomega .Equal (ParseQuantityOrDie ("100Mi" )))
775+ gomega .Expect (float64 (container .Resources .Limits .Cpu ().MilliValue ()) / float64 (container .Resources .Requests .Cpu ().MilliValue ())).To (gomega .BeNumerically ("~" , 1 ))
776+ gomega .Expect (float64 (container .Resources .Limits .Memory ().Value ()) / float64 (container .Resources .Requests .Memory ().Value ())).To (gomega .BeNumerically ("~" , 1 ))
777+ }
778+ }
779+ })
780+
781+ ginkgo .It ("caps cpu requests and limits according to pod max limit set in LimitRange" , func () {
782+ d := utils .NewNHamstersDeployment (f , 3 )
783+
784+ d .Spec .Template .Spec .Containers [0 ].Resources .Requests = apiv1.ResourceList {
785+ apiv1 .ResourceCPU : ParseQuantityOrDie ("1m" ),
786+ apiv1 .ResourceMemory : ParseQuantityOrDie ("100Mi" ),
787+ }
788+ d .Spec .Template .Spec .Containers [0 ].Resources .Limits = apiv1.ResourceList {
789+ apiv1 .ResourceCPU : ParseQuantityOrDie ("1m" ),
790+ apiv1 .ResourceMemory : ParseQuantityOrDie ("100Mi" ),
791+ }
792+ d .Spec .Template .Spec .Containers [1 ].Resources .Requests = apiv1.ResourceList {
793+ apiv1 .ResourceCPU : ParseQuantityOrDie ("1m" ),
794+ apiv1 .ResourceMemory : ParseQuantityOrDie ("100Mi" ),
795+ }
796+ d .Spec .Template .Spec .Containers [1 ].Resources .Limits = apiv1.ResourceList {
797+ apiv1 .ResourceCPU : ParseQuantityOrDie ("1m" ),
798+ apiv1 .ResourceMemory : ParseQuantityOrDie ("100Mi" ),
799+ }
800+ d .Spec .Template .Spec .Containers [2 ].Resources .Requests = apiv1.ResourceList {
801+ apiv1 .ResourceCPU : ParseQuantityOrDie ("1m" ),
802+ apiv1 .ResourceMemory : ParseQuantityOrDie ("100Mi" ),
803+ }
804+ d .Spec .Template .Spec .Containers [2 ].Resources .Limits = apiv1.ResourceList {
805+ apiv1 .ResourceCPU : ParseQuantityOrDie ("1m" ),
806+ apiv1 .ResourceMemory : ParseQuantityOrDie ("100Mi" ),
807+ }
808+
809+ container1Name := utils .GetHamsterContainerNameByIndex (0 )
810+ container2Name := utils .GetHamsterContainerNameByIndex (1 )
811+ container3Name := utils .GetHamsterContainerNameByIndex (2 )
812+
813+ ginkgo .By ("Setting up a VPA CRD" )
814+ vpaCRD := test .VerticalPodAutoscaler ().
815+ WithName ("hamster-vpa" ).
816+ WithNamespace (f .Namespace .Name ).
817+ WithTargetRef (utils .HamsterTargetRef ).
818+ WithContainer (container1Name ).
819+ AppendRecommendation (
820+ test .Recommendation ().
821+ WithContainer (container1Name ).
822+ WithTarget ("4m" , "100Mi" ).
823+ WithLowerBound ("4m" , "100Mi" ).
824+ WithUpperBound ("4m" , "100Mi" ).
825+ GetContainerResources ()).
826+ WithContainer (container2Name ).
827+ AppendRecommendation (
828+ test .Recommendation ().
829+ WithContainer (container2Name ).
830+ WithTarget ("21m" , "100Mi" ).
831+ WithLowerBound ("21m" , "100Mi" ).
832+ WithUpperBound ("21m" , "100Mi" ).
833+ GetContainerResources ()).
834+ WithContainer (container3Name ).
835+ AppendRecommendation (
836+ test .Recommendation ().
837+ WithContainer (container3Name ).
838+ WithTarget ("90m" , "100Mi" ).
839+ WithLowerBound ("90m" , "100Mi" ).
840+ WithUpperBound ("90m" , "100Mi" ).
841+ GetContainerResources ()).
842+ Get ()
843+
844+ utils .InstallVPA (f , vpaCRD )
845+
846+ maxCpu := ParseQuantityOrDie ("80m" )
847+ installLimitRange (f , nil , nil , & maxCpu , nil , apiv1 .LimitTypePod )
848+
849+ ginkgo .By ("Setting up a hamster deployment" )
850+ podList := utils .StartDeploymentPods (f , d )
851+
852+ expectedRequestsLimits := map [string ]string {
853+ container1Name : "2m" , // floor((4*80)/115), for more details check PR #8946
854+ container2Name : "14m" , // floor((21*80)/115)
855+ container3Name : "62m" , // floor((90*80)/115)
856+ }
857+
858+ for _ , pod := range podList .Items {
859+ for _ , container := range pod .Spec .Containers {
860+ gomega .Expect (* container .Resources .Requests .Cpu ()).To (gomega .Equal (ParseQuantityOrDie (expectedRequestsLimits [container .Name ])))
861+ gomega .Expect (* container .Resources .Requests .Memory ()).To (gomega .Equal (ParseQuantityOrDie ("100Mi" )))
862+ gomega .Expect (* container .Resources .Limits .Cpu ()).To (gomega .Equal (ParseQuantityOrDie (expectedRequestsLimits [container .Name ])))
863+ gomega .Expect (* container .Resources .Limits .Memory ()).To (gomega .Equal (ParseQuantityOrDie ("100Mi" )))
864+ gomega .Expect (float64 (container .Resources .Limits .Cpu ().MilliValue ()) / float64 (container .Resources .Requests .Cpu ().MilliValue ())).To (gomega .BeNumerically ("~" , 1 ))
865+ gomega .Expect (float64 (container .Resources .Limits .Memory ().Value ()) / float64 (container .Resources .Requests .Memory ().Value ())).To (gomega .BeNumerically ("~" , 1 ))
866+ }
867+ }
868+ })
869+
692870 ginkgo .It ("raises request according to pod min limit set in LimitRange" , func () {
693871 d := NewHamsterDeploymentWithResourcesAndLimits (f ,
694872 ParseQuantityOrDie ("100m" ) /*cpu request*/ , ParseQuantityOrDie ("200Mi" ), /*memory request*/
0 commit comments