podman

Форк
0
/
container_clone_test.go 
305 строк · 12.8 Кб
1
package integration
2

3
import (
4
	. "github.com/containers/podman/v5/test/utils"
5
	. "github.com/onsi/ginkgo/v2"
6
	. "github.com/onsi/gomega"
7
	. "github.com/onsi/gomega/gexec"
8
)
9

10
var _ = Describe("Podman container clone", func() {
11
	BeforeEach(func() {
12
		SkipIfRemote("podman container clone is not supported in remote")
13
	})
14

15
	It("podman container clone basic test", func() {
16
		SkipIfRootlessCgroupsV1("starting a container with the memory limits not supported")
17
		create := podmanTest.Podman([]string{"create", ALPINE})
18
		create.WaitWithDefaultTimeout()
19
		Expect(create).To(ExitCleanly())
20
		clone := podmanTest.Podman([]string{"container", "clone", create.OutputToString()})
21
		clone.WaitWithDefaultTimeout()
22
		Expect(clone).To(ExitCleanly())
23

24
		clone = podmanTest.Podman([]string{"container", "clone", clone.OutputToString()})
25
		clone.WaitWithDefaultTimeout()
26
		Expect(clone).To(ExitCleanly())
27

28
		ctrInspect := podmanTest.Podman([]string{"inspect", clone.OutputToString()})
29
		ctrInspect.WaitWithDefaultTimeout()
30
		Expect(ctrInspect).To(ExitCleanly())
31
		Expect(ctrInspect.InspectContainerToJSON()[0].Name).To(ContainSubstring("-clone1"))
32

33
		ctrStart := podmanTest.Podman([]string{"container", "start", clone.OutputToString()})
34
		ctrStart.WaitWithDefaultTimeout()
35
		Expect(ctrStart).To(ExitCleanly())
36
	})
37

38
	It("podman container clone image test", func() {
39
		create := podmanTest.Podman([]string{"create", ALPINE})
40
		create.WaitWithDefaultTimeout()
41
		Expect(create).To(ExitCleanly())
42
		clone := podmanTest.Podman([]string{"container", "clone", create.OutputToString(), "new_name", fedoraMinimal})
43
		clone.WaitWithDefaultTimeout()
44
		Expect(clone).To(ExitCleanly())
45

46
		ctrInspect := podmanTest.Podman([]string{"inspect", clone.OutputToString()})
47
		ctrInspect.WaitWithDefaultTimeout()
48
		Expect(ctrInspect).To(ExitCleanly())
49
		Expect(ctrInspect.InspectContainerToJSON()[0]).To(HaveField("ImageName", fedoraMinimal))
50
		Expect(ctrInspect.InspectContainerToJSON()[0]).To(HaveField("Name", "new_name"))
51
	})
52

53
	It("podman container clone name test", func() {
54
		create := podmanTest.Podman([]string{"create", ALPINE})
55
		create.WaitWithDefaultTimeout()
56
		Expect(create).To(ExitCleanly())
57
		clone := podmanTest.Podman([]string{"container", "clone", "--name", "testing123", create.OutputToString()})
58
		clone.WaitWithDefaultTimeout()
59
		Expect(clone).To(ExitCleanly())
60

61
		cloneInspect := podmanTest.Podman([]string{"inspect", clone.OutputToString()})
62
		cloneInspect.WaitWithDefaultTimeout()
63
		Expect(cloneInspect).To(ExitCleanly())
64
		cloneData := cloneInspect.InspectContainerToJSON()
65
		Expect(cloneData[0]).To(HaveField("Name", "testing123"))
66
	})
67

68
	It("podman container clone resource limits override", func() {
69
		SkipIfRootlessCgroupsV1("Not supported for rootless + CgroupsV1")
70
		create := podmanTest.Podman([]string{"create", "--cpus=5", ALPINE})
71
		create.WaitWithDefaultTimeout()
72
		Expect(create).To(ExitCleanly())
73
		clone := podmanTest.Podman([]string{"container", "clone", create.OutputToString()})
74
		clone.WaitWithDefaultTimeout()
75
		Expect(clone).To(ExitCleanly())
76

77
		createInspect := podmanTest.Podman([]string{"inspect", create.OutputToString()})
78
		createInspect.WaitWithDefaultTimeout()
79
		Expect(createInspect).To(ExitCleanly())
80
		createData := createInspect.InspectContainerToJSON()
81

82
		cloneInspect := podmanTest.Podman([]string{"inspect", clone.OutputToString()})
83
		cloneInspect.WaitWithDefaultTimeout()
84
		Expect(cloneInspect).To(ExitCleanly())
85
		cloneData := cloneInspect.InspectContainerToJSON()
86
		Expect(createData[0].HostConfig).To(HaveField("NanoCpus", cloneData[0].HostConfig.NanoCpus))
87

88
		create = podmanTest.Podman([]string{"create", "--memory=5", ALPINE})
89
		create.WaitWithDefaultTimeout()
90
		Expect(create).To(ExitCleanly())
91
		clone = podmanTest.Podman([]string{"container", "clone", "--cpus=6", create.OutputToString()})
92
		clone.WaitWithDefaultTimeout()
93
		Expect(clone).To(ExitCleanly())
94

95
		createInspect = podmanTest.Podman([]string{"inspect", create.OutputToString()})
96
		createInspect.WaitWithDefaultTimeout()
97
		Expect(createInspect).To(ExitCleanly())
98
		createData = createInspect.InspectContainerToJSON()
99

100
		cloneInspect = podmanTest.Podman([]string{"inspect", clone.OutputToString()})
101
		cloneInspect.WaitWithDefaultTimeout()
102
		Expect(cloneInspect).To(ExitCleanly())
103
		cloneData = cloneInspect.InspectContainerToJSON()
104
		Expect(createData[0].HostConfig).To(HaveField("MemorySwap", cloneData[0].HostConfig.MemorySwap))
105

106
		create = podmanTest.Podman([]string{"create", "--cpus=5", ALPINE})
107
		create.WaitWithDefaultTimeout()
108
		Expect(create).To(ExitCleanly())
109
		clone = podmanTest.Podman([]string{"container", "clone", "--cpus=4", create.OutputToString()})
110
		clone.WaitWithDefaultTimeout()
111
		Expect(clone).To(ExitCleanly())
112

113
		var nanoCPUs int64
114
		numCpus := 4
115
		nanoCPUs = int64(numCpus * 1000000000)
116

117
		createInspect = podmanTest.Podman([]string{"inspect", create.OutputToString()})
118
		createInspect.WaitWithDefaultTimeout()
119
		Expect(createInspect).To(ExitCleanly())
120
		createData = createInspect.InspectContainerToJSON()
121

122
		cloneInspect = podmanTest.Podman([]string{"inspect", clone.OutputToString()})
123
		cloneInspect.WaitWithDefaultTimeout()
124
		Expect(cloneInspect).To(ExitCleanly())
125
		cloneData = cloneInspect.InspectContainerToJSON()
126
		Expect(createData[0].HostConfig.NanoCpus).ToNot(Equal(cloneData[0].HostConfig.NanoCpus))
127
		Expect(cloneData[0].HostConfig).To(HaveField("NanoCpus", nanoCPUs))
128

129
		create = podmanTest.Podman([]string{"create", ALPINE})
130
		create.WaitWithDefaultTimeout()
131
		Expect(create).To(ExitCleanly())
132
		clone = podmanTest.Podman([]string{"container", "clone", "--cpus=4", create.OutputToString()})
133
		clone.WaitWithDefaultTimeout()
134
		Expect(clone).To(ExitCleanly())
135

136
		cloneInspect = podmanTest.Podman([]string{"inspect", clone.OutputToString()})
137
		cloneInspect.WaitWithDefaultTimeout()
138
		Expect(cloneInspect).To(ExitCleanly())
139
		cloneData = cloneInspect.InspectContainerToJSON()
140
		Expect(cloneData[0].HostConfig).To(HaveField("MemorySwappiness", int64(0)))
141

142
	})
143

144
	It("podman container clone in a pod", func() {
145
		SkipIfRootlessCgroupsV1("starting a container with the memory limits not supported")
146
		run := podmanTest.Podman([]string{"run", "-dt", "--pod", "new:1234", ALPINE, "sleep", "20"})
147
		run.WaitWithDefaultTimeout()
148
		Expect(run).To(ExitCleanly())
149
		clone := podmanTest.Podman([]string{"container", "clone", run.OutputToString()})
150
		clone.WaitWithDefaultTimeout()
151
		Expect(clone).To(ExitCleanly())
152
		ctrStart := podmanTest.Podman([]string{"container", "start", clone.OutputToString()})
153
		ctrStart.WaitWithDefaultTimeout()
154
		Expect(ctrStart).To(ExitCleanly())
155

156
		checkClone := podmanTest.Podman([]string{"ps", "-f", "id=" + clone.OutputToString(), "--ns", "--format", "{{.Namespaces.IPC}} {{.Namespaces.UTS}} {{.Namespaces.NET}}"})
157
		checkClone.WaitWithDefaultTimeout()
158
		Expect(checkClone).Should(ExitCleanly())
159
		cloneArray := checkClone.OutputToStringArray()
160

161
		checkCreate := podmanTest.Podman([]string{"ps", "-f", "id=" + run.OutputToString(), "--ns", "--format", "{{.Namespaces.IPC}} {{.Namespaces.UTS}} {{.Namespaces.NET}}"})
162
		checkCreate.WaitWithDefaultTimeout()
163
		Expect(checkCreate).Should(ExitCleanly())
164
		createArray := checkCreate.OutputToStringArray()
165

166
		Expect(cloneArray).To(ContainElements(createArray))
167

168
		ctrInspect := podmanTest.Podman([]string{"inspect", clone.OutputToString()})
169
		ctrInspect.WaitWithDefaultTimeout()
170
		Expect(ctrInspect).Should(ExitCleanly())
171

172
		runInspect := podmanTest.Podman([]string{"inspect", run.OutputToString()})
173
		runInspect.WaitWithDefaultTimeout()
174
		Expect(runInspect).Should(ExitCleanly())
175

176
		Expect(ctrInspect.InspectContainerToJSON()[0].Pod).Should(Equal(runInspect.InspectContainerToJSON()[0].Pod))
177
		Expect(ctrInspect.InspectContainerToJSON()[0].HostConfig.NetworkMode).Should(Equal(runInspect.InspectContainerToJSON()[0].HostConfig.NetworkMode))
178
	})
179

180
	It("podman container clone to a pod", func() {
181
		createPod := podmanTest.Podman([]string{"pod", "create", "--share", "uts", "--name", "foo-pod"})
182
		createPod.WaitWithDefaultTimeout()
183
		Expect(createPod).To(ExitCleanly())
184

185
		ctr := podmanTest.RunTopContainer("ctr")
186
		ctr.WaitWithDefaultTimeout()
187
		Expect(ctr).Should(ExitCleanly())
188

189
		clone := podmanTest.Podman([]string{"container", "clone", "--name", "cloned", "--pod", "foo-pod", "ctr"})
190
		clone.WaitWithDefaultTimeout()
191
		// Cannot use ExitCleanly() because of warning: "At least one namespace was reset to the default configuration"
192
		Expect(clone).To(Exit(0))
193

194
		ctrInspect := podmanTest.Podman([]string{"inspect", "cloned"})
195
		ctrInspect.WaitWithDefaultTimeout()
196
		Expect(ctrInspect).Should(ExitCleanly())
197

198
		Expect(ctrInspect.InspectContainerToJSON()[0].Pod).Should(Equal(createPod.OutputToString()))
199

200
		Expect(ctrInspect.InspectContainerToJSON()[0].HostConfig.NetworkMode).Should(Not(ContainSubstring("container:")))
201

202
		createPod = podmanTest.Podman([]string{"pod", "create", "--share", "uts,net", "--name", "bar-pod"})
203
		createPod.WaitWithDefaultTimeout()
204
		Expect(createPod).To(ExitCleanly())
205

206
		clone = podmanTest.Podman([]string{"container", "clone", "--name", "cloned2", "--pod", "bar-pod", "ctr"})
207
		clone.WaitWithDefaultTimeout()
208
		// Cannot use ExitCleanly() because of warning: "At least one namespace was reset to the default configuration"
209
		Expect(clone).To(Exit(0))
210

211
		ctrInspect = podmanTest.Podman([]string{"inspect", "cloned2"})
212
		ctrInspect.WaitWithDefaultTimeout()
213
		Expect(ctrInspect).Should(ExitCleanly())
214

215
		Expect(ctrInspect.InspectContainerToJSON()[0].Pod).Should(Equal(createPod.OutputToString()))
216

217
		Expect(ctrInspect.InspectContainerToJSON()[0].HostConfig.NetworkMode).Should(ContainSubstring("container:"))
218
	})
219

220
	It("podman container clone --destroy --force test", func() {
221
		create := podmanTest.Podman([]string{"create", ALPINE})
222
		create.WaitWithDefaultTimeout()
223
		Expect(create).To(ExitCleanly())
224
		clone := podmanTest.Podman([]string{"container", "clone", "--destroy", create.OutputToString()})
225
		clone.WaitWithDefaultTimeout()
226
		Expect(clone).To(ExitCleanly())
227

228
		inspect := podmanTest.Podman([]string{"inspect", create.OutputToString()})
229
		inspect.WaitWithDefaultTimeout()
230
		Expect(inspect).ToNot(ExitCleanly())
231

232
		run := podmanTest.Podman([]string{"run", "-dt", ALPINE, "top"})
233
		run.WaitWithDefaultTimeout()
234
		Expect(run).To(ExitCleanly())
235
		clone = podmanTest.Podman([]string{"container", "clone", "--destroy", "-f", run.OutputToString()})
236
		clone.WaitWithDefaultTimeout()
237
		Expect(clone).To(ExitCleanly())
238

239
		inspect = podmanTest.Podman([]string{"inspect", run.OutputToString()})
240
		inspect.WaitWithDefaultTimeout()
241
		Expect(inspect).ToNot(ExitCleanly())
242

243
		run = podmanTest.Podman([]string{"run", "-dt", ALPINE})
244
		run.WaitWithDefaultTimeout()
245
		Expect(run).To(ExitCleanly())
246
		clone = podmanTest.Podman([]string{"container", "clone", "-f", run.OutputToString()})
247
		clone.WaitWithDefaultTimeout()
248
		Expect(clone).ToNot(ExitCleanly())
249

250
	})
251

252
	It("podman container clone network passing", func() {
253
		networkCreate := podmanTest.Podman([]string{"network", "create", "testing123"})
254
		networkCreate.WaitWithDefaultTimeout()
255
		defer podmanTest.removeNetwork("testing123")
256
		Expect(networkCreate).To(ExitCleanly())
257
		run := podmanTest.Podman([]string{"run", "--network", "bridge", "-dt", ALPINE})
258
		run.WaitWithDefaultTimeout()
259
		Expect(run).To(ExitCleanly())
260

261
		connect := podmanTest.Podman([]string{"network", "connect", "testing123", run.OutputToString()})
262
		connect.WaitWithDefaultTimeout()
263
		Expect(connect).To(ExitCleanly())
264

265
		clone := podmanTest.Podman([]string{"container", "clone", run.OutputToString()})
266
		clone.WaitWithDefaultTimeout()
267
		Expect(clone).To(ExitCleanly())
268

269
		inspect := podmanTest.Podman([]string{"inspect", clone.OutputToString()})
270
		inspect.WaitWithDefaultTimeout()
271
		Expect(inspect).To(ExitCleanly())
272
		networks := inspect.InspectContainerToJSON()[0].NetworkSettings.Networks
273
		Expect(networks).To(HaveLen(2))
274
		Expect(networks).To(HaveKey("testing123"))
275
	})
276

277
	It("podman container clone env test", func() {
278
		session := podmanTest.Podman([]string{"run", "--name", "env_ctr", "-e", "ENV_TEST=123", ALPINE, "printenv", "ENV_TEST"})
279
		session.WaitWithDefaultTimeout()
280
		Expect(session).Should(ExitCleanly())
281

282
		session = podmanTest.Podman([]string{"container", "clone", "env_ctr"})
283
		session.WaitWithDefaultTimeout()
284
		Expect(session).Should(ExitCleanly())
285

286
		session = podmanTest.Podman([]string{"start", "-a", "env_ctr-clone"})
287
		session.WaitWithDefaultTimeout()
288
		Expect(session).Should(ExitCleanly())
289
		Expect(session.OutputToString()).Should(ContainSubstring("123"))
290

291
		session = podmanTest.Podman([]string{"run", "--name", "env_ctr2", "-e", "ENV_TEST=12=3", ALPINE, "printenv", "ENV_TEST"})
292
		session.WaitWithDefaultTimeout()
293
		Expect(session).Should(ExitCleanly())
294

295
		session = podmanTest.Podman([]string{"container", "clone", "env_ctr2"})
296
		session.WaitWithDefaultTimeout()
297
		Expect(session).Should(ExitCleanly())
298

299
		session = podmanTest.Podman([]string{"start", "-a", "env_ctr2-clone"})
300
		session.WaitWithDefaultTimeout()
301
		Expect(session).Should(ExitCleanly())
302
		Expect(session.OutputToString()).Should(ContainSubstring("12=3"))
303

304
	})
305
})
306

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.