Skip to content

Commit a7ec316

Browse files
authored
Merge pull request #509 from Gekko0114/elasticquota-min-max
CapacityScheduling: fix usedOverMinWith/usedOverMaxWith/usedOverMin func and add unit test
2 parents 989fa3a + 5a9f02a commit a7ec316

File tree

2 files changed

+262
-0
lines changed

2 files changed

+262
-0
lines changed

pkg/capacityscheduling/elasticquota.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,26 @@ func (e *ElasticQuotaInfo) unreserveResource(request framework.Resource) {
8888
}
8989

9090
func (e *ElasticQuotaInfo) usedOverMinWith(podRequest *framework.Resource) bool {
91+
// "ElasticQuotaInfo doesn't have Min" means used values exceeded min(0)
92+
if e.Min == nil {
93+
return true
94+
}
9195
return cmp2(podRequest, e.Used, e.Min)
9296
}
9397

9498
func (e *ElasticQuotaInfo) usedOverMaxWith(podRequest *framework.Resource) bool {
99+
// "ElasticQuotaInfo doesn't have Max" means there are no limitations(infinite)
100+
if e.Max == nil {
101+
return false
102+
}
95103
return cmp2(podRequest, e.Used, e.Max)
96104
}
97105

98106
func (e *ElasticQuotaInfo) usedOverMin() bool {
107+
// "ElasticQuotaInfo doesn't have Min" means used values exceeded min(0)
108+
if e.Min == nil {
109+
return true
110+
}
99111
return cmp(e.Used, e.Min)
100112
}
101113

pkg/capacityscheduling/elasticquota_test.go

Lines changed: 250 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,3 +127,253 @@ func TestUnReserveResource(t *testing.T) {
127127
})
128128
}
129129
}
130+
131+
func TestUsedOverMinWith(t *testing.T) {
132+
tests := []struct {
133+
before *ElasticQuotaInfo
134+
name string
135+
podRequest *framework.Resource
136+
expected bool
137+
}{
138+
{
139+
before: &ElasticQuotaInfo{
140+
Namespace: "ns1",
141+
Used: &framework.Resource{
142+
MilliCPU: 4000,
143+
Memory: 200,
144+
ScalarResources: map[v1.ResourceName]int64{
145+
ResourceGPU: 5,
146+
},
147+
},
148+
Min: &framework.Resource{
149+
MilliCPU: 3000,
150+
Memory: 100,
151+
ScalarResources: map[v1.ResourceName]int64{
152+
ResourceGPU: 5,
153+
},
154+
},
155+
},
156+
name: "ElasticQuotaInfo OverMinWith Sum Of PodRequest And Used Is Bigger Than Min",
157+
podRequest: &framework.Resource{
158+
MilliCPU: 1500,
159+
Memory: 100,
160+
},
161+
expected: true,
162+
},
163+
{
164+
before: &ElasticQuotaInfo{
165+
Namespace: "ns1",
166+
Used: &framework.Resource{
167+
MilliCPU: 300,
168+
Memory: 100,
169+
ScalarResources: map[v1.ResourceName]int64{
170+
ResourceGPU: 5,
171+
},
172+
},
173+
Min: &framework.Resource{
174+
MilliCPU: 4000,
175+
Memory: 200,
176+
ScalarResources: map[v1.ResourceName]int64{
177+
ResourceGPU: 5,
178+
},
179+
},
180+
},
181+
name: "ElasticQuotaInfo OverMinWith Sum Of PodRequest And Used Is Not Bigger Than Min",
182+
podRequest: &framework.Resource{
183+
MilliCPU: 100,
184+
Memory: 50,
185+
},
186+
expected: false,
187+
},
188+
{
189+
before: &ElasticQuotaInfo{
190+
Namespace: "ns1",
191+
Used: &framework.Resource{
192+
MilliCPU: 3900,
193+
Memory: 100,
194+
ScalarResources: map[v1.ResourceName]int64{
195+
ResourceGPU: 5,
196+
},
197+
},
198+
},
199+
name: "ElasticQuotaInfo OverMinWith ElasticQuotaInfo Doesn't Have Max",
200+
podRequest: &framework.Resource{
201+
MilliCPU: 100,
202+
Memory: 100,
203+
},
204+
expected: true,
205+
},
206+
}
207+
for _, tt := range tests {
208+
t.Run(tt.name, func(t *testing.T) {
209+
elasticQuotaInfo := tt.before
210+
podRequest := tt.podRequest
211+
actual := elasticQuotaInfo.usedOverMinWith(podRequest)
212+
if actual != tt.expected {
213+
t.Errorf("expected %v, got %v", tt.expected, actual)
214+
}
215+
})
216+
}
217+
}
218+
219+
func TestUsedOverMaxWith(t *testing.T) {
220+
tests := []struct {
221+
before *ElasticQuotaInfo
222+
name string
223+
podRequest *framework.Resource
224+
expected bool
225+
}{
226+
{
227+
before: &ElasticQuotaInfo{
228+
Namespace: "ns1",
229+
Used: &framework.Resource{
230+
MilliCPU: 4000,
231+
Memory: 200,
232+
ScalarResources: map[v1.ResourceName]int64{
233+
ResourceGPU: 5,
234+
},
235+
},
236+
Max: &framework.Resource{
237+
MilliCPU: 4000,
238+
Memory: 200,
239+
ScalarResources: map[v1.ResourceName]int64{
240+
ResourceGPU: 5,
241+
},
242+
},
243+
},
244+
name: "ElasticQuotaInfo OverMaxWith Sum Of PodRequest And Used Is Bigger Than Max",
245+
podRequest: &framework.Resource{
246+
MilliCPU: 100,
247+
Memory: 100,
248+
},
249+
expected: true,
250+
},
251+
{
252+
before: &ElasticQuotaInfo{
253+
Namespace: "ns1",
254+
Used: &framework.Resource{
255+
MilliCPU: 3900,
256+
Memory: 100,
257+
ScalarResources: map[v1.ResourceName]int64{
258+
ResourceGPU: 5,
259+
},
260+
},
261+
Max: &framework.Resource{
262+
MilliCPU: 4000,
263+
Memory: 200,
264+
ScalarResources: map[v1.ResourceName]int64{
265+
ResourceGPU: 5,
266+
},
267+
},
268+
},
269+
name: "ElasticQuotaInfo OverMaxWith Sum Of PodRequest And Used Is Not Bigger Than Max",
270+
podRequest: &framework.Resource{
271+
MilliCPU: 100,
272+
Memory: 100,
273+
},
274+
expected: false,
275+
},
276+
{
277+
before: &ElasticQuotaInfo{
278+
Namespace: "ns1",
279+
Used: &framework.Resource{
280+
MilliCPU: 3900,
281+
Memory: 100,
282+
ScalarResources: map[v1.ResourceName]int64{
283+
ResourceGPU: 5,
284+
},
285+
},
286+
},
287+
name: "ElasticQuotaInfo OverMaxWith ElasticQuotaInfo Doesn't Have Max",
288+
podRequest: &framework.Resource{
289+
MilliCPU: 100,
290+
Memory: 100,
291+
},
292+
expected: false,
293+
},
294+
}
295+
for _, tt := range tests {
296+
t.Run(tt.name, func(t *testing.T) {
297+
elasticQuotaInfo := tt.before
298+
podRequest := tt.podRequest
299+
actual := elasticQuotaInfo.usedOverMaxWith(podRequest)
300+
if actual != tt.expected {
301+
t.Errorf("expected %v, got %v", tt.expected, actual)
302+
}
303+
})
304+
}
305+
}
306+
307+
func TestUsedOverMin(t *testing.T) {
308+
tests := []struct {
309+
before *ElasticQuotaInfo
310+
name string
311+
expected bool
312+
}{
313+
{
314+
before: &ElasticQuotaInfo{
315+
Namespace: "ns1",
316+
Used: &framework.Resource{
317+
MilliCPU: 4000,
318+
Memory: 200,
319+
ScalarResources: map[v1.ResourceName]int64{
320+
ResourceGPU: 5,
321+
},
322+
},
323+
Min: &framework.Resource{
324+
MilliCPU: 3000,
325+
Memory: 300,
326+
ScalarResources: map[v1.ResourceName]int64{
327+
ResourceGPU: 5,
328+
},
329+
},
330+
},
331+
name: "ElasticQuotaInfo OverMin Used Is Bigger Than Min",
332+
expected: true,
333+
},
334+
{
335+
before: &ElasticQuotaInfo{
336+
Namespace: "ns1",
337+
Used: &framework.Resource{
338+
MilliCPU: 300,
339+
Memory: 100,
340+
ScalarResources: map[v1.ResourceName]int64{
341+
ResourceGPU: 5,
342+
},
343+
},
344+
Min: &framework.Resource{
345+
MilliCPU: 4000,
346+
Memory: 200,
347+
ScalarResources: map[v1.ResourceName]int64{
348+
ResourceGPU: 5,
349+
},
350+
},
351+
},
352+
name: "ElasticQuotaInfo OverMin Used Is Not Bigger Than Min",
353+
expected: false,
354+
},
355+
{
356+
before: &ElasticQuotaInfo{
357+
Namespace: "ns1",
358+
Used: &framework.Resource{
359+
MilliCPU: 3900,
360+
Memory: 100,
361+
ScalarResources: map[v1.ResourceName]int64{
362+
ResourceGPU: 5,
363+
},
364+
},
365+
},
366+
name: "ElasticQuotaInfo OverMin ElasticQuotaInfo Doesn't Have Min",
367+
expected: true,
368+
},
369+
}
370+
for _, tt := range tests {
371+
t.Run(tt.name, func(t *testing.T) {
372+
elasticQuotaInfo := tt.before
373+
actual := elasticQuotaInfo.usedOverMin()
374+
if actual != tt.expected {
375+
t.Errorf("expected %v, got %v", tt.expected, actual)
376+
}
377+
})
378+
}
379+
}

0 commit comments

Comments
 (0)