Skip to content

Commit 9abee58

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

14 files changed

Lines changed: 2126 additions & 1394 deletions

File tree

pkg/adaptation/adaptation.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,47 @@ func (r *Adaptation) UpdatePodSandbox(ctx context.Context, req *UpdatePodSandbox
272272
return &UpdatePodSandboxResponse{}, nil
273273
}
274274

275+
// PodSandboxStatus relays the corresponding CRI request to plugins.
276+
// If a plugin returns IP addresses, those will be returned to the caller.
277+
// An error is returned if multiple plugins attempt to set the same field.
278+
func (r *Adaptation) PodSandboxStatus(ctx context.Context, req *PodSandboxStatusRequest) (*PodSandboxStatusResponse, error) {
279+
r.Lock()
280+
defer r.Unlock()
281+
defer r.removeClosedPlugins()
282+
283+
var (
284+
rsp = &PodSandboxStatusResponse{}
285+
ipOwner = ""
286+
additionalIpsOwner = ""
287+
)
288+
289+
for _, plugin := range r.plugins {
290+
pluginRsp, err := plugin.podSandboxStatus(ctx, req)
291+
if err != nil {
292+
return nil, err
293+
}
294+
if pluginRsp == nil || (pluginRsp.Ip == "" && len(pluginRsp.AdditionalIps) == 0) {
295+
continue
296+
}
297+
if pluginRsp.Ip != "" {
298+
if ipOwner != "" {
299+
return nil, fmt.Errorf("plugins %q and %q both tried to set PodSandboxStatus IP address field", ipOwner, plugin.name())
300+
}
301+
rsp.Ip = pluginRsp.Ip
302+
ipOwner = plugin.name()
303+
}
304+
if len(pluginRsp.AdditionalIps) > 0 {
305+
if additionalIpsOwner != "" {
306+
return nil, fmt.Errorf("plugins %q and %q both tried to set PodSandboxStatus additional IP addresses field", additionalIpsOwner, plugin.name())
307+
}
308+
rsp.AdditionalIps = pluginRsp.AdditionalIps
309+
additionalIpsOwner = plugin.name()
310+
}
311+
}
312+
313+
return rsp, nil
314+
}
315+
275316
// PostUpdatePodSandbox relays the corresponding CRI request to plugins.
276317
func (r *Adaptation) PostUpdatePodSandbox(ctx context.Context, req *PostUpdatePodSandboxRequest) error {
277318
r.Lock()

pkg/adaptation/api.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ type (
5454
RunPodSandboxResponse = api.RunPodSandboxResponse
5555
UpdatePodSandboxRequest = api.UpdatePodSandboxRequest
5656
UpdatePodSandboxResponse = api.UpdatePodSandboxResponse
57+
PodSandboxStatusRequest = api.PodSandboxStatusRequest
58+
PodSandboxStatusResponse = api.PodSandboxStatusResponse
5759
StopPodSandboxRequest = api.StopPodSandboxRequest
5860
StopPodSandboxResponse = api.StopPodSandboxResponse
5961
RemovePodSandboxRequest = api.RemovePodSandboxRequest
@@ -132,6 +134,7 @@ const (
132134
Event_STOP_CONTAINER = api.Event_STOP_CONTAINER
133135
Event_REMOVE_CONTAINER = api.Event_REMOVE_CONTAINER
134136
Event_VALIDATE_CONTAINER_ADJUSTMENT = api.Event_VALIDATE_CONTAINER_ADJUSTMENT
137+
Event_POD_SANDBOX_STATUS = api.Event_POD_SANDBOX_STATUS
135138
ValidEvents = api.ValidEvents
136139

137140
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
}
@@ -147,6 +151,14 @@ func (b *BuiltinPlugin) UpdatePodSandbox(ctx context.Context, req *api.UpdatePod
147151
return &api.UpdatePodSandboxResponse{}, nil
148152
}
149153

154+
// PodSandboxStatus implements PluginService of the NRI API.
155+
func (b *BuiltinPlugin) PodSandboxStatus(ctx context.Context, req *api.PodSandboxStatusRequest) (*api.PodSandboxStatusResponse, error) {
156+
if b.Handlers.PodSandboxStatus != nil {
157+
return b.Handlers.PodSandboxStatus(ctx, req)
158+
}
159+
return &api.PodSandboxStatusResponse{}, nil
160+
}
161+
150162
// PostUpdatePodSandbox is a handler for the PostUpdatePodSandbox event.
151163
func (b *BuiltinPlugin) PostUpdatePodSandbox(ctx context.Context, req *api.PostUpdatePodSandboxRequest) (*api.PostUpdatePodSandboxResponse, error) {
152164
if b.Handlers.PostUpdatePodSandbox != nil {

pkg/adaptation/plugin.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -660,6 +660,29 @@ func (p *plugin) updatePodSandbox(ctx context.Context, req *UpdatePodSandboxRequ
660660
return &UpdatePodSandboxResponse{}, nil
661661
}
662662

663+
// Relay PodSandboxStatus request to plugin.
664+
func (p *plugin) podSandboxStatus(ctx context.Context, req *PodSandboxStatusRequest) (*PodSandboxStatusResponse, error) {
665+
if !p.events.IsSet(Event_POD_SANDBOX_STATUS) {
666+
return nil, nil
667+
}
668+
669+
ctx, cancel := context.WithTimeout(ctx, getPluginRequestTimeout())
670+
defer cancel()
671+
672+
rsp, err := p.impl.PodSandboxStatus(ctx, req)
673+
if err != nil {
674+
if isFatalError(err) {
675+
log.Errorf(ctx, "closing plugin %s, failed to handle event %d: %v",
676+
p.name(), Event_POD_SANDBOX_STATUS, err)
677+
p.close()
678+
return nil, nil
679+
}
680+
return nil, err
681+
}
682+
683+
return rsp, nil
684+
}
685+
663686
// Relay PostUpdatePodSandbox request to plugin.
664687
func (p *plugin) postUpdatePodSandbox(ctx context.Context, req *PostUpdatePodSandboxRequest) (*PostUpdatePodSandboxResponse, error) {
665688
event := Event_POST_UPDATE_POD_SANDBOX

pkg/adaptation/plugin_type.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,21 @@ func (p *pluginType) UpdatePodSandbox(ctx context.Context, req *UpdatePodSandbox
111111
return nil, errUnknownImpl
112112
}
113113

114+
// PodSandboxStatus handles type-specific details of relaying a
115+
// PodSandboxStatus request.
116+
func (p *pluginType) PodSandboxStatus(ctx context.Context, req *PodSandboxStatusRequest) (*PodSandboxStatusResponse, error) {
117+
switch {
118+
case p.ttrpcImpl != nil:
119+
return p.ttrpcImpl.PodSandboxStatus(ctx, req)
120+
case p.builtinImpl != nil:
121+
return p.builtinImpl.PodSandboxStatus(ctx, req)
122+
case p.wasmImpl != nil:
123+
return p.wasmImpl.PodSandboxStatus(ctx, req)
124+
}
125+
126+
return nil, errUnknownImpl
127+
}
128+
114129
// PostUpdatePodSandbox handles type-specific details of relaying a
115130
// PostUpdatePodSandbox request.
116131
func (p *pluginType) PostUpdatePodSandbox(ctx context.Context, req *PostUpdatePodSandboxRequest) (*PostUpdatePodSandboxResponse, error) {

0 commit comments

Comments
 (0)