Skip to content

Commit 77341f7

Browse files
committed
DRA: remove support for v1alpha2 kubelet API
The v1alpha2 API is several releases old. No current drivers should still depend on it.
1 parent f39ece2 commit 77341f7

File tree

9 files changed

+50
-1809
lines changed

9 files changed

+50
-1809
lines changed

pkg/kubelet/cm/dra/plugin/client.go

Lines changed: 4 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -22,112 +22,13 @@ import (
2222
"time"
2323

2424
"google.golang.org/grpc"
25-
grpccodes "google.golang.org/grpc/codes"
26-
grpcstatus "google.golang.org/grpc/status"
2725

2826
"k8s.io/klog/v2"
29-
drapbv1alpha2 "k8s.io/kubelet/pkg/apis/dra/v1alpha2"
3027
drapb "k8s.io/kubelet/pkg/apis/dra/v1alpha3"
3128
)
3229

3330
const PluginClientTimeout = 45 * time.Second
3431

35-
type (
36-
nodeResourceManager interface {
37-
Prepare(context.Context, *grpc.ClientConn, *plugin, *drapb.NodePrepareResourcesRequest) (*drapb.NodePrepareResourcesResponse, error)
38-
Unprepare(context.Context, *grpc.ClientConn, *plugin, *drapb.NodeUnprepareResourcesRequest) (*drapb.NodeUnprepareResourcesResponse, error)
39-
}
40-
41-
v1alpha2NodeResourceManager struct{}
42-
v1alpha3NodeResourceManager struct{}
43-
)
44-
45-
var nodeResourceManagers = map[string]nodeResourceManager{
46-
v1alpha2Version: v1alpha2NodeResourceManager{},
47-
v1alpha3Version: v1alpha3NodeResourceManager{},
48-
}
49-
50-
func (v1alpha2rm v1alpha2NodeResourceManager) Prepare(ctx context.Context, conn *grpc.ClientConn, _ *plugin, req *drapb.NodePrepareResourcesRequest) (*drapb.NodePrepareResourcesResponse, error) {
51-
nodeClient := drapbv1alpha2.NewNodeClient(conn)
52-
response := &drapb.NodePrepareResourcesResponse{
53-
Claims: make(map[string]*drapb.NodePrepareResourceResponse),
54-
}
55-
56-
for _, claim := range req.Claims {
57-
req := &drapbv1alpha2.NodePrepareResourceRequest{
58-
Namespace: claim.Namespace,
59-
ClaimUid: claim.Uid,
60-
ClaimName: claim.Name,
61-
ResourceHandle: claim.ResourceHandle,
62-
StructuredResourceHandle: claim.StructuredResourceHandle,
63-
}
64-
res, err := nodeClient.NodePrepareResource(ctx, req)
65-
result := &drapb.NodePrepareResourceResponse{}
66-
if err != nil {
67-
result.Error = err.Error()
68-
} else {
69-
result.CDIDevices = res.CdiDevices
70-
}
71-
response.Claims[claim.Uid] = result
72-
}
73-
74-
return response, nil
75-
}
76-
77-
func (v1alpha2rm v1alpha2NodeResourceManager) Unprepare(ctx context.Context, conn *grpc.ClientConn, _ *plugin, req *drapb.NodeUnprepareResourcesRequest) (*drapb.NodeUnprepareResourcesResponse, error) {
78-
nodeClient := drapbv1alpha2.NewNodeClient(conn)
79-
response := &drapb.NodeUnprepareResourcesResponse{
80-
Claims: make(map[string]*drapb.NodeUnprepareResourceResponse),
81-
}
82-
83-
for _, claim := range req.Claims {
84-
_, err := nodeClient.NodeUnprepareResource(ctx,
85-
&drapbv1alpha2.NodeUnprepareResourceRequest{
86-
Namespace: claim.Namespace,
87-
ClaimUid: claim.Uid,
88-
ClaimName: claim.Name,
89-
ResourceHandle: claim.ResourceHandle,
90-
})
91-
result := &drapb.NodeUnprepareResourceResponse{}
92-
if err != nil {
93-
result.Error = err.Error()
94-
}
95-
response.Claims[claim.Uid] = result
96-
}
97-
98-
return response, nil
99-
}
100-
101-
func (v1alpha3rm v1alpha3NodeResourceManager) Prepare(ctx context.Context, conn *grpc.ClientConn, p *plugin, req *drapb.NodePrepareResourcesRequest) (*drapb.NodePrepareResourcesResponse, error) {
102-
nodeClient := drapb.NewNodeClient(conn)
103-
response, err := nodeClient.NodePrepareResources(ctx, req)
104-
if err != nil {
105-
status, _ := grpcstatus.FromError(err)
106-
if status.Code() == grpccodes.Unimplemented {
107-
p.setVersion(v1alpha2Version)
108-
return nodeResourceManagers[v1alpha2Version].Prepare(ctx, conn, p, req)
109-
}
110-
return nil, err
111-
}
112-
113-
return response, nil
114-
}
115-
116-
func (v1alpha3rm v1alpha3NodeResourceManager) Unprepare(ctx context.Context, conn *grpc.ClientConn, p *plugin, req *drapb.NodeUnprepareResourcesRequest) (*drapb.NodeUnprepareResourcesResponse, error) {
117-
nodeClient := drapb.NewNodeClient(conn)
118-
response, err := nodeClient.NodeUnprepareResources(ctx, req)
119-
if err != nil {
120-
status, _ := grpcstatus.FromError(err)
121-
if status.Code() == grpccodes.Unimplemented {
122-
p.setVersion(v1alpha2Version)
123-
return nodeResourceManagers[v1alpha2Version].Unprepare(ctx, conn, p, req)
124-
}
125-
return nil, err
126-
}
127-
128-
return response, nil
129-
}
130-
13132
func NewDRAPluginClient(pluginName string) (drapb.NodeClient, error) {
13233
if pluginName == "" {
13334
return nil, fmt.Errorf("plugin name is empty")
@@ -157,15 +58,8 @@ func (p *plugin) NodePrepareResources(
15758
ctx, cancel := context.WithTimeout(ctx, p.clientTimeout)
15859
defer cancel()
15960

160-
version := p.getVersion()
161-
resourceManager, exists := nodeResourceManagers[version]
162-
if !exists {
163-
err := fmt.Errorf("unsupported plugin version: %s", version)
164-
logger.V(4).Info(log("done calling NodePrepareResources rpc"), "response", nil, "err", err)
165-
return nil, err
166-
}
167-
168-
response, err := resourceManager.Prepare(ctx, conn, p, req)
61+
nodeClient := drapb.NewNodeClient(conn)
62+
response, err := nodeClient.NodePrepareResources(ctx, req)
16963
logger.V(4).Info(log("done calling NodePrepareResources rpc"), "response", response, "err", err)
17064
return response, err
17165
}
@@ -186,15 +80,8 @@ func (p *plugin) NodeUnprepareResources(
18680
ctx, cancel := context.WithTimeout(ctx, p.clientTimeout)
18781
defer cancel()
18882

189-
version := p.getVersion()
190-
resourceManager, exists := nodeResourceManagers[version]
191-
if !exists {
192-
err := fmt.Errorf("unsupported plugin version: %s", version)
193-
logger.V(4).Info(log("done calling NodeUnprepareResources rpc"), "response", nil, "err", err)
194-
return nil, err
195-
}
196-
197-
response, err := resourceManager.Unprepare(ctx, conn, p, req)
83+
nodeClient := drapb.NewNodeClient(conn)
84+
response, err := nodeClient.NodeUnprepareResources(ctx, req)
19885
logger.V(4).Info(log("done calling NodeUnprepareResources rpc"), "response", response, "err", err)
19986
return response, err
20087
}

pkg/kubelet/cm/dra/plugin/client_test.go

Lines changed: 6 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,21 @@ import (
2727

2828
"github.com/stretchr/testify/assert"
2929
"google.golang.org/grpc"
30-
drapbv1alpha2 "k8s.io/kubelet/pkg/apis/dra/v1alpha2"
3130
drapbv1alpha3 "k8s.io/kubelet/pkg/apis/dra/v1alpha3"
3231
)
3332

3433
type fakeV1alpha3GRPCServer struct {
3534
drapbv1alpha3.UnimplementedNodeServer
3635
}
3736

38-
func (f *fakeV1alpha3GRPCServer) NodePrepareResource(ctx context.Context, in *drapbv1alpha3.NodePrepareResourcesRequest) (*drapbv1alpha3.NodePrepareResourcesResponse, error) {
37+
var _ drapbv1alpha3.NodeServer = &fakeV1alpha3GRPCServer{}
38+
39+
func (f *fakeV1alpha3GRPCServer) NodePrepareResources(ctx context.Context, in *drapbv1alpha3.NodePrepareResourcesRequest) (*drapbv1alpha3.NodePrepareResourcesResponse, error) {
3940
return &drapbv1alpha3.NodePrepareResourcesResponse{Claims: map[string]*drapbv1alpha3.NodePrepareResourceResponse{"dummy": {CDIDevices: []string{"dummy"}}}}, nil
4041
}
4142

42-
func (f *fakeV1alpha3GRPCServer) NodeUnprepareResource(ctx context.Context, in *drapbv1alpha3.NodeUnprepareResourcesRequest) (*drapbv1alpha3.NodeUnprepareResourcesResponse, error) {
43+
func (f *fakeV1alpha3GRPCServer) NodeUnprepareResources(ctx context.Context, in *drapbv1alpha3.NodeUnprepareResourcesRequest) (*drapbv1alpha3.NodeUnprepareResourcesResponse, error) {
44+
4345
return &drapbv1alpha3.NodeUnprepareResourcesResponse{}, nil
4446
}
4547

@@ -53,18 +55,6 @@ func (f *fakeV1alpha3GRPCServer) NodeListAndWatchResources(req *drapbv1alpha3.No
5355
return nil
5456
}
5557

56-
type fakeV1alpha2GRPCServer struct {
57-
drapbv1alpha2.UnimplementedNodeServer
58-
}
59-
60-
func (f *fakeV1alpha2GRPCServer) NodePrepareResource(ctx context.Context, in *drapbv1alpha2.NodePrepareResourceRequest) (*drapbv1alpha2.NodePrepareResourceResponse, error) {
61-
return &drapbv1alpha2.NodePrepareResourceResponse{CdiDevices: []string{"dummy"}}, nil
62-
}
63-
64-
func (f *fakeV1alpha2GRPCServer) NodeUnprepareResource(ctx context.Context, in *drapbv1alpha2.NodeUnprepareResourceRequest) (*drapbv1alpha2.NodeUnprepareResourceResponse, error) {
65-
return &drapbv1alpha2.NodeUnprepareResourceResponse{}, nil
66-
}
67-
6858
type tearDown func()
6959

7060
func setupFakeGRPCServer(version string) (string, tearDown, error) {
@@ -88,9 +78,6 @@ func setupFakeGRPCServer(version string) (string, tearDown, error) {
8878

8979
s := grpc.NewServer()
9080
switch version {
91-
case v1alpha2Version:
92-
fakeGRPCServer := &fakeV1alpha2GRPCServer{}
93-
drapbv1alpha2.RegisterNodeServer(s, fakeGRPCServer)
9481
case v1alpha3Version:
9582
fakeGRPCServer := &fakeV1alpha3GRPCServer{}
9683
drapbv1alpha3.RegisterNodeServer(s, fakeGRPCServer)
@@ -120,7 +107,6 @@ func TestGRPCConnIsReused(t *testing.T) {
120107

121108
p := &plugin{
122109
endpoint: addr,
123-
version: v1alpha3Version,
124110
}
125111

126112
conn, err := p.getOrCreateGRPCConn()
@@ -231,7 +217,7 @@ func TestNewDRAPluginClient(t *testing.T) {
231217
}
232218
}
233219

234-
func TestNodeUnprepareResource(t *testing.T) {
220+
func TestNodeUnprepareResources(t *testing.T) {
235221
for _, test := range []struct {
236222
description string
237223
serverSetup func(string) (string, tearDown, error)
@@ -244,21 +230,6 @@ func TestNodeUnprepareResource(t *testing.T) {
244230
serverVersion: v1alpha3Version,
245231
request: &drapbv1alpha3.NodeUnprepareResourcesRequest{},
246232
},
247-
{
248-
description: "server supports v1alpha2, plugin client should fallback",
249-
serverSetup: setupFakeGRPCServer,
250-
serverVersion: v1alpha2Version,
251-
request: &drapbv1alpha3.NodeUnprepareResourcesRequest{
252-
Claims: []*drapbv1alpha3.Claim{
253-
{
254-
Namespace: "dummy-namespace",
255-
Uid: "dummy-uid",
256-
Name: "dummy-claim",
257-
ResourceHandle: "dummy-resource",
258-
},
259-
},
260-
},
261-
},
262233
} {
263234
t.Run(test.description, func(t *testing.T) {
264235
addr, teardown, err := setupFakeGRPCServer(test.serverVersion)
@@ -269,7 +240,6 @@ func TestNodeUnprepareResource(t *testing.T) {
269240

270241
p := &plugin{
271242
endpoint: addr,
272-
version: v1alpha3Version,
273243
clientTimeout: PluginClientTimeout,
274244
}
275245

@@ -320,13 +290,6 @@ func TestListAndWatchResources(t *testing.T) {
320290
},
321291
expectError: "EOF",
322292
},
323-
{
324-
description: "server doesn't support NodeResources API",
325-
serverSetup: setupFakeGRPCServer,
326-
serverVersion: v1alpha2Version,
327-
request: new(drapbv1alpha3.NodeListAndWatchResourcesRequest),
328-
expectError: "Unimplemented",
329-
},
330293
} {
331294
t.Run(test.description, func(t *testing.T) {
332295
addr, teardown, err := setupFakeGRPCServer(test.serverVersion)
@@ -337,7 +300,6 @@ func TestListAndWatchResources(t *testing.T) {
337300

338301
p := &plugin{
339302
endpoint: addr,
340-
version: v1alpha3Version,
341303
}
342304

343305
conn, err := p.getOrCreateGRPCConn()

pkg/kubelet/cm/dra/plugin/plugin.go

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,13 @@ const (
3838
// DRAPluginName is the name of the in-tree DRA Plugin.
3939
DRAPluginName = "kubernetes.io/dra"
4040
v1alpha3Version = "v1alpha3"
41-
v1alpha2Version = "v1alpha2"
4241
)
4342

44-
// Plugin is a description of a DRA Plugin, defined by an endpoint
45-
// and the highest DRA version supported.
43+
// Plugin is a description of a DRA Plugin, defined by an endpoint.
4644
type plugin struct {
4745
sync.Mutex
4846
conn *grpc.ClientConn
4947
endpoint string
50-
version string
5148
highestSupportedVersion *utilversion.Version
5249
clientTimeout time.Duration
5350
}
@@ -84,18 +81,6 @@ func (p *plugin) getOrCreateGRPCConn() (*grpc.ClientConn, error) {
8481
return p.conn, nil
8582
}
8683

87-
func (p *plugin) getVersion() string {
88-
p.Lock()
89-
defer p.Unlock()
90-
return p.version
91-
}
92-
93-
func (p *plugin) setVersion(version string) {
94-
p.Lock()
95-
p.version = version
96-
p.Unlock()
97-
}
98-
9984
// RegistrationHandler is the handler which is fed to the pluginwatcher API.
10085
type RegistrationHandler struct {
10186
controller *nodeResourcesController
@@ -135,7 +120,6 @@ func (h *RegistrationHandler) RegisterPlugin(pluginName string, endpoint string,
135120
pluginInstance := &plugin{
136121
conn: nil,
137122
endpoint: endpoint,
138-
version: v1alpha3Version,
139123
highestSupportedVersion: highestSupportedVersion,
140124
clientTimeout: timeout,
141125
}

staging/src/k8s.io/dynamic-resource-allocation/kubeletplugin/draplugin.go

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import (
2424
"google.golang.org/grpc"
2525
"k8s.io/klog/v2"
2626

27-
drapbv1alpha2 "k8s.io/kubelet/pkg/apis/dra/v1alpha2"
2827
drapbv1alpha3 "k8s.io/kubelet/pkg/apis/dra/v1alpha3"
2928
registerapi "k8s.io/kubelet/pkg/apis/pluginregistration/v1"
3029
)
@@ -154,16 +153,7 @@ func GRPCStreamInterceptor(interceptor grpc.StreamServerInterceptor) Option {
154153
}
155154
}
156155

157-
// NodeV1alpha2 explicitly chooses whether the DRA gRPC API v1alpha2
158-
// gets enabled.
159-
func NodeV1alpha2(enabled bool) Option {
160-
return func(o *options) error {
161-
o.nodeV1alpha2 = enabled
162-
return nil
163-
}
164-
}
165-
166-
// NodeV1alpha2 explicitly chooses whether the DRA gRPC API v1alpha3
156+
// NodeV1alpha3 explicitly chooses whether the DRA gRPC API v1alpha3
167157
// gets enabled.
168158
func NodeV1alpha3(enabled bool) Option {
169159
return func(o *options) error {
@@ -182,7 +172,7 @@ type options struct {
182172
unaryInterceptors []grpc.UnaryServerInterceptor
183173
streamInterceptors []grpc.StreamServerInterceptor
184174

185-
nodeV1alpha2, nodeV1alpha3 bool
175+
nodeV1alpha3 bool
186176
}
187177

188178
// draPlugin combines the kubelet registration service and the DRA node plugin
@@ -200,7 +190,6 @@ func Start(nodeServer interface{}, opts ...Option) (result DRAPlugin, finalErr e
200190
o := options{
201191
logger: klog.Background(),
202192
grpcVerbosity: 4,
203-
nodeV1alpha2: true,
204193
nodeV1alpha3: true,
205194
}
206195
for _, option := range opts {
@@ -231,11 +220,6 @@ func Start(nodeServer interface{}, opts ...Option) (result DRAPlugin, finalErr e
231220
drapbv1alpha3.RegisterNodeServer(grpcServer, nodeServer)
232221
implemented = true
233222
}
234-
if nodeServer, ok := nodeServer.(drapbv1alpha2.NodeServer); ok && o.nodeV1alpha2 {
235-
o.logger.V(5).Info("registering drapbv1alpha2.NodeServer")
236-
drapbv1alpha2.RegisterNodeServer(grpcServer, nodeServer)
237-
implemented = true
238-
}
239223
})
240224
if err != nil {
241225
return nil, fmt.Errorf("start node client: %v", err)

0 commit comments

Comments
 (0)