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 12, 2025
1 parent 8955028 commit 21fec05
Show file tree
Hide file tree
Showing 14 changed files with 1,620 additions and 853 deletions.
19 changes: 19 additions & 0 deletions pkg/adaptation/adaptation.go
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,25 @@ 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) {
evt := &StateChangeEvent{
Pod: req.Pod,
Event: Event_UPDATE_POD_SANDBOX,
}
err := r.StateChange(ctx, evt)
if err != nil {
return nil, err
}
return &UpdatePodSandboxResponse{}, 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
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
3 changes: 3 additions & 0 deletions pkg/adaptation/adaptation_suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,9 @@ var _ = Describe("Pod and container requests and events", func() {
}
},
Entry("with RunPodSandbox", "RunPodSandbox"),
// TODO: Figure out why these are broken + write other tests.
// Entry("with UpdatePodSandbox", "UpdatePodSandbox"),
// Entry("with PostUpdatePodSandbox", "PostUpdatePodSandbox"),
Entry("with StopPodSandbox", "StopPodSandbox"),
Entry("with RemovePodSandbox", "RemovePodSandbox"),

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
96 changes: 74 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 All @@ -242,6 +248,22 @@ func (m *mockRuntime) startStopPodAndContainer(ctx context.Context, pod *api.Pod
return err
}

_, err = m.UpdatePodSandbox(ctx, &api.UpdatePodSandboxRequest{
Pod: pod,
OverheadLinuxResources: &api.LinuxResources{},
LinuxResources: &api.LinuxResources{},
})
if err != nil {
return err
}

err = m.runtime.PostUpdatePodSandbox(ctx, &api.StateChangeEvent{
Pod: pod,
})
if err != nil {
return err
}

_, err = m.CreateContainer(ctx, &api.CreateContainerRequest{
Pod: pod,
Container: ctr,
Expand Down Expand Up @@ -341,25 +363,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.LinuxResources) 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 +460,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 +575,20 @@ func (m *mockPlugin) RunPodSandbox(_ context.Context, pod *api.PodSandbox) error
return err
}

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

return m.updatePodSandbox(m, pod, overhead, 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 +670,10 @@ func nopEvent(*mockPlugin, *api.PodSandbox, *api.Container) error {
return nil
}

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

func nopCreateContainer(*mockPlugin, *api.PodSandbox, *api.Container) (*api.ContainerAdjustment, []*api.ContainerUpdate, error) {
return nil, nil, nil
}
Expand All @@ -648,17 +698,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 21fec05

Please sign in to comment.