Add checkpoint/restore e2e test for overlay configurations.

This tests that various MemoryFiles are serialized and deserialized correctly
from the container state file.

PiperOrigin-RevId: 589887745
This commit is contained in:
Ayush Ranjan
2023-12-11 11:33:55 -08:00
committed by gVisor bot
parent 0bdb383c24
commit a047cde5e6
2 changed files with 66 additions and 1 deletions
+65
View File
@@ -213,3 +213,68 @@ func TestOverlayRootfsWhiteout(t *testing.T) {
t.Errorf("root directory contains a file/directory whose name contains %q: output = %q", boot.SelfFilestorePrefix, got)
}
}
func TestOverlayCheckpointRestore(t *testing.T) {
if !testutil.IsCheckpointSupported() {
t.Skip("Checkpoint is not supported.")
}
dockerutil.EnsureDockerExperimentalEnabled()
dir, err := os.MkdirTemp(testutil.TmpDir(), "submount")
if err != nil {
t.Fatalf("MkdirTemp(): %v", err)
}
defer os.RemoveAll(dir)
ctx := context.Background()
d := dockerutil.MakeContainerWithRuntime(ctx, t, "-overlay")
defer d.CleanUp(ctx)
opts := dockerutil.RunOpts{
Image: "basic/alpine",
Mounts: []mount.Mount{
{
Type: mount.TypeBind,
Source: dir,
Target: "/submount",
},
},
}
if err := d.Spawn(ctx, opts, "sleep", "infinity"); err != nil {
t.Fatalf("docker run failed: %v", err)
}
// Create files in rootfs and submount.
if _, err := d.Exec(ctx, dockerutil.ExecOpts{}, "/bin/sh", "-c", "echo rootfs > /file"); err != nil {
t.Fatalf("docker exec failed: %v", err)
}
if _, err := d.Exec(ctx, dockerutil.ExecOpts{}, "/bin/sh", "-c", "echo submount > /submount/file"); err != nil {
t.Fatalf("docker exec failed: %v", err)
}
// Check that the file was not created on host.
if _, err := os.Stat(filepath.Join(dir, "file")); err == nil || !os.IsNotExist(err) {
t.Fatalf("file was created on host, expected err = ENOENT, got %v", err)
}
// Create a snapshot.
if err := d.Checkpoint(ctx, "test"); err != nil {
t.Fatalf("docker checkpoint failed: %v", err)
}
if err := d.WaitTimeout(ctx, defaultWait); err != nil {
t.Fatalf("wait failed: %v", err)
}
// Restore the snapshot.
// TODO(b/143498576): Remove Poll after github.com/moby/moby/issues/38963 is fixed.
if err := testutil.Poll(func() error { return d.Restore(ctx, "test") }, defaultWait); err != nil {
t.Fatalf("docker restore failed: %v", err)
}
// Make sure the files are restored in the overlay.
if got, err := d.Exec(ctx, dockerutil.ExecOpts{}, "cat", "/file"); err != nil || got != "rootfs\n" {
t.Errorf("cat /file returned: output = %q, err = %v", got, err)
}
if got, err := d.Exec(ctx, dockerutil.ExecOpts{}, "cat", "/submount/file"); err != nil || got != "submount\n" {
t.Errorf("cat /submount/file returned: output = %q, err = %v", got, err)
}
}
+1 -1
View File
@@ -179,7 +179,7 @@ func TestPauseResume(t *testing.T) {
func TestCheckpointRestore(t *testing.T) {
if !testutil.IsCheckpointSupported() {
t.Skip("Pause/resume is not supported.")
t.Skip("Checkpoint is not supported.")
}
dockerutil.EnsureDockerExperimentalEnabled()