Skip to content

Commit 8930aed

Browse files
committed
adaptation: implement wrapper for old plugins.
Add a backward compatibility wrapper for old plugins which do not support the full set of dedicated lifecycle events yet. Fall back to relaying StateChange events to them. Signed-off-by: Krisztian Litkey <krisztian.litkey@intel.com>
1 parent eabcda0 commit 8930aed

2 files changed

Lines changed: 128 additions & 11 deletions

File tree

pkg/adaptation/plugin.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -917,8 +917,6 @@ func isFatalError(err error) bool {
917917
return true
918918
case errors.Is(err, context.DeadlineExceeded):
919919
return true
920-
case status.Code(err) == codes.Unimplemented:
921-
return true
922920
}
923921
return false
924922
}

pkg/adaptation/plugin_type.go

Lines changed: 128 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import (
2121
"errors"
2222

2323
"github.com/containerd/nri/pkg/api"
24+
"google.golang.org/grpc/codes"
25+
"google.golang.org/grpc/status"
2426
)
2527

2628
type pluginType struct {
@@ -74,7 +76,12 @@ func (p *pluginType) Configure(ctx context.Context, req *ConfigureRequest) (*Con
7476
func (p *pluginType) RunPodSandbox(ctx context.Context, req *RunPodSandboxRequest) (*RunPodSandboxResponse, error) {
7577
switch {
7678
case p.ttrpcImpl != nil:
77-
return p.ttrpcImpl.RunPodSandbox(ctx, req)
79+
rpl, err := p.ttrpcImpl.RunPodSandbox(ctx, req)
80+
if err != nil && status.Code(err) == codes.Unimplemented {
81+
p.ttrpcImpl = &origImplWrapper{p.ttrpcImpl}
82+
rpl, err = p.ttrpcImpl.RunPodSandbox(ctx, req)
83+
}
84+
return rpl, err
7885
case p.builtinImpl != nil:
7986
return p.builtinImpl.RunPodSandbox(ctx, req)
8087
case p.wasmImpl != nil:
@@ -100,7 +107,12 @@ func (p *pluginType) UpdatePodSandbox(ctx context.Context, req *UpdatePodSandbox
100107
func (p *pluginType) PostUpdatePodSandbox(ctx context.Context, req *PostUpdatePodSandboxRequest) (*PostUpdatePodSandboxResponse, error) {
101108
switch {
102109
case p.ttrpcImpl != nil:
103-
return p.ttrpcImpl.PostUpdatePodSandbox(ctx, req)
110+
rpl, err := p.ttrpcImpl.PostUpdatePodSandbox(ctx, req)
111+
if err != nil && status.Code(err) == codes.Unimplemented {
112+
p.ttrpcImpl = &origImplWrapper{p.ttrpcImpl}
113+
rpl, err = p.ttrpcImpl.PostUpdatePodSandbox(ctx, req)
114+
}
115+
return rpl, err
104116
case p.builtinImpl != nil:
105117
return p.builtinImpl.PostUpdatePodSandbox(ctx, req)
106118
case p.wasmImpl != nil:
@@ -113,7 +125,12 @@ func (p *pluginType) PostUpdatePodSandbox(ctx context.Context, req *PostUpdatePo
113125
func (p *pluginType) StopPodSandbox(ctx context.Context, req *StopPodSandboxRequest) (*StopPodSandboxResponse, error) {
114126
switch {
115127
case p.ttrpcImpl != nil:
116-
return p.ttrpcImpl.StopPodSandbox(ctx, req)
128+
rpl, err := p.ttrpcImpl.StopPodSandbox(ctx, req)
129+
if err != nil && status.Code(err) == codes.Unimplemented {
130+
p.ttrpcImpl = &origImplWrapper{p.ttrpcImpl}
131+
rpl, err = p.ttrpcImpl.StopPodSandbox(ctx, req)
132+
}
133+
return rpl, err
117134
case p.builtinImpl != nil:
118135
return p.builtinImpl.StopPodSandbox(ctx, req)
119136
case p.wasmImpl != nil:
@@ -126,7 +143,12 @@ func (p *pluginType) StopPodSandbox(ctx context.Context, req *StopPodSandboxRequ
126143
func (p *pluginType) RemovePodSandbox(ctx context.Context, req *RemovePodSandboxRequest) (*RemovePodSandboxResponse, error) {
127144
switch {
128145
case p.ttrpcImpl != nil:
129-
return p.ttrpcImpl.RemovePodSandbox(ctx, req)
146+
rpl, err := p.ttrpcImpl.RemovePodSandbox(ctx, req)
147+
if err != nil && status.Code(err) == codes.Unimplemented {
148+
p.ttrpcImpl = &origImplWrapper{p.ttrpcImpl}
149+
rpl, err = p.ttrpcImpl.RemovePodSandbox(ctx, req)
150+
}
151+
return rpl, err
130152
case p.builtinImpl != nil:
131153
return p.builtinImpl.RemovePodSandbox(ctx, req)
132154
case p.wasmImpl != nil:
@@ -152,7 +174,12 @@ func (p *pluginType) CreateContainer(ctx context.Context, req *CreateContainerRe
152174
func (p *pluginType) PostCreateContainer(ctx context.Context, req *PostCreateContainerRequest) (*PostCreateContainerResponse, error) {
153175
switch {
154176
case p.ttrpcImpl != nil:
155-
return p.ttrpcImpl.PostCreateContainer(ctx, req)
177+
rpl, err := p.ttrpcImpl.PostCreateContainer(ctx, req)
178+
if err != nil && status.Code(err) == codes.Unimplemented {
179+
p.ttrpcImpl = &origImplWrapper{p.ttrpcImpl}
180+
rpl, err = p.ttrpcImpl.PostCreateContainer(ctx, req)
181+
}
182+
return rpl, err
156183
case p.builtinImpl != nil:
157184
return p.builtinImpl.PostCreateContainer(ctx, req)
158185
case p.wasmImpl != nil:
@@ -165,7 +192,12 @@ func (p *pluginType) PostCreateContainer(ctx context.Context, req *PostCreateCon
165192
func (p *pluginType) StartContainer(ctx context.Context, req *StartContainerRequest) (*StartContainerResponse, error) {
166193
switch {
167194
case p.ttrpcImpl != nil:
168-
return p.ttrpcImpl.StartContainer(ctx, req)
195+
rpl, err := p.ttrpcImpl.StartContainer(ctx, req)
196+
if err != nil && status.Code(err) == codes.Unimplemented {
197+
p.ttrpcImpl = &origImplWrapper{p.ttrpcImpl}
198+
rpl, err = p.ttrpcImpl.StartContainer(ctx, req)
199+
}
200+
return rpl, err
169201
case p.builtinImpl != nil:
170202
return p.builtinImpl.StartContainer(ctx, req)
171203
case p.wasmImpl != nil:
@@ -178,7 +210,12 @@ func (p *pluginType) StartContainer(ctx context.Context, req *StartContainerRequ
178210
func (p *pluginType) PostStartContainer(ctx context.Context, req *PostStartContainerRequest) (*PostStartContainerResponse, error) {
179211
switch {
180212
case p.ttrpcImpl != nil:
181-
return p.ttrpcImpl.PostStartContainer(ctx, req)
213+
rpl, err := p.ttrpcImpl.PostStartContainer(ctx, req)
214+
if err != nil && status.Code(err) == codes.Unimplemented {
215+
p.ttrpcImpl = &origImplWrapper{p.ttrpcImpl}
216+
rpl, err = p.ttrpcImpl.PostStartContainer(ctx, req)
217+
}
218+
return rpl, err
182219
case p.builtinImpl != nil:
183220
return p.builtinImpl.PostStartContainer(ctx, req)
184221
case p.wasmImpl != nil:
@@ -204,7 +241,12 @@ func (p *pluginType) UpdateContainer(ctx context.Context, req *UpdateContainerRe
204241
func (p *pluginType) PostUpdateContainer(ctx context.Context, req *PostUpdateContainerRequest) (*PostUpdateContainerResponse, error) {
205242
switch {
206243
case p.ttrpcImpl != nil:
207-
return p.ttrpcImpl.PostUpdateContainer(ctx, req)
244+
rpl, err := p.ttrpcImpl.PostUpdateContainer(ctx, req)
245+
if err != nil && status.Code(err) == codes.Unimplemented {
246+
p.ttrpcImpl = &origImplWrapper{p.ttrpcImpl}
247+
rpl, err = p.ttrpcImpl.PostUpdateContainer(ctx, req)
248+
}
249+
return rpl, err
208250
case p.builtinImpl != nil:
209251
return p.builtinImpl.PostUpdateContainer(ctx, req)
210252
case p.wasmImpl != nil:
@@ -230,7 +272,12 @@ func (p *pluginType) StopContainer(ctx context.Context, req *StopContainerReques
230272
func (p *pluginType) RemoveContainer(ctx context.Context, req *RemoveContainerRequest) (*RemoveContainerResponse, error) {
231273
switch {
232274
case p.ttrpcImpl != nil:
233-
return p.ttrpcImpl.RemoveContainer(ctx, req)
275+
rpl, err := p.ttrpcImpl.RemoveContainer(ctx, req)
276+
if err != nil && status.Code(err) == codes.Unimplemented {
277+
p.ttrpcImpl = &origImplWrapper{p.ttrpcImpl}
278+
rpl, err = p.ttrpcImpl.RemoveContainer(ctx, req)
279+
}
280+
return rpl, err
234281
case p.builtinImpl != nil:
235282
return p.builtinImpl.RemoveContainer(ctx, req)
236283
case p.wasmImpl != nil:
@@ -266,3 +313,75 @@ func (p *pluginType) ValidateContainerAdjustment(ctx context.Context, req *Valid
266313

267314
return nil, errUnknownImpl
268315
}
316+
317+
type origImplWrapper struct {
318+
api.PluginService
319+
}
320+
321+
func (o *origImplWrapper) RunPodSandbox(ctx context.Context, req *RunPodSandboxRequest) (*RunPodSandboxResponse, error) {
322+
_, err := o.PluginService.StateChange(ctx, &StateChangeEvent{
323+
Event: Event_RUN_POD_SANDBOX,
324+
Pod: req.GetPod(),
325+
})
326+
return &api.RunPodSandboxResponse{}, err
327+
}
328+
329+
func (o *origImplWrapper) PostUpdatePodSandbox(ctx context.Context, req *PostUpdatePodSandboxRequest) (*PostUpdatePodSandboxResponse, error) {
330+
_, err := o.PluginService.StateChange(ctx, &StateChangeEvent{
331+
Event: Event_POST_UPDATE_POD_SANDBOX,
332+
Pod: req.GetPod(),
333+
})
334+
return &api.PostUpdatePodSandboxResponse{}, err
335+
}
336+
337+
func (o *origImplWrapper) StopPodSandbox(ctx context.Context, req *StopPodSandboxRequest) (*StopPodSandboxResponse, error) {
338+
_, err := o.PluginService.StateChange(ctx, &StateChangeEvent{
339+
Event: Event_STOP_POD_SANDBOX,
340+
Pod: req.GetPod(),
341+
})
342+
return &api.StopPodSandboxResponse{}, err
343+
}
344+
345+
func (o *origImplWrapper) RemovePodSandbox(ctx context.Context, req *RemovePodSandboxRequest) (*RemovePodSandboxResponse, error) {
346+
_, err := o.PluginService.StateChange(ctx, &StateChangeEvent{
347+
Event: Event_REMOVE_POD_SANDBOX,
348+
Pod: req.GetPod(),
349+
})
350+
return &api.RemovePodSandboxResponse{}, err
351+
}
352+
353+
func (o *origImplWrapper) PostCreateContainer(ctx context.Context, req *PostCreateContainerRequest) (*PostCreateContainerResponse, error) {
354+
_, err := o.PluginService.StateChange(ctx, &StateChangeEvent{
355+
Event: Event_POST_CREATE_CONTAINER,
356+
Pod: req.GetPod(),
357+
Container: req.GetContainer(),
358+
})
359+
return &api.PostCreateContainerResponse{}, err
360+
}
361+
362+
func (o *origImplWrapper) StartContainer(ctx context.Context, req *StartContainerRequest) (*StartContainerResponse, error) {
363+
_, err := o.PluginService.StateChange(ctx, &StateChangeEvent{
364+
Event: Event_START_CONTAINER,
365+
Pod: req.GetPod(),
366+
Container: req.GetContainer(),
367+
})
368+
return &api.StartContainerResponse{}, err
369+
}
370+
371+
func (o *origImplWrapper) PostStartContainer(ctx context.Context, req *PostStartContainerRequest) (*PostStartContainerResponse, error) {
372+
_, err := o.PluginService.StateChange(ctx, &StateChangeEvent{
373+
Event: Event_POST_START_CONTAINER,
374+
Pod: req.GetPod(),
375+
Container: req.GetContainer(),
376+
})
377+
return &api.PostStartContainerResponse{}, err
378+
}
379+
380+
func (o *origImplWrapper) RemoveContainer(ctx context.Context, req *RemoveContainerRequest) (*RemoveContainerResponse, error) {
381+
_, err := o.PluginService.StateChange(ctx, &StateChangeEvent{
382+
Event: Event_REMOVE_CONTAINER,
383+
Pod: req.GetPod(),
384+
Container: req.GetContainer(),
385+
})
386+
return &api.RemoveContainerResponse{}, err
387+
}

0 commit comments

Comments
 (0)