diff --git a/src/runtime/virtcontainers/agent.go b/src/runtime/virtcontainers/agent.go index 4008967f4..817bf158d 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 f11377124..b52f981c7 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 e8b82fa8b..6e88fcbba 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 8a6e2cb2c..082bf157d 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 c79127976..51810a41d 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 88737e272..c5ac60808 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 231d4e228..33fbe3e20 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 0a78a1118..3e7077917 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() +}