diff options
Diffstat (limited to 'runsc/test')
-rwxr-xr-x | runsc/test/install.sh | 3 | ||||
-rw-r--r-- | runsc/test/integration/integration_test.go | 44 | ||||
-rw-r--r-- | runsc/test/testutil/docker.go | 16 |
3 files changed, 62 insertions, 1 deletions
diff --git a/runsc/test/install.sh b/runsc/test/install.sh index 457df2d26..8f05dea20 100755 --- a/runsc/test/install.sh +++ b/runsc/test/install.sh @@ -76,7 +76,8 @@ if [[ ${uninstall} == 0 ]]; then sudo -n chmod a+wx "${logdir}" declare -r args="--debug-log '${logdir}/' --debug --strace --log-packets" - sudo -n "${dockercfg}" runtime-add "${runtime}" "${runsc}" ${args} + # experimental is needed to checkpoint/restore. + sudo -n "${dockercfg}" --experimental=true runtime-add "${runtime}" "${runsc}" ${args} sudo -n "${dockercfg}" runtime-add "${runtime}"-kvm "${runsc}" --platform=kvm ${args} sudo -n "${dockercfg}" runtime-add "${runtime}"-hostnet "${runsc}" --network=host ${args} sudo -n "${dockercfg}" runtime-add "${runtime}"-overlay "${runsc}" --overlay ${args} diff --git a/runsc/test/integration/integration_test.go b/runsc/test/integration/integration_test.go index 842f05545..de17dd3c2 100644 --- a/runsc/test/integration/integration_test.go +++ b/runsc/test/integration/integration_test.go @@ -148,6 +148,50 @@ func TestPauseResume(t *testing.T) { } } +func TestCheckpointRestore(t *testing.T) { + if !testutil.IsPauseResumeSupported() { + t.Log("Pause/resume is not supported, skipping test.") + return + } + if err := testutil.Pull("google/python-hello"); err != nil { + t.Fatal("docker pull failed:", err) + } + d := testutil.MakeDocker("save-restore-test") + if err := d.Run("-p", "8080", "google/python-hello"); err != nil { + t.Fatalf("docker run failed: %v", err) + } + defer d.CleanUp() + + if err := d.Checkpoint("test"); err != nil { + t.Fatal("docker checkpoint failed:", err) + } + + if _, err := d.Wait(30 * time.Second); err != nil { + t.Fatal(err) + } + + if err := d.Restore("test"); err != nil { + t.Fatal("docker restore failed:", err) + } + + // Find where port 8080 is mapped to. + port, err := d.FindPort(8080) + if err != nil { + t.Fatal("docker.FindPort(8080) failed:", err) + } + + // Wait until it's up and running. + if err := testutil.WaitForHTTP(port, 30*time.Second); err != nil { + t.Fatal("WaitForHTTP() timeout:", err) + } + + // Check if container is working again. + client := http.Client{Timeout: time.Duration(2 * time.Second)} + if err := httpRequestSucceeds(client, "localhost", port); err != nil { + t.Error("http request failed:", err) + } +} + // Create client and server that talk to each other using the local IP. func TestConnectToSelf(t *testing.T) { d := testutil.MakeDocker("connect-to-self-test") diff --git a/runsc/test/testutil/docker.go b/runsc/test/testutil/docker.go index ecd66dc77..e103e930c 100644 --- a/runsc/test/testutil/docker.go +++ b/runsc/test/testutil/docker.go @@ -263,6 +263,22 @@ func (d *Docker) Unpause() error { return nil } +// Checkpoint calls 'docker checkpoint'. +func (d *Docker) Checkpoint(name string) error { + if _, err := do("checkpoint", "create", d.Name, name); err != nil { + return fmt.Errorf("error pausing container %q: %v", d.Name, err) + } + return nil +} + +// Restore calls 'docker start --checkname [name]'. +func (d *Docker) Restore(name string) error { + if _, err := do("start", "--checkpoint", name, d.Name); err != nil { + return fmt.Errorf("error starting container %q: %v", d.Name, err) + } + return nil +} + // Remove calls 'docker rm'. func (d *Docker) Remove() error { if _, err := do("rm", d.Name); err != nil { |