Update code for latest containerd.
Signed-off-by: Lantao Liu <lantaol@google.com>
This commit is contained in:
parent
4e2b4aa972
commit
2ce0bb0926
@ -17,13 +17,11 @@ limitations under the License.
|
|||||||
package integration
|
package integration
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
|
||||||
"os/exec"
|
|
||||||
"sort"
|
"sort"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/containerd/containerd"
|
"github.com/containerd/containerd"
|
||||||
|
"github.com/containerd/containerd/errdefs"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
@ -127,7 +125,9 @@ func TestContainerdRestart(t *testing.T) {
|
|||||||
task, err := cntr.Task(ctx, nil)
|
task, err := cntr.Task(ctx, nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
_, err = task.Delete(ctx, containerd.WithProcessKill)
|
_, err = task.Delete(ctx, containerd.WithProcessKill)
|
||||||
require.NoError(t, err)
|
if err != nil {
|
||||||
|
require.True(t, errdefs.IsNotFound(err))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -196,149 +196,4 @@ func TestContainerdRestart(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note: The test moves runc binary.
|
// TODO: Add back the unknown state test.
|
||||||
// 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))
|
|
||||||
}
|
|
||||||
|
@ -21,30 +21,30 @@ package server
|
|||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/containerd/cgroups"
|
v1 "github.com/containerd/cgroups/stats/v1"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGetWorkingSet(t *testing.T) {
|
func TestGetWorkingSet(t *testing.T) {
|
||||||
for desc, test := range map[string]struct {
|
for desc, test := range map[string]struct {
|
||||||
memory *cgroups.MemoryStat
|
memory *v1.MemoryStat
|
||||||
expected uint64
|
expected uint64
|
||||||
}{
|
}{
|
||||||
"nil memory usage": {
|
"nil memory usage": {
|
||||||
memory: &cgroups.MemoryStat{},
|
memory: &v1.MemoryStat{},
|
||||||
expected: 0,
|
expected: 0,
|
||||||
},
|
},
|
||||||
"memory usage higher than inactive_total_file": {
|
"memory usage higher than inactive_total_file": {
|
||||||
memory: &cgroups.MemoryStat{
|
memory: &v1.MemoryStat{
|
||||||
TotalInactiveFile: 1000,
|
TotalInactiveFile: 1000,
|
||||||
Usage: &cgroups.MemoryEntry{Usage: 2000},
|
Usage: &v1.MemoryEntry{Usage: 2000},
|
||||||
},
|
},
|
||||||
expected: 1000,
|
expected: 1000,
|
||||||
},
|
},
|
||||||
"memory usage lower than inactive_total_file": {
|
"memory usage lower than inactive_total_file": {
|
||||||
memory: &cgroups.MemoryStat{
|
memory: &v1.MemoryStat{
|
||||||
TotalInactiveFile: 2000,
|
TotalInactiveFile: 2000,
|
||||||
Usage: &cgroups.MemoryEntry{Usage: 1000},
|
Usage: &v1.MemoryEntry{Usage: 1000},
|
||||||
},
|
},
|
||||||
expected: 0,
|
expected: 0,
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user