@@ -42,9 +42,10 @@ import (
42
42
43
43
func TestPodConstraintsFunc (t * testing.T ) {
44
44
testCases := map [string ]struct {
45
- pod * api.Pod
46
- required []corev1.ResourceName
47
- err string
45
+ pod * api.Pod
46
+ required []corev1.ResourceName
47
+ err string
48
+ podLevelResourcesEnabled bool
48
49
}{
49
50
"init container resource missing" : {
50
51
pod : & api.Pod {
@@ -133,9 +134,30 @@ func TestPodConstraintsFunc(t *testing.T) {
133
134
required : []corev1.ResourceName {corev1 .ResourceMemory , corev1 .ResourceCPU },
134
135
err : `must specify cpu for: bar,foo; memory for: bar,foo` ,
135
136
},
137
+ "pod-level resource set, container-level required resources missing" : {
138
+ pod : & api.Pod {
139
+ Spec : api.PodSpec {
140
+ Resources : & api.ResourceRequirements {
141
+ Requests : api.ResourceList {api .ResourceCPU : resource .MustParse ("1m" )},
142
+ },
143
+ Containers : []api.Container {{
144
+ Name : "foo" ,
145
+ Resources : api.ResourceRequirements {},
146
+ }, {
147
+ Name : "bar" ,
148
+ Resources : api.ResourceRequirements {},
149
+ }},
150
+ },
151
+ },
152
+ required : []corev1.ResourceName {corev1 .ResourceMemory , corev1 .ResourceCPU },
153
+ podLevelResourcesEnabled : true ,
154
+ err : `` ,
155
+ },
136
156
}
137
157
evaluator := NewPodEvaluator (nil , clock.RealClock {})
138
158
for testName , test := range testCases {
159
+ featuregatetesting .SetFeatureGateDuringTest (t , utilfeature .DefaultFeatureGate , features .PodLevelResources , test .podLevelResourcesEnabled )
160
+
139
161
err := evaluator .Constraints (test .required , test .pod )
140
162
switch {
141
163
case err != nil && len (test .err ) == 0 ,
@@ -158,8 +180,9 @@ func TestPodEvaluatorUsage(t *testing.T) {
158
180
deletionTimestampNotPastGracePeriod := metav1 .NewTime (fakeClock .Now ())
159
181
160
182
testCases := map [string ]struct {
161
- pod * api.Pod
162
- usage corev1.ResourceList
183
+ pod * api.Pod
184
+ usage corev1.ResourceList
185
+ podLevelResourcesEnabled bool
163
186
}{
164
187
"init container CPU" : {
165
188
pod : & api.Pod {
@@ -529,10 +552,74 @@ func TestPodEvaluatorUsage(t *testing.T) {
529
552
generic .ObjectCountQuotaResourceNameFor (schema.GroupResource {Resource : "pods" }): resource .MustParse ("1" ),
530
553
},
531
554
},
555
+ "pod-level CPU" : {
556
+ pod : & api.Pod {
557
+ Spec : api.PodSpec {
558
+ Resources : & api.ResourceRequirements {
559
+ Requests : api.ResourceList {api .ResourceCPU : resource .MustParse ("1m" )},
560
+ Limits : api.ResourceList {api .ResourceCPU : resource .MustParse ("2m" )},
561
+ },
562
+ },
563
+ },
564
+ podLevelResourcesEnabled : true ,
565
+ usage : corev1.ResourceList {
566
+ corev1 .ResourceRequestsCPU : resource .MustParse ("1m" ),
567
+ corev1 .ResourceLimitsCPU : resource .MustParse ("2m" ),
568
+ corev1 .ResourcePods : resource .MustParse ("1" ),
569
+ corev1 .ResourceCPU : resource .MustParse ("1m" ),
570
+ generic .ObjectCountQuotaResourceNameFor (schema.GroupResource {Resource : "pods" }): resource .MustParse ("1" ),
571
+ },
572
+ },
573
+ "pod-level Memory" : {
574
+ pod : & api.Pod {
575
+ Spec : api.PodSpec {
576
+ Resources : & api.ResourceRequirements {
577
+ Requests : api.ResourceList {api .ResourceMemory : resource .MustParse ("1Mi" )},
578
+ Limits : api.ResourceList {api .ResourceMemory : resource .MustParse ("2Mi" )},
579
+ },
580
+ },
581
+ },
582
+ podLevelResourcesEnabled : true ,
583
+ usage : corev1.ResourceList {
584
+ corev1 .ResourceRequestsMemory : resource .MustParse ("1Mi" ),
585
+ corev1 .ResourceLimitsMemory : resource .MustParse ("2Mi" ),
586
+ corev1 .ResourcePods : resource .MustParse ("1" ),
587
+ corev1 .ResourceMemory : resource .MustParse ("1Mi" ),
588
+ generic .ObjectCountQuotaResourceNameFor (schema.GroupResource {Resource : "pods" }): resource .MustParse ("1" ),
589
+ },
590
+ },
591
+ "pod-level memory with container-level ephemeral storage" : {
592
+ pod : & api.Pod {
593
+ Spec : api.PodSpec {
594
+ Resources : & api.ResourceRequirements {
595
+ Requests : api.ResourceList {api .ResourceMemory : resource .MustParse ("1Mi" )},
596
+ Limits : api.ResourceList {api .ResourceMemory : resource .MustParse ("2Mi" )},
597
+ },
598
+ Containers : []api.Container {{
599
+ Resources : api.ResourceRequirements {
600
+ Requests : api.ResourceList {api .ResourceEphemeralStorage : resource .MustParse ("32Mi" )},
601
+ Limits : api.ResourceList {api .ResourceEphemeralStorage : resource .MustParse ("64Mi" )},
602
+ },
603
+ }},
604
+ },
605
+ },
606
+ podLevelResourcesEnabled : true ,
607
+ usage : corev1.ResourceList {
608
+ corev1 .ResourceEphemeralStorage : resource .MustParse ("32Mi" ),
609
+ corev1 .ResourceRequestsEphemeralStorage : resource .MustParse ("32Mi" ),
610
+ corev1 .ResourceLimitsEphemeralStorage : resource .MustParse ("64Mi" ),
611
+ corev1 .ResourcePods : resource .MustParse ("1" ),
612
+ corev1 .ResourceRequestsMemory : resource .MustParse ("1Mi" ),
613
+ corev1 .ResourceLimitsMemory : resource .MustParse ("2Mi" ),
614
+ corev1 .ResourceMemory : resource .MustParse ("1Mi" ),
615
+ generic .ObjectCountQuotaResourceNameFor (schema.GroupResource {Resource : "pods" }): resource .MustParse ("1" ),
616
+ },
617
+ },
532
618
}
533
619
t .Parallel ()
534
620
for testName , testCase := range testCases {
535
621
t .Run (testName , func (t * testing.T ) {
622
+ featuregatetesting .SetFeatureGateDuringTest (t , utilfeature .DefaultFeatureGate , features .PodLevelResources , testCase .podLevelResourcesEnabled )
536
623
actual , err := evaluator .Usage (testCase .pod )
537
624
if err != nil {
538
625
t .Error (err )
0 commit comments