Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions pkg/adaptation/adaptation.go
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,47 @@ func (r *Adaptation) UpdatePodSandbox(ctx context.Context, req *UpdatePodSandbox
return &UpdatePodSandboxResponse{}, nil
}

// PodSandboxStatus relays the corresponding CRI request to plugins.
// If a plugin returns IP addresses, those will be returned to the caller.
// An error is returned if multiple plugins attempt to set the same field.
func (r *Adaptation) PodSandboxStatus(ctx context.Context, req *PodSandboxStatusRequest) (*PodSandboxStatusResponse, error) {
r.Lock()
defer r.Unlock()
defer r.removeClosedPlugins()

var (
rsp = &PodSandboxStatusResponse{}
ipOwner = ""
additionalIpsOwner = ""
)

for _, plugin := range r.plugins {
pluginRsp, err := plugin.podSandboxStatus(ctx, req)
if err != nil {
return nil, err
}
if pluginRsp == nil || (pluginRsp.Ip == "" && len(pluginRsp.AdditionalIps) == 0) {
continue
}
if pluginRsp.Ip != "" {
if ipOwner != "" {
return nil, fmt.Errorf("plugins %q and %q both tried to set PodSandboxStatus IP address field", ipOwner, plugin.name())
}
rsp.Ip = pluginRsp.Ip
ipOwner = plugin.name()
}
if len(pluginRsp.AdditionalIps) > 0 {
if additionalIpsOwner != "" {
return nil, fmt.Errorf("plugins %q and %q both tried to set PodSandboxStatus additional IP addresses field", additionalIpsOwner, plugin.name())
}
rsp.AdditionalIps = pluginRsp.AdditionalIps
additionalIpsOwner = plugin.name()
}
}

return rsp, nil
}

// PostUpdatePodSandbox relays the corresponding CRI event to plugins.
func (r *Adaptation) PostUpdatePodSandbox(ctx context.Context, evt *StateChangeEvent) error {
evt.Event = Event_POST_UPDATE_POD_SANDBOX
Expand Down
3 changes: 3 additions & 0 deletions pkg/adaptation/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ type (
RunPodSandboxRequest = api.RunPodSandboxRequest
UpdatePodSandboxRequest = api.UpdatePodSandboxRequest
UpdatePodSandboxResponse = api.UpdatePodSandboxResponse
PodSandboxStatusRequest = api.PodSandboxStatusRequest
PodSandboxStatusResponse = api.PodSandboxStatusResponse
StopPodSandboxRequest = api.StopPodSandboxRequest
RemovePodSandboxRequest = api.RemovePodSandboxRequest
PostUpdatePodSandboxRequest = api.PostUpdatePodSandboxRequest
Expand Down Expand Up @@ -127,6 +129,7 @@ const (
Event_STOP_CONTAINER = api.Event_STOP_CONTAINER
Event_REMOVE_CONTAINER = api.Event_REMOVE_CONTAINER
Event_VALIDATE_CONTAINER_ADJUSTMENT = api.Event_VALIDATE_CONTAINER_ADJUSTMENT
Event_POD_SANDBOX_STATUS = api.Event_POD_SANDBOX_STATUS
ValidEvents = api.ValidEvents

ContainerState_CONTAINER_UNKNOWN = api.ContainerState_CONTAINER_UNKNOWN
Expand Down
12 changes: 12 additions & 0 deletions pkg/adaptation/builtin/plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ type BuiltinHandlers struct {
RemovePodSandbox func(context.Context, *api.RemovePodSandboxRequest) error
UpdatePodSandbox func(context.Context, *api.UpdatePodSandboxRequest) (*api.UpdatePodSandboxResponse, error)
PostUpdatePodSandbox func(context.Context, *api.PostUpdatePodSandboxRequest) error
PodSandboxStatus func(context.Context, *api.PodSandboxStatusRequest) (*api.PodSandboxStatusResponse, error)

CreateContainer func(context.Context, *api.CreateContainerRequest) (*api.CreateContainerResponse, error)
PostCreateContainer func(context.Context, *api.PostCreateContainerRequest) error
Expand Down Expand Up @@ -84,6 +85,9 @@ func (b *BuiltinPlugin) Configure(ctx context.Context, req *api.ConfigureRequest
if b.Handlers.PostUpdatePodSandbox != nil {
events.Set(api.Event_POST_UPDATE_POD_SANDBOX)
}
if b.Handlers.PodSandboxStatus != nil {
events.Set(api.Event_POD_SANDBOX_STATUS)
}
if b.Handlers.CreateContainer != nil {
events.Set(api.Event_CREATE_CONTAINER)
}
Expand Down Expand Up @@ -204,6 +208,14 @@ func (b *BuiltinPlugin) UpdatePodSandbox(ctx context.Context, req *api.UpdatePod
return &api.UpdatePodSandboxResponse{}, nil
}

// PodSandboxStatus implements PluginService of the NRI API.
func (b *BuiltinPlugin) PodSandboxStatus(ctx context.Context, req *api.PodSandboxStatusRequest) (*api.PodSandboxStatusResponse, error) {
if b.Handlers.PodSandboxStatus != nil {
return b.Handlers.PodSandboxStatus(ctx, req)
}
return &api.PodSandboxStatusResponse{}, nil
}

// PostUpdatePodSandbox is a handler for the PostUpdatePodSandbox event.
func (b *BuiltinPlugin) PostUpdatePodSandbox(ctx context.Context, req *api.PostUpdatePodSandboxRequest) error {
if b.Handlers.PostUpdatePodSandbox != nil {
Expand Down
22 changes: 22 additions & 0 deletions pkg/adaptation/plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -686,6 +686,28 @@ func (p *plugin) updatePodSandbox(ctx context.Context, req *UpdatePodSandboxRequ
return &UpdatePodSandboxResponse{}, nil
}

func (p *plugin) podSandboxStatus(ctx context.Context, req *PodSandboxStatusRequest) (*PodSandboxStatusResponse, error) {
if !p.events.IsSet(Event_POD_SANDBOX_STATUS) {
return nil, nil
}

ctx, cancel := context.WithTimeout(ctx, getPluginRequestTimeout())
defer cancel()

rsp, err := p.impl.PodSandboxStatus(ctx, req)
if err != nil {
if isFatalError(err) {
log.Errorf(ctx, "closing plugin %s, failed to handle event %d: %v",
p.name(), Event_POD_SANDBOX_STATUS, err)
p.close()
return nil, nil
}
return nil, err
}

return rsp, nil
}

// Relay other pod or container state change events to the plugin.
func (p *plugin) StateChange(ctx context.Context, evt *StateChangeEvent) (err error) {
if !p.events.IsSet(evt.Event) {
Expand Down
13 changes: 13 additions & 0 deletions pkg/adaptation/plugin_type.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,19 @@ func (p *pluginType) UpdatePodSandbox(ctx context.Context, req *UpdatePodSandbox
return nil, errUnknownImpl
}

func (p *pluginType) PodSandboxStatus(ctx context.Context, req *PodSandboxStatusRequest) (*PodSandboxStatusResponse, error) {
switch {
case p.ttrpcImpl != nil:
return p.ttrpcImpl.PodSandboxStatus(ctx, req)
case p.builtinImpl != nil:
return p.builtinImpl.PodSandboxStatus(ctx, req)
case p.wasmImpl != nil:
return p.wasmImpl.PodSandboxStatus(ctx, req)
}

return nil, errUnknownImpl
}

func (p *pluginType) StateChange(ctx context.Context, req *StateChangeEvent) (err error) {
switch {
case p.ttrpcImpl != nil:
Expand Down
Loading
Loading