mirror of
https://github.com/containers/podman.git
synced 2026-03-17 22:28:22 -04:00
The systemd test was inaccurately being skipped when a userns env. var. flag was set. At best this is confusing to new developers, and at worse it actively blocks an otherwise legitimate class of tests. Improve the accuracy of skip-logic by adding/using a purpose built set of functions. Signed-off-by: Chris Evich <cevich@redhat.com>
156 lines
4.8 KiB
Go
156 lines
4.8 KiB
Go
package integration
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
|
|
. "github.com/containers/podman/v2/test/utils"
|
|
. "github.com/onsi/ginkgo"
|
|
. "github.com/onsi/gomega"
|
|
)
|
|
|
|
var _ = Describe("Podman systemd", func() {
|
|
var (
|
|
tempdir string
|
|
err error
|
|
podmanTest *PodmanTestIntegration
|
|
systemd_unit_file string
|
|
)
|
|
|
|
BeforeEach(func() {
|
|
tempdir, err = CreateTempDirInTempDir()
|
|
if err != nil {
|
|
os.Exit(1)
|
|
}
|
|
podmanTest = PodmanTestCreate(tempdir)
|
|
podmanTest.Setup()
|
|
podmanTest.SeedImages()
|
|
systemd_unit_file = `[Unit]
|
|
Description=redis container
|
|
[Service]
|
|
Restart=always
|
|
ExecStart=/usr/bin/podman start -a redis
|
|
ExecStop=/usr/bin/podman stop -t 10 redis
|
|
KillMode=process
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
`
|
|
})
|
|
|
|
AfterEach(func() {
|
|
podmanTest.Cleanup()
|
|
f := CurrentGinkgoTestDescription()
|
|
processTestResult(f)
|
|
|
|
})
|
|
|
|
It("podman start container by systemd", func() {
|
|
SkipIfRootless("rootless can not write to /etc")
|
|
SkipIfContainerized("test does not have systemd as pid 1")
|
|
|
|
sys_file := ioutil.WriteFile("/etc/systemd/system/redis.service", []byte(systemd_unit_file), 0644)
|
|
Expect(sys_file).To(BeNil())
|
|
defer func() {
|
|
stop := SystemExec("bash", []string{"-c", "systemctl stop redis"})
|
|
os.Remove("/etc/systemd/system/redis.service")
|
|
SystemExec("bash", []string{"-c", "systemctl daemon-reload"})
|
|
Expect(stop.ExitCode()).To(Equal(0))
|
|
}()
|
|
|
|
create := podmanTest.Podman([]string{"create", "-d", "--name", "redis", "redis"})
|
|
create.WaitWithDefaultTimeout()
|
|
Expect(create.ExitCode()).To(Equal(0))
|
|
|
|
enable := SystemExec("bash", []string{"-c", "systemctl daemon-reload"})
|
|
Expect(enable.ExitCode()).To(Equal(0))
|
|
|
|
start := SystemExec("bash", []string{"-c", "systemctl start redis"})
|
|
Expect(start.ExitCode()).To(Equal(0))
|
|
|
|
logs := SystemExec("bash", []string{"-c", "journalctl -n 20 -u redis"})
|
|
Expect(logs.ExitCode()).To(Equal(0))
|
|
|
|
status := SystemExec("bash", []string{"-c", "systemctl status redis"})
|
|
Expect(status.OutputToString()).To(ContainSubstring("active (running)"))
|
|
})
|
|
|
|
It("podman run container with systemd PID1", func() {
|
|
ctrName := "testSystemd"
|
|
run := podmanTest.Podman([]string{"run", "--name", ctrName, "-t", "-i", "-d", ubi_init, "/sbin/init"})
|
|
run.WaitWithDefaultTimeout()
|
|
Expect(run.ExitCode()).To(Equal(0))
|
|
ctrID := run.OutputToString()
|
|
|
|
logs := podmanTest.Podman([]string{"logs", ctrName})
|
|
logs.WaitWithDefaultTimeout()
|
|
Expect(logs.ExitCode()).To(Equal(0))
|
|
|
|
// Give container 10 seconds to start
|
|
started := false
|
|
for i := 0; i < 10; i++ {
|
|
runningCtrs := podmanTest.Podman([]string{"ps", "-q", "--no-trunc"})
|
|
runningCtrs.WaitWithDefaultTimeout()
|
|
Expect(runningCtrs.ExitCode()).To(Equal(0))
|
|
|
|
if strings.Contains(runningCtrs.OutputToString(), ctrID) {
|
|
started = true
|
|
break
|
|
}
|
|
|
|
time.Sleep(1 * time.Second)
|
|
}
|
|
|
|
Expect(started).To(BeTrue())
|
|
|
|
systemctl := podmanTest.Podman([]string{"exec", "-t", "-i", ctrName, "systemctl", "status", "--no-pager"})
|
|
systemctl.WaitWithDefaultTimeout()
|
|
Expect(systemctl.ExitCode()).To(Equal(0))
|
|
Expect(strings.Contains(systemctl.OutputToString(), "State:")).To(BeTrue())
|
|
|
|
result := podmanTest.Podman([]string{"inspect", ctrName})
|
|
result.WaitWithDefaultTimeout()
|
|
Expect(result.ExitCode()).To(Equal(0))
|
|
conData := result.InspectContainerToJSON()
|
|
Expect(len(conData)).To(Equal(1))
|
|
Expect(conData[0].Config.SystemdMode).To(BeTrue())
|
|
})
|
|
|
|
It("podman create container with systemd entrypoint triggers systemd mode", func() {
|
|
ctrName := "testCtr"
|
|
run := podmanTest.Podman([]string{"create", "--name", ctrName, "--entrypoint", "/sbin/init", ubi_init})
|
|
run.WaitWithDefaultTimeout()
|
|
Expect(run.ExitCode()).To(Equal(0))
|
|
|
|
result := podmanTest.Podman([]string{"inspect", ctrName})
|
|
result.WaitWithDefaultTimeout()
|
|
Expect(result.ExitCode()).To(Equal(0))
|
|
conData := result.InspectContainerToJSON()
|
|
Expect(len(conData)).To(Equal(1))
|
|
Expect(conData[0].Config.SystemdMode).To(BeTrue())
|
|
})
|
|
|
|
It("podman create container with systemd=always triggers systemd mode", func() {
|
|
ctrName := "testCtr"
|
|
run := podmanTest.Podman([]string{"create", "--name", ctrName, "--systemd", "always", ALPINE})
|
|
run.WaitWithDefaultTimeout()
|
|
Expect(run.ExitCode()).To(Equal(0))
|
|
|
|
result := podmanTest.Podman([]string{"inspect", ctrName})
|
|
result.WaitWithDefaultTimeout()
|
|
Expect(result.ExitCode()).To(Equal(0))
|
|
conData := result.InspectContainerToJSON()
|
|
Expect(len(conData)).To(Equal(1))
|
|
Expect(conData[0].Config.SystemdMode).To(BeTrue())
|
|
})
|
|
|
|
It("podman run --systemd container should NOT mount /run noexec", func() {
|
|
session := podmanTest.Podman([]string{"run", "--systemd", "always", ALPINE, "sh", "-c", "mount | grep \"/run \""})
|
|
session.WaitWithDefaultTimeout()
|
|
Expect(session.ExitCode()).To(Equal(0))
|
|
|
|
Expect(session.OutputToString()).To(Not(ContainSubstring("noexec")))
|
|
})
|
|
})
|