1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
|
package integration
import (
"fmt"
"os"
"path/filepath"
"github.com/containers/podman/v4/libpod/define"
. "github.com/containers/podman/v4/test/utils"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
. "github.com/onsi/gomega/gexec"
)
var _ = Describe("Podman init containers", func() {
var (
tempdir string
err error
podmanTest *PodmanTestIntegration
)
BeforeEach(func() {
tempdir, err = CreateTempDirInTempDir()
if err != nil {
os.Exit(1)
}
podmanTest = PodmanTestCreate(tempdir)
podmanTest.Setup()
})
AfterEach(func() {
podmanTest.Cleanup()
f := CurrentGinkgoTestDescription()
processTestResult(f)
})
It("podman create init container without --pod should fail", func() {
session := podmanTest.Podman([]string{"create", "--init-ctr", "always", ALPINE, "top"})
session.WaitWithDefaultTimeout()
Expect(session).Should(Exit(125))
})
It("podman create init container with bad init type should fail", func() {
session := podmanTest.Podman([]string{"create", "--init-ctr", "unknown", "--pod", "new:foobar", ALPINE, "top"})
session.WaitWithDefaultTimeout()
Expect(session).Should(Exit(125))
})
It("podman init containers should not degrade pod status", func() {
// create a pod
topPod := podmanTest.Podman([]string{"create", "-t", "--pod", "new:foobar", ALPINE, "top"})
topPod.WaitWithDefaultTimeout()
Expect(topPod).Should(Exit(0))
// add an init container
session := podmanTest.Podman([]string{"create", "--init-ctr", "always", "--pod", "foobar", ALPINE, "date"})
session.WaitWithDefaultTimeout()
Expect(session).Should(Exit(0))
// start a pod
start := podmanTest.Podman([]string{"pod", "start", "foobar"})
start.WaitWithDefaultTimeout()
Expect(start).Should(Exit(0))
inspect := podmanTest.Podman([]string{"pod", "inspect", "foobar"})
inspect.WaitWithDefaultTimeout()
Expect(inspect).Should(Exit(0))
data := inspect.InspectPodToJSON()
Expect(data).To(HaveField("State", define.PodStateRunning))
})
It("podman create init container should fail in running pod", func() {
// create a running pod
topPod := podmanTest.Podman([]string{"run", "-dt", "--pod", "new:foobar", ALPINE, "top"})
topPod.WaitWithDefaultTimeout()
Expect(topPod).Should(Exit(0))
// adding init-ctr to running pod should fail
session := podmanTest.Podman([]string{"create", "--init-ctr", "always", "--pod", "foobar", ALPINE, "date"})
session.WaitWithDefaultTimeout()
Expect(session).Should(Exit(125))
})
It("podman make sure init container runs before pod containers", func() {
filename := filepath.Join("/dev/shm", RandomString(12))
content := RandomString(16)
session := podmanTest.Podman([]string{"create", "--init-ctr", "always", "--pod", "new:foobar", ALPINE, "bin/sh", "-c", fmt.Sprintf("echo %s > %s", content, filename)})
session.WaitWithDefaultTimeout()
Expect(session).Should(Exit(0))
verify := podmanTest.Podman([]string{"create", "--pod", "foobar", "-t", ALPINE, "top"})
verify.WaitWithDefaultTimeout()
Expect(verify).Should(Exit(0))
start := podmanTest.Podman([]string{"pod", "start", "foobar"})
start.WaitWithDefaultTimeout()
Expect(start).Should(Exit(0))
checkLog := podmanTest.Podman([]string{"exec", "-it", verify.OutputToString(), "cat", filename})
checkLog.WaitWithDefaultTimeout()
Expect(checkLog).Should(Exit(0))
Expect(checkLog.OutputToString()).To(Equal(content))
})
It("podman make sure once container is removed", func() {
filename := filepath.Join("/dev/shm", RandomString(12))
content := RandomString(16)
session := podmanTest.Podman([]string{"create", "--init-ctr", "once", "--pod", "new:foobar", ALPINE, "bin/sh", "-c", fmt.Sprintf("echo %s > %s", content, filename)})
session.WaitWithDefaultTimeout()
initContainerID := session.OutputToString()
Expect(session).Should(Exit(0))
verify := podmanTest.Podman([]string{"create", "--pod", "foobar", "-t", ALPINE, "top"})
verify.WaitWithDefaultTimeout()
Expect(verify).Should(Exit(0))
start := podmanTest.Podman([]string{"pod", "start", "foobar"})
start.WaitWithDefaultTimeout()
Expect(start).Should(Exit(0))
check := podmanTest.Podman([]string{"container", "exists", initContainerID})
check.WaitWithDefaultTimeout()
// Container was rm'd
// Expect(check).Should(Exit(1))
Expect(check.ExitCode()).To(Equal(1), "I dont understand why the other way does not work")
// Lets double check with a stop and start
stopPod := podmanTest.Podman([]string{"pod", "stop", "foobar"})
stopPod.WaitWithDefaultTimeout()
Expect(stopPod).Should(Exit(0))
startPod := podmanTest.Podman([]string{"pod", "start", "foobar"})
startPod.WaitWithDefaultTimeout()
Expect(startPod).Should(Exit(0))
// Because no init was run, the file should not even exist
doubleCheck := podmanTest.Podman([]string{"exec", "-it", verify.OutputToString(), "cat", filename})
doubleCheck.WaitWithDefaultTimeout()
Expect(doubleCheck).Should(Exit(1))
})
It("podman ensure always init containers always run", func() {
filename := filepath.Join("/dev/shm", RandomString(12))
// Write the date to a file
session := podmanTest.Podman([]string{"create", "--init-ctr", "always", "--pod", "new:foobar", fedoraMinimal, "bin/sh", "-c", "date +%T.%N > " + filename})
session.WaitWithDefaultTimeout()
Expect(session).Should(Exit(0))
verify := podmanTest.Podman([]string{"create", "--pod", "foobar", "-t", ALPINE, "top"})
verify.WaitWithDefaultTimeout()
Expect(verify).Should(Exit(0))
start := podmanTest.Podman([]string{"pod", "start", "foobar"})
start.WaitWithDefaultTimeout()
Expect(start).Should(Exit(0))
// capture the date written
checkLog := podmanTest.Podman([]string{"exec", "-it", verify.OutputToString(), "cat", filename})
checkLog.WaitWithDefaultTimeout()
firstResult := checkLog.OutputToString()
Expect(checkLog).Should(Exit(0))
// Stop and start the pod
stopPod := podmanTest.Podman([]string{"pod", "stop", "foobar"})
stopPod.WaitWithDefaultTimeout()
Expect(stopPod).Should(Exit(0))
startPod := podmanTest.Podman([]string{"pod", "start", "foobar"})
startPod.WaitWithDefaultTimeout()
Expect(startPod).Should(Exit(0))
// Check the file again with exec
secondCheckLog := podmanTest.Podman([]string{"exec", "-it", verify.OutputToString(), "cat", filename})
secondCheckLog.WaitWithDefaultTimeout()
Expect(secondCheckLog).Should(Exit(0))
// Dates should not match
Expect(firstResult).ToNot(Equal(secondCheckLog.OutputToString()))
})
})
|