Skip to content

Commit

Permalink
Add UpdatePodSandbox to NRI plugin API
Browse files Browse the repository at this point in the history
This API is called by the container runtime to update pod sandbox
resources when they change. This is for the In-place Pod Resize
KEP-1287.

Signed-off-by: Chris Henzie <chrishenzie@google.com>
  • Loading branch information
chrishenzie committed Feb 8, 2025
1 parent 8955028 commit 5688820
Show file tree
Hide file tree
Showing 14 changed files with 2,225 additions and 943 deletions.
12 changes: 12 additions & 0 deletions pkg/adaptation/adaptation.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ type SyncFn func(context.Context, SyncCB) error
type SyncCB func(context.Context, []*PodSandbox, []*Container) ([]*ContainerUpdate, error)

// UpdateFn is a container runtime function for unsolicited container updates.
// TODO: I think I'll need to add one for PodSandboxUpdates.
type UpdateFn func(context.Context, []*ContainerUpdate) ([]*ContainerUpdate, error)

// Adaptation is the NRI abstraction for container runtime NRI adaptation/integration.
Expand Down Expand Up @@ -208,6 +209,17 @@ func (r *Adaptation) RunPodSandbox(ctx context.Context, evt *StateChangeEvent) e
return r.StateChange(ctx, evt)
}

// UpdatePodSandbox relays the corresponding CRI request to plugins.
func (r *Adaptation) UpdatePodSandbox(ctx context.Context, req *UpdatePodSandboxRequest) (*UpdatePodSandboxResponse, error) {

Check warning on line 213 in pkg/adaptation/adaptation.go

View workflow job for this annotation

GitHub Actions / Linters (1.22.3, ubuntu-22.04)

unused-parameter: parameter 'ctx' seems to be unused, consider removing or renaming it as _ (revive)
return nil, errors.New("unimplemented")
}

// 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
return r.StateChange(ctx, evt)
}

// StopPodSandbox relays the corresponding CRI event to plugins.
func (r *Adaptation) StopPodSandbox(ctx context.Context, evt *StateChangeEvent) error {
evt.Event = Event_STOP_POD_SANDBOX
Expand Down
1 change: 1 addition & 0 deletions pkg/adaptation/adaptation_suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import (
"github.com/containerd/nri/pkg/api"
)

// TODO: Add tests.
var _ = Describe("Configuration", func() {
var (
s = &Suite{}
Expand Down
62 changes: 34 additions & 28 deletions pkg/adaptation/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,21 +44,25 @@ type (
StopContainerRequest = api.StopContainerRequest
StopContainerResponse = api.StopContainerResponse

StateChangeEvent = api.StateChangeEvent
StateChangeResponse = api.StateChangeResponse
RunPodSandboxRequest = api.RunPodSandboxRequest
StopPodSandboxRequest = api.StopPodSandboxRequest
RemovePodSandboxRequest = api.RemovePodSandboxRequest
StartContainerRequest = api.StartContainerRequest
StartContainerResponse = api.StartContainerResponse
RemoveContainerRequest = api.RemoveContainerRequest
RemoveContainerResponse = api.RemoveContainerResponse
PostCreateContainerRequest = api.PostCreateContainerRequest
PostCreateContainerResponse = api.PostCreateContainerResponse
PostStartContainerRequest = api.PostStartContainerRequest
PostStartContainerResponse = api.PostStartContainerResponse
PostUpdateContainerRequest = api.PostUpdateContainerRequest
PostUpdateContainerResponse = api.PostUpdateContainerResponse
StateChangeEvent = api.StateChangeEvent
StateChangeResponse = api.StateChangeResponse
RunPodSandboxRequest = api.RunPodSandboxRequest
UpdatePodSandboxRequest = api.UpdatePodSandboxRequest
UpdatePodSandboxResponse = api.UpdatePodSandboxResponse
StopPodSandboxRequest = api.StopPodSandboxRequest
RemovePodSandboxRequest = api.RemovePodSandboxRequest
PostUpdatePodSandboxRequest = api.PostUpdatePodSandboxRequest
PostUpdatePodSandboxResponse = api.PostUpdatePodSandboxResponse
StartContainerRequest = api.StartContainerRequest
StartContainerResponse = api.StartContainerResponse
RemoveContainerRequest = api.RemoveContainerRequest
RemoveContainerResponse = api.RemoveContainerResponse
PostCreateContainerRequest = api.PostCreateContainerRequest
PostCreateContainerResponse = api.PostCreateContainerResponse
PostStartContainerRequest = api.PostStartContainerRequest
PostStartContainerResponse = api.PostStartContainerResponse
PostUpdateContainerRequest = api.PostUpdateContainerRequest
PostUpdateContainerResponse = api.PostUpdateContainerResponse

PodSandbox = api.PodSandbox
LinuxPodSandbox = api.LinuxPodSandbox
Expand Down Expand Up @@ -90,19 +94,21 @@ type (
// Aliased consts for api/api.proto.
// nolint
const (
Event_UNKNOWN = api.Event_UNKNOWN
Event_RUN_POD_SANDBOX = api.Event_RUN_POD_SANDBOX
Event_STOP_POD_SANDBOX = api.Event_STOP_POD_SANDBOX
Event_REMOVE_POD_SANDBOX = api.Event_REMOVE_POD_SANDBOX
Event_CREATE_CONTAINER = api.Event_CREATE_CONTAINER
Event_POST_CREATE_CONTAINER = api.Event_POST_CREATE_CONTAINER
Event_START_CONTAINER = api.Event_START_CONTAINER
Event_POST_START_CONTAINER = api.Event_POST_START_CONTAINER
Event_UPDATE_CONTAINER = api.Event_UPDATE_CONTAINER
Event_POST_UPDATE_CONTAINER = api.Event_POST_UPDATE_CONTAINER
Event_STOP_CONTAINER = api.Event_STOP_CONTAINER
Event_REMOVE_CONTAINER = api.Event_REMOVE_CONTAINER
ValidEvents = api.ValidEvents
Event_UNKNOWN = api.Event_UNKNOWN
Event_RUN_POD_SANDBOX = api.Event_RUN_POD_SANDBOX
Event_UPDATE_POD_SANDBOX = api.Event_UPDATE_POD_SANDBOX
Event_POST_UPDATE_POD_SANDBOX = api.Event_POST_UPDATE_POD_SANDBOX
Event_STOP_POD_SANDBOX = api.Event_STOP_POD_SANDBOX
Event_REMOVE_POD_SANDBOX = api.Event_REMOVE_POD_SANDBOX
Event_CREATE_CONTAINER = api.Event_CREATE_CONTAINER
Event_POST_CREATE_CONTAINER = api.Event_POST_CREATE_CONTAINER
Event_START_CONTAINER = api.Event_START_CONTAINER
Event_POST_START_CONTAINER = api.Event_POST_START_CONTAINER
Event_UPDATE_CONTAINER = api.Event_UPDATE_CONTAINER
Event_POST_UPDATE_CONTAINER = api.Event_POST_UPDATE_CONTAINER
Event_STOP_CONTAINER = api.Event_STOP_CONTAINER
Event_REMOVE_CONTAINER = api.Event_REMOVE_CONTAINER
ValidEvents = api.ValidEvents

ContainerState_CONTAINER_UNKNOWN = api.ContainerState_CONTAINER_UNKNOWN
ContainerState_CONTAINER_CREATED = api.ContainerState_CONTAINER_CREATED
Expand Down
80 changes: 58 additions & 22 deletions pkg/adaptation/suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,12 @@ func (m *mockRuntime) RunPodSandbox(ctx context.Context, evt *api.StateChangeEve
return m.runtime.RunPodSandbox(ctx, evt)
}

func (m *mockRuntime) UpdatePodSandbox(ctx context.Context, req *api.UpdatePodSandboxRequest) (*api.UpdatePodSandboxResponse, error) {
b := m.runtime.BlockPluginSync()
defer b.Unblock()
return m.runtime.UpdatePodSandbox(ctx, req)
}

func (m *mockRuntime) CreateContainer(ctx context.Context, req *api.CreateContainerRequest) (*api.CreateContainerResponse, error) {
b := m.runtime.BlockPluginSync()
defer b.Unblock()
Expand Down Expand Up @@ -341,25 +347,29 @@ type mockPlugin struct {
pods map[string]*api.PodSandbox
ctrs map[string]*api.Container

runPodSandbox func(*mockPlugin, *api.PodSandbox, *api.Container) error
stopPodSandbox func(*mockPlugin, *api.PodSandbox, *api.Container) error
removePodSandbox func(*mockPlugin, *api.PodSandbox, *api.Container) error
createContainer func(*mockPlugin, *api.PodSandbox, *api.Container) (*api.ContainerAdjustment, []*api.ContainerUpdate, error)
postCreateContainer func(*mockPlugin, *api.PodSandbox, *api.Container) error
startContainer func(*mockPlugin, *api.PodSandbox, *api.Container) error
postStartContainer func(*mockPlugin, *api.PodSandbox, *api.Container) error
updateContainer func(*mockPlugin, *api.PodSandbox, *api.Container, *api.LinuxResources) ([]*api.ContainerUpdate, error)
postUpdateContainer func(*mockPlugin, *api.PodSandbox, *api.Container) error
stopContainer func(*mockPlugin, *api.PodSandbox, *api.Container) ([]*api.ContainerUpdate, error)
removeContainer func(*mockPlugin, *api.PodSandbox, *api.Container) error
runPodSandbox func(*mockPlugin, *api.PodSandbox, *api.Container) error
updatePodSandbox func(*mockPlugin, *api.PodSandbox, *api.LinuxResources) (*api.PodSandboxUpdate, error)
postUpdatePodSandbox func(*mockPlugin, *api.PodSandbox, *api.Container) error
stopPodSandbox func(*mockPlugin, *api.PodSandbox, *api.Container) error
removePodSandbox func(*mockPlugin, *api.PodSandbox, *api.Container) error
createContainer func(*mockPlugin, *api.PodSandbox, *api.Container) (*api.ContainerAdjustment, []*api.ContainerUpdate, error)
postCreateContainer func(*mockPlugin, *api.PodSandbox, *api.Container) error
startContainer func(*mockPlugin, *api.PodSandbox, *api.Container) error
postStartContainer func(*mockPlugin, *api.PodSandbox, *api.Container) error
updateContainer func(*mockPlugin, *api.PodSandbox, *api.Container, *api.LinuxResources) ([]*api.ContainerUpdate, error)
postUpdateContainer func(*mockPlugin, *api.PodSandbox, *api.Container) error
stopContainer func(*mockPlugin, *api.PodSandbox, *api.Container) ([]*api.ContainerUpdate, error)
removeContainer func(*mockPlugin, *api.PodSandbox, *api.Container) error
}

var (
_ = stub.ConfigureInterface(&mockPlugin{})
_ = stub.SynchronizeInterface(&mockPlugin{})
_ = stub.RunPodInterface(&mockPlugin{})
_ = stub.UpdatePodInterface(&mockPlugin{})
_ = stub.StopPodInterface(&mockPlugin{})
_ = stub.RemovePodInterface(&mockPlugin{})
_ = stub.PostUpdatePodInterface(&mockPlugin{})
_ = stub.CreateContainerInterface(&mockPlugin{})
_ = stub.StartContainerInterface(&mockPlugin{})
_ = stub.UpdateContainerInterface(&mockPlugin{})
Expand Down Expand Up @@ -434,6 +444,12 @@ func (m *mockPlugin) Init(dir string) error {
if m.runPodSandbox == nil {
m.runPodSandbox = nopEvent
}
if m.updatePodSandbox == nil {
m.updatePodSandbox = nopUpdatePodSandbox
}
if m.postUpdatePodSandbox == nil {
m.postUpdatePodSandbox = nopEvent
}
if m.stopPodSandbox == nil {
m.stopPodSandbox = nopEvent
}
Expand Down Expand Up @@ -543,6 +559,20 @@ func (m *mockPlugin) RunPodSandbox(_ context.Context, pod *api.PodSandbox) error
return err
}

func (m *mockPlugin) UpdatePodSandbox(_ context.Context, pod *api.PodSandbox, res *api.LinuxResources) (*api.PodSandboxUpdate, error) {
m.pods[pod.Id] = pod
m.q.Add(PodSandboxEvent(pod, UpdatePodSandbox))

return m.updatePodSandbox(m, pod, res)
}

func (m *mockPlugin) PostUpdatePodSandbox(_ context.Context, pod *api.PodSandbox) error {
m.pods[pod.Id] = pod
err := m.postUpdatePodSandbox(m, pod, nil)
m.q.Add(PodSandboxEvent(pod, PostUpdatePodSandbox))
return err
}

func (m *mockPlugin) StopPodSandbox(_ context.Context, pod *api.PodSandbox) error {
m.pods[pod.Id] = pod
err := m.stopPodSandbox(m, pod, nil)
Expand Down Expand Up @@ -624,6 +654,10 @@ func nopEvent(*mockPlugin, *api.PodSandbox, *api.Container) error {
return nil
}

func nopUpdatePodSandbox(*mockPlugin, *api.PodSandbox, *api.LinuxResources) (*api.PodSandboxUpdate, error) {
return nil, nil
}

func nopCreateContainer(*mockPlugin, *api.PodSandbox, *api.Container) (*api.ContainerAdjustment, []*api.ContainerUpdate, error) {
return nil, nil, nil
}
Expand All @@ -648,17 +682,19 @@ const (
Disconnected = "closed"
Stopped = "stopped"

RunPodSandbox = "RunPodSandbox"
StopPodSandbox = "StopPodSandbox"
RemovePodSandbox = "RemovePodSandbox"
CreateContainer = "CreateContainer"
StartContainer = "StartContainer"
UpdateContainer = "UpdateContainer"
StopContainer = "StopContainer"
RemoveContainer = "RemoveContainer"
PostCreateContainer = "PostCreateContainer"
PostStartContainer = "PostStartContainer"
PostUpdateContainer = "PostUpdateContainer"
RunPodSandbox = "RunPodSandbox"
UpdatePodSandbox = "UpdatePodSandbox"
StopPodSandbox = "StopPodSandbox"
RemovePodSandbox = "RemovePodSandbox"
PostUpdatePodSandbox = "PostUpdatePodSandbox"
CreateContainer = "CreateContainer"
StartContainer = "StartContainer"
UpdateContainer = "UpdateContainer"
StopContainer = "StopContainer"
RemoveContainer = "RemoveContainer"
PostCreateContainer = "PostCreateContainer"
PostStartContainer = "PostStartContainer"
PostUpdateContainer = "PostUpdateContainer"

Error = "Error"
Timeout = ""
Expand Down
Loading

0 comments on commit 5688820

Please sign in to comment.