mirror of
https://github.com/containers/podman.git
synced 2025-06-17 15:08:08 +08:00
107
test/e2e/systemd_activate_test.go
Normal file
107
test/e2e/systemd_activate_test.go
Normal file
@ -0,0 +1,107 @@
|
||||
package integration
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"io/fs"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
testUtils "github.com/containers/podman/v4/test/utils"
|
||||
podmanUtils "github.com/containers/podman/v4/utils"
|
||||
. "github.com/onsi/ginkgo"
|
||||
. "github.com/onsi/gomega"
|
||||
. "github.com/onsi/gomega/gexec"
|
||||
)
|
||||
|
||||
var _ = Describe("Systemd activate", func() {
|
||||
var tempDir string
|
||||
var err error
|
||||
var podmanTest *PodmanTestIntegration
|
||||
|
||||
BeforeEach(func() {
|
||||
tempDir, err = testUtils.CreateTempDirInTempDir()
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "%v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
podmanTest = PodmanTestCreate(tempDir)
|
||||
podmanTest.Setup()
|
||||
podmanTest.SeedImages()
|
||||
})
|
||||
|
||||
AfterEach(func() {
|
||||
podmanTest.Cleanup()
|
||||
processTestResult(CurrentGinkgoTestDescription())
|
||||
})
|
||||
|
||||
It("stop podman.service", func() {
|
||||
SkipIfRemote("Testing stopped service requires both podman and podman-remote binaries")
|
||||
|
||||
activate, err := exec.LookPath("systemd-socket-activate")
|
||||
if err != nil {
|
||||
activate = "/usr/bin/systemd-socket-activate"
|
||||
}
|
||||
stat, err := os.Stat(activate)
|
||||
switch {
|
||||
case errors.Is(err, fs.ErrNotExist):
|
||||
Skip(activate + " required for systemd activation tests")
|
||||
case stat.Mode()&0111 == 0:
|
||||
Skip("Unable to execute " + activate)
|
||||
case err != nil:
|
||||
Skip(err.Error())
|
||||
}
|
||||
|
||||
// systemd-socket-activate does not support DNS lookups
|
||||
host := "127.0.0.1"
|
||||
port, err := podmanUtils.GetRandomPort()
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
|
||||
activateSession := testUtils.StartSystemExec(activate, []string{
|
||||
fmt.Sprintf("--listen=%s:%d", host, port),
|
||||
podmanTest.PodmanBinary,
|
||||
"--root=" + filepath.Join(tempDir, "server_root"),
|
||||
"system", "service",
|
||||
"--time=0",
|
||||
})
|
||||
Expect(activateSession.Exited).ShouldNot(Receive(), "Failed to start podman service")
|
||||
|
||||
// Curried functions for specialized podman calls
|
||||
podmanRemote := func(args ...string) *testUtils.PodmanSession {
|
||||
args = append([]string{"--url", fmt.Sprintf("tcp://%s:%d", host, port)}, args...)
|
||||
return testUtils.SystemExec(podmanTest.RemotePodmanBinary, args)
|
||||
}
|
||||
|
||||
podman := func(args ...string) *testUtils.PodmanSession {
|
||||
args = append([]string{"--root", filepath.Join(tempDir, "server_root")}, args...)
|
||||
return testUtils.SystemExec(podmanTest.PodmanBinary, args)
|
||||
}
|
||||
|
||||
containerName := "top_" + testUtils.RandomString(8)
|
||||
apiSession := podmanRemote(
|
||||
"create", "--tty", "--name", containerName, "--entrypoint", "top",
|
||||
"quay.io/libpod/alpine_labels:latest",
|
||||
)
|
||||
Expect(apiSession).Should(Exit(0))
|
||||
|
||||
apiSession = podmanRemote("start", containerName)
|
||||
Expect(apiSession).Should(Exit(0))
|
||||
|
||||
apiSession = podmanRemote("inspect", "--format={{.State.Running}}", containerName)
|
||||
Expect(apiSession).Should(Exit(0))
|
||||
Expect(apiSession.OutputToString()).To(Equal("true"))
|
||||
|
||||
// Emulate 'systemd stop podman.service'
|
||||
activateSession.Signal(syscall.SIGTERM)
|
||||
time.Sleep(2)
|
||||
Eventually(activateSession).Should(Exit(0))
|
||||
|
||||
abiSession := podman("inspect", "--format={{.State.Running}}", containerName)
|
||||
Expect(abiSession).To(Exit(0))
|
||||
Expect(abiSession.OutputToString()).To(Equal("true"))
|
||||
})
|
||||
})
|
@ -368,6 +368,7 @@ func CreateTempDirInTempDir() (string, error) {
|
||||
// SystemExec is used to exec a system command to check its exit code or output
|
||||
func SystemExec(command string, args []string) *PodmanSession {
|
||||
c := exec.Command(command, args...)
|
||||
fmt.Println("Execing " + c.String() + "\n")
|
||||
session, err := Start(c, GinkgoWriter, GinkgoWriter)
|
||||
if err != nil {
|
||||
Fail(fmt.Sprintf("unable to run command: %s %s", command, strings.Join(args, " ")))
|
||||
@ -379,6 +380,7 @@ func SystemExec(command string, args []string) *PodmanSession {
|
||||
// StartSystemExec is used to start exec a system command
|
||||
func StartSystemExec(command string, args []string) *PodmanSession {
|
||||
c := exec.Command(command, args...)
|
||||
fmt.Println("Execing " + c.String() + "\n")
|
||||
session, err := Start(c, GinkgoWriter, GinkgoWriter)
|
||||
if err != nil {
|
||||
Fail(fmt.Sprintf("unable to run command: %s %s", command, strings.Join(args, " ")))
|
||||
|
Reference in New Issue
Block a user