diff --git a/integration/restart_test.go b/integration/restart_test.go index b3bcebc25..180563559 100644 --- a/integration/restart_test.go +++ b/integration/restart_test.go @@ -17,13 +17,11 @@ limitations under the License. package integration import ( - "os" - "os/exec" "sort" "testing" - "time" "github.com/containerd/containerd" + "github.com/containerd/containerd/errdefs" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "golang.org/x/net/context" @@ -127,7 +125,9 @@ func TestContainerdRestart(t *testing.T) { task, err := cntr.Task(ctx, nil) require.NoError(t, err) _, err = task.Delete(ctx, containerd.WithProcessKill) - require.NoError(t, err) + if err != nil { + require.True(t, errdefs.IsNotFound(err)) + } } } @@ -195,150 +195,3 @@ func TestContainerdRestart(t *testing.T) { assert.True(t, found, "should find image %+v", i1) } } - -// Note: The test moves runc binary. -// The test requires: -// 1) The runtime is runc; -// 2) runc is in PATH; -func TestUnknownStateAfterContainerdRestart(t *testing.T) { - if *runtimeHandler != "" { - t.Skip("unsupported config: runtime handler is set") - } - runcPath, err := exec.LookPath("runc") - if err != nil { - t.Skip("unsupported config: runc not in PATH") - } - - sbConfig := PodSandboxConfig("sandbox", "sandbox-unknown-state") - - const testImage = "busybox" - t.Logf("Pull test image %q", testImage) - img, err := imageService.PullImage(&runtime.ImageSpec{Image: testImage}, nil, sbConfig) - require.NoError(t, err) - defer func() { - assert.NoError(t, imageService.RemoveImage(&runtime.ImageSpec{Image: img})) - }() - - t.Log("Should not be able to create sandbox without runc") - tmpRuncPath := Randomize(runcPath) - require.NoError(t, os.Rename(runcPath, tmpRuncPath)) - defer func() { - os.Rename(tmpRuncPath, runcPath) - }() - sb, err := runtimeService.RunPodSandbox(sbConfig, "") - if err == nil { - assert.NoError(t, runtimeService.StopPodSandbox(sb)) - assert.NoError(t, runtimeService.RemovePodSandbox(sb)) - t.Skip("unsupported config: runc is not being used") - } - require.NoError(t, os.Rename(tmpRuncPath, runcPath)) - - t.Log("Create a sandbox") - sb, err = runtimeService.RunPodSandbox(sbConfig, "") - require.NoError(t, err) - defer func() { - // Make sure the sandbox is cleaned up in any case. - runtimeService.StopPodSandbox(sb) - runtimeService.RemovePodSandbox(sb) - }() - ps, err := runtimeService.PodSandboxStatus(sb) - require.NoError(t, err) - assert.Equal(t, runtime.PodSandboxState_SANDBOX_READY, ps.GetState()) - - t.Log("Create a container") - cnConfig := ContainerConfig( - "container-unknown-state", - testImage, - WithCommand("sleep", "1000"), - ) - cn, err := runtimeService.CreateContainer(sb, cnConfig, sbConfig) - require.NoError(t, err) - - t.Log("Start the container") - require.NoError(t, runtimeService.StartContainer(cn)) - cs, err := runtimeService.ContainerStatus(cn) - require.NoError(t, err) - assert.Equal(t, runtime.ContainerState_CONTAINER_RUNNING, cs.GetState()) - - t.Log("Move runc binary, so that container/sandbox can't be loaded after restart") - tmpRuncPath = Randomize(runcPath) - require.NoError(t, os.Rename(runcPath, tmpRuncPath)) - defer func() { - os.Rename(tmpRuncPath, runcPath) - }() - - t.Log("Restart containerd") - RestartContainerd(t) - - t.Log("Sandbox should be in NOTREADY state after containerd restart") - ps, err = runtimeService.PodSandboxStatus(sb) - require.NoError(t, err) - assert.Equal(t, runtime.PodSandboxState_SANDBOX_NOTREADY, ps.GetState()) - - t.Log("Container should be in UNKNOWN state after containerd restart") - cs, err = runtimeService.ContainerStatus(cn) - require.NoError(t, err) - assert.Equal(t, runtime.ContainerState_CONTAINER_UNKNOWN, cs.GetState()) - - t.Log("Stop/remove the sandbox should fail for the lack of runc") - assert.Error(t, runtimeService.StopPodSandbox(sb)) - assert.Error(t, runtimeService.RemovePodSandbox(sb)) - - t.Log("Stop/remove the container should fail for the lack of runc") - assert.Error(t, runtimeService.StopContainer(cn, 10)) - assert.Error(t, runtimeService.RemoveContainer(cn)) - - t.Log("Move runc back") - require.NoError(t, os.Rename(tmpRuncPath, runcPath)) - - t.Log("Sandbox should still be in NOTREADY state") - ps, err = runtimeService.PodSandboxStatus(sb) - require.NoError(t, err) - assert.Equal(t, runtime.PodSandboxState_SANDBOX_NOTREADY, ps.GetState()) - - t.Log("Container should still be in UNKNOWN state") - cs, err = runtimeService.ContainerStatus(cn) - require.NoError(t, err) - assert.Equal(t, runtime.ContainerState_CONTAINER_UNKNOWN, cs.GetState()) - - t.Log("Sandbox operations which require running state should fail") - _, err = runtimeService.PortForward(&runtime.PortForwardRequest{ - PodSandboxId: sb, - Port: []int32{8080}, - }) - assert.Error(t, err) - - t.Log("Container operations which require running state should fail") - assert.Error(t, runtimeService.ReopenContainerLog(cn)) - _, _, err = runtimeService.ExecSync(cn, []string{"ls"}, 10*time.Second) - assert.Error(t, err) - _, err = runtimeService.Attach(&runtime.AttachRequest{ - ContainerId: cn, - Stdin: true, - Stdout: true, - Stderr: true, - }) - assert.Error(t, err) - - t.Log("Containerd should still be running now") - _, err = runtimeService.Status() - require.NoError(t, err) - - t.Log("Remove the container should fail in this state") - assert.Error(t, runtimeService.RemoveContainer(cn)) - - t.Log("Remove the sandbox should fail in this state") - assert.Error(t, runtimeService.RemovePodSandbox(sb)) - - t.Log("Should be able to stop container in this state") - assert.NoError(t, runtimeService.StopContainer(cn, 10)) - - t.Log("Should be able to stop sandbox in this state") - assert.NoError(t, runtimeService.StopPodSandbox(sb)) - - t.Log("Should be able to remove container after stop") - assert.NoError(t, runtimeService.RemoveContainer(cn)) - - t.Log("Should be able to remove sandbox after stop") - assert.NoError(t, runtimeService.RemovePodSandbox(sb)) -} diff --git a/pkg/server/container_stats_list_unix_test.go b/pkg/server/container_stats_list_unix_test.go index 812d2f7f4..09787d905 100644 --- a/pkg/server/container_stats_list_unix_test.go +++ b/pkg/server/container_stats_list_unix_test.go @@ -21,30 +21,30 @@ package server import ( "testing" - "github.com/containerd/cgroups" + v1 "github.com/containerd/cgroups/stats/v1" "github.com/stretchr/testify/assert" ) func TestGetWorkingSet(t *testing.T) { for desc, test := range map[string]struct { - memory *cgroups.MemoryStat + memory *v1.MemoryStat expected uint64 }{ "nil memory usage": { - memory: &cgroups.MemoryStat{}, + memory: &v1.MemoryStat{}, expected: 0, }, "memory usage higher than inactive_total_file": { - memory: &cgroups.MemoryStat{ + memory: &v1.MemoryStat{ TotalInactiveFile: 1000, - Usage: &cgroups.MemoryEntry{Usage: 2000}, + Usage: &v1.MemoryEntry{Usage: 2000}, }, expected: 1000, }, "memory usage lower than inactive_total_file": { - memory: &cgroups.MemoryStat{ + memory: &v1.MemoryStat{ TotalInactiveFile: 2000, - Usage: &cgroups.MemoryEntry{Usage: 1000}, + Usage: &v1.MemoryEntry{Usage: 1000}, }, expected: 0, },