@@ -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
2628type pluginType struct {
@@ -74,7 +76,12 @@ func (p *pluginType) Configure(ctx context.Context, req *ConfigureRequest) (*Con
7476func (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
100107func (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
113125func (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
126143func (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
152174func (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
165192func (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
178210func (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
204241func (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
230272func (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