@@ -19,12 +19,16 @@ limitations under the License.
19
19
package kuberuntime
20
20
21
21
import (
22
+ "reflect"
22
23
"testing"
23
24
25
+ cgroupfs "github.com/opencontainers/runc/libcontainer/cgroups/fs"
24
26
"github.com/stretchr/testify/assert"
25
- "k8s.io/api/core/v1"
27
+ v1 "k8s.io/api/core/v1"
26
28
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
27
29
runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1alpha2"
30
+
31
+ "k8s.io/apimachinery/pkg/api/resource"
28
32
)
29
33
30
34
func makeExpectedConfig (m * kubeGenericRuntimeManager , pod * v1.Pod , containerIndex int ) * runtimeapi.ContainerConfig {
@@ -135,3 +139,160 @@ func TestGenerateContainerConfig(t *testing.T) {
135
139
_ , _ , err = m .generateContainerConfig (& podWithContainerSecurityContext .Spec .Containers [0 ], podWithContainerSecurityContext , 0 , "" , podWithContainerSecurityContext .Spec .Containers [0 ].Image , []string {})
136
140
assert .Error (t , err , "RunAsNonRoot should fail for non-numeric username" )
137
141
}
142
+
143
+ func TestGetHugepageLimitsFromResources (t * testing.T ) {
144
+ var baseHugepage []* runtimeapi.HugepageLimit
145
+
146
+ // For each page size, limit to 0.
147
+ for _ , pageSize := range cgroupfs .HugePageSizes {
148
+ baseHugepage = append (baseHugepage , & runtimeapi.HugepageLimit {
149
+ PageSize : pageSize ,
150
+ Limit : uint64 (0 ),
151
+ })
152
+ }
153
+
154
+ tests := []struct {
155
+ name string
156
+ resources v1.ResourceRequirements
157
+ expected []* runtimeapi.HugepageLimit
158
+ }{
159
+ {
160
+ name : "Success2MB" ,
161
+ resources : v1.ResourceRequirements {
162
+ Limits : v1.ResourceList {
163
+ "hugepages-2Mi" : resource .MustParse ("2Mi" ),
164
+ },
165
+ },
166
+ expected : []* runtimeapi.HugepageLimit {
167
+ {
168
+ PageSize : "2MB" ,
169
+ Limit : 2097152 ,
170
+ },
171
+ },
172
+ },
173
+ {
174
+ name : "Success1GB" ,
175
+ resources : v1.ResourceRequirements {
176
+ Limits : v1.ResourceList {
177
+ "hugepages-1Gi" : resource .MustParse ("2Gi" ),
178
+ },
179
+ },
180
+ expected : []* runtimeapi.HugepageLimit {
181
+ {
182
+ PageSize : "1GB" ,
183
+ Limit : 2147483648 ,
184
+ },
185
+ },
186
+ },
187
+ {
188
+ name : "Skip2MB" ,
189
+ resources : v1.ResourceRequirements {
190
+ Limits : v1.ResourceList {
191
+ "hugepages-2MB" : resource .MustParse ("2Mi" ),
192
+ },
193
+ },
194
+ expected : []* runtimeapi.HugepageLimit {
195
+ {
196
+ PageSize : "2MB" ,
197
+ Limit : 0 ,
198
+ },
199
+ },
200
+ },
201
+ {
202
+ name : "Skip1GB" ,
203
+ resources : v1.ResourceRequirements {
204
+ Limits : v1.ResourceList {
205
+ "hugepages-1GB" : resource .MustParse ("2Gi" ),
206
+ },
207
+ },
208
+ expected : []* runtimeapi.HugepageLimit {
209
+ {
210
+ PageSize : "1GB" ,
211
+ Limit : 0 ,
212
+ },
213
+ },
214
+ },
215
+ {
216
+ name : "Success2MBand1GB" ,
217
+ resources : v1.ResourceRequirements {
218
+ Limits : v1.ResourceList {
219
+ v1 .ResourceName (v1 .ResourceCPU ): resource .MustParse ("0" ),
220
+ "hugepages-2Mi" : resource .MustParse ("2Mi" ),
221
+ "hugepages-1Gi" : resource .MustParse ("2Gi" ),
222
+ },
223
+ },
224
+ expected : []* runtimeapi.HugepageLimit {
225
+ {
226
+ PageSize : "2MB" ,
227
+ Limit : 2097152 ,
228
+ },
229
+ {
230
+ PageSize : "1GB" ,
231
+ Limit : 2147483648 ,
232
+ },
233
+ },
234
+ },
235
+ {
236
+ name : "Skip2MBand1GB" ,
237
+ resources : v1.ResourceRequirements {
238
+ Limits : v1.ResourceList {
239
+ v1 .ResourceName (v1 .ResourceCPU ): resource .MustParse ("0" ),
240
+ "hugepages-2MB" : resource .MustParse ("2Mi" ),
241
+ "hugepages-1GB" : resource .MustParse ("2Gi" ),
242
+ },
243
+ },
244
+ expected : []* runtimeapi.HugepageLimit {
245
+ {
246
+ PageSize : "2MB" ,
247
+ Limit : 0 ,
248
+ },
249
+ {
250
+ PageSize : "1GB" ,
251
+ Limit : 0 ,
252
+ },
253
+ },
254
+ },
255
+ }
256
+
257
+ for _ , test := range tests {
258
+ // Validate if machine supports hugepage size that used in test case.
259
+ machineHugepageSupport := true
260
+ for _ , hugepageLimit := range test .expected {
261
+ hugepageSupport := false
262
+ for _ , pageSize := range cgroupfs .HugePageSizes {
263
+ if pageSize == hugepageLimit .PageSize {
264
+ hugepageSupport = true
265
+ break
266
+ }
267
+ }
268
+
269
+ if ! hugepageSupport {
270
+ machineHugepageSupport = false
271
+ break
272
+ }
273
+ }
274
+
275
+ // Case of machine can't support hugepage size
276
+ if ! machineHugepageSupport {
277
+ continue
278
+ }
279
+
280
+ expectedHugepages := baseHugepage
281
+ for _ , hugepage := range test .expected {
282
+ for _ , expectedHugepage := range expectedHugepages {
283
+ if expectedHugepage .PageSize == hugepage .PageSize {
284
+ expectedHugepage .Limit = hugepage .Limit
285
+ }
286
+ }
287
+ }
288
+
289
+ results := GetHugepageLimitsFromResources (test .resources )
290
+ if ! reflect .DeepEqual (expectedHugepages , results ) {
291
+ t .Errorf ("%s test failed. Expected %v but got %v" , test .name , expectedHugepages , results )
292
+ }
293
+
294
+ for _ , hugepage := range baseHugepage {
295
+ hugepage .Limit = uint64 (0 )
296
+ }
297
+ }
298
+ }
0 commit comments