Update kubeletplugin API for DynamicResourceAllocation to v1alpha2

This PR makes the NodePrepareResources() and NodeUnprepareResource()
calls of the kubeletplugin API for DynamicResourceAllocation
symmetrical. It wasn't clear how one would use the set of CDIDevices
passed back in the NodeUnprepareResource() of the v1alpha1 API, and the
new API now passes back the full ResourceHandle that was originally
passed to the Prepare() call. Passing the ResourceHandle is strictly
more informative and a plugin could always (re)derive the set of
CDIDevice from it.

This is a breaking change, but this release is scheduled to break
multiple APIs for DynamicResourceAllocation, so it makes sense to do
this now instead of later.

Signed-off-by: Kevin Klues <kklues@nvidia.com>

Kubernetes-commit: 579295e727a12deadad9e084ff8efd2708707091
This commit is contained in:
Kevin Klues 2023-03-13 21:38:56 +00:00 committed by Kubernetes Publisher
parent 507755b2b6
commit 704590723f
2 changed files with 61 additions and 65 deletions

View File

@ -17,7 +17,7 @@ limitations under the License.
// Code generated by protoc-gen-gogo. DO NOT EDIT. // Code generated by protoc-gen-gogo. DO NOT EDIT.
// source: api.proto // source: api.proto
package v1alpha1 package v1alpha2
import ( import (
context "context" context "context"
@ -55,7 +55,7 @@ type NodePrepareResourceRequest struct {
// The name of the Resource claim (ResourceClaim.meta.Name) // The name of the Resource claim (ResourceClaim.meta.Name)
// This field is REQUIRED. // This field is REQUIRED.
ClaimName string `protobuf:"bytes,3,opt,name=claim_name,json=claimName,proto3" json:"claim_name,omitempty"` ClaimName string `protobuf:"bytes,3,opt,name=claim_name,json=claimName,proto3" json:"claim_name,omitempty"`
// Resource handle (AllocationResult.ResourceHandle) // Resource handle (AllocationResult.ResourceHandles[*].Data)
// This field is REQUIRED. // This field is REQUIRED.
ResourceHandle string `protobuf:"bytes,4,opt,name=resource_handle,json=resourceHandle,proto3" json:"resource_handle,omitempty"` ResourceHandle string `protobuf:"bytes,4,opt,name=resource_handle,json=resourceHandle,proto3" json:"resource_handle,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
@ -180,9 +180,9 @@ type NodeUnprepareResourceRequest struct {
// The name of the Resource claim (ResourceClaim.meta.Name) // The name of the Resource claim (ResourceClaim.meta.Name)
// This field is REQUIRED. // This field is REQUIRED.
ClaimName string `protobuf:"bytes,3,opt,name=claim_name,json=claimName,proto3" json:"claim_name,omitempty"` ClaimName string `protobuf:"bytes,3,opt,name=claim_name,json=claimName,proto3" json:"claim_name,omitempty"`
// List of fully qualified CDI device names // Resource handle (AllocationResult.ResourceHandles[*].Data)
// Kubelet plugin returns them in the NodePrepareResourceResponse // This field is REQUIRED.
CdiDevices []string `protobuf:"bytes,4,rep,name=cdi_devices,json=cdiDevices,proto3" json:"cdi_devices,omitempty"` ResourceHandle string `protobuf:"bytes,4,opt,name=resource_handle,json=resourceHandle,proto3" json:"resource_handle,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
} }
@ -240,11 +240,11 @@ func (m *NodeUnprepareResourceRequest) GetClaimName() string {
return "" return ""
} }
func (m *NodeUnprepareResourceRequest) GetCdiDevices() []string { func (m *NodeUnprepareResourceRequest) GetResourceHandle() string {
if m != nil { if m != nil {
return m.CdiDevices return m.ResourceHandle
} }
return nil return ""
} }
type NodeUnprepareResourceResponse struct { type NodeUnprepareResourceResponse struct {
@ -285,40 +285,40 @@ func (m *NodeUnprepareResourceResponse) XXX_DiscardUnknown() {
var xxx_messageInfo_NodeUnprepareResourceResponse proto.InternalMessageInfo var xxx_messageInfo_NodeUnprepareResourceResponse proto.InternalMessageInfo
func init() { func init() {
proto.RegisterType((*NodePrepareResourceRequest)(nil), "v1alpha1.NodePrepareResourceRequest") proto.RegisterType((*NodePrepareResourceRequest)(nil), "v1alpha2.NodePrepareResourceRequest")
proto.RegisterType((*NodePrepareResourceResponse)(nil), "v1alpha1.NodePrepareResourceResponse") proto.RegisterType((*NodePrepareResourceResponse)(nil), "v1alpha2.NodePrepareResourceResponse")
proto.RegisterType((*NodeUnprepareResourceRequest)(nil), "v1alpha1.NodeUnprepareResourceRequest") proto.RegisterType((*NodeUnprepareResourceRequest)(nil), "v1alpha2.NodeUnprepareResourceRequest")
proto.RegisterType((*NodeUnprepareResourceResponse)(nil), "v1alpha1.NodeUnprepareResourceResponse") proto.RegisterType((*NodeUnprepareResourceResponse)(nil), "v1alpha2.NodeUnprepareResourceResponse")
} }
func init() { proto.RegisterFile("api.proto", fileDescriptor_00212fb1f9d3bf1c) } func init() { proto.RegisterFile("api.proto", fileDescriptor_00212fb1f9d3bf1c) }
var fileDescriptor_00212fb1f9d3bf1c = []byte{ var fileDescriptor_00212fb1f9d3bf1c = []byte{
// 374 bytes of a gzipped FileDescriptorProto // 369 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x52, 0x31, 0x6f, 0xda, 0x40, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x52, 0xb1, 0x6e, 0xe2, 0x40,
0x14, 0xe6, 0x0a, 0xaa, 0xf0, 0x55, 0x6a, 0xa5, 0xab, 0x2a, 0x59, 0x06, 0x0c, 0xb2, 0x68, 0x61, 0x10, 0x65, 0x0f, 0x74, 0xc2, 0x7b, 0xd2, 0x9d, 0xb4, 0xa7, 0x93, 0x2c, 0x03, 0x06, 0x59, 0xdc,
0xa9, 0x2d, 0xda, 0xa5, 0x53, 0x07, 0xd4, 0xa1, 0x13, 0xaa, 0x2c, 0xb1, 0x74, 0x41, 0x67, 0xdf, 0x41, 0x73, 0xb6, 0x8e, 0x6b, 0xae, 0xba, 0x02, 0xa5, 0x48, 0x85, 0x22, 0x4b, 0x34, 0x69, 0xd0,
0x8b, 0xb9, 0x60, 0xfb, 0x2e, 0x3e, 0x9b, 0x39, 0x3f, 0x21, 0x6b, 0xa6, 0xfc, 0x1d, 0xc6, 0x8c, 0xda, 0x3b, 0x31, 0x1b, 0x6c, 0xef, 0xc6, 0x6b, 0x53, 0xe7, 0x13, 0xf2, 0x07, 0x51, 0xfe, 0x86,
0x8c, 0xc1, 0xf9, 0x23, 0x11, 0xe7, 0x58, 0x51, 0x12, 0x10, 0x5b, 0xb6, 0x7b, 0xdf, 0xfb, 0xde, 0x32, 0x25, 0x65, 0x70, 0x7e, 0x24, 0x62, 0x1d, 0x2b, 0x8a, 0x04, 0xa2, 0x4d, 0xb7, 0xf3, 0xe6,
0xfb, 0xbe, 0xf7, 0xde, 0x61, 0x83, 0x4a, 0xee, 0xca, 0x4c, 0xe4, 0x82, 0xb4, 0xd7, 0x13, 0x1a, 0xcd, 0xbc, 0x37, 0xb3, 0x83, 0x0d, 0x2a, 0xb9, 0x2b, 0x33, 0x91, 0x0b, 0xd2, 0x5e, 0xff, 0xa1,
0xcb, 0x25, 0x9d, 0x58, 0xdf, 0x23, 0x9e, 0x2f, 0x8b, 0xc0, 0x0d, 0x45, 0xe2, 0x45, 0x22, 0x12, 0xb1, 0x5c, 0xd2, 0x89, 0xf5, 0x3b, 0xe2, 0xf9, 0xb2, 0x08, 0xdc, 0x50, 0x24, 0x5e, 0x24, 0x22,
0x9e, 0x26, 0x04, 0xc5, 0x99, 0x8e, 0x74, 0xa0, 0x5f, 0x55, 0xa1, 0x73, 0x83, 0xb0, 0x35, 0x13, 0xe1, 0x69, 0x42, 0x50, 0x5c, 0xe9, 0x48, 0x07, 0xfa, 0x55, 0x15, 0x3a, 0xf7, 0x08, 0x5b, 0x33,
0x0c, 0xfe, 0x65, 0x20, 0x69, 0x06, 0x3e, 0x28, 0x51, 0x64, 0x21, 0xf8, 0x70, 0x51, 0x80, 0xca, 0xc1, 0xe0, 0x22, 0x03, 0x49, 0x33, 0xf0, 0x41, 0x89, 0x22, 0x0b, 0xc1, 0x87, 0x9b, 0x02, 0x54,
0x49, 0x17, 0x1b, 0x29, 0x4d, 0x40, 0x49, 0x1a, 0x82, 0x89, 0x06, 0x68, 0x6c, 0xf8, 0x4f, 0x00, 0x4e, 0xba, 0xd8, 0x48, 0x69, 0x02, 0x4a, 0xd2, 0x10, 0x4c, 0x34, 0x40, 0x63, 0xc3, 0x7f, 0x03,
0xe9, 0x60, 0x23, 0x8c, 0x29, 0x4f, 0x16, 0x05, 0x67, 0xe6, 0x3b, 0x9d, 0x6d, 0x6b, 0x60, 0xce, 0x48, 0x07, 0x1b, 0x61, 0x4c, 0x79, 0xb2, 0x28, 0x38, 0x33, 0x3f, 0xe9, 0x6c, 0x5b, 0x03, 0x73,
0x19, 0xe9, 0x61, 0x5c, 0x25, 0xf7, 0x7c, 0xb3, 0x59, 0xd5, 0x6a, 0x64, 0x46, 0x13, 0x20, 0x23, 0xce, 0x48, 0x0f, 0xe3, 0x2a, 0xb9, 0xe7, 0x9b, 0xcd, 0xaa, 0x56, 0x23, 0x33, 0x9a, 0x00, 0x19,
0xfc, 0x29, 0x7b, 0x14, 0x5b, 0x2c, 0x69, 0xca, 0x62, 0x30, 0x5b, 0x9a, 0xf3, 0xb1, 0x86, 0xff, 0xe1, 0x6f, 0xd9, 0xab, 0xd8, 0x62, 0x49, 0x53, 0x16, 0x83, 0xd9, 0xd2, 0x9c, 0xaf, 0x35, 0x7c,
0x6a, 0xd4, 0xf9, 0x8d, 0x3b, 0x07, 0x0d, 0x2a, 0x29, 0x52, 0x05, 0xa4, 0x8f, 0x3f, 0x84, 0x8c, 0xae, 0x51, 0xe7, 0x3f, 0xee, 0x1c, 0x34, 0xa8, 0xa4, 0x48, 0x15, 0x90, 0x3e, 0xfe, 0x12, 0x32,
0x2f, 0x18, 0xac, 0x79, 0x08, 0xca, 0x44, 0x83, 0xe6, 0xd8, 0xf0, 0x71, 0xc8, 0xf8, 0x9f, 0x0a, 0xbe, 0x60, 0xb0, 0xe6, 0x21, 0x28, 0x13, 0x0d, 0x9a, 0x63, 0xc3, 0xc7, 0x21, 0xe3, 0x67, 0x15,
0x71, 0xae, 0x11, 0xee, 0xee, 0x1b, 0xcc, 0x53, 0xf9, 0xd6, 0x33, 0xbe, 0xf0, 0xd6, 0x7a, 0xe5, 0xe2, 0x3c, 0x20, 0xdc, 0xdd, 0x37, 0x98, 0xa7, 0xf2, 0xc3, 0xce, 0xd8, 0xc7, 0xbd, 0x23, 0x16,
0xad, 0x8f, 0x7b, 0x47, 0xac, 0x55, 0xd3, 0xfd, 0xd8, 0x22, 0xdc, 0xda, 0x33, 0x08, 0xc3, 0x9f, 0xab, 0x29, 0x27, 0x5b, 0x84, 0x5b, 0x7b, 0x06, 0x61, 0xf8, 0xfb, 0x81, 0x6d, 0x90, 0xa1, 0x5b,
0x0f, 0x6c, 0x81, 0x0c, 0xdd, 0xfa, 0xf0, 0xee, 0xf1, 0x2b, 0x5a, 0x5f, 0x4f, 0xb0, 0x2a, 0x31, 0x1f, 0x80, 0x7b, 0xfc, 0x37, 0xad, 0x9f, 0x27, 0x58, 0x95, 0x98, 0xd3, 0x20, 0xd7, 0xf8, 0xc7,
0xa7, 0x41, 0xce, 0xf1, 0x97, 0x83, 0x7e, 0xc8, 0xb7, 0xe7, 0x1d, 0x8e, 0xed, 0xd2, 0x1a, 0x9d, 0x41, 0x3f, 0xe4, 0xd7, 0xfb, 0x0e, 0xc7, 0x76, 0x6a, 0x8d, 0x4e, 0xf2, 0x6a, 0xad, 0xe9, 0x74,
0xe4, 0xd5, 0x5a, 0xd3, 0xe9, 0x66, 0x67, 0xa3, 0xed, 0xce, 0x6e, 0x5c, 0x96, 0x36, 0xda, 0x94, 0xb3, 0xb3, 0xd1, 0x76, 0x67, 0x37, 0x6e, 0x4b, 0x1b, 0x6d, 0x4a, 0x1b, 0x3d, 0x96, 0x36, 0x7a,
0x36, 0xba, 0x2d, 0x6d, 0x74, 0x57, 0xda, 0xe8, 0xea, 0xde, 0x6e, 0xfc, 0x1f, 0xae, 0x7e, 0x29, 0x2a, 0x6d, 0x74, 0xf7, 0x6c, 0x37, 0x2e, 0x87, 0xab, 0x7f, 0xca, 0xe5, 0xc2, 0x5b, 0x15, 0x01,
0x97, 0x0b, 0x6f, 0x55, 0x04, 0x10, 0x43, 0xee, 0xc9, 0x55, 0xe4, 0x51, 0xc9, 0x95, 0xc7, 0x32, 0xc4, 0x90, 0x7b, 0x72, 0x15, 0x79, 0x54, 0x72, 0xe5, 0xb1, 0x8c, 0x7a, 0xb5, 0x46, 0xf0, 0x59,
0xea, 0xd5, 0x1a, 0xc1, 0x7b, 0xfd, 0x89, 0x7f, 0x3e, 0x04, 0x00, 0x00, 0xff, 0xff, 0xf6, 0xcb, 0x1f, 0xf3, 0xdf, 0x97, 0x00, 0x00, 0x00, 0xff, 0xff, 0x89, 0x2f, 0x77, 0x8e, 0x12, 0x03, 0x00,
0x4e, 0x59, 0x0a, 0x03, 0x00, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
@ -347,7 +347,7 @@ func NewNodeClient(cc *grpc.ClientConn) NodeClient {
func (c *nodeClient) NodePrepareResource(ctx context.Context, in *NodePrepareResourceRequest, opts ...grpc.CallOption) (*NodePrepareResourceResponse, error) { func (c *nodeClient) NodePrepareResource(ctx context.Context, in *NodePrepareResourceRequest, opts ...grpc.CallOption) (*NodePrepareResourceResponse, error) {
out := new(NodePrepareResourceResponse) out := new(NodePrepareResourceResponse)
err := c.cc.Invoke(ctx, "/v1alpha1.Node/NodePrepareResource", in, out, opts...) err := c.cc.Invoke(ctx, "/v1alpha2.Node/NodePrepareResource", in, out, opts...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -356,7 +356,7 @@ func (c *nodeClient) NodePrepareResource(ctx context.Context, in *NodePrepareRes
func (c *nodeClient) NodeUnprepareResource(ctx context.Context, in *NodeUnprepareResourceRequest, opts ...grpc.CallOption) (*NodeUnprepareResourceResponse, error) { func (c *nodeClient) NodeUnprepareResource(ctx context.Context, in *NodeUnprepareResourceRequest, opts ...grpc.CallOption) (*NodeUnprepareResourceResponse, error) {
out := new(NodeUnprepareResourceResponse) out := new(NodeUnprepareResourceResponse)
err := c.cc.Invoke(ctx, "/v1alpha1.Node/NodeUnprepareResource", in, out, opts...) err := c.cc.Invoke(ctx, "/v1alpha2.Node/NodeUnprepareResource", in, out, opts...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -394,7 +394,7 @@ func _Node_NodePrepareResource_Handler(srv interface{}, ctx context.Context, dec
} }
info := &grpc.UnaryServerInfo{ info := &grpc.UnaryServerInfo{
Server: srv, Server: srv,
FullMethod: "/v1alpha1.Node/NodePrepareResource", FullMethod: "/v1alpha2.Node/NodePrepareResource",
} }
handler := func(ctx context.Context, req interface{}) (interface{}, error) { handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(NodeServer).NodePrepareResource(ctx, req.(*NodePrepareResourceRequest)) return srv.(NodeServer).NodePrepareResource(ctx, req.(*NodePrepareResourceRequest))
@ -412,7 +412,7 @@ func _Node_NodeUnprepareResource_Handler(srv interface{}, ctx context.Context, d
} }
info := &grpc.UnaryServerInfo{ info := &grpc.UnaryServerInfo{
Server: srv, Server: srv,
FullMethod: "/v1alpha1.Node/NodeUnprepareResource", FullMethod: "/v1alpha2.Node/NodeUnprepareResource",
} }
handler := func(ctx context.Context, req interface{}) (interface{}, error) { handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(NodeServer).NodeUnprepareResource(ctx, req.(*NodeUnprepareResourceRequest)) return srv.(NodeServer).NodeUnprepareResource(ctx, req.(*NodeUnprepareResourceRequest))
@ -421,7 +421,7 @@ func _Node_NodeUnprepareResource_Handler(srv interface{}, ctx context.Context, d
} }
var _Node_serviceDesc = grpc.ServiceDesc{ var _Node_serviceDesc = grpc.ServiceDesc{
ServiceName: "v1alpha1.Node", ServiceName: "v1alpha2.Node",
HandlerType: (*NodeServer)(nil), HandlerType: (*NodeServer)(nil),
Methods: []grpc.MethodDesc{ Methods: []grpc.MethodDesc{
{ {
@ -540,14 +540,12 @@ func (m *NodeUnprepareResourceRequest) MarshalToSizedBuffer(dAtA []byte) (int, e
_ = i _ = i
var l int var l int
_ = l _ = l
if len(m.CdiDevices) > 0 { if len(m.ResourceHandle) > 0 {
for iNdEx := len(m.CdiDevices) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.ResourceHandle)
i -= len(m.CdiDevices[iNdEx]) copy(dAtA[i:], m.ResourceHandle)
copy(dAtA[i:], m.CdiDevices[iNdEx]) i = encodeVarintApi(dAtA, i, uint64(len(m.ResourceHandle)))
i = encodeVarintApi(dAtA, i, uint64(len(m.CdiDevices[iNdEx]))) i--
i-- dAtA[i] = 0x22
dAtA[i] = 0x22
}
} }
if len(m.ClaimName) > 0 { if len(m.ClaimName) > 0 {
i -= len(m.ClaimName) i -= len(m.ClaimName)
@ -665,11 +663,9 @@ func (m *NodeUnprepareResourceRequest) Size() (n int) {
if l > 0 { if l > 0 {
n += 1 + l + sovApi(uint64(l)) n += 1 + l + sovApi(uint64(l))
} }
if len(m.CdiDevices) > 0 { l = len(m.ResourceHandle)
for _, s := range m.CdiDevices { if l > 0 {
l = len(s) n += 1 + l + sovApi(uint64(l))
n += 1 + l + sovApi(uint64(l))
}
} }
return n return n
} }
@ -720,7 +716,7 @@ func (this *NodeUnprepareResourceRequest) String() string {
`Namespace:` + fmt.Sprintf("%v", this.Namespace) + `,`, `Namespace:` + fmt.Sprintf("%v", this.Namespace) + `,`,
`ClaimUid:` + fmt.Sprintf("%v", this.ClaimUid) + `,`, `ClaimUid:` + fmt.Sprintf("%v", this.ClaimUid) + `,`,
`ClaimName:` + fmt.Sprintf("%v", this.ClaimName) + `,`, `ClaimName:` + fmt.Sprintf("%v", this.ClaimName) + `,`,
`CdiDevices:` + fmt.Sprintf("%v", this.CdiDevices) + `,`, `ResourceHandle:` + fmt.Sprintf("%v", this.ResourceHandle) + `,`,
`}`, `}`,
}, "") }, "")
return s return s
@ -1129,7 +1125,7 @@ func (m *NodeUnprepareResourceRequest) Unmarshal(dAtA []byte) error {
iNdEx = postIndex iNdEx = postIndex
case 4: case 4:
if wireType != 2 { if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field CdiDevices", wireType) return fmt.Errorf("proto: wrong wireType = %d for field ResourceHandle", wireType)
} }
var stringLen uint64 var stringLen uint64
for shift := uint(0); ; shift += 7 { for shift := uint(0); ; shift += 7 {
@ -1157,7 +1153,7 @@ func (m *NodeUnprepareResourceRequest) Unmarshal(dAtA []byte) error {
if postIndex > l { if postIndex > l {
return io.ErrUnexpectedEOF return io.ErrUnexpectedEOF
} }
m.CdiDevices = append(m.CdiDevices, string(dAtA[iNdEx:postIndex])) m.ResourceHandle = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex iNdEx = postIndex
default: default:
iNdEx = preIndex iNdEx = preIndex

View File

@ -1,5 +1,5 @@
/* /*
Copyright 2022 The Kubernetes Authors. Copyright 2023 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
@ -18,8 +18,8 @@ limitations under the License.
syntax = "proto3"; syntax = "proto3";
package v1alpha1; package v1alpha2;
option go_package = "k8s.io/kubelet/pkg/apis/dra/v1alpha1"; option go_package = "k8s.io/kubelet/pkg/apis/dra/v1alpha2";
import "github.com/gogo/protobuf/gogoproto/gogo.proto"; import "github.com/gogo/protobuf/gogoproto/gogo.proto";
@ -49,7 +49,7 @@ message NodePrepareResourceRequest {
// The name of the Resource claim (ResourceClaim.meta.Name) // The name of the Resource claim (ResourceClaim.meta.Name)
// This field is REQUIRED. // This field is REQUIRED.
string claim_name = 3; string claim_name = 3;
// Resource handle (AllocationResult.ResourceHandle) // Resource handle (AllocationResult.ResourceHandles[*].Data)
// This field is REQUIRED. // This field is REQUIRED.
string resource_handle = 4; string resource_handle = 4;
} }
@ -71,9 +71,9 @@ message NodeUnprepareResourceRequest {
// The name of the Resource claim (ResourceClaim.meta.Name) // The name of the Resource claim (ResourceClaim.meta.Name)
// This field is REQUIRED. // This field is REQUIRED.
string claim_name = 3; string claim_name = 3;
// List of fully qualified CDI device names // Resource handle (AllocationResult.ResourceHandles[*].Data)
// Kubelet plugin returns them in the NodePrepareResourceResponse // This field is REQUIRED.
repeated string cdi_devices = 4; string resource_handle = 4;
} }
message NodeUnprepareResourceResponse { message NodeUnprepareResourceResponse {