Skip to content

Commit b4bf04c

Browse files
committed
implement PodSandboxStatus support
Signed-off-by: Michael Zappa <michael.zappa@gmail.com>
1 parent bbb1b79 commit b4bf04c

15 files changed

Lines changed: 2303 additions & 1266 deletions

pkg/adaptation/adaptation.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,29 @@ func (r *Adaptation) UpdatePodSandbox(ctx context.Context, req *UpdatePodSandbox
238238
return &UpdatePodSandboxResponse{}, nil
239239
}
240240

241+
// PodSandboxStatus relays the corresponding CRI request to plugins.
242+
// If a plugin returns IP addresses, those will be returned to the caller.
243+
// The last plugin to return non-empty IPs wins.
244+
func (r *Adaptation) PodSandboxStatus(ctx context.Context, req *PodSandboxStatusRequest) (*PodSandboxStatusResponse, error) {
245+
r.Lock()
246+
defer r.Unlock()
247+
defer r.removeClosedPlugins()
248+
249+
rsp := &PodSandboxStatusResponse{}
250+
for _, plugin := range r.plugins {
251+
pluginRsp, err := plugin.podSandboxStatus(ctx, req)
252+
if err != nil {
253+
return nil, err
254+
}
255+
// Use the last plugin's non-empty IP response
256+
if pluginRsp != nil && (pluginRsp.Ip != "" || len(pluginRsp.AdditionalIps) > 0) {
257+
rsp = pluginRsp
258+
}
259+
}
260+
261+
return rsp, nil
262+
}
263+
241264
// PostUpdatePodSandbox relays the corresponding CRI event to plugins.
242265
func (r *Adaptation) PostUpdatePodSandbox(ctx context.Context, evt *StateChangeEvent) error {
243266
evt.Event = Event_POST_UPDATE_POD_SANDBOX

pkg/adaptation/api.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ type (
5353
RunPodSandboxRequest = api.RunPodSandboxRequest
5454
UpdatePodSandboxRequest = api.UpdatePodSandboxRequest
5555
UpdatePodSandboxResponse = api.UpdatePodSandboxResponse
56+
PodSandboxStatusRequest = api.PodSandboxStatusRequest
57+
PodSandboxStatusResponse = api.PodSandboxStatusResponse
5658
StopPodSandboxRequest = api.StopPodSandboxRequest
5759
RemovePodSandboxRequest = api.RemovePodSandboxRequest
5860
PostUpdatePodSandboxRequest = api.PostUpdatePodSandboxRequest
@@ -127,6 +129,7 @@ const (
127129
Event_STOP_CONTAINER = api.Event_STOP_CONTAINER
128130
Event_REMOVE_CONTAINER = api.Event_REMOVE_CONTAINER
129131
Event_VALIDATE_CONTAINER_ADJUSTMENT = api.Event_VALIDATE_CONTAINER_ADJUSTMENT
132+
Event_POD_SANDBOX_STATUS = api.Event_POD_SANDBOX_STATUS
130133
ValidEvents = api.ValidEvents
131134

132135
ContainerState_CONTAINER_UNKNOWN = api.ContainerState_CONTAINER_UNKNOWN

pkg/adaptation/builtin/plugin.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ type BuiltinHandlers struct {
4343
RemovePodSandbox func(context.Context, *api.RemovePodSandboxRequest) error
4444
UpdatePodSandbox func(context.Context, *api.UpdatePodSandboxRequest) (*api.UpdatePodSandboxResponse, error)
4545
PostUpdatePodSandbox func(context.Context, *api.PostUpdatePodSandboxRequest) error
46+
PodSandboxStatus func(context.Context, *api.PodSandboxStatusRequest) (*api.PodSandboxStatusResponse, error)
4647

4748
CreateContainer func(context.Context, *api.CreateContainerRequest) (*api.CreateContainerResponse, error)
4849
PostCreateContainer func(context.Context, *api.PostCreateContainerRequest) error
@@ -84,6 +85,9 @@ func (b *BuiltinPlugin) Configure(ctx context.Context, req *api.ConfigureRequest
8485
if b.Handlers.PostUpdatePodSandbox != nil {
8586
events.Set(api.Event_POST_UPDATE_POD_SANDBOX)
8687
}
88+
if b.Handlers.PodSandboxStatus != nil {
89+
events.Set(api.Event_POD_SANDBOX_STATUS)
90+
}
8791
if b.Handlers.CreateContainer != nil {
8892
events.Set(api.Event_CREATE_CONTAINER)
8993
}
@@ -204,6 +208,14 @@ func (b *BuiltinPlugin) UpdatePodSandbox(ctx context.Context, req *api.UpdatePod
204208
return &api.UpdatePodSandboxResponse{}, nil
205209
}
206210

211+
// PodSandboxStatus implements PluginService of the NRI API.
212+
func (b *BuiltinPlugin) PodSandboxStatus(ctx context.Context, req *api.PodSandboxStatusRequest) (*api.PodSandboxStatusResponse, error) {
213+
if b.Handlers.PodSandboxStatus != nil {
214+
return b.Handlers.PodSandboxStatus(ctx, req)
215+
}
216+
return &api.PodSandboxStatusResponse{}, nil
217+
}
218+
207219
// PostUpdatePodSandbox is a handler for the PostUpdatePodSandbox event.
208220
func (b *BuiltinPlugin) PostUpdatePodSandbox(ctx context.Context, req *api.PostUpdatePodSandboxRequest) error {
209221
if b.Handlers.PostUpdatePodSandbox != nil {

pkg/adaptation/plugin.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -686,6 +686,28 @@ func (p *plugin) updatePodSandbox(ctx context.Context, req *UpdatePodSandboxRequ
686686
return &UpdatePodSandboxResponse{}, nil
687687
}
688688

689+
func (p *plugin) podSandboxStatus(ctx context.Context, req *PodSandboxStatusRequest) (*PodSandboxStatusResponse, error) {
690+
if !p.events.IsSet(Event_POD_SANDBOX_STATUS) {
691+
return nil, nil
692+
}
693+
694+
ctx, cancel := context.WithTimeout(ctx, getPluginRequestTimeout())
695+
defer cancel()
696+
697+
rsp, err := p.impl.PodSandboxStatus(ctx, req)
698+
if err != nil {
699+
if isFatalError(err) {
700+
log.Errorf(ctx, "closing plugin %s, failed to handle event %d: %v",
701+
p.name(), Event_POD_SANDBOX_STATUS, err)
702+
p.close()
703+
return nil, nil
704+
}
705+
return nil, err
706+
}
707+
708+
return rsp, nil
709+
}
710+
689711
// Relay other pod or container state change events to the plugin.
690712
func (p *plugin) StateChange(ctx context.Context, evt *StateChangeEvent) (err error) {
691713
if !p.events.IsSet(evt.Event) {

pkg/adaptation/plugin_type.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,19 @@ func (p *pluginType) UpdatePodSandbox(ctx context.Context, req *UpdatePodSandbox
123123
return nil, errUnknownImpl
124124
}
125125

126+
func (p *pluginType) PodSandboxStatus(ctx context.Context, req *PodSandboxStatusRequest) (*PodSandboxStatusResponse, error) {
127+
switch {
128+
case p.ttrpcImpl != nil:
129+
return p.ttrpcImpl.PodSandboxStatus(ctx, req)
130+
case p.builtinImpl != nil:
131+
return p.builtinImpl.PodSandboxStatus(ctx, req)
132+
case p.wasmImpl != nil:
133+
return p.wasmImpl.PodSandboxStatus(ctx, req)
134+
}
135+
136+
return nil, errUnknownImpl
137+
}
138+
126139
func (p *pluginType) StateChange(ctx context.Context, req *StateChangeEvent) (err error) {
127140
switch {
128141
case p.ttrpcImpl != nil:

0 commit comments

Comments
 (0)