github.com/AbhinandanKurakure/podman/v3@v3.4.10/test/e2e/create_test.go (about) 1 package integration 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "path/filepath" 8 "runtime" 9 "strings" 10 11 . "github.com/containers/podman/v3/test/utils" 12 "github.com/containers/storage/pkg/stringid" 13 . "github.com/onsi/ginkgo" 14 . "github.com/onsi/gomega" 15 . "github.com/onsi/gomega/gexec" 16 ) 17 18 var _ = Describe("Podman create", func() { 19 var ( 20 tempdir string 21 err error 22 podmanTest *PodmanTestIntegration 23 ) 24 25 BeforeEach(func() { 26 tempdir, err = CreateTempDirInTempDir() 27 if err != nil { 28 os.Exit(1) 29 } 30 podmanTest = PodmanTestCreate(tempdir) 31 podmanTest.Setup() 32 podmanTest.SeedImages() 33 }) 34 35 AfterEach(func() { 36 podmanTest.Cleanup() 37 f := CurrentGinkgoTestDescription() 38 processTestResult(f) 39 40 }) 41 42 It("podman create container based on a local image", func() { 43 session := podmanTest.Podman([]string{"create", "--name", "local_image_test", ALPINE, "ls"}) 44 session.WaitWithDefaultTimeout() 45 cid := session.OutputToString() 46 Expect(session).Should(Exit(0)) 47 Expect(podmanTest.NumberOfContainers()).To(Equal(1)) 48 49 check := podmanTest.Podman([]string{"inspect", "local_image_test"}) 50 check.WaitWithDefaultTimeout() 51 data := check.InspectContainerToJSON() 52 Expect(data[0].ID).To(ContainSubstring(cid)) 53 }) 54 55 It("podman create container based on a remote image", func() { 56 session := podmanTest.Podman([]string{"create", BB_GLIBC, "ls"}) 57 session.WaitWithDefaultTimeout() 58 Expect(session).Should(Exit(0)) 59 Expect(podmanTest.NumberOfContainers()).To(Equal(1)) 60 }) 61 62 It("podman container create container based on a remote image", func() { 63 containerCreate := podmanTest.Podman([]string{"container", "create", BB_GLIBC, "ls"}) 64 containerCreate.WaitWithDefaultTimeout() 65 Expect(containerCreate).Should(Exit(0)) 66 67 lock := GetPortLock("5000") 68 defer lock.Unlock() 69 session := podmanTest.Podman([]string{"run", "-d", "--name", "registry", "-p", "5000:5000", registry, "/entrypoint.sh", "/etc/docker/registry/config.yml"}) 70 session.WaitWithDefaultTimeout() 71 Expect(session).Should(Exit(0)) 72 73 if !WaitContainerReady(podmanTest, "registry", "listening on", 20, 1) { 74 Skip("Cannot start docker registry.") 75 } 76 77 create := podmanTest.Podman([]string{"container", "create", "--tls-verify=false", ALPINE}) 78 create.WaitWithDefaultTimeout() 79 Expect(create).Should(Exit(0)) 80 Expect(podmanTest.NumberOfContainers()).To(Equal(3)) 81 }) 82 83 It("podman create using short options", func() { 84 session := podmanTest.Podman([]string{"create", ALPINE, "ls"}) 85 session.WaitWithDefaultTimeout() 86 Expect(session).Should(Exit(0)) 87 Expect(podmanTest.NumberOfContainers()).To(Equal(1)) 88 }) 89 90 It("podman create using existing name", func() { 91 session := podmanTest.Podman([]string{"create", "--name=foo", ALPINE, "ls"}) 92 session.WaitWithDefaultTimeout() 93 Expect(session).Should(Exit(0)) 94 Expect(podmanTest.NumberOfContainers()).To(Equal(1)) 95 96 session = podmanTest.Podman([]string{"create", "--name=foo", ALPINE, "ls"}) 97 session.WaitWithDefaultTimeout() 98 Expect(session).Should(Exit(125)) 99 }) 100 101 It("podman create adds annotation", func() { 102 session := podmanTest.Podman([]string{"create", "--annotation", "HELLO=WORLD", "--name", "annotate_test", ALPINE, "ls"}) 103 session.WaitWithDefaultTimeout() 104 Expect(session).Should(Exit(0)) 105 Expect(podmanTest.NumberOfContainers()).To(Equal(1)) 106 107 check := podmanTest.Podman([]string{"inspect", "annotate_test"}) 108 check.WaitWithDefaultTimeout() 109 data := check.InspectContainerToJSON() 110 value, ok := data[0].Config.Annotations["HELLO"] 111 Expect(ok).To(BeTrue()) 112 Expect(value).To(Equal("WORLD")) 113 }) 114 115 It("podman create --entrypoint command", func() { 116 session := podmanTest.Podman([]string{"create", "--name", "entrypoint_test", "--entrypoint", "/bin/foobar", ALPINE}) 117 session.WaitWithDefaultTimeout() 118 Expect(session).Should(Exit(0)) 119 Expect(podmanTest.NumberOfContainers()).To(Equal(1)) 120 121 result := podmanTest.Podman([]string{"inspect", "entrypoint_test", "--format", "{{.Config.Entrypoint}}"}) 122 result.WaitWithDefaultTimeout() 123 Expect(result).Should(Exit(0)) 124 Expect(result.OutputToString()).To(Equal("/bin/foobar")) 125 }) 126 127 It("podman create --entrypoint \"\"", func() { 128 session := podmanTest.Podman([]string{"create", "--entrypoint", "", ALPINE, "ls"}) 129 session.WaitWithDefaultTimeout() 130 Expect(session).Should(Exit(0)) 131 Expect(podmanTest.NumberOfContainers()).To(Equal(1)) 132 133 result := podmanTest.Podman([]string{"inspect", session.OutputToString(), "--format", "{{.Config.Entrypoint}}"}) 134 result.WaitWithDefaultTimeout() 135 Expect(result).Should(Exit(0)) 136 Expect(result.OutputToString()).To(Equal("")) 137 }) 138 139 It("podman create --entrypoint json", func() { 140 jsonString := `[ "/bin/foo", "-c"]` 141 session := podmanTest.Podman([]string{"create", "--name", "entrypoint_json", "--entrypoint", jsonString, ALPINE}) 142 session.WaitWithDefaultTimeout() 143 Expect(session).Should(Exit(0)) 144 Expect(podmanTest.NumberOfContainers()).To(Equal(1)) 145 146 result := podmanTest.Podman([]string{"inspect", "entrypoint_json", "--format", "{{.Config.Entrypoint}}"}) 147 result.WaitWithDefaultTimeout() 148 Expect(result).Should(Exit(0)) 149 Expect(result.OutputToString()).To(Equal("/bin/foo -c")) 150 }) 151 152 It("podman create --mount flag with multiple mounts", func() { 153 vol1 := filepath.Join(podmanTest.TempDir, "vol-test1") 154 err := os.MkdirAll(vol1, 0755) 155 Expect(err).To(BeNil()) 156 vol2 := filepath.Join(podmanTest.TempDir, "vol-test2") 157 err = os.MkdirAll(vol2, 0755) 158 Expect(err).To(BeNil()) 159 160 session := podmanTest.Podman([]string{"create", "--name", "test", "--mount", "type=bind,src=" + vol1 + ",target=/myvol1,z", "--mount", "type=bind,src=" + vol2 + ",target=/myvol2,z", ALPINE, "touch", "/myvol2/foo.txt"}) 161 session.WaitWithDefaultTimeout() 162 Expect(session).Should(Exit(0)) 163 164 session = podmanTest.Podman([]string{"start", "test"}) 165 session.WaitWithDefaultTimeout() 166 Expect(session).Should(Exit(0)) 167 168 session = podmanTest.Podman([]string{"logs", "test"}) 169 session.WaitWithDefaultTimeout() 170 Expect(session).Should(Exit(0)) 171 Expect(session.OutputToString()).ToNot(ContainSubstring("cannot touch")) 172 }) 173 174 It("podman create with --mount flag", func() { 175 if podmanTest.Host.Arch == "ppc64le" { 176 Skip("skip failing test on ppc64le") 177 } 178 // NOTE: we force the k8s-file log driver to make sure the 179 // tests are passing inside a container. 180 181 mountPath := filepath.Join(podmanTest.TempDir, "secrets") 182 os.Mkdir(mountPath, 0755) 183 session := podmanTest.Podman([]string{"create", "--log-driver", "k8s-file", "--name", "test", "--mount", fmt.Sprintf("type=bind,src=%s,target=/create/test", mountPath), ALPINE, "grep", "/create/test", "/proc/self/mountinfo"}) 184 session.WaitWithDefaultTimeout() 185 Expect(session).Should(Exit(0)) 186 session = podmanTest.Podman([]string{"start", "test"}) 187 session.WaitWithDefaultTimeout() 188 Expect(session).Should(Exit(0)) 189 session = podmanTest.Podman([]string{"logs", "test"}) 190 session.WaitWithDefaultTimeout() 191 Expect(session).Should(Exit(0)) 192 Expect(session.OutputToString()).To(ContainSubstring("/create/test rw")) 193 194 session = podmanTest.Podman([]string{"create", "--log-driver", "k8s-file", "--name", "test_ro", "--mount", fmt.Sprintf("type=bind,src=%s,target=/create/test,ro", mountPath), ALPINE, "grep", "/create/test", "/proc/self/mountinfo"}) 195 session.WaitWithDefaultTimeout() 196 Expect(session).Should(Exit(0)) 197 session = podmanTest.Podman([]string{"start", "test_ro"}) 198 session.WaitWithDefaultTimeout() 199 Expect(session).Should(Exit(0)) 200 session = podmanTest.Podman([]string{"logs", "test_ro"}) 201 session.WaitWithDefaultTimeout() 202 Expect(session).Should(Exit(0)) 203 Expect(session.OutputToString()).To(ContainSubstring("/create/test ro")) 204 205 session = podmanTest.Podman([]string{"create", "--log-driver", "k8s-file", "--name", "test_shared", "--mount", fmt.Sprintf("type=bind,src=%s,target=/create/test,shared", mountPath), ALPINE, "grep", "/create/test", "/proc/self/mountinfo"}) 206 session.WaitWithDefaultTimeout() 207 Expect(session).Should(Exit(0)) 208 session = podmanTest.Podman([]string{"start", "test_shared"}) 209 session.WaitWithDefaultTimeout() 210 Expect(session).Should(Exit(0)) 211 session = podmanTest.Podman([]string{"logs", "test_shared"}) 212 session.WaitWithDefaultTimeout() 213 Expect(session).Should(Exit(0)) 214 found, matches := session.GrepString("/create/test") 215 Expect(found).Should(BeTrue()) 216 Expect(matches[0]).To(ContainSubstring("rw")) 217 Expect(matches[0]).To(ContainSubstring("shared")) 218 219 mountPath = filepath.Join(podmanTest.TempDir, "scratchpad") 220 os.Mkdir(mountPath, 0755) 221 session = podmanTest.Podman([]string{"create", "--log-driver", "k8s-file", "--name", "test_tmpfs", "--mount", "type=tmpfs,target=/create/test", ALPINE, "grep", "/create/test", "/proc/self/mountinfo"}) 222 session.WaitWithDefaultTimeout() 223 Expect(session).Should(Exit(0)) 224 session = podmanTest.Podman([]string{"start", "test_tmpfs"}) 225 session.WaitWithDefaultTimeout() 226 Expect(session).Should(Exit(0)) 227 session = podmanTest.Podman([]string{"logs", "test_tmpfs"}) 228 session.WaitWithDefaultTimeout() 229 Expect(session).Should(Exit(0)) 230 Expect(session.OutputToString()).To(ContainSubstring("/create/test rw,nosuid,nodev,relatime - tmpfs")) 231 }) 232 233 It("podman create --pod automatically", func() { 234 session := podmanTest.Podman([]string{"create", "--pod", "new:foobar", ALPINE, "ls"}) 235 session.WaitWithDefaultTimeout() 236 Expect(session).Should(Exit(0)) 237 238 check := podmanTest.Podman([]string{"pod", "ps", "--no-trunc"}) 239 check.WaitWithDefaultTimeout() 240 match, _ := check.GrepString("foobar") 241 Expect(match).To(BeTrue()) 242 }) 243 244 It("podman create --pod-id-file", func() { 245 // First, make sure that --pod and --pod-id-file yield an error 246 // if used together. 247 session := podmanTest.Podman([]string{"create", "--pod", "foo", "--pod-id-file", "bar", ALPINE, "ls"}) 248 session.WaitWithDefaultTimeout() 249 Expect(session).Should(Exit(125)) 250 251 tmpDir, err := ioutil.TempDir("", "") 252 Expect(err).To(BeNil()) 253 defer os.RemoveAll(tmpDir) 254 255 podName := "rudolph" 256 ctrName := "prancer" 257 podIDFile := tmpDir + "pod-id-file" 258 259 // Now, let's create a pod with --pod-id-file. 260 session = podmanTest.Podman([]string{"pod", "create", "--pod-id-file", podIDFile, "--name", podName}) 261 session.WaitWithDefaultTimeout() 262 Expect(session).Should(Exit(0)) 263 264 session = podmanTest.Podman([]string{"pod", "inspect", podName}) 265 session.WaitWithDefaultTimeout() 266 Expect(session).Should(Exit(0)) 267 Expect(session.IsJSONOutputValid()).To(BeTrue()) 268 podData := session.InspectPodToJSON() 269 270 // Finally we can create a container with --pod-id-file and do 271 // some checks to make sure it's working as expected. 272 session = podmanTest.Podman([]string{"create", "--pod-id-file", podIDFile, "--name", ctrName, ALPINE, "top"}) 273 session.WaitWithDefaultTimeout() 274 Expect(session).Should(Exit(0)) 275 276 ctrJSON := podmanTest.InspectContainer(ctrName) 277 Expect(podData.ID).To(Equal(ctrJSON[0].Pod)) // Make sure the container's pod matches the pod's ID 278 }) 279 280 It("podman run entrypoint and cmd test", func() { 281 name := "test101" 282 create := podmanTest.Podman([]string{"create", "--name", name, redis}) 283 create.WaitWithDefaultTimeout() 284 Expect(create).Should(Exit(0)) 285 286 ctrJSON := podmanTest.InspectContainer(name) 287 Expect(len(ctrJSON)).To(Equal(1)) 288 Expect(len(ctrJSON[0].Config.Cmd)).To(Equal(1)) 289 Expect(ctrJSON[0].Config.Cmd[0]).To(Equal("redis-server")) 290 Expect(ctrJSON[0].Config.Entrypoint).To(Equal("docker-entrypoint.sh")) 291 }) 292 293 It("podman create --pull", func() { 294 session := podmanTest.Podman([]string{"create", "--pull", "never", "--name=foo", "testimage:00000000"}) 295 session.WaitWithDefaultTimeout() 296 Expect(session).To(ExitWithError()) 297 298 session = podmanTest.Podman([]string{"create", "--pull", "always", "--name=foo", "testimage:00000000"}) 299 session.WaitWithDefaultTimeout() 300 Expect(session).Should(Exit(0)) 301 }) 302 303 It("podman create using image list by tag", func() { 304 session := podmanTest.Podman([]string{"create", "--pull=always", "--arch=arm64", "--name=foo", ALPINELISTTAG}) 305 session.WaitWithDefaultTimeout() 306 Expect(session).Should(Exit(0)) 307 session = podmanTest.Podman([]string{"inspect", "--format", "{{.Image}}", "foo"}) 308 session.WaitWithDefaultTimeout() 309 Expect(session).Should(Exit(0)) 310 Expect(string(session.Out.Contents())).To(ContainSubstring(ALPINEARM64ID)) 311 session = podmanTest.Podman([]string{"inspect", "--format", "{{.ImageName}}", "foo"}) 312 session.WaitWithDefaultTimeout() 313 Expect(session).Should(Exit(0)) 314 Expect(string(session.Out.Contents())).To(ContainSubstring(ALPINELISTTAG)) 315 }) 316 317 It("podman create using image list by digest", func() { 318 session := podmanTest.Podman([]string{"create", "--pull=always", "--arch=arm64", "--name=foo", ALPINELISTDIGEST}) 319 session.WaitWithDefaultTimeout() 320 Expect(session).Should(Exit(0)) 321 session = podmanTest.Podman([]string{"inspect", "--format", "{{.Image}}", "foo"}) 322 session.WaitWithDefaultTimeout() 323 Expect(session).Should(Exit(0)) 324 Expect(string(session.Out.Contents())).To(ContainSubstring(ALPINEARM64ID)) 325 session = podmanTest.Podman([]string{"inspect", "--format", "{{.ImageName}}", "foo"}) 326 session.WaitWithDefaultTimeout() 327 Expect(session).Should(Exit(0)) 328 Expect(string(session.Out.Contents())).To(ContainSubstring(ALPINELISTDIGEST)) 329 }) 330 331 It("podman create using image list instance by digest", func() { 332 session := podmanTest.Podman([]string{"create", "--pull=always", "--arch=arm64", "--name=foo", ALPINEARM64DIGEST}) 333 session.WaitWithDefaultTimeout() 334 Expect(session).Should(Exit(0)) 335 session = podmanTest.Podman([]string{"inspect", "--format", "{{.Image}}", "foo"}) 336 session.WaitWithDefaultTimeout() 337 Expect(session).Should(Exit(0)) 338 Expect(string(session.Out.Contents())).To(ContainSubstring(ALPINEARM64ID)) 339 session = podmanTest.Podman([]string{"inspect", "--format", "{{.ImageName}}", "foo"}) 340 session.WaitWithDefaultTimeout() 341 Expect(session).Should(Exit(0)) 342 Expect(string(session.Out.Contents())).To(ContainSubstring(ALPINEARM64DIGEST)) 343 }) 344 345 It("podman create using cross-arch image list instance by digest", func() { 346 session := podmanTest.Podman([]string{"create", "--pull=always", "--arch=arm64", "--name=foo", ALPINEARM64DIGEST}) 347 session.WaitWithDefaultTimeout() 348 Expect(session).Should(Exit(0)) 349 session = podmanTest.Podman([]string{"inspect", "--format", "{{.Image}}", "foo"}) 350 session.WaitWithDefaultTimeout() 351 Expect(session).Should(Exit(0)) 352 Expect(string(session.Out.Contents())).To(ContainSubstring(ALPINEARM64ID)) 353 session = podmanTest.Podman([]string{"inspect", "--format", "{{.ImageName}}", "foo"}) 354 session.WaitWithDefaultTimeout() 355 Expect(session).Should(Exit(0)) 356 Expect(string(session.Out.Contents())).To(ContainSubstring(ALPINEARM64DIGEST)) 357 }) 358 359 It("podman create --authfile with nonexistent authfile", func() { 360 session := podmanTest.Podman([]string{"create", "--authfile", "/tmp/nonexistent", "--name=foo", ALPINE}) 361 session.WaitWithDefaultTimeout() 362 Expect(session).To(Not(Equal(0))) 363 }) 364 365 It("podman create --signature-policy", func() { 366 SkipIfRemote("SigPolicy not handled by remote") 367 session := podmanTest.Podman([]string{"create", "--pull=always", "--signature-policy", "/no/such/file", ALPINE}) 368 session.WaitWithDefaultTimeout() 369 Expect(session).To(ExitWithError()) 370 371 session = podmanTest.Podman([]string{"create", "--pull=always", "--signature-policy", "/etc/containers/policy.json", ALPINE}) 372 session.WaitWithDefaultTimeout() 373 Expect(session).Should(Exit(0)) 374 }) 375 376 It("podman create with unset label", func() { 377 // Alpine is assumed to have no labels here, which seems safe 378 ctrName := "testctr" 379 session := podmanTest.Podman([]string{"create", "--label", "TESTKEY1=", "--label", "TESTKEY2", "--name", ctrName, ALPINE, "top"}) 380 session.WaitWithDefaultTimeout() 381 Expect(session).Should(Exit(0)) 382 383 inspect := podmanTest.Podman([]string{"inspect", ctrName}) 384 inspect.WaitWithDefaultTimeout() 385 data := inspect.InspectContainerToJSON() 386 Expect(len(data)).To(Equal(1)) 387 Expect(len(data[0].Config.Labels)).To(Equal(2)) 388 _, ok1 := data[0].Config.Labels["TESTKEY1"] 389 Expect(ok1).To(BeTrue()) 390 _, ok2 := data[0].Config.Labels["TESTKEY2"] 391 Expect(ok2).To(BeTrue()) 392 }) 393 394 It("podman create with set label", func() { 395 // Alpine is assumed to have no labels here, which seems safe 396 ctrName := "testctr" 397 session := podmanTest.Podman([]string{"create", "--label", "TESTKEY1=value1", "--label", "TESTKEY2=bar", "--name", ctrName, ALPINE, "top"}) 398 session.WaitWithDefaultTimeout() 399 Expect(session).Should(Exit(0)) 400 401 inspect := podmanTest.Podman([]string{"inspect", ctrName}) 402 inspect.WaitWithDefaultTimeout() 403 data := inspect.InspectContainerToJSON() 404 Expect(len(data)).To(Equal(1)) 405 Expect(len(data[0].Config.Labels)).To(Equal(2)) 406 val1, ok1 := data[0].Config.Labels["TESTKEY1"] 407 Expect(ok1).To(BeTrue()) 408 Expect(val1).To(Equal("value1")) 409 val2, ok2 := data[0].Config.Labels["TESTKEY2"] 410 Expect(ok2).To(BeTrue()) 411 Expect(val2).To(Equal("bar")) 412 }) 413 414 It("podman create with --restart=on-failure:5 parses correctly", func() { 415 ctrName := "testctr" 416 session := podmanTest.Podman([]string{"create", "-t", "--restart", "on-failure:5", "--name", ctrName, ALPINE, "/bin/sh"}) 417 session.WaitWithDefaultTimeout() 418 Expect(session).Should(Exit(0)) 419 420 inspect := podmanTest.Podman([]string{"inspect", ctrName}) 421 inspect.WaitWithDefaultTimeout() 422 data := inspect.InspectContainerToJSON() 423 Expect(len(data)).To(Equal(1)) 424 Expect(data[0].HostConfig.RestartPolicy.Name).To(Equal("on-failure")) 425 Expect(data[0].HostConfig.RestartPolicy.MaximumRetryCount).To(Equal(uint(5))) 426 }) 427 428 It("podman create with --restart-policy=always:5 fails", func() { 429 session := podmanTest.Podman([]string{"create", "-t", "--restart", "always:5", ALPINE, "/bin/sh"}) 430 session.WaitWithDefaultTimeout() 431 Expect(session).To(ExitWithError()) 432 }) 433 434 It("podman create with --restart-policy unless-stopped", func() { 435 ctrName := "testctr" 436 unlessStopped := "unless-stopped" 437 session := podmanTest.Podman([]string{"create", "-t", "--restart", unlessStopped, "--name", ctrName, ALPINE, "/bin/sh"}) 438 session.WaitWithDefaultTimeout() 439 Expect(session).Should(Exit(0)) 440 441 inspect := podmanTest.Podman([]string{"inspect", ctrName}) 442 inspect.WaitWithDefaultTimeout() 443 data := inspect.InspectContainerToJSON() 444 Expect(len(data)).To(Equal(1)) 445 Expect(data[0].HostConfig.RestartPolicy.Name).To(Equal(unlessStopped)) 446 }) 447 448 It("podman create with -m 1000000 sets swap to 2000000", func() { 449 numMem := 1000000 450 ctrName := "testCtr" 451 session := podmanTest.Podman([]string{"create", "-t", "-m", fmt.Sprintf("%db", numMem), "--name", ctrName, ALPINE, "/bin/sh"}) 452 session.WaitWithDefaultTimeout() 453 Expect(session).Should(Exit(0)) 454 455 inspect := podmanTest.Podman([]string{"inspect", ctrName}) 456 inspect.WaitWithDefaultTimeout() 457 data := inspect.InspectContainerToJSON() 458 Expect(len(data)).To(Equal(1)) 459 Expect(data[0].HostConfig.MemorySwap).To(Equal(int64(2 * numMem))) 460 }) 461 462 It("podman create --cpus 5 sets nanocpus", func() { 463 numCpus := 5 464 nanoCPUs := numCpus * 1000000000 465 ctrName := "testCtr" 466 session := podmanTest.Podman([]string{"create", "-t", "--cpus", fmt.Sprintf("%d", numCpus), "--name", ctrName, ALPINE, "/bin/sh"}) 467 session.WaitWithDefaultTimeout() 468 Expect(session).Should(Exit(0)) 469 470 inspect := podmanTest.Podman([]string{"inspect", ctrName}) 471 inspect.WaitWithDefaultTimeout() 472 data := inspect.InspectContainerToJSON() 473 Expect(len(data)).To(Equal(1)) 474 Expect(data[0].HostConfig.NanoCpus).To(Equal(int64(nanoCPUs))) 475 }) 476 477 It("podman create --replace", func() { 478 // Make sure we error out with --name. 479 session := podmanTest.Podman([]string{"create", "--replace", ALPINE, "/bin/sh"}) 480 session.WaitWithDefaultTimeout() 481 Expect(session).Should(Exit(125)) 482 483 // Create and replace 5 times in a row the "same" container. 484 ctrName := "testCtr" 485 for i := 0; i < 5; i++ { 486 session = podmanTest.Podman([]string{"create", "--replace", "--name", ctrName, ALPINE, "/bin/sh"}) 487 session.WaitWithDefaultTimeout() 488 Expect(session).Should(Exit(0)) 489 } 490 }) 491 492 It("podman create sets default stop signal 15", func() { 493 ctrName := "testCtr" 494 session := podmanTest.Podman([]string{"create", "--name", ctrName, ALPINE, "/bin/sh"}) 495 session.WaitWithDefaultTimeout() 496 Expect(session).Should(Exit(0)) 497 498 inspect := podmanTest.Podman([]string{"inspect", ctrName}) 499 inspect.WaitWithDefaultTimeout() 500 data := inspect.InspectContainerToJSON() 501 Expect(len(data)).To(Equal(1)) 502 Expect(data[0].Config.StopSignal).To(Equal(uint(15))) 503 }) 504 505 It("podman create --tz", func() { 506 session := podmanTest.Podman([]string{"create", "--tz", "foo", "--name", "bad", ALPINE, "date"}) 507 session.WaitWithDefaultTimeout() 508 Expect(session).To(ExitWithError()) 509 510 session = podmanTest.Podman([]string{"create", "--tz", "America", "--name", "dir", ALPINE, "date"}) 511 session.WaitWithDefaultTimeout() 512 Expect(session).To(ExitWithError()) 513 514 session = podmanTest.Podman([]string{"create", "--tz", "Pacific/Honolulu", "--name", "zone", ALPINE, "date"}) 515 session.WaitWithDefaultTimeout() 516 inspect := podmanTest.Podman([]string{"inspect", "zone"}) 517 inspect.WaitWithDefaultTimeout() 518 data := inspect.InspectContainerToJSON() 519 Expect(len(data)).To(Equal(1)) 520 Expect(data[0].Config.Timezone).To(Equal("Pacific/Honolulu")) 521 522 session = podmanTest.Podman([]string{"create", "--tz", "local", "--name", "lcl", ALPINE, "date"}) 523 session.WaitWithDefaultTimeout() 524 inspect = podmanTest.Podman([]string{"inspect", "lcl"}) 525 inspect.WaitWithDefaultTimeout() 526 data = inspect.InspectContainerToJSON() 527 Expect(len(data)).To(Equal(1)) 528 Expect(data[0].Config.Timezone).To(Equal("local")) 529 }) 530 531 It("podman create --umask", func() { 532 if !strings.Contains(podmanTest.OCIRuntime, "crun") { 533 Skip("Test only works on crun") 534 } 535 536 session := podmanTest.Podman([]string{"create", "--name", "default", ALPINE}) 537 session.WaitWithDefaultTimeout() 538 inspect := podmanTest.Podman([]string{"inspect", "default"}) 539 inspect.WaitWithDefaultTimeout() 540 data := inspect.InspectContainerToJSON() 541 Expect(len(data)).To(Equal(1)) 542 Expect(data[0].Config.Umask).To(Equal("0022")) 543 544 session = podmanTest.Podman([]string{"create", "--umask", "0002", "--name", "umask", ALPINE}) 545 session.WaitWithDefaultTimeout() 546 inspect = podmanTest.Podman([]string{"inspect", "umask"}) 547 inspect.WaitWithDefaultTimeout() 548 data = inspect.InspectContainerToJSON() 549 Expect(len(data)).To(Equal(1)) 550 Expect(data[0].Config.Umask).To(Equal("0002")) 551 552 session = podmanTest.Podman([]string{"create", "--umask", "0077", "--name", "fedora", fedoraMinimal}) 553 session.WaitWithDefaultTimeout() 554 inspect = podmanTest.Podman([]string{"inspect", "fedora"}) 555 inspect.WaitWithDefaultTimeout() 556 data = inspect.InspectContainerToJSON() 557 Expect(len(data)).To(Equal(1)) 558 Expect(data[0].Config.Umask).To(Equal("0077")) 559 560 session = podmanTest.Podman([]string{"create", "--umask", "22", "--name", "umask-short", ALPINE}) 561 session.WaitWithDefaultTimeout() 562 inspect = podmanTest.Podman([]string{"inspect", "umask-short"}) 563 inspect.WaitWithDefaultTimeout() 564 data = inspect.InspectContainerToJSON() 565 Expect(len(data)).To(Equal(1)) 566 Expect(data[0].Config.Umask).To(Equal("0022")) 567 568 session = podmanTest.Podman([]string{"create", "--umask", "9999", "--name", "bad", ALPINE}) 569 session.WaitWithDefaultTimeout() 570 Expect(session).To(ExitWithError()) 571 Expect(session.ErrorToString()).To(ContainSubstring("Invalid umask")) 572 }) 573 574 It("create container in pod with IP should fail", func() { 575 SkipIfRootless("Setting IP not supported in rootless mode without network") 576 name := "createwithstaticip" 577 pod := podmanTest.RunTopContainerInPod("", "new:"+name) 578 pod.WaitWithDefaultTimeout() 579 Expect(pod).Should(Exit(0)) 580 581 session := podmanTest.Podman([]string{"create", "--pod", name, "--ip", "192.168.1.2", ALPINE, "top"}) 582 session.WaitWithDefaultTimeout() 583 Expect(session).Should(ExitWithError()) 584 }) 585 586 It("create container in pod with mac should fail", func() { 587 SkipIfRootless("Setting MAC Address not supported in rootless mode without network") 588 name := "createwithstaticmac" 589 pod := podmanTest.RunTopContainerInPod("", "new:"+name) 590 pod.WaitWithDefaultTimeout() 591 Expect(pod).Should(Exit(0)) 592 593 session := podmanTest.Podman([]string{"create", "--pod", name, "--mac-address", "52:54:00:6d:2f:82", ALPINE, "top"}) 594 session.WaitWithDefaultTimeout() 595 Expect(session).Should(ExitWithError()) 596 }) 597 598 It("create container in pod with network should not fail", func() { 599 name := "createwithnetwork" 600 pod := podmanTest.RunTopContainerInPod("", "new:"+name) 601 pod.WaitWithDefaultTimeout() 602 Expect(pod).Should(Exit(0)) 603 604 netName := "pod" + stringid.GenerateNonCryptoID() 605 session := podmanTest.Podman([]string{"network", "create", netName}) 606 session.WaitWithDefaultTimeout() 607 Expect(session).Should(Exit(0)) 608 defer podmanTest.removeCNINetwork(netName) 609 610 session = podmanTest.Podman([]string{"create", "--pod", name, "--network", netName, ALPINE, "top"}) 611 session.WaitWithDefaultTimeout() 612 Expect(session).Should(Exit(0)) 613 }) 614 615 It("create container in pod with ports should fail", func() { 616 name := "createwithports" 617 pod := podmanTest.RunTopContainerInPod("", "new:"+name) 618 pod.WaitWithDefaultTimeout() 619 Expect(pod).Should(Exit(0)) 620 621 session := podmanTest.Podman([]string{"create", "--pod", name, "-p", "8086:80", ALPINE, "top"}) 622 session.WaitWithDefaultTimeout() 623 Expect(session).Should(ExitWithError()) 624 }) 625 626 It("create container in pod publish ports should fail", func() { 627 name := "createwithpublishports" 628 pod := podmanTest.RunTopContainerInPod("", "new:"+name) 629 pod.WaitWithDefaultTimeout() 630 Expect(pod).Should(Exit(0)) 631 632 session := podmanTest.Podman([]string{"create", "--pod", name, "-P", ALPINE, "top"}) 633 session.WaitWithDefaultTimeout() 634 Expect(session).Should(ExitWithError()) 635 }) 636 637 It("create use local store image if input image contains a manifest list", func() { 638 session := podmanTest.Podman([]string{"pull", BB}) 639 session.WaitWithDefaultTimeout() 640 Expect(session).Should(Exit(0)) 641 642 session = podmanTest.Podman([]string{"manifest", "create", "mylist"}) 643 session.WaitWithDefaultTimeout() 644 Expect(session).Should(Exit(0)) 645 646 session = podmanTest.Podman([]string{"manifest", "add", "--all", "mylist", BB}) 647 session.WaitWithDefaultTimeout() 648 Expect(session).Should(Exit(0)) 649 650 session = podmanTest.Podman([]string{"create", "mylist"}) 651 session.WaitWithDefaultTimeout() 652 Expect(session).Should(Exit(0)) 653 }) 654 655 It("podman create -d should fail, can not detach create containers", func() { 656 session := podmanTest.Podman([]string{"create", "-d", ALPINE}) 657 session.WaitWithDefaultTimeout() 658 Expect(session).Should(Exit(125)) 659 Expect(session.ErrorToString()).To(ContainSubstring("unknown shorthand flag")) 660 661 session = podmanTest.Podman([]string{"create", "--detach", ALPINE}) 662 session.WaitWithDefaultTimeout() 663 Expect(session).Should(Exit(125)) 664 Expect(session.ErrorToString()).To(ContainSubstring("unknown flag")) 665 666 session = podmanTest.Podman([]string{"create", "--detach-keys", "ctrl-x", ALPINE}) 667 session.WaitWithDefaultTimeout() 668 Expect(session).Should(Exit(125)) 669 Expect(session.ErrorToString()).To(ContainSubstring("unknown flag")) 670 }) 671 672 It("podman create --platform", func() { 673 session := podmanTest.Podman([]string{"create", "--platform=linux/bogus", ALPINE}) 674 session.WaitWithDefaultTimeout() 675 Expect(session).Should(Exit(125)) 676 expectedError := "no image found in manifest list for architecture bogus" 677 Expect(session.ErrorToString()).To(ContainSubstring(expectedError)) 678 679 session = podmanTest.Podman([]string{"create", "--platform=linux/arm64", "--os", "windows", ALPINE}) 680 session.WaitWithDefaultTimeout() 681 Expect(session).Should(Exit(125)) 682 expectedError = "--platform option can not be specified with --arch or --os" 683 Expect(session.ErrorToString()).To(ContainSubstring(expectedError)) 684 685 session = podmanTest.Podman([]string{"create", "-q", "--platform=linux/arm64", ALPINE}) 686 session.WaitWithDefaultTimeout() 687 Expect(session).Should(Exit(0)) 688 689 setup := podmanTest.Podman([]string{"container", "inspect", session.OutputToString()}) 690 setup.WaitWithDefaultTimeout() 691 Expect(setup).Should(Exit(0)) 692 693 data := setup.InspectContainerToJSON() 694 setup = podmanTest.Podman([]string{"image", "inspect", data[0].Image}) 695 setup.WaitWithDefaultTimeout() 696 Expect(setup).Should(Exit(0)) 697 698 idata := setup.InspectImageJSON() // returns []inspect.ImageData 699 Expect(len(idata)).To(Equal(1)) 700 Expect(idata[0].Os).To(Equal(runtime.GOOS)) 701 Expect(idata[0].Architecture).To(Equal("arm64")) 702 }) 703 })