New oom sync (#257)
* Vendor in runc afaa21f79ade3b2e99a68f3f15e7219155aa4662 This updates the Dockerfile to use go 1.6.2 and install pkg-config are both are now needed by runc. Signed-off-by: Kenfe-Mickael Laventure <mickael.laventure@gmail.com> * Add support for runc create/start operation Signed-off-by: Kenfe-Mickael Laventure <mickael.laventure@gmail.com> * Remove dependency on runc state directory for OOM handler Signed-off-by: Kenfe-Mickael Laventure <mickael.laventure@gmail.com> * Add OOM test Signed-off-by: Kenfe-Mickael Laventure <mickael.laventure@gmail.com>
This commit is contained in:
parent
cf554d59dd
commit
8040df4e89
214 changed files with 215 additions and 30135 deletions
|
@ -4,6 +4,7 @@ import (
|
|||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"sort"
|
||||
|
@ -13,6 +14,11 @@ import (
|
|||
"golang.org/x/net/context"
|
||||
)
|
||||
|
||||
func (cs *ContainerdSuite) GetLogs() string {
|
||||
b, _ := ioutil.ReadFile(cs.logFile.Name())
|
||||
return string(b)
|
||||
}
|
||||
|
||||
func (cs *ContainerdSuite) ListRunningContainers() ([]*types.Container, error) {
|
||||
resp, err := cs.grpcClient.State(context.Background(), &types.StateRequest{})
|
||||
if err != nil {
|
||||
|
@ -38,6 +44,16 @@ func (cs *ContainerdSuite) KillContainer(id string) error {
|
|||
return cs.SignalContainerProcess(id, "init", uint32(syscall.SIGKILL))
|
||||
}
|
||||
|
||||
func (cs *ContainerdSuite) UpdateContainerResource(id string, rs *types.UpdateResource) error {
|
||||
_, err := cs.grpcClient.UpdateContainer(context.Background(), &types.UpdateContainerRequest{
|
||||
Id: id,
|
||||
Pid: "init",
|
||||
Status: "",
|
||||
Resources: rs,
|
||||
})
|
||||
return err
|
||||
}
|
||||
|
||||
func (cs *ContainerdSuite) PauseContainer(id string) error {
|
||||
_, err := cs.grpcClient.UpdateContainer(context.Background(), &types.UpdateContainerRequest{
|
||||
Id: id,
|
||||
|
|
|
@ -9,6 +9,7 @@ import (
|
|||
"github.com/docker/containerd/api/grpc/types"
|
||||
"github.com/docker/docker/pkg/integration/checker"
|
||||
"github.com/go-check/check"
|
||||
ocs "github.com/opencontainers/runtime-spec/specs-go"
|
||||
"google.golang.org/grpc"
|
||||
)
|
||||
|
||||
|
@ -61,7 +62,8 @@ func (cs *ContainerdSuite) TestStartBusyboxTop(t *check.C) {
|
|||
t.Fatal(err)
|
||||
}
|
||||
|
||||
_, err := cs.StartContainer("top", bundleName)
|
||||
containerID := "start-busybox-top"
|
||||
_, err := cs.StartContainer(containerID, bundleName)
|
||||
t.Assert(err, checker.Equals, nil)
|
||||
|
||||
containers, err := cs.ListRunningContainers()
|
||||
|
@ -69,7 +71,7 @@ func (cs *ContainerdSuite) TestStartBusyboxTop(t *check.C) {
|
|||
t.Fatal(err)
|
||||
}
|
||||
t.Assert(len(containers), checker.Equals, 1)
|
||||
t.Assert(containers[0].Id, checker.Equals, "top")
|
||||
t.Assert(containers[0].Id, checker.Equals, containerID)
|
||||
t.Assert(containers[0].Status, checker.Equals, "running")
|
||||
t.Assert(containers[0].BundlePath, check.Equals, filepath.Join(cs.cwd, GetBundle(bundleName).Path))
|
||||
}
|
||||
|
@ -144,8 +146,8 @@ func (cs *ContainerdSuite) TestStartBusyboxTopKill(t *check.C) {
|
|||
t.Fatal(err)
|
||||
}
|
||||
|
||||
containerID := "top"
|
||||
c, err := cs.StartContainer("top", bundleName)
|
||||
containerID := "top-kill"
|
||||
c, err := cs.StartContainer(containerID, bundleName)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
@ -189,8 +191,8 @@ func (cs *ContainerdSuite) TestStartBusyboxTopSignalSigterm(t *check.C) {
|
|||
t.Fatal(err)
|
||||
}
|
||||
|
||||
containerID := "top"
|
||||
c, err := cs.StartContainer("top", bundleName)
|
||||
containerID := "top-sigterm"
|
||||
c, err := cs.StartContainer(containerID, bundleName)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
@ -229,7 +231,7 @@ func (cs *ContainerdSuite) TestStartBusyboxTopSignalSigterm(t *check.C) {
|
|||
}
|
||||
|
||||
func (cs *ContainerdSuite) TestStartBusyboxTrapUSR1(t *check.C) {
|
||||
if err := CreateBusyboxBundle("busybox-trap-usr1", []string{"sh", "-c", "trap 'echo -n booh!' SIGUSR1 ; sleep 100 & wait"}); err != nil {
|
||||
if err := CreateBusyboxBundle("busybox-trap-usr1", []string{"sh", "-c", "trap 'echo -n booh!' SIGUSR1 ; sleep 60 & wait"}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
|
@ -239,6 +241,8 @@ func (cs *ContainerdSuite) TestStartBusyboxTrapUSR1(t *check.C) {
|
|||
t.Fatal(err)
|
||||
}
|
||||
|
||||
<-time.After(1 * time.Second)
|
||||
|
||||
if err := cs.SignalContainer(containerID, uint32(syscall.SIGUSR1)); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
@ -259,7 +263,7 @@ func (cs *ContainerdSuite) TestStartBusyboxTopPauseResume(t *check.C) {
|
|||
t.Fatal(err)
|
||||
}
|
||||
|
||||
containerID := "top"
|
||||
containerID := "top-pause-resume"
|
||||
c, err := cs.StartContainer(containerID, bundleName)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
|
@ -310,10 +314,59 @@ func (cs *ContainerdSuite) TestStartBusyboxTopPauseResume(t *check.C) {
|
|||
t.Fatal(err)
|
||||
}
|
||||
t.Assert(len(containers), checker.Equals, 1)
|
||||
t.Assert(containers[0].Id, checker.Equals, "top")
|
||||
t.Assert(containers[0].Id, checker.Equals, containerID)
|
||||
t.Assert(containers[0].Status, checker.Equals, "running")
|
||||
}
|
||||
|
||||
func (cs *ContainerdSuite) TestOOM(t *check.C) {
|
||||
bundleName := "busybox-sh-512k-memlimit"
|
||||
if err := CreateBundleWithFilter("busybox", bundleName, []string{"sh", "-c", "x=oom-party-time; while true; do x=$x$x$x$x$x$x$x$x$x$x; done"}, func(spec *ocs.Spec) {
|
||||
// Limit to 512k for quick oom
|
||||
var limit uint64 = 8 * 1024 * 1024
|
||||
spec.Linux.Resources.Memory = &ocs.Memory{
|
||||
Limit: &limit,
|
||||
}
|
||||
}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
containerID := "sh-oom"
|
||||
c, err := cs.StartContainer(containerID, bundleName)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
for _, evt := range []types.Event{
|
||||
{
|
||||
Type: "start-container",
|
||||
Id: containerID,
|
||||
Status: 0,
|
||||
Pid: "",
|
||||
},
|
||||
{
|
||||
Type: "oom",
|
||||
Id: containerID,
|
||||
Status: 0,
|
||||
Pid: "",
|
||||
},
|
||||
{
|
||||
Type: "exit",
|
||||
Id: containerID,
|
||||
Status: 137,
|
||||
Pid: "init",
|
||||
},
|
||||
} {
|
||||
ch := c.GetEventsChannel()
|
||||
select {
|
||||
case e := <-ch:
|
||||
evt.Timestamp = e.Timestamp
|
||||
t.Assert(*e, checker.Equals, evt)
|
||||
case <-time.After(60 * time.Second):
|
||||
t.Fatal("Container took more than 10 seconds to terminate")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (cs *ContainerdSuite) TestRestart(t *check.C) {
|
||||
bundleName := "busybox-top"
|
||||
if err := CreateBusyboxBundle(bundleName, []string{"top"}); err != nil {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue