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  })