Skip to content

Commit ad179fc

Browse files
committed
Add admission tests for namespace minimums
1 parent 4e7eda3 commit ad179fc

File tree

1 file changed

+135
-1
lines changed

1 file changed

+135
-1
lines changed

pkg/quota/admission/clusterresourceoverride/admission_test.go

Lines changed: 135 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ func TestLimitRequestAdmission(t *testing.T) {
129129
expectedCpuLimit resource.Quantity
130130
expectedCpuRequest resource.Quantity
131131
namespace *kapi.Namespace
132+
namespaceLimits []*kapi.LimitRange
132133
}{
133134
{
134135
name: "ignore pods that have no memory limit specified",
@@ -139,6 +140,21 @@ func TestLimitRequestAdmission(t *testing.T) {
139140
expectedCpuRequest: resource.MustParse("0"),
140141
namespace: fakeNamespace(true),
141142
},
143+
{
144+
name: "with namespace limits, ignore pods that have no memory limit specified",
145+
config: testConfig(100, 50, 50),
146+
pod: testBestEffortPod(),
147+
expectedMemRequest: resource.MustParse("0"),
148+
expectedCpuLimit: resource.MustParse("0"),
149+
expectedCpuRequest: resource.MustParse("0"),
150+
namespace: fakeNamespace(true),
151+
namespaceLimits: []*kapi.LimitRange{
152+
fakeMinCPULimitRange("567m"),
153+
fakeMinCPULimitRange("678m"),
154+
fakeMinMemoryLimitRange("700Gi"),
155+
fakeMinMemoryLimitRange("456Gi"),
156+
},
157+
},
142158
{
143159
name: "test floor for memory and cpu",
144160
config: testConfig(100, 50, 50),
@@ -148,6 +164,21 @@ func TestLimitRequestAdmission(t *testing.T) {
148164
expectedCpuRequest: resource.MustParse("1m"),
149165
namespace: fakeNamespace(true),
150166
},
167+
{
168+
name: "with namespace limits, test floor for memory and cpu",
169+
config: testConfig(100, 50, 50),
170+
pod: testPod("1Mi", "0", "0", "0"),
171+
expectedMemRequest: resource.MustParse("456Gi"),
172+
expectedCpuLimit: resource.MustParse("567m"),
173+
expectedCpuRequest: resource.MustParse("567m"),
174+
namespace: fakeNamespace(true),
175+
namespaceLimits: []*kapi.LimitRange{
176+
fakeMinCPULimitRange("567m"),
177+
fakeMinCPULimitRange("678m"),
178+
fakeMinMemoryLimitRange("700Gi"),
179+
fakeMinMemoryLimitRange("456Gi"),
180+
},
181+
},
151182
{
152183
name: "nil config",
153184
config: nil,
@@ -157,6 +188,21 @@ func TestLimitRequestAdmission(t *testing.T) {
157188
expectedCpuRequest: resource.MustParse("1"),
158189
namespace: fakeNamespace(true),
159190
},
191+
{
192+
name: "with namespace limits, nil config",
193+
config: nil,
194+
pod: testPod("1", "1", "1", "1"),
195+
expectedMemRequest: resource.MustParse("1"),
196+
expectedCpuLimit: resource.MustParse("1"),
197+
expectedCpuRequest: resource.MustParse("1"),
198+
namespace: fakeNamespace(true),
199+
namespaceLimits: []*kapi.LimitRange{
200+
fakeMinCPULimitRange("567m"),
201+
fakeMinCPULimitRange("678m"),
202+
fakeMinMemoryLimitRange("700Gi"),
203+
fakeMinMemoryLimitRange("456Gi"),
204+
},
205+
},
160206
{
161207
name: "all values are adjusted",
162208
config: testConfig(100, 50, 50),
@@ -166,6 +212,21 @@ func TestLimitRequestAdmission(t *testing.T) {
166212
expectedCpuRequest: resource.MustParse("500m"),
167213
namespace: fakeNamespace(true),
168214
},
215+
{
216+
name: "with namespace limits, all values are adjusted to floor of namespace limits",
217+
config: testConfig(100, 50, 50),
218+
pod: testPod("1Gi", "0", "2000m", "0"),
219+
expectedMemRequest: resource.MustParse("456Gi"),
220+
expectedCpuLimit: resource.MustParse("10567m"),
221+
expectedCpuRequest: resource.MustParse("10567m"),
222+
namespace: fakeNamespace(true),
223+
namespaceLimits: []*kapi.LimitRange{
224+
fakeMinCPULimitRange("10567m"),
225+
fakeMinCPULimitRange("20678m"),
226+
fakeMinMemoryLimitRange("700Gi"),
227+
fakeMinMemoryLimitRange("456Gi"),
228+
},
229+
},
169230
{
170231
name: "just requests are adjusted",
171232
config: testConfig(0, 50, 50),
@@ -175,6 +236,21 @@ func TestLimitRequestAdmission(t *testing.T) {
175236
expectedCpuRequest: resource.MustParse("25m"),
176237
namespace: fakeNamespace(true),
177238
},
239+
{
240+
name: "with namespace limits, all requests are adjusted to floor of namespace limits",
241+
config: testConfig(0, 50, 50),
242+
pod: testPod("10Mi", "0", "50m", "0"),
243+
expectedMemRequest: resource.MustParse("456Gi"),
244+
expectedCpuLimit: resource.MustParse("50m"),
245+
expectedCpuRequest: resource.MustParse("10567m"),
246+
namespace: fakeNamespace(true),
247+
namespaceLimits: []*kapi.LimitRange{
248+
fakeMinCPULimitRange("10567m"),
249+
fakeMinCPULimitRange("20678m"),
250+
fakeMinMemoryLimitRange("700Gi"),
251+
fakeMinMemoryLimitRange("456Gi"),
252+
},
253+
},
178254
{
179255
name: "project annotation disables overrides",
180256
config: testConfig(0, 50, 50),
@@ -184,6 +260,21 @@ func TestLimitRequestAdmission(t *testing.T) {
184260
expectedCpuRequest: resource.MustParse("0"),
185261
namespace: fakeNamespace(false),
186262
},
263+
{
264+
name: "with namespace limits, project annotation disables overrides",
265+
config: testConfig(0, 50, 50),
266+
pod: testPod("10Mi", "0", "50m", "0"),
267+
expectedMemRequest: resource.MustParse("0"),
268+
expectedCpuLimit: resource.MustParse("50m"),
269+
expectedCpuRequest: resource.MustParse("0"),
270+
namespace: fakeNamespace(false),
271+
namespaceLimits: []*kapi.LimitRange{
272+
fakeMinCPULimitRange("10567m"),
273+
fakeMinCPULimitRange("20678m"),
274+
fakeMinMemoryLimitRange("700Gi"),
275+
fakeMinMemoryLimitRange("456Gi"),
276+
},
277+
},
187278
{
188279
name: "large values don't overflow",
189280
config: testConfig(100, 50, 50),
@@ -211,10 +302,24 @@ func TestLimitRequestAdmission(t *testing.T) {
211302
expectedCpuRequest: resource.MustParse("250m"),
212303
namespace: fakeNamespace(true),
213304
},
305+
{
306+
name: "test only containers types are considered with namespace limits",
307+
config: testConfig(100, 50, 50),
308+
pod: testPod("1Gi", "0", "2000m", "0"),
309+
expectedMemRequest: resource.MustParse("512Mi"),
310+
expectedCpuLimit: resource.MustParse("1"),
311+
expectedCpuRequest: resource.MustParse("500m"),
312+
namespace: fakeNamespace(true),
313+
namespaceLimits: []*kapi.LimitRange{
314+
fakeMinStorageLimitRange("1567Mi"),
315+
},
316+
},
214317
}
215318

216319
for _, test := range tests {
217-
c, err := newClusterResourceOverride(test.config)
320+
c, err := newClusterResourceOverride(test.config, func(a *clusterResourceOverridePlugin, attr admission.Attributes) ([]*kapi.LimitRange, error) {
321+
return test.namespaceLimits, nil
322+
})
218323
if err != nil {
219324
t.Errorf("%s: config de/serialize failed: %v", test.name, err)
220325
continue
@@ -336,3 +441,32 @@ func testConfig(lc2mr int64, cr2lr int64, mr2lr int64) *clusterresourceoverride.
336441
MemoryRequestToLimitPercent: mr2lr,
337442
}
338443
}
444+
445+
func fakeMinLimitRange(limitType kapi.LimitType, resourceType kapi.ResourceName, limits ...string) *kapi.LimitRange {
446+
r := &kapi.LimitRange{}
447+
448+
for i := range limits {
449+
rl := kapi.ResourceList{}
450+
rl[resourceType] = resource.MustParse(limits[i])
451+
r.Spec.Limits = append(r.Spec.Limits,
452+
kapi.LimitRangeItem{
453+
Type: limitType,
454+
Min: rl,
455+
},
456+
)
457+
}
458+
459+
return r
460+
}
461+
462+
func fakeMinMemoryLimitRange(limits ...string) *kapi.LimitRange {
463+
return fakeMinLimitRange(kapi.LimitTypeContainer, kapi.ResourceMemory, limits...)
464+
}
465+
466+
func fakeMinCPULimitRange(limits ...string) *kapi.LimitRange {
467+
return fakeMinLimitRange(kapi.LimitTypeContainer, kapi.ResourceCPU, limits...)
468+
}
469+
470+
func fakeMinStorageLimitRange(limits ...string) *kapi.LimitRange {
471+
return fakeMinLimitRange(kapi.LimitTypePersistentVolumeClaim, kapi.ResourceStorage, limits...)
472+
}

0 commit comments

Comments
 (0)