From de6d620181b93996192bf0da835c5effc7c80f04 Mon Sep 17 00:00:00 2001 From: brokenlander <94259413+brokenlander@users.noreply.github.com> Date: Tue, 13 Oct 2026 15:20:18 -0400 Subject: [PATCH] fix(api): do not count DRA admin access GPU claims as GPU usage Signed-off-by: brokenlander <94259413+brokenlander@users.noreply.github.com> --- .../unreleased/fixed-20261013-151729.yaml | 6 ++ utilities/resources/dra.go | 16 ++-- utilities/resources/dra_gpu_test.go | 85 +++++++++++++++++++ 3 files changed, 101 insertions(+), 6 deletions(-) create mode 100644 .changes/unreleased/fixed-20261013-151729.yaml diff --git a/.changes/unreleased/fixed-20261013-151729.yaml b/.changes/unreleased/fixed-20261013-151729.yaml new file mode 100644 index 0000000..8b71ba0 --- /dev/null +++ b/.changes/unreleased/fixed-20261013-151729.yaml @@ -0,0 +1,6 @@ +kind: Fixed +body: |- + DRA claims with admin access no longer count as GPU usage +custom: + Author: "brokenlander" + Issue: "26" diff --git a/utilities/resources/dra.go b/utilities/resources/dra.go index 4dda9bc..2e5b5c3 100644 --- a/utilities/resources/dra.go +++ b/utilities/resources/dra.go @@ -22,6 +22,7 @@ import ( "k8s.io/client-go/rest" draclient "k8s.io/dynamic-resource-allocation/client" resourceinstall "k8s.io/kubernetes/pkg/apis/resource/install" + "k8s.io/utils/ptr" "sigs.k8s.io/controller-runtime/pkg/client" commonmath "github.com/kai-scheduler/api/utilities/math" @@ -160,13 +161,20 @@ func IsGPUDeviceClass(deviceClassName string) bool { // Returns empty string if no GPU device class is found. func getGPUDeviceClassNameFromClaim(claim *resourceapi.ResourceClaim) string { for _, request := range claim.Spec.Devices.Requests { - if request.Exactly != nil && IsGPUDeviceClass(request.Exactly.DeviceClassName) { + if isGPUConsumingRequest(request) { return request.Exactly.DeviceClassName } } return "" } +// isGPUConsumingRequest excludes admin access requests: they share the device and consume no GPU capacity. +func isGPUConsumingRequest(request resourceapi.DeviceRequest) bool { + return request.Exactly != nil && + IsGPUDeviceClass(request.Exactly.DeviceClassName) && + !ptr.Deref(request.Exactly.AdminAccess, false) +} + // countGPUDevicesFromClaim counts GPU devices from a ResourceClaim. // Returns the total count of GPU devices requested by this claim. // @@ -177,11 +185,7 @@ func countGPUDevicesFromClaim(claim *resourceapi.ResourceClaim) int64 { totalCount := int64(0) for _, request := range claim.Spec.Devices.Requests { - if request.Exactly == nil { - continue - } - - if !IsGPUDeviceClass(request.Exactly.DeviceClassName) { + if !isGPUConsumingRequest(request) { continue } diff --git a/utilities/resources/dra_gpu_test.go b/utilities/resources/dra_gpu_test.go index 334a3f2..3f2331e 100644 --- a/utilities/resources/dra_gpu_test.go +++ b/utilities/resources/dra_gpu_test.go @@ -212,6 +212,91 @@ var _ = Describe("DRA GPU Extraction", func() { Expect(count).To(Equal(int64(0))) // Unknown mode skipped }) }) + + Context("when GPU requests use admin access", func() { + adminRequest := func(name string, mode resourceapi.DeviceAllocationMode, count int64) resourceapi.DeviceRequest { + return resourceapi.DeviceRequest{ + Name: name, + Exactly: &resourceapi.ExactDeviceRequest{ + DeviceClassName: constants.NvidiaGpuResource, + AllocationMode: mode, + Count: count, + AdminAccess: ptr.To(true), + }, + } + } + + It("should not count an ExactCount admin access request", func() { + claim := &resourceapi.ResourceClaim{ + Spec: resourceapi.ResourceClaimSpec{ + Devices: resourceapi.DeviceClaim{ + Requests: []resourceapi.DeviceRequest{ + adminRequest("validation-gpu", resourceapi.DeviceAllocationModeExactCount, 1), + }, + }, + }, + } + + Expect(countGPUDevicesFromClaim(claim)).To(Equal(int64(0))) + }) + + It("should not count an All admin access request", func() { + claim := &resourceapi.ResourceClaim{ + Spec: resourceapi.ResourceClaimSpec{ + Devices: resourceapi.DeviceClaim{ + Requests: []resourceapi.DeviceRequest{ + adminRequest("admin-gpus", resourceapi.DeviceAllocationModeAll, 0), + }, + }, + }, + } + + Expect(countGPUDevicesFromClaim(claim)).To(Equal(int64(0))) + }) + + It("should count only the non-admin requests of a mixed claim", func() { + claim := &resourceapi.ResourceClaim{ + Spec: resourceapi.ResourceClaimSpec{ + Devices: resourceapi.DeviceClaim{ + Requests: []resourceapi.DeviceRequest{ + adminRequest("admin-gpus", resourceapi.DeviceAllocationModeAll, 0), + { + Name: "gpu", + Exactly: &resourceapi.ExactDeviceRequest{ + DeviceClassName: constants.NvidiaGpuResource, + AllocationMode: resourceapi.DeviceAllocationModeExactCount, + Count: 2, + AdminAccess: ptr.To(false), + }, + }, + }, + }, + }, + } + + Expect(countGPUDevicesFromClaim(claim)).To(Equal(int64(2))) + }) + + It("should leave admin access claims out of the per device class totals", func() { + adminClaim := func(name string, mode resourceapi.DeviceAllocationMode, count int64) *resourceapi.ResourceClaim { + return &resourceapi.ResourceClaim{ + ObjectMeta: metav1.ObjectMeta{Name: name}, + Spec: resourceapi.ResourceClaimSpec{ + Devices: resourceapi.DeviceClaim{ + Requests: []resourceapi.DeviceRequest{adminRequest(name, mode, count)}, + }, + }, + } + } + claims := []*resourceapi.ResourceClaim{ + adminClaim("validator", resourceapi.DeviceAllocationModeExactCount, 1), + adminClaim("dcgm-exporter", resourceapi.DeviceAllocationModeAll, 0), + } + + Expect(ExtractDRAGPUResourcesFromClaims(claims)).To(BeEmpty()) + Expect(DRAGPUResourceListFromClaims(claims)).To(BeEmpty()) + }) + }) }) Describe("ExtractDRAGPUResources", func() {