From 7c205be27d7a2a5b12de33fc28bea3155ad32270 Mon Sep 17 00:00:00 2001 From: Alex Price Date: Mon, 29 Jun 2020 00:42:08 -0700 Subject: [PATCH] virtcontainers: add support for getOOMEvent agent endpoint to sandbox [ port from runtime commit 86686b56a2bf7f6dd62f620278ae289564da51d0 ] This adds support for the getOOMEvent agent endpoint to retrieve OOM events from the agent. Signed-off-by: Alex Price Signed-off-by: Peng Tao --- src/runtime/virtcontainers/agent.go | 4 ++++ src/runtime/virtcontainers/interfaces.go | 2 ++ src/runtime/virtcontainers/kata_agent.go | 19 ++++++++++++++++++- src/runtime/virtcontainers/kata_agent_test.go | 3 +++ src/runtime/virtcontainers/noop_agent.go | 4 ++++ src/runtime/virtcontainers/noop_agent_test.go | 9 +++++++++ .../virtcontainers/pkg/vcmock/sandbox.go | 4 ++++ src/runtime/virtcontainers/sandbox.go | 4 ++++ 8 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/runtime/virtcontainers/agent.go b/src/runtime/virtcontainers/agent.go index 4008967f47..817bf158d4 100644 --- a/src/runtime/virtcontainers/agent.go +++ b/src/runtime/virtcontainers/agent.go @@ -259,4 +259,8 @@ type agent interface { // load data from disk load(persistapi.AgentState) + + // getOOMEvent will wait on OOM events that occur in the sandbox. + // Will return the ID of the container where the event occurred. + getOOMEvent() (string, error) } diff --git a/src/runtime/virtcontainers/interfaces.go b/src/runtime/virtcontainers/interfaces.go index f113771242..b52f981c76 100644 --- a/src/runtime/virtcontainers/interfaces.go +++ b/src/runtime/virtcontainers/interfaces.go @@ -98,6 +98,8 @@ type VCSandbox interface { ListInterfaces() ([]*vcTypes.Interface, error) UpdateRoutes(routes []*vcTypes.Route) ([]*vcTypes.Route, error) ListRoutes() ([]*vcTypes.Route, error) + + GetOOMEvent() (string, error) } // VCContainer is the Container interface diff --git a/src/runtime/virtcontainers/kata_agent.go b/src/runtime/virtcontainers/kata_agent.go index e8b82fa8be..6e88fcbba5 100644 --- a/src/runtime/virtcontainers/kata_agent.go +++ b/src/runtime/virtcontainers/kata_agent.go @@ -21,9 +21,9 @@ import ( "github.com/kata-containers/kata-containers/src/runtime/virtcontainers/device/api" "github.com/kata-containers/kata-containers/src/runtime/virtcontainers/device/config" persistapi "github.com/kata-containers/kata-containers/src/runtime/virtcontainers/persist/api" + aTypes "github.com/kata-containers/kata-containers/src/runtime/virtcontainers/pkg/agent/protocols" kataclient "github.com/kata-containers/kata-containers/src/runtime/virtcontainers/pkg/agent/protocols/client" "github.com/kata-containers/kata-containers/src/runtime/virtcontainers/pkg/agent/protocols/grpc" - aTypes "github.com/kata-containers/kata-containers/src/runtime/virtcontainers/pkg/agent/protocols" vcAnnotations "github.com/kata-containers/kata-containers/src/runtime/virtcontainers/pkg/annotations" vccgroups "github.com/kata-containers/kata-containers/src/runtime/virtcontainers/pkg/cgroups" ns "github.com/kata-containers/kata-containers/src/runtime/virtcontainers/pkg/nsenter" @@ -127,6 +127,7 @@ const ( grpcSetGuestDateTimeRequest = "grpc.SetGuestDateTimeRequest" grpcStartTracingRequest = "grpc.StartTracingRequest" grpcStopTracingRequest = "grpc.StopTracingRequest" + grpcGetOOMEventRequest = "grpc.GetOOMEventRequest" ) // The function is declared this way for mocking in unit tests @@ -2049,6 +2050,9 @@ func (k *kataAgent) installReqFunc(c *kataclient.AgentClient) { k.reqHandlers[grpcStopTracingRequest] = func(ctx context.Context, req interface{}) (interface{}, error) { return k.client.AgentServiceClient.StopTracing(ctx, req.(*grpc.StopTracingRequest)) } + k.reqHandlers[grpcGetOOMEventRequest] = func(ctx context.Context, req interface{}) (interface{}, error) { + return k.client.AgentServiceClient.GetOOMEvent(ctx, req.(*grpc.GetOOMEventRequest)) + } } func (k *kataAgent) getReqContext(reqName string) (ctx context.Context, cancel context.CancelFunc) { @@ -2378,3 +2382,16 @@ func (k *kataAgent) load(s persistapi.AgentState) { k.state.ProxyPid = s.ProxyPid k.state.URL = s.URL } + +func (k *kataAgent) getOOMEvent() (string, error) { + req := &grpc.GetOOMEventRequest{} + result, err := k.sendReq(req) + if err != nil { + return "", err + } + oomEvent, ok := result.(*grpc.OOMEvent) + if ok { + return oomEvent.ContainerId, err + } + return "", err +} diff --git a/src/runtime/virtcontainers/kata_agent_test.go b/src/runtime/virtcontainers/kata_agent_test.go index 8a6e2cb2c1..082bf157d2 100644 --- a/src/runtime/virtcontainers/kata_agent_test.go +++ b/src/runtime/virtcontainers/kata_agent_test.go @@ -350,6 +350,9 @@ func TestKataAgentSendReq(t *testing.T) { _, err = k.readProcessStderr(container, execid, []byte{}) assert.Nil(err) + + _, err = k.getOOMEvent() + assert.Nil(err) } func TestHandleEphemeralStorage(t *testing.T) { diff --git a/src/runtime/virtcontainers/noop_agent.go b/src/runtime/virtcontainers/noop_agent.go index c791279760..51810a41db 100644 --- a/src/runtime/virtcontainers/noop_agent.go +++ b/src/runtime/virtcontainers/noop_agent.go @@ -236,3 +236,7 @@ func (n *noopAgent) save() (s persistapi.AgentState) { // load is the Noop agent state loader. It does nothing. func (n *noopAgent) load(s persistapi.AgentState) {} + +func (n *noopAgent) getOOMEvent() (string, error) { + return "", nil +} diff --git a/src/runtime/virtcontainers/noop_agent_test.go b/src/runtime/virtcontainers/noop_agent_test.go index 88737e272c..c5ac60808d 100644 --- a/src/runtime/virtcontainers/noop_agent_test.go +++ b/src/runtime/virtcontainers/noop_agent_test.go @@ -237,3 +237,12 @@ func TestNoopCopyFile(t *testing.T) { err := n.copyFile("", "") assert.Nil(err) } + +func TestNoopGetOOMEvent(t *testing.T) { + assert := assert.New(t) + n := &noopAgent{} + + containerID, err := n.getOOMEvent() + assert.Nil(err) + assert.Empty(containerID) +} diff --git a/src/runtime/virtcontainers/pkg/vcmock/sandbox.go b/src/runtime/virtcontainers/pkg/vcmock/sandbox.go index 231d4e2286..33fbe3e208 100644 --- a/src/runtime/virtcontainers/pkg/vcmock/sandbox.go +++ b/src/runtime/virtcontainers/pkg/vcmock/sandbox.go @@ -212,3 +212,7 @@ func (s *Sandbox) UpdateRoutes(routes []*vcTypes.Route) ([]*vcTypes.Route, error func (s *Sandbox) ListRoutes() ([]*vcTypes.Route, error) { return nil, nil } + +func (s *Sandbox) GetOOMEvent() (string, error) { + return "", nil +} diff --git a/src/runtime/virtcontainers/sandbox.go b/src/runtime/virtcontainers/sandbox.go index 0a78a11188..3e70779174 100644 --- a/src/runtime/virtcontainers/sandbox.go +++ b/src/runtime/virtcontainers/sandbox.go @@ -2201,3 +2201,7 @@ func (s *Sandbox) GetPatchedOCISpec() *specs.Spec { return nil } + +func (s *Sandbox) GetOOMEvent() (string, error) { + return s.agent.getOOMEvent() +}