diff --git a/pkg/device/ascend/device.go b/pkg/device/ascend/device.go index 34d807a338..31604d3299 100644 --- a/pkg/device/ascend/device.go +++ b/pkg/device/ascend/device.go @@ -460,14 +460,16 @@ func (npu *Devices) Fit(devices []*device.DeviceUsage, request device.ContainerD totalMemPerCard = devices[0].Totalmem } + if isHAMiCore && !nodeSupportHamiCore { + reason[common.ModeNotFit]++ + klog.V(4).InfoS("Node filtered: pod requests hami-core but node does not support it", "pod", klog.KObj(pod)) + return false, nil, common.GenReason(reason, len(devices)) + } + if request.Memreq > 0 && request.Memreq < totalMemPerCard && request.Nums > 0 { - if !nodeSupportHamiCore && isHAMiCore { - reason[common.ModeNotFit]++ - klog.V(4).InfoS("Node filtered: Node does not support hami-core mode", "node", nodeInfo.Node.Name, "pod", pod.Name) - return false, nil, common.GenReason(reason, len(devices)) - } else if nodeSupportHamiCore && !isHAMiCore { + if nodeSupportHamiCore && !isHAMiCore { reason[common.ModeNotFit]++ - klog.V(4).InfoS("Node filtered: Reserved for hami-core but pod is legacy vNPU", "node", nodeInfo.Node.Name, "pod", pod.Name) + klog.V(4).InfoS("Node filtered: node reserved for hami-core but pod is legacy vNPU", "pod", klog.KObj(pod)) return false, nil, common.GenReason(reason, len(devices)) } } diff --git a/pkg/device/ascend/device_test.go b/pkg/device/ascend/device_test.go index 6a80e89086..2562e7f2cd 100644 --- a/pkg/device/ascend/device_test.go +++ b/pkg/device/ascend/device_test.go @@ -1813,6 +1813,80 @@ func TestDevices_Fit(t *testing.T) { wantReason: "1/1 ModeNotFit", nodeAnnotation: map[string]string{VNPUNodeSelectorAnnotation: "true"}, }, + { + name: "fit fail: whole-card hami-core pod on legacy node (ModeNotFit)", + devices: []*device.DeviceUsage{{ + ID: "dev-0", Index: 0, Used: 0, Count: 100, + Usedmem: 0, Totalmem: 32768, Totalcore: 100, Usedcores: 0, + Numa: 0, Health: true, + }}, + request: device.ContainerDeviceRequest{ + Nums: 1, Memreq: 32768, MemPercentagereq: 0, Coresreq: 0, + }, + annos: map[string]string{ + VNPUModeAnnotation: VNPUModeHamiCore, + }, + wantFit: false, + wantLen: 0, + wantDevIDs: []string{}, + wantReason: "1/1 ModeNotFit", + nodeAnnotation: map[string]string{}, + }, + { + name: "fit fail: memory-less hami-core pod on legacy node (ModeNotFit)", + devices: []*device.DeviceUsage{{ + ID: "dev-0", Index: 0, Used: 0, Count: 100, + Usedmem: 0, Totalmem: 32768, Totalcore: 100, Usedcores: 0, + Numa: 0, Health: true, + }}, + request: device.ContainerDeviceRequest{ + Nums: 1, Memreq: 0, MemPercentagereq: 101, Coresreq: 0, + }, + annos: map[string]string{ + VNPUModeAnnotation: VNPUModeHamiCore, + }, + wantFit: false, + wantLen: 0, + wantDevIDs: []string{}, + wantReason: "1/1 ModeNotFit", + nodeAnnotation: map[string]string{}, + }, + { + name: "fit success: whole-card hami-core pod on hami-core node", + devices: []*device.DeviceUsage{{ + ID: "dev-0", Index: 0, Used: 0, Count: 100, + Usedmem: 0, Totalmem: 32768, Totalcore: 100, Usedcores: 0, + Numa: 0, Health: true, + }}, + request: device.ContainerDeviceRequest{ + Nums: 1, Memreq: 32768, MemPercentagereq: 0, Coresreq: 0, + }, + annos: map[string]string{ + VNPUModeAnnotation: VNPUModeHamiCore, + }, + wantFit: true, + wantLen: 1, + wantDevIDs: []string{"dev-0"}, + wantReason: "", + nodeAnnotation: map[string]string{VNPUNodeSelectorAnnotation: "true"}, + }, + { + name: "fit success: whole-card legacy pod on hami-core node", + devices: []*device.DeviceUsage{{ + ID: "dev-0", Index: 0, Used: 0, Count: 100, + Usedmem: 0, Totalmem: 32768, Totalcore: 100, Usedcores: 0, + Numa: 0, Health: true, + }}, + request: device.ContainerDeviceRequest{ + Nums: 1, Memreq: 32768, MemPercentagereq: 0, Coresreq: 0, + }, + annos: map[string]string{}, + wantFit: true, + wantLen: 1, + wantDevIDs: []string{"dev-0"}, + wantReason: "", + nodeAnnotation: map[string]string{VNPUNodeSelectorAnnotation: "true"}, + }, } for _, dev := range devs {