@@ -17,14 +17,15 @@ limitations under the License.
1717package dra
1818
1919import (
20+ "errors"
2021 "fmt"
22+ "slices"
2123 "sync"
2224
2325 resourceapi "k8s.io/api/resource/v1alpha3"
2426 "k8s.io/apimachinery/pkg/types"
2527 "k8s.io/apimachinery/pkg/util/sets"
2628 "k8s.io/kubernetes/pkg/kubelet/cm/dra/state"
27- "k8s.io/kubernetes/pkg/kubelet/cm/util/cdi"
2829 kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
2930)
3031
@@ -33,10 +34,7 @@ import (
3334// +k8s:deepcopy-gen=true
3435type ClaimInfo struct {
3536 state.ClaimInfoState
36- // annotations is a mapping of container annotations per DRA plugin associated with
37- // a prepared resource
38- annotations map [string ][]kubecontainer.Annotation
39- prepared bool
37+ prepared bool
4038}
4139
4240// claimInfoCache is a cache of processed resource claims keyed by namespace/claimname.
@@ -47,89 +45,45 @@ type claimInfoCache struct {
4745}
4846
4947// newClaimInfoFromClaim creates a new claim info from a resource claim.
50- func newClaimInfoFromClaim (claim * resourceapi.ResourceClaim ) * ClaimInfo {
51- // Grab the allocation.resourceHandles. If there are no
52- // allocation.resourceHandles, create a single resourceHandle with no
53- // content. This will trigger processing of this claim by a single
54- // kubelet plugin whose name matches resourceClaim.Status.DriverName.
55- resourceHandles := claim .Status .Allocation .ResourceHandles
56- if len (resourceHandles ) == 0 {
57- resourceHandles = make ([]resourceapi.ResourceHandle , 1 )
58- }
48+ // It verifies that the kubelet can handle the claim.
49+ func newClaimInfoFromClaim (claim * resourceapi.ResourceClaim ) (* ClaimInfo , error ) {
5950 claimInfoState := state.ClaimInfoState {
60- DriverName : claim .Status .DriverName ,
61- ClassName : claim .Spec .ResourceClassName ,
62- ClaimUID : claim .UID ,
63- ClaimName : claim .Name ,
64- Namespace : claim .Namespace ,
65- PodUIDs : sets .New [string ](),
66- ResourceHandles : resourceHandles ,
67- CDIDevices : make (map [string ][]string ),
51+ ClaimUID : claim .UID ,
52+ ClaimName : claim .Name ,
53+ Namespace : claim .Namespace ,
54+ PodUIDs : sets .New [string ](),
55+ DriverState : make (map [string ]state.DriverState ),
56+ }
57+ if claim .Status .Allocation == nil {
58+ return nil , errors .New ("not allocated" )
59+ }
60+ for _ , result := range claim .Status .Allocation .Devices .Results {
61+ claimInfoState .DriverState [result .Driver ] = state.DriverState {}
6862 }
6963 info := & ClaimInfo {
7064 ClaimInfoState : claimInfoState ,
71- annotations : make (map [string ][]kubecontainer.Annotation ),
7265 prepared : false ,
7366 }
74- return info
67+ return info , nil
7568}
7669
7770// newClaimInfoFromClaim creates a new claim info from a checkpointed claim info state object.
7871func newClaimInfoFromState (state * state.ClaimInfoState ) * ClaimInfo {
7972 info := & ClaimInfo {
8073 ClaimInfoState : * state .DeepCopy (),
81- annotations : make (map [string ][]kubecontainer.Annotation ),
8274 prepared : false ,
8375 }
84- for pluginName , devices := range info .CDIDevices {
85- annotations , _ := cdi .GenerateAnnotations (info .ClaimUID , info .DriverName , devices )
86- info .annotations [pluginName ] = append (info .annotations [pluginName ], annotations ... )
87- }
8876 return info
8977}
9078
9179// setCDIDevices adds a set of CDI devices to the claim info.
92- func (info * ClaimInfo ) setCDIDevices (pluginName string , cdiDevices []string ) error {
93- // NOTE: Passing CDI device names as annotations is a temporary solution
94- // It will be removed after all runtimes are updated
95- // to get CDI device names from the ContainerConfig.CDIDevices field
96- annotations , err := cdi .GenerateAnnotations (info .ClaimUID , info .DriverName , cdiDevices )
97- if err != nil {
98- return fmt .Errorf ("failed to generate container annotations, err: %+v" , err )
99- }
100-
101- if info .CDIDevices == nil {
102- info .CDIDevices = make (map [string ][]string )
103- }
104-
105- if info .annotations == nil {
106- info .annotations = make (map [string ][]kubecontainer.Annotation )
107- }
108-
109- info .CDIDevices [pluginName ] = cdiDevices
110- info .annotations [pluginName ] = annotations
111-
112- return nil
113- }
114-
115- // annotationsAsList returns container annotations as a single list.
116- func (info * ClaimInfo ) annotationsAsList () []kubecontainer.Annotation {
117- var lst []kubecontainer.Annotation
118- for _ , v := range info .annotations {
119- lst = append (lst , v ... )
80+ func (info * ClaimInfo ) addDevice (driverName string , device state.Device ) {
81+ if info .DriverState == nil {
82+ info .DriverState = make (map [string ]state.DriverState )
12083 }
121- return lst
122- }
123-
124- // cdiDevicesAsList returns a list of CDIDevices from the provided claim info.
125- func (info * ClaimInfo ) cdiDevicesAsList () []kubecontainer.CDIDevice {
126- var cdiDevices []kubecontainer.CDIDevice
127- for _ , devices := range info .CDIDevices {
128- for _ , device := range devices {
129- cdiDevices = append (cdiDevices , kubecontainer.CDIDevice {Name : device })
130- }
131- }
132- return cdiDevices
84+ driverState := info .DriverState [driverName ]
85+ driverState .Devices = append (driverState .Devices , device )
86+ info .DriverState [driverName ] = driverState
13387}
13488
13589// addPodReference adds a pod reference to the claim info.
@@ -240,3 +194,20 @@ func (cache *claimInfoCache) syncToCheckpoint() error {
240194 }
241195 return cache .state .Store (claimInfoStateList )
242196}
197+
198+ // cdiDevicesAsList returns a list of CDIDevices from the provided claim info.
199+ // When the request name is non-empty, only devices relevant for that request
200+ // are returned.
201+ func (info * ClaimInfo ) cdiDevicesAsList (requestName string ) []kubecontainer.CDIDevice {
202+ var cdiDevices []kubecontainer.CDIDevice
203+ for _ , driverData := range info .DriverState {
204+ for _ , device := range driverData .Devices {
205+ if requestName == "" || len (device .RequestNames ) == 0 || slices .Contains (device .RequestNames , requestName ) {
206+ for _ , cdiDeviceID := range device .CDIDeviceIDs {
207+ cdiDevices = append (cdiDevices , kubecontainer.CDIDevice {Name : cdiDeviceID })
208+ }
209+ }
210+ }
211+ }
212+ return cdiDevices
213+ }
0 commit comments