Skip to content

Commit

Permalink
Add tests for restore runtime verification
Browse files Browse the repository at this point in the history
On container restore ensures that the same container runtime is used as
during checkpointing and it also ensures that the user does not select
a different runtime.

Signed-off-by: Adrian Reber <[email protected]>
  • Loading branch information
adrianreber committed Nov 19, 2021
1 parent c76caba commit ced0ffb
Showing 1 changed file with 173 additions and 0 deletions.
173 changes: 173 additions & 0 deletions test/e2e/checkpoint_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1377,4 +1377,177 @@ var _ = Describe("Podman checkpoint", func() {
Expect(result).Should(Exit(0))
Expect(podmanTest.NumberOfContainersRunning()).To(Equal(0))
})

It("podman checkpoint container with export and verify runtime", func() {
SkipIfRemote("podman-remote does not support --runtime flag")
localRunString := getRunString([]string{
"--rm",
ALPINE,
"top",
})
session := podmanTest.Podman(localRunString)
session.WaitWithDefaultTimeout()
Expect(session).Should(Exit(0))
Expect(podmanTest.NumberOfContainersRunning()).To(Equal(1))
cid := session.OutputToString()

session = podmanTest.Podman([]string{
"inspect",
"--format",
"{{.OCIRuntime}}",
cid,
})
session.WaitWithDefaultTimeout()
Expect(session).Should(Exit(0))
runtime := session.OutputToString()

fileName := "/tmp/checkpoint-" + cid + ".tar.gz"

result := podmanTest.Podman([]string{
"container",
"checkpoint",
cid, "-e",
fileName,
})
result.WaitWithDefaultTimeout()

// As the container has been started with '--rm' it will be completely
// cleaned up after checkpointing.
Expect(result).Should(Exit(0))
Expect(podmanTest.NumberOfContainersRunning()).To(Equal(0))
Expect(podmanTest.NumberOfContainers()).To(Equal(0))

result = podmanTest.Podman([]string{
"container",
"restore",
"-i",
fileName,
})
result.WaitWithDefaultTimeout()
Expect(result).Should(Exit(0))
Expect(podmanTest.NumberOfContainersRunning()).To(Equal(1))
Expect(podmanTest.GetContainerStatus()).To(ContainSubstring("Up"))

// The restored container should have the same runtime as the original container
result = podmanTest.Podman([]string{
"inspect",
"--format",
"{{.OCIRuntime}}",
cid,
})
result.WaitWithDefaultTimeout()
Expect(result).Should(Exit(0))
Expect(session.OutputToString()).To(Equal(runtime))

// Remove exported checkpoint
os.Remove(fileName)
})

It("podman checkpoint container with export and try to change the runtime", func() {
SkipIfRemote("podman-remote does not support --runtime flag")
// This test will only run if runc and crun both exist
if !strings.Contains(podmanTest.OCIRuntime, "crun") {
Skip("Test requires crun and runc")
}
cmd := exec.Command("runc")
if err := cmd.Start(); err != nil {
Skip("Test requires crun and runc")
}
if err := cmd.Wait(); err != nil {
Skip("Test requires crun and runc")
}
localRunString := getRunString([]string{
"--rm",
ALPINE,
"top",
})
// Let's start a container with runc and try to restore it with crun (expected to fail)
localRunString = append(
[]string{
"--runtime",
"runc",
},
localRunString...,
)
session := podmanTest.Podman(localRunString)
session.WaitWithDefaultTimeout()
Expect(session).Should(Exit(0))
Expect(podmanTest.NumberOfContainersRunning()).To(Equal(1))
cid := session.OutputToString()

session = podmanTest.Podman([]string{
"inspect",
"--format",
"{{.OCIRuntime}}",
cid,
})
session.WaitWithDefaultTimeout()
Expect(session).Should(Exit(0))
runtime := session.OutputToString()

fileName := "/tmp/checkpoint-" + cid + ".tar.gz"

result := podmanTest.Podman([]string{
"container",
"checkpoint",
cid, "-e",
fileName,
})
result.WaitWithDefaultTimeout()

// As the container has been started with '--rm' it will be completely
// cleaned up after checkpointing.
Expect(result).Should(Exit(0))
Expect(podmanTest.NumberOfContainersRunning()).To(Equal(0))
Expect(podmanTest.NumberOfContainers()).To(Equal(0))

// This should fail as the container was checkpointed with runc
result = podmanTest.Podman([]string{
"--runtime",
"crun",
"container",
"restore",
"-i",
fileName,
})
result.WaitWithDefaultTimeout()

Expect(result).Should(Exit(125))
Expect(result.ErrorToString()).To(
ContainSubstring("and cannot be restored with runtime"),
)

result = podmanTest.Podman([]string{
"--runtime",
"runc",
"container",
"restore",
"-i",
fileName,
})
result.WaitWithDefaultTimeout()
Expect(result).Should(Exit(0))

result = podmanTest.Podman([]string{
"inspect",
"--format",
"{{.OCIRuntime}}",
cid,
})
result.WaitWithDefaultTimeout()
Expect(result).Should(Exit(0))
Expect(result.OutputToString()).To(Equal(runtime))

result = podmanTest.Podman([]string{
"--runtime",
"runc",
"rm",
"-fa",
})
result.WaitWithDefaultTimeout()
Expect(result).Should(Exit(0))
Expect(podmanTest.NumberOfContainersRunning()).To(Equal(0))
// Remove exported checkpoint
os.Remove(fileName)
})
})

0 comments on commit ced0ffb

Please sign in to comment.