7
"github.com/containers/podman/v5/libpod/define"
8
. "github.com/containers/podman/v5/test/utils"
9
. "github.com/onsi/ginkgo/v2"
10
. "github.com/onsi/gomega"
11
. "github.com/onsi/gomega/gexec"
14
var _ = Describe("Podman init containers", func() {
16
It("podman create init container without --pod should fail", func() {
17
session := podmanTest.Podman([]string{"create", "--init-ctr", "always", ALPINE, "top"})
18
session.WaitWithDefaultTimeout()
19
Expect(session).Should(Exit(125))
22
It("podman create init container with bad init type should fail", func() {
23
session := podmanTest.Podman([]string{"create", "--init-ctr", "unknown", "--pod", "new:foobar", ALPINE, "top"})
24
session.WaitWithDefaultTimeout()
25
Expect(session).Should(Exit(125))
28
It("podman init containers should not degrade pod status", func() {
30
topPod := podmanTest.Podman([]string{"create", "-t", "--pod", "new:foobar", ALPINE, "top"})
31
topPod.WaitWithDefaultTimeout()
32
Expect(topPod).Should(ExitCleanly())
33
// add an init container
34
session := podmanTest.Podman([]string{"create", "--init-ctr", "always", "--pod", "foobar", ALPINE, "date"})
35
session.WaitWithDefaultTimeout()
36
Expect(session).Should(ExitCleanly())
38
start := podmanTest.Podman([]string{"pod", "start", "foobar"})
39
start.WaitWithDefaultTimeout()
40
Expect(start).Should(ExitCleanly())
42
inspect := podmanTest.Podman([]string{"pod", "inspect", "foobar"})
43
inspect.WaitWithDefaultTimeout()
44
Expect(inspect).Should(ExitCleanly())
45
data := inspect.InspectPodToJSON()
46
Expect(data).To(HaveField("State", define.PodStateRunning))
49
It("podman create init container should fail in running pod", func() {
50
// create a running pod
51
topPod := podmanTest.Podman([]string{"run", "-dt", "--pod", "new:foobar", ALPINE, "top"})
52
topPod.WaitWithDefaultTimeout()
53
Expect(topPod).Should(ExitCleanly())
54
// adding init-ctr to running pod should fail
55
session := podmanTest.Podman([]string{"create", "--init-ctr", "always", "--pod", "foobar", ALPINE, "date"})
56
session.WaitWithDefaultTimeout()
57
Expect(session).Should(Exit(125))
60
It("podman make sure init container runs before pod containers", func() {
61
filename := filepath.Join("/dev/shm", RandomString(12))
62
content := RandomString(16)
63
session := podmanTest.Podman([]string{"create", "--init-ctr", "always", "--pod", "new:foobar", ALPINE, "bin/sh", "-c", fmt.Sprintf("echo %s > %s", content, filename)})
64
session.WaitWithDefaultTimeout()
65
Expect(session).Should(ExitCleanly())
66
verify := podmanTest.Podman([]string{"create", "--pod", "foobar", "-t", ALPINE, "top"})
67
verify.WaitWithDefaultTimeout()
68
Expect(verify).Should(ExitCleanly())
69
start := podmanTest.Podman([]string{"pod", "start", "foobar"})
70
start.WaitWithDefaultTimeout()
71
Expect(start).Should(ExitCleanly())
72
checkLog := podmanTest.Podman([]string{"exec", verify.OutputToString(), "cat", filename})
73
checkLog.WaitWithDefaultTimeout()
74
Expect(checkLog).Should(ExitCleanly())
75
Expect(checkLog.OutputToString()).To(Equal(content))
78
It("podman make sure once container is removed", func() {
79
filename := filepath.Join("/dev/shm", RandomString(12))
80
content := RandomString(16)
81
session := podmanTest.Podman([]string{"create", "--init-ctr", "once", "--pod", "new:foobar", ALPINE, "bin/sh", "-c", fmt.Sprintf("echo %s > %s", content, filename)})
82
session.WaitWithDefaultTimeout()
83
initContainerID := session.OutputToString()
84
Expect(session).Should(ExitCleanly())
85
verify := podmanTest.Podman([]string{"create", "--pod", "foobar", "-t", ALPINE, "top"})
86
verify.WaitWithDefaultTimeout()
87
Expect(verify).Should(ExitCleanly())
88
start := podmanTest.Podman([]string{"pod", "start", "foobar"})
89
start.WaitWithDefaultTimeout()
90
Expect(start).Should(ExitCleanly())
91
check := podmanTest.Podman([]string{"container", "exists", initContainerID})
92
check.WaitWithDefaultTimeout()
94
// Expect(check).Should(Exit(1))
95
Expect(check.ExitCode()).To(Equal(1), "I dont understand why the other way does not work")
96
// Let's double check with a stop and start
97
podmanTest.StopPod("foobar")
98
startPod := podmanTest.Podman([]string{"pod", "start", "foobar"})
99
startPod.WaitWithDefaultTimeout()
100
Expect(startPod).Should(ExitCleanly())
102
// Because no init was run, the file should not even exist
103
doubleCheck := podmanTest.Podman([]string{"exec", verify.OutputToString(), "cat", filename})
104
doubleCheck.WaitWithDefaultTimeout()
105
Expect(doubleCheck).Should(Exit(1))
109
It("podman ensure always init containers always run", func() {
110
filename := filepath.Join("/dev/shm", RandomString(12))
112
// Write the date to a file
113
session := podmanTest.Podman([]string{"create", "--init-ctr", "always", "--pod", "new:foobar", fedoraMinimal, "/bin/sh", "-c", "date +%T.%N > " + filename})
114
session.WaitWithDefaultTimeout()
115
Expect(session).Should(ExitCleanly())
116
verify := podmanTest.Podman([]string{"create", "--pod", "foobar", "-t", ALPINE, "top"})
117
verify.WaitWithDefaultTimeout()
118
Expect(verify).Should(ExitCleanly())
119
start := podmanTest.Podman([]string{"pod", "start", "foobar"})
120
start.WaitWithDefaultTimeout()
121
Expect(start).Should(ExitCleanly())
123
// capture the date written
124
checkLog := podmanTest.Podman([]string{"exec", verify.OutputToString(), "cat", filename})
125
checkLog.WaitWithDefaultTimeout()
126
firstResult := checkLog.OutputToString()
127
Expect(checkLog).Should(ExitCleanly())
129
// Stop and start the pod
130
podmanTest.StopPod("foobar")
131
startPod := podmanTest.Podman([]string{"pod", "start", "foobar"})
132
startPod.WaitWithDefaultTimeout()
133
Expect(startPod).Should(ExitCleanly())
135
// Check the file again with exec
136
secondCheckLog := podmanTest.Podman([]string{"exec", verify.OutputToString(), "cat", filename})
137
secondCheckLog.WaitWithDefaultTimeout()
138
Expect(secondCheckLog).Should(ExitCleanly())
140
// Dates should not match
141
Expect(firstResult).ToNot(Equal(secondCheckLog.OutputToString()))