diff --git a/pkg/device/ascend/device.go b/pkg/device/ascend/device.go index d262da89f9..691770ca5b 100644 --- a/pkg/device/ascend/device.go +++ b/pkg/device/ascend/device.go @@ -21,6 +21,7 @@ import ( "errors" "flag" "fmt" + "math" "slices" "sort" "strconv" @@ -339,6 +340,13 @@ func (dev *Devices) GenerateResourceRequests(ctr *corev1.Container) device.Conta memnum = int(memnums) } else { m, _ := dev.trimMemory(memnums) + if m <= 0 { + // No template and not the whole card can serve this + // request. Carry the requested value through so Fit + // rejects it, rather than letting the zero fall + // through to the whole-card default below. + m = min(memnums, math.MaxInt32) + } memnum = int(m) } } diff --git a/pkg/device/ascend/device_test.go b/pkg/device/ascend/device_test.go index ebdbdd032c..65a37df7bc 100644 --- a/pkg/device/ascend/device_test.go +++ b/pkg/device/ascend/device_test.go @@ -19,6 +19,7 @@ package ascend import ( "errors" "fmt" + "math" "strconv" "strings" "testing" @@ -1211,6 +1212,60 @@ func Test_GenerateResourceRequests(t *testing.T) { Coresreq: int32(0), }, }, + { + name: "resourcememoryname larger than MemoryCapacity is carried through, not defaulted to the whole card", + args: corev1.Container{ + Resources: corev1.ResourceRequirements{ + Requests: corev1.ResourceList{ + "huawei.com/Ascend910A": resource.MustParse("1"), + "huawei.com/Ascend910A-memory": resource.MustParse("65536"), + }, + }, + }, + want: device.ContainerDeviceRequest{ + Nums: int32(1), + Type: "Ascend910A", + Memreq: int32(65536), + MemPercentagereq: int32(0), + Coresreq: int32(0), + }, + }, + { + name: "resourcememoryname larger than MemoryCapacity on the limits path is carried through too", + args: corev1.Container{ + Resources: corev1.ResourceRequirements{ + Limits: corev1.ResourceList{ + "huawei.com/Ascend910A": resource.MustParse("1"), + "huawei.com/Ascend910A-memory": resource.MustParse("65536"), + }, + }, + }, + want: device.ContainerDeviceRequest{ + Nums: int32(1), + Type: "Ascend910A", + Memreq: int32(65536), + MemPercentagereq: int32(0), + Coresreq: int32(0), + }, + }, + { + name: "resourcememoryname above int32 max is clamped instead of wrapping to zero", + args: corev1.Container{ + Resources: corev1.ResourceRequirements{ + Requests: corev1.ResourceList{ + "huawei.com/Ascend910A": resource.MustParse("1"), + "huawei.com/Ascend910A-memory": resource.MustParse("2147483648"), + }, + }, + }, + want: device.ContainerDeviceRequest{ + Nums: int32(1), + Type: "Ascend910A", + Memreq: int32(math.MaxInt32), + MemPercentagereq: int32(0), + Coresreq: int32(0), + }, + }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { @@ -1391,6 +1446,45 @@ func Test_GenerateResourceRequestsFactor(t *testing.T) { Coresreq: int32(0), }, }, + { + name: "factor scales the request past MemoryCapacity", + dev: Devices{ + config: VNPUConfig{ + CommonWord: "Ascend910A", + ResourceName: "huawei.com/Ascend910A", + ResourceMemoryName: "huawei.com/Ascend910A-memory", + MemoryAllocatable: int64(32768), + MemoryCapacity: int64(32768), + MemoryFactor: int32(1000), + Templates: []Template{ + { + Name: "vir02", + Memory: int64(2184), + AICore: int32(2), + }, { + Name: "vir04", + Memory: int64(4369), + AICore: int32(4), + }, { + Name: "vir08", + Memory: int64(8738), + AICore: int32(8), + }, { + Name: "vir16", + Memory: int64(17476), + AICore: int32(16), + }, + }, + }, + }, + want: device.ContainerDeviceRequest{ + Nums: int32(1), + Type: "Ascend910A", + Memreq: int32(128000), + MemPercentagereq: int32(0), + Coresreq: int32(0), + }, + }, { name: "factor 0", dev: Devices{