@@ -20,18 +20,21 @@ import (
20
20
"context"
21
21
"fmt"
22
22
"path"
23
+ "strconv"
23
24
"strings"
24
25
"time"
25
26
26
27
"github.com/pkg/errors"
27
28
apiv1 "k8s.io/api/core/v1"
28
29
corev1 "k8s.io/api/core/v1"
30
+ resourceapi "k8s.io/api/resource/v1beta1"
29
31
"k8s.io/apimachinery/pkg/api/resource"
30
32
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
31
33
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
32
34
"k8s.io/apimachinery/pkg/runtime/schema"
33
35
"k8s.io/apimachinery/pkg/util/validation"
34
36
klog "k8s.io/klog/v2"
37
+ "k8s.io/utils/ptr"
35
38
)
36
39
37
40
type unstructuredScalableResource struct {
@@ -297,6 +300,46 @@ func (r unstructuredScalableResource) InstanceCapacity() (map[corev1.ResourceNam
297
300
return capacity , nil
298
301
}
299
302
303
+ func (r unstructuredScalableResource ) InstanceResourceSlices (nodeName string ) ([]* resourceapi.ResourceSlice , error ) {
304
+ driver := r .InstanceDRADriver ()
305
+ gpuCount , err := r .InstanceGPUCapacityAnnotation ()
306
+ if err != nil {
307
+ return nil , err
308
+ }
309
+
310
+ var result []* resourceapi.ResourceSlice
311
+ if driver != "" && ! gpuCount .IsZero () {
312
+ resourceslice := & resourceapi.ResourceSlice {
313
+ ObjectMeta : metav1.ObjectMeta {
314
+ Name : nodeName + "-" + driver ,
315
+ },
316
+ Spec : resourceapi.ResourceSliceSpec {
317
+ Driver : driver ,
318
+ NodeName : nodeName ,
319
+ Pool : resourceapi.ResourcePool {
320
+ Name : nodeName ,
321
+ },
322
+ },
323
+ }
324
+ for i := 0 ; i < int (gpuCount .Value ()); i ++ {
325
+ device := resourceapi.Device {
326
+ Name : "gpu-" + strconv .Itoa (i ),
327
+ Basic : & resourceapi.BasicDevice {
328
+ Attributes : map [resourceapi.QualifiedName ]resourceapi.DeviceAttribute {
329
+ "type" : {
330
+ StringValue : ptr .To (GpuDeviceType ),
331
+ },
332
+ },
333
+ },
334
+ }
335
+ resourceslice .Spec .Devices = append (resourceslice .Spec .Devices , device )
336
+ }
337
+ result = append (result , resourceslice )
338
+ return result , nil
339
+ }
340
+ return nil , nil
341
+ }
342
+
300
343
func (r unstructuredScalableResource ) InstanceEphemeralDiskCapacityAnnotation () (resource.Quantity , error ) {
301
344
return parseEphemeralDiskCapacity (r .unstructured .GetAnnotations ())
302
345
}
@@ -321,6 +364,10 @@ func (r unstructuredScalableResource) InstanceMaxPodsCapacityAnnotation() (resou
321
364
return parseMaxPodsCapacity (r .unstructured .GetAnnotations ())
322
365
}
323
366
367
+ func (r unstructuredScalableResource ) InstanceDRADriver () string {
368
+ return parseDRADriver (r .unstructured .GetAnnotations ())
369
+ }
370
+
324
371
func (r unstructuredScalableResource ) readInfrastructureReferenceResource () (* unstructured.Unstructured , error ) {
325
372
infraref , found , err := unstructured .NestedStringMap (r .unstructured .Object , "spec" , "template" , "spec" , "infrastructureRef" )
326
373
if ! found || err != nil {
0 commit comments