@@ -22,7 +22,11 @@ import (
22
22
"github.com/stretchr/testify/assert"
23
23
24
24
"k8s.io/api/core/v1"
25
+ "k8s.io/apimachinery/pkg/api/equality"
25
26
"k8s.io/apimachinery/pkg/api/resource"
27
+ utilfeature "k8s.io/apiserver/pkg/util/feature"
28
+ featuregatetesting "k8s.io/component-base/featuregate/testing"
29
+ "k8s.io/kubernetes/pkg/features"
26
30
)
27
31
28
32
func TestResourceHelpers (t * testing.T ) {
@@ -64,27 +68,53 @@ func TestDefaultResourceHelpers(t *testing.T) {
64
68
}
65
69
66
70
func TestGetResourceRequest (t * testing.T ) {
71
+ defer featuregatetesting .SetFeatureGateDuringTest (t , utilfeature .DefaultFeatureGate , features .PodOverhead , true )()
72
+
67
73
cases := []struct {
68
74
pod * v1.Pod
69
- res v1.ResourceName
75
+ cName string
76
+ resourceName v1.ResourceName
70
77
expectedValue int64
71
- expectedError error
72
78
}{
73
79
{
74
80
pod : getPod ("foo" , podResources {cpuRequest : "9" }),
75
- res : v1 .ResourceCPU ,
81
+ resourceName : v1 .ResourceCPU ,
76
82
expectedValue : 9000 ,
77
83
},
78
84
{
79
85
pod : getPod ("foo" , podResources {memoryRequest : "90Mi" }),
80
- res : v1 .ResourceMemory ,
86
+ resourceName : v1 .ResourceMemory ,
81
87
expectedValue : 94371840 ,
82
88
},
89
+ {
90
+ cName : "just-overhead for cpu" ,
91
+ pod : getPod ("foo" , podResources {cpuOverhead : "5" , memoryOverhead : "5" }),
92
+ resourceName : v1 .ResourceCPU ,
93
+ expectedValue : 0 ,
94
+ },
95
+ {
96
+ cName : "just-overhead for memory" ,
97
+ pod : getPod ("foo" , podResources {memoryOverhead : "5" }),
98
+ resourceName : v1 .ResourceMemory ,
99
+ expectedValue : 0 ,
100
+ },
101
+ {
102
+ cName : "cpu overhead and req" ,
103
+ pod : getPod ("foo" , podResources {cpuRequest : "2" , cpuOverhead : "5" , memoryOverhead : "5" }),
104
+ resourceName : v1 .ResourceCPU ,
105
+ expectedValue : 7000 ,
106
+ },
107
+ {
108
+ cName : "mem overhead and req" ,
109
+ pod : getPod ("foo" , podResources {cpuRequest : "2" , memoryRequest : "1024" , cpuOverhead : "5" , memoryOverhead : "5" }),
110
+ resourceName : v1 .ResourceMemory ,
111
+ expectedValue : 1029 ,
112
+ },
83
113
}
84
114
as := assert .New (t )
85
115
for idx , tc := range cases {
86
- actual := GetResourceRequest (tc .pod , tc .res )
87
- as .Equal (actual , tc .expectedValue , "expected test case [%d] to return %q; got %q instead" , idx , tc .expectedValue , actual )
116
+ actual := GetResourceRequest (tc .pod , tc .resourceName )
117
+ as .Equal (actual , tc .expectedValue , "expected test case [%d] %v: to return %q; got %q instead" , idx , tc . cName , tc .expectedValue , actual )
88
118
}
89
119
}
90
120
@@ -242,6 +272,78 @@ func TestExtractResourceValue(t *testing.T) {
242
272
}
243
273
}
244
274
275
+ func TestPodRequestsAndLimits (t * testing.T ) {
276
+ defer featuregatetesting .SetFeatureGateDuringTest (t , utilfeature .DefaultFeatureGate , features .PodOverhead , true )()
277
+
278
+ cases := []struct {
279
+ pod * v1.Pod
280
+ cName string
281
+ expectedRequests v1.ResourceList
282
+ expectedLimits v1.ResourceList
283
+ }{
284
+ {
285
+ cName : "just-limit-no-overhead" ,
286
+ pod : getPod ("foo" , podResources {cpuLimit : "9" }),
287
+ expectedRequests : v1.ResourceList {},
288
+ expectedLimits : v1.ResourceList {
289
+ v1 .ResourceName (v1 .ResourceCPU ): resource .MustParse ("9" ),
290
+ },
291
+ },
292
+ {
293
+ cName : "just-overhead" ,
294
+ pod : getPod ("foo" , podResources {cpuOverhead : "5" , memoryOverhead : "5" }),
295
+ expectedRequests : v1.ResourceList {
296
+ v1 .ResourceName (v1 .ResourceCPU ): resource .MustParse ("5" ),
297
+ v1 .ResourceName (v1 .ResourceMemory ): resource .MustParse ("5" ),
298
+ },
299
+ expectedLimits : v1.ResourceList {},
300
+ },
301
+ {
302
+ cName : "req-and-overhead" ,
303
+ pod : getPod ("foo" , podResources {cpuRequest : "1" , memoryRequest : "10" , cpuOverhead : "5" , memoryOverhead : "5" }),
304
+ expectedRequests : v1.ResourceList {
305
+ v1 .ResourceName (v1 .ResourceCPU ): resource .MustParse ("6" ),
306
+ v1 .ResourceName (v1 .ResourceMemory ): resource .MustParse ("15" ),
307
+ },
308
+ expectedLimits : v1.ResourceList {},
309
+ },
310
+ {
311
+ cName : "all-req-lim-and-overhead" ,
312
+ pod : getPod ("foo" , podResources {cpuRequest : "1" , cpuLimit : "2" , memoryRequest : "10" , memoryLimit : "12" , cpuOverhead : "5" , memoryOverhead : "5" }),
313
+ expectedRequests : v1.ResourceList {
314
+ v1 .ResourceName (v1 .ResourceCPU ): resource .MustParse ("6" ),
315
+ v1 .ResourceName (v1 .ResourceMemory ): resource .MustParse ("15" ),
316
+ },
317
+ expectedLimits : v1.ResourceList {
318
+ v1 .ResourceName (v1 .ResourceCPU ): resource .MustParse ("7" ),
319
+ v1 .ResourceName (v1 .ResourceMemory ): resource .MustParse ("17" ),
320
+ },
321
+ },
322
+ {
323
+ cName : "req-some-lim-and-overhead" ,
324
+ pod : getPod ("foo" , podResources {cpuRequest : "1" , cpuLimit : "2" , memoryRequest : "10" , cpuOverhead : "5" , memoryOverhead : "5" }),
325
+ expectedRequests : v1.ResourceList {
326
+ v1 .ResourceName (v1 .ResourceCPU ): resource .MustParse ("6" ),
327
+ v1 .ResourceName (v1 .ResourceMemory ): resource .MustParse ("15" ),
328
+ },
329
+ expectedLimits : v1.ResourceList {
330
+ v1 .ResourceName (v1 .ResourceCPU ): resource .MustParse ("7" ),
331
+ },
332
+ },
333
+ }
334
+ for idx , tc := range cases {
335
+ resRequests , resLimits := PodRequestsAndLimits (tc .pod )
336
+
337
+ if ! equality .Semantic .DeepEqual (tc .expectedRequests , resRequests ) {
338
+ t .Errorf ("test case failure[%d]: %v, requests:\n expected:\t %v\n got\t \t %v" , idx , tc .cName , tc .expectedRequests , resRequests )
339
+ }
340
+
341
+ if ! equality .Semantic .DeepEqual (tc .expectedLimits , resLimits ) {
342
+ t .Errorf ("test case failure[%d]: %v, limits:\n expected:\t %v\n got\t \t %v" , idx , tc .cName , tc .expectedLimits , resLimits )
343
+ }
344
+ }
345
+ }
346
+
245
347
type podResources struct {
246
348
cpuRequest , cpuLimit , memoryRequest , memoryLimit , cpuOverhead , memoryOverhead string
247
349
}
@@ -251,6 +353,9 @@ func getPod(cname string, resources podResources) *v1.Pod {
251
353
Limits : make (v1.ResourceList ),
252
354
Requests : make (v1.ResourceList ),
253
355
}
356
+
357
+ overhead := make (v1.ResourceList )
358
+
254
359
if resources .cpuLimit != "" {
255
360
r .Limits [v1 .ResourceCPU ] = resource .MustParse (resources .cpuLimit )
256
361
}
@@ -263,6 +368,13 @@ func getPod(cname string, resources podResources) *v1.Pod {
263
368
if resources .memoryRequest != "" {
264
369
r .Requests [v1 .ResourceMemory ] = resource .MustParse (resources .memoryRequest )
265
370
}
371
+ if resources .cpuOverhead != "" {
372
+ overhead [v1 .ResourceCPU ] = resource .MustParse (resources .cpuOverhead )
373
+ }
374
+ if resources .memoryOverhead != "" {
375
+ overhead [v1 .ResourceMemory ] = resource .MustParse (resources .memoryOverhead )
376
+ }
377
+
266
378
return & v1.Pod {
267
379
Spec : v1.PodSpec {
268
380
Containers : []v1.Container {
@@ -277,6 +389,7 @@ func getPod(cname string, resources podResources) *v1.Pod {
277
389
Resources : r ,
278
390
},
279
391
},
392
+ Overhead : overhead ,
280
393
},
281
394
}
282
395
}
0 commit comments