Skip to content

Commit 0bdaae7

Browse files
authored
fix: humanize message and add tests (#383)
* fix: humanize message and add tests * test: reduce tests * test: remove static message checks
1 parent a484a4b commit 0bdaae7

File tree

2 files changed

+103
-2
lines changed

2 files changed

+103
-2
lines changed

pkg/scheduler/api/unschedule_info.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,15 @@ func getOverCapacityMessageDetails(queueName, resourceName string, deserved, use
3636
case CpuResource:
3737
return fmt.Sprintf("Workload requested %v CPU cores, but %s quota is %v cores, "+
3838
"while %v cores are already allocated for non-preemptible pods.",
39-
requiredResources.MilliCPU,
39+
resource_info.HumanizeResource(requiredResources.MilliCPU, resource_info.MilliCPUToCores),
4040
queueName,
4141
resource_info.HumanizeResource(deserved, resource_info.MilliCPUToCores),
4242
resource_info.HumanizeResource(used, resource_info.MilliCPUToCores),
4343
)
4444
case MemoryResource:
4545
return fmt.Sprintf("Workload requested %v GB memory, but %s quota is %v GB, "+
4646
"while %v GB are already allocated for non-preemptible pods.",
47-
requiredResources.Memory,
47+
resource_info.HumanizeResource(requiredResources.Memory, resource_info.MemoryToGB),
4848
queueName,
4949
resource_info.HumanizeResource(deserved, resource_info.MemoryToGB),
5050
resource_info.HumanizeResource(used, resource_info.MemoryToGB),
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
// Copyright 2025 NVIDIA CORPORATION
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package api
5+
6+
import (
7+
"testing"
8+
9+
"github.com/NVIDIA/KAI-scheduler/pkg/scheduler/api/podgroup_info"
10+
. "github.com/onsi/ginkgo/v2"
11+
. "github.com/onsi/gomega"
12+
)
13+
14+
func TestUnscheduledInfo(t *testing.T) {
15+
RegisterFailHandler(Fail)
16+
RunSpecs(t, "UnscheduledInfo Suite")
17+
}
18+
19+
var _ = Describe("UnscheduledInfo", func() {
20+
Context("GetBuildOverCapacityMessageForQueue", func() {
21+
22+
It("should generate correct message for CPU resource", func() {
23+
queueName := "cpu-queue"
24+
resourceName := CpuResource
25+
deserved := 8000.0 // 8 CPU cores in millicores
26+
used := 4000.0 // 4 CPU cores in millicores
27+
requiredResources := &podgroup_info.JobRequirement{
28+
GPU: 0,
29+
MilliCPU: 6000.0, // 6 CPU cores in millicores
30+
Memory: 0,
31+
}
32+
33+
message := GetBuildOverCapacityMessageForQueue(queueName, resourceName, deserved, used, requiredResources)
34+
35+
expectedDetails := "Workload requested 6 CPU cores, but cpu-queue quota is 8 cores, while 4 cores are already allocated for non-preemptible pods."
36+
37+
Expect(message).To(ContainSubstring(expectedDetails))
38+
})
39+
40+
It("should generate correct message for 200G memory resource", func() {
41+
queueName := "memory-queue"
42+
resourceName := MemoryResource
43+
deserved := 100000000000.0 // 100 GB in bytes
44+
used := 50000000000.0 // 50 GB in bytes
45+
requiredResources := &podgroup_info.JobRequirement{
46+
GPU: 0,
47+
MilliCPU: 0,
48+
Memory: 200000000000.0, // 200 GB in bytes
49+
}
50+
51+
message := GetBuildOverCapacityMessageForQueue(queueName, resourceName, deserved, used, requiredResources)
52+
53+
expectedDetails := "Workload requested 200 GB memory, but memory-queue quota is 100 GB, while 50 GB are already allocated for non-preemptible pods."
54+
55+
Expect(message).To(ContainSubstring(expectedDetails))
56+
})
57+
58+
})
59+
60+
Context("GetJobOverMaxAllowedMessageForQueue", func() {
61+
It("should generate correct message for GPU resource", func() {
62+
queueName := "gpu-queue"
63+
resourceName := GpuResource
64+
maxAllowed := 8.0
65+
used := 6.0
66+
requested := 4.0
67+
68+
message := GetJobOverMaxAllowedMessageForQueue(queueName, resourceName, maxAllowed, used, requested)
69+
70+
expected := "gpu-queue quota has reached the allowable limit of GPUs. Limit is 8 GPUs, currently 6 GPUs allocated and workload requested 4 GPUs"
71+
Expect(message).To(Equal(expected))
72+
})
73+
74+
It("should generate correct message for CPU resource", func() {
75+
queueName := "cpu-queue"
76+
resourceName := CpuResource
77+
maxAllowed := 16000.0 // 16 CPU cores in millicores
78+
used := 12000.0 // 12 CPU cores in millicores
79+
requested := 8000.0 // 8 CPU cores in millicores
80+
81+
message := GetJobOverMaxAllowedMessageForQueue(queueName, resourceName, maxAllowed, used, requested)
82+
83+
expected := "cpu-queue quota has reached the allowable limit of CPU cores. Limit is 16 cores, currently 12 cores allocated and workload requested 8 cores"
84+
Expect(message).To(Equal(expected))
85+
})
86+
87+
It("should generate correct message for memory resource", func() {
88+
queueName := "memory-queue"
89+
resourceName := MemoryResource
90+
maxAllowed := 500000000000.0 // 500 GB in bytes
91+
used := 400000000000.0 // 400 GB in bytes
92+
requested := 200000000000.0 // 200 GB in bytes
93+
94+
message := GetJobOverMaxAllowedMessageForQueue(queueName, resourceName, maxAllowed, used, requested)
95+
96+
expected := "memory-queue quota has reached the allowable limit of memory. Limit is 500 GB, currently 400 GB allocated and workload requested 200 GB"
97+
Expect(message).To(Equal(expected))
98+
})
99+
})
100+
101+
})

0 commit comments

Comments
 (0)