mirror of
https://github.com/containers/podman.git
synced 2025-12-02 11:08:36 +08:00
Make sure to wait for the container to exit after kill. While the cleanup process will take care eventually of transitioning the state, we need to give a guarantee to the user to leave the container in the expected state once the (kill) command has finished. The issue could be observed in a flaking test (#16142) where `podman rm -f -t0` failed because the preceding `podman kill` left the container in "running" state which ultimately confused the "stop" backend. Note that we should only wait for the container to exit when SIGKILL is being used. Other signals have different semantics. [NO NEW TESTS NEEDED] as I do not know how to reliably reproduce the issue. If #16142 stops flaking, we are good. Fixes: #16142 Signed-off-by: Valentin Rothberg <vrothberg@redhat.com>
119 lines
3.8 KiB
Go
119 lines
3.8 KiB
Go
package integration
|
|
|
|
import (
|
|
"syscall"
|
|
"time"
|
|
|
|
. "github.com/containers/podman/v4/test/utils"
|
|
. "github.com/onsi/ginkgo"
|
|
. "github.com/onsi/gomega"
|
|
. "github.com/onsi/gomega/gexec"
|
|
)
|
|
|
|
var _ = Describe("Podman attach", func() {
|
|
var (
|
|
tempdir string
|
|
err error
|
|
podmanTest *PodmanTestIntegration
|
|
)
|
|
|
|
BeforeEach(func() {
|
|
tempdir, err = CreateTempDirInTempDir()
|
|
Expect(err).To(BeNil())
|
|
podmanTest = PodmanTestCreate(tempdir)
|
|
podmanTest.Setup()
|
|
})
|
|
|
|
AfterEach(func() {
|
|
podmanTest.Cleanup()
|
|
f := CurrentGinkgoTestDescription()
|
|
processTestResult(f)
|
|
})
|
|
|
|
It("podman attach to bogus container", func() {
|
|
session := podmanTest.Podman([]string{"attach", "foobar"})
|
|
session.WaitWithDefaultTimeout()
|
|
Expect(session).Should(Exit(125))
|
|
})
|
|
|
|
It("podman attach to non-running container", func() {
|
|
session := podmanTest.Podman([]string{"create", "--name", "test1", "-i", ALPINE, "ls"})
|
|
session.WaitWithDefaultTimeout()
|
|
Expect(session).Should(Exit(0))
|
|
|
|
results := podmanTest.Podman([]string{"attach", "test1"})
|
|
results.WaitWithDefaultTimeout()
|
|
Expect(results).Should(Exit(125))
|
|
})
|
|
|
|
It("podman container attach to non-running container", func() {
|
|
session := podmanTest.Podman([]string{"container", "create", "--name", "test1", "-i", ALPINE, "ls"})
|
|
|
|
session.WaitWithDefaultTimeout()
|
|
Expect(session).Should(Exit(0))
|
|
|
|
results := podmanTest.Podman([]string{"container", "attach", "test1"})
|
|
results.WaitWithDefaultTimeout()
|
|
Expect(results).Should(Exit(125))
|
|
})
|
|
|
|
It("podman attach to multiple containers", func() {
|
|
session := podmanTest.RunTopContainer("test1")
|
|
session.WaitWithDefaultTimeout()
|
|
Expect(session).Should(Exit(0))
|
|
|
|
session = podmanTest.RunTopContainer("test2")
|
|
session.WaitWithDefaultTimeout()
|
|
Expect(session).Should(Exit(0))
|
|
|
|
results := podmanTest.Podman([]string{"attach", "test1", "test2"})
|
|
results.WaitWithDefaultTimeout()
|
|
Expect(results).Should(Exit(125))
|
|
})
|
|
|
|
It("podman attach to a running container", func() {
|
|
session := podmanTest.Podman([]string{"run", "-d", "--name", "test", ALPINE, "/bin/sh", "-c", "while true; do echo test; sleep 1; done"})
|
|
session.WaitWithDefaultTimeout()
|
|
Expect(session).Should(Exit(0))
|
|
|
|
results := podmanTest.Podman([]string{"attach", "test"})
|
|
time.Sleep(2 * time.Second)
|
|
results.Signal(syscall.SIGTSTP)
|
|
Expect(results.OutputToString()).To(ContainSubstring("test"))
|
|
Expect(podmanTest.NumberOfContainersRunning()).To(Equal(1))
|
|
})
|
|
|
|
It("podman attach to the latest container", func() {
|
|
session := podmanTest.Podman([]string{"run", "-d", "--name", "test1", ALPINE, "/bin/sh", "-c", "while true; do echo test1; sleep 1; done"})
|
|
session.WaitWithDefaultTimeout()
|
|
Expect(session).Should(Exit(0))
|
|
|
|
session = podmanTest.Podman([]string{"run", "-d", "--name", "test2", ALPINE, "/bin/sh", "-c", "while true; do echo test2; sleep 1; done"})
|
|
session.WaitWithDefaultTimeout()
|
|
Expect(session).Should(Exit(0))
|
|
|
|
cid := "-l"
|
|
if IsRemote() {
|
|
cid = "test2"
|
|
}
|
|
results := podmanTest.Podman([]string{"attach", cid})
|
|
time.Sleep(2 * time.Second)
|
|
results.Signal(syscall.SIGTSTP)
|
|
Expect(results.OutputToString()).To(ContainSubstring("test2"))
|
|
Expect(podmanTest.NumberOfContainersRunning()).To(Equal(2))
|
|
})
|
|
|
|
It("podman attach to a container with --sig-proxy set to false", func() {
|
|
session := podmanTest.Podman([]string{"run", "-d", "--name", "test", ALPINE, "/bin/sh", "-c", "while true; do echo test; sleep 1; done"})
|
|
session.WaitWithDefaultTimeout()
|
|
Expect(session).Should(Exit(0))
|
|
|
|
results := podmanTest.Podman([]string{"attach", "--sig-proxy=false", "test"})
|
|
time.Sleep(2 * time.Second)
|
|
results.Signal(syscall.SIGTERM)
|
|
results.WaitWithDefaultTimeout()
|
|
Expect(results.OutputToString()).To(ContainSubstring("test"))
|
|
Expect(podmanTest.NumberOfContainersRunning()).To(Equal(1))
|
|
})
|
|
})
|