diff options
author | Daniel J Walsh <dwalsh@redhat.com> | 2018-03-16 10:34:32 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-03-16 10:34:32 -0400 |
commit | d7acfb478e5e5e6ac344d18c1a65ab81996fd8b2 (patch) | |
tree | c1a335e5a2291e8447e8f9f4c4ef02e7cde2fd0c /test | |
parent | 2f533888a5adcbfb57ec22a8086aa5e76acb9071 (diff) | |
parent | cd73a6904d3dc91f305c7415ab7bada8a976d815 (diff) | |
download | podman-d7acfb478e5e5e6ac344d18c1a65ab81996fd8b2.tar.gz podman-d7acfb478e5e5e6ac344d18c1a65ab81996fd8b2.tar.bz2 podman-d7acfb478e5e5e6ac344d18c1a65ab81996fd8b2.zip |
Merge pull request #447 from mheon/sig_proxy
Add signal proxying to podman run and attach
Diffstat (limited to 'test')
-rw-r--r-- | test/e2e/libpod_suite_test.go | 2 | ||||
-rw-r--r-- | test/e2e/run_signal_test.go | 101 |
2 files changed, 102 insertions, 1 deletions
diff --git a/test/e2e/libpod_suite_test.go b/test/e2e/libpod_suite_test.go index dc6292ace..634c38b29 100644 --- a/test/e2e/libpod_suite_test.go +++ b/test/e2e/libpod_suite_test.go @@ -162,7 +162,7 @@ func (p *PodmanTest) Podman(args []string) *PodmanSession { command := exec.Command(p.PodmanBinary, podmanOptions...) session, err := gexec.Start(command, GinkgoWriter, GinkgoWriter) if err != nil { - Fail(fmt.Sprintf("unable to run podman command: %s", strings.Join(podmanOptions, " "))) + Fail(fmt.Sprintf("unable to run podman command: %s\n%v", strings.Join(podmanOptions, " "), err)) } return &PodmanSession{session} } diff --git a/test/e2e/run_signal_test.go b/test/e2e/run_signal_test.go new file mode 100644 index 000000000..095288277 --- /dev/null +++ b/test/e2e/run_signal_test.go @@ -0,0 +1,101 @@ +package integration + +import ( + "fmt" + "os" + "os/exec" + "strings" + "syscall" + + "github.com/onsi/gomega/gexec" + "golang.org/x/sys/unix" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +// PodmanPID execs podman and returns its PID +func (p *PodmanTest) PodmanPID(args []string) (*PodmanSession, int) { + podmanOptions := p.MakeOptions() + podmanOptions = append(podmanOptions, strings.Split(p.StorageOptions, " ")...) + podmanOptions = append(podmanOptions, args...) + fmt.Printf("Running: %s %s\n", p.PodmanBinary, strings.Join(podmanOptions, " ")) + command := exec.Command(p.PodmanBinary, podmanOptions...) + session, err := gexec.Start(command, GinkgoWriter, GinkgoWriter) + if err != nil { + Fail(fmt.Sprintf("unable to run podman command: %s", strings.Join(podmanOptions, " "))) + } + return &PodmanSession{session}, command.Process.Pid +} + +const sigCatch = "for NUM in `seq 1 64`; do trap \"echo Received $NUM\" $NUM; done; echo READY; while :; do sleep 0.1; done" + +var _ = Describe("Podman run with --sig-proxy", func() { + var ( + tmpdir string + err error + podmanTest PodmanTest + ) + + BeforeEach(func() { + tmpdir, err = CreateTempDirInTempDir() + if err != nil { + os.Exit(1) + } + podmanTest = PodmanCreate(tmpdir) + podmanTest.RestoreAllArtifacts() + podmanTest.RestoreArtifact(fedoraMinimal) + }) + + AfterEach(func() { + podmanTest.Cleanup() + + }) + + Specify("signals are forwarded to container using sig-proxy", func() { + signal := syscall.SIGPOLL + session, pid := podmanTest.PodmanPID([]string{"run", "--name", "test1", fedoraMinimal, "bash", "-c", sigCatch}) + + ok := WaitForContainer(&podmanTest) + Expect(ok).To(BeTrue()) + + // Kill with given signal + if err := unix.Kill(pid, signal); err != nil { + Fail(fmt.Sprintf("error killing podman process %d: %v", pid, err)) + } + + // Kill with -9 to guarantee the container dies + killSession := podmanTest.Podman([]string{"kill", "-s", "9", "test1"}) + killSession.WaitWithDefaultTimeout() + Expect(killSession.ExitCode()).To(Equal(0)) + + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + ok, _ = session.GrepString(fmt.Sprintf("Received %d", signal)) + Expect(ok).To(BeTrue()) + }) + + Specify("signals are not forwarded to container with sig-proxy false", func() { + signal := syscall.SIGPOLL + session, pid := podmanTest.PodmanPID([]string{"run", "--name", "test2", "--sig-proxy=false", fedoraMinimal, "bash", "-c", sigCatch}) + + ok := WaitForContainer(&podmanTest) + Expect(ok).To(BeTrue()) + + // Kill with given signal + // Should be no output, SIGPOLL is usually ignored + if err := unix.Kill(pid, signal); err != nil { + Fail(fmt.Sprintf("error killing podman process %d: %v", pid, err)) + } + + // Kill with -9 to guarantee the container dies + killSession := podmanTest.Podman([]string{"kill", "-s", "9", "test2"}) + killSession.WaitWithDefaultTimeout() + Expect(killSession.ExitCode()).To(Equal(0)) + + session.WaitWithDefaultTimeout() + Expect(session.ExitCode()).To(Equal(0)) + ok, _ = session.GrepString(fmt.Sprintf("Received %d", signal)) + Expect(ok).To(BeFalse()) + }) +}) |