github.com/containers/libpod@v1.9.4-0.20220419124438-4284fd425507/test/e2e/create_test.go (about)

     1  package integration
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"path/filepath"
     7  
     8  	. "github.com/containers/libpod/test/utils"
     9  	. "github.com/onsi/ginkgo"
    10  	. "github.com/onsi/gomega"
    11  )
    12  
    13  var _ = Describe("Podman create", func() {
    14  	var (
    15  		tempdir    string
    16  		err        error
    17  		podmanTest *PodmanTestIntegration
    18  	)
    19  
    20  	BeforeEach(func() {
    21  		tempdir, err = CreateTempDirInTempDir()
    22  		if err != nil {
    23  			os.Exit(1)
    24  		}
    25  		podmanTest = PodmanTestCreate(tempdir)
    26  		podmanTest.Setup()
    27  		podmanTest.SeedImages()
    28  	})
    29  
    30  	AfterEach(func() {
    31  		podmanTest.Cleanup()
    32  		f := CurrentGinkgoTestDescription()
    33  		processTestResult(f)
    34  
    35  	})
    36  
    37  	It("podman create container based on a local image", func() {
    38  		session := podmanTest.Podman([]string{"create", ALPINE, "ls"})
    39  		session.WaitWithDefaultTimeout()
    40  		cid := session.OutputToString()
    41  		Expect(session.ExitCode()).To(Equal(0))
    42  		Expect(podmanTest.NumberOfContainers()).To(Equal(1))
    43  
    44  		check := podmanTest.Podman([]string{"inspect", "-l"})
    45  		check.WaitWithDefaultTimeout()
    46  		data := check.InspectContainerToJSON()
    47  		Expect(data[0].ID).To(ContainSubstring(cid))
    48  	})
    49  
    50  	It("podman create container based on a remote image", func() {
    51  		session := podmanTest.Podman([]string{"create", BB_GLIBC, "ls"})
    52  		session.WaitWithDefaultTimeout()
    53  		Expect(session.ExitCode()).To(Equal(0))
    54  		Expect(podmanTest.NumberOfContainers()).To(Equal(1))
    55  	})
    56  
    57  	It("podman container create container based on a remote image", func() {
    58  		session := podmanTest.Podman([]string{"container", "create", BB_GLIBC, "ls"})
    59  		session.WaitWithDefaultTimeout()
    60  		Expect(session.ExitCode()).To(Equal(0))
    61  		Expect(podmanTest.NumberOfContainers()).To(Equal(1))
    62  	})
    63  
    64  	It("podman create using short options", func() {
    65  		session := podmanTest.Podman([]string{"create", ALPINE, "ls"})
    66  		session.WaitWithDefaultTimeout()
    67  		Expect(session.ExitCode()).To(Equal(0))
    68  		Expect(podmanTest.NumberOfContainers()).To(Equal(1))
    69  	})
    70  
    71  	It("podman create using existing name", func() {
    72  		session := podmanTest.Podman([]string{"create", "--name=foo", ALPINE, "ls"})
    73  		session.WaitWithDefaultTimeout()
    74  		Expect(session.ExitCode()).To(Equal(0))
    75  		Expect(podmanTest.NumberOfContainers()).To(Equal(1))
    76  
    77  		session = podmanTest.Podman([]string{"create", "--name=foo", ALPINE, "ls"})
    78  		session.WaitWithDefaultTimeout()
    79  		Expect(session.ExitCode()).To(Equal(125))
    80  	})
    81  
    82  	It("podman create adds annotation", func() {
    83  		session := podmanTest.Podman([]string{"create", "--annotation", "HELLO=WORLD", ALPINE, "ls"})
    84  		session.WaitWithDefaultTimeout()
    85  		Expect(session.ExitCode()).To(Equal(0))
    86  		Expect(podmanTest.NumberOfContainers()).To(Equal(1))
    87  
    88  		check := podmanTest.Podman([]string{"inspect", "-l"})
    89  		check.WaitWithDefaultTimeout()
    90  		data := check.InspectContainerToJSON()
    91  		value, ok := data[0].Config.Annotations["HELLO"]
    92  		Expect(ok).To(BeTrue())
    93  		Expect(value).To(Equal("WORLD"))
    94  	})
    95  
    96  	It("podman create --entrypoint command", func() {
    97  		session := podmanTest.Podman([]string{"create", "--entrypoint", "/bin/foobar", ALPINE})
    98  		session.WaitWithDefaultTimeout()
    99  		Expect(session.ExitCode()).To(Equal(0))
   100  		Expect(podmanTest.NumberOfContainers()).To(Equal(1))
   101  
   102  		result := podmanTest.Podman([]string{"inspect", "-l", "--format", "{{.Config.Entrypoint}}"})
   103  		result.WaitWithDefaultTimeout()
   104  		Expect(result.ExitCode()).To(Equal(0))
   105  		Expect(result.OutputToString()).To(Equal("/bin/foobar"))
   106  	})
   107  
   108  	It("podman create --entrypoint \"\"", func() {
   109  		session := podmanTest.Podman([]string{"create", "--entrypoint", "", ALPINE, "ls"})
   110  		session.WaitWithDefaultTimeout()
   111  		Expect(session.ExitCode()).To(Equal(0))
   112  		Expect(podmanTest.NumberOfContainers()).To(Equal(1))
   113  
   114  		result := podmanTest.Podman([]string{"inspect", "-l", "--format", "{{.Config.Entrypoint}}"})
   115  		result.WaitWithDefaultTimeout()
   116  		Expect(result.ExitCode()).To(Equal(0))
   117  		Expect(result.OutputToString()).To(Equal(""))
   118  	})
   119  
   120  	It("podman create --entrypoint json", func() {
   121  		jsonString := `[ "/bin/foo", "-c"]`
   122  		session := podmanTest.Podman([]string{"create", "--entrypoint", jsonString, ALPINE})
   123  		session.WaitWithDefaultTimeout()
   124  		Expect(session.ExitCode()).To(Equal(0))
   125  		Expect(podmanTest.NumberOfContainers()).To(Equal(1))
   126  
   127  		result := podmanTest.Podman([]string{"inspect", "-l", "--format", "{{.Config.Entrypoint}}"})
   128  		result.WaitWithDefaultTimeout()
   129  		Expect(result.ExitCode()).To(Equal(0))
   130  		Expect(result.OutputToString()).To(Equal("/bin/foo -c"))
   131  	})
   132  
   133  	It("podman create --mount flag with multiple mounts", func() {
   134  		vol1 := filepath.Join(podmanTest.TempDir, "vol-test1")
   135  		err := os.MkdirAll(vol1, 0755)
   136  		Expect(err).To(BeNil())
   137  		vol2 := filepath.Join(podmanTest.TempDir, "vol-test2")
   138  		err = os.MkdirAll(vol2, 0755)
   139  		Expect(err).To(BeNil())
   140  
   141  		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"})
   142  		session.WaitWithDefaultTimeout()
   143  		Expect(session.ExitCode()).To(Equal(0))
   144  
   145  		session = podmanTest.Podman([]string{"start", "test"})
   146  		session.WaitWithDefaultTimeout()
   147  		Expect(session.ExitCode()).To(Equal(0))
   148  
   149  		session = podmanTest.Podman([]string{"logs", "test"})
   150  		session.WaitWithDefaultTimeout()
   151  		Expect(session.ExitCode()).To(Equal(0))
   152  		Expect(session.OutputToString()).ToNot(ContainSubstring("cannot touch"))
   153  	})
   154  
   155  	It("podman create with --mount flag", func() {
   156  		if podmanTest.Host.Arch == "ppc64le" {
   157  			Skip("skip failing test on ppc64le")
   158  		}
   159  		mountPath := filepath.Join(podmanTest.TempDir, "secrets")
   160  		os.Mkdir(mountPath, 0755)
   161  		session := podmanTest.Podman([]string{"create", "--name", "test", "--mount", fmt.Sprintf("type=bind,src=%s,target=/create/test", mountPath), ALPINE, "grep", "/create/test", "/proc/self/mountinfo"})
   162  		session.WaitWithDefaultTimeout()
   163  		Expect(session.ExitCode()).To(Equal(0))
   164  		session = podmanTest.Podman([]string{"start", "test"})
   165  		session.WaitWithDefaultTimeout()
   166  		Expect(session.ExitCode()).To(Equal(0))
   167  		session = podmanTest.Podman([]string{"logs", "test"})
   168  		session.WaitWithDefaultTimeout()
   169  		Expect(session.ExitCode()).To(Equal(0))
   170  		Expect(session.OutputToString()).To(ContainSubstring("/create/test rw"))
   171  
   172  		session = podmanTest.Podman([]string{"create", "--name", "test_ro", "--mount", fmt.Sprintf("type=bind,src=%s,target=/create/test,ro", mountPath), ALPINE, "grep", "/create/test", "/proc/self/mountinfo"})
   173  		session.WaitWithDefaultTimeout()
   174  		Expect(session.ExitCode()).To(Equal(0))
   175  		session = podmanTest.Podman([]string{"start", "test_ro"})
   176  		session.WaitWithDefaultTimeout()
   177  		Expect(session.ExitCode()).To(Equal(0))
   178  		session = podmanTest.Podman([]string{"logs", "test_ro"})
   179  		session.WaitWithDefaultTimeout()
   180  		Expect(session.ExitCode()).To(Equal(0))
   181  		Expect(session.OutputToString()).To(ContainSubstring("/create/test ro"))
   182  
   183  		session = podmanTest.Podman([]string{"create", "--name", "test_shared", "--mount", fmt.Sprintf("type=bind,src=%s,target=/create/test,shared", mountPath), ALPINE, "grep", "/create/test", "/proc/self/mountinfo"})
   184  		session.WaitWithDefaultTimeout()
   185  		Expect(session.ExitCode()).To(Equal(0))
   186  		session = podmanTest.Podman([]string{"start", "test_shared"})
   187  		session.WaitWithDefaultTimeout()
   188  		Expect(session.ExitCode()).To(Equal(0))
   189  		session = podmanTest.Podman([]string{"logs", "test_shared"})
   190  		session.WaitWithDefaultTimeout()
   191  		Expect(session.ExitCode()).To(Equal(0))
   192  		found, matches := session.GrepString("/create/test")
   193  		Expect(found).Should(BeTrue())
   194  		Expect(matches[0]).To(ContainSubstring("rw"))
   195  		Expect(matches[0]).To(ContainSubstring("shared"))
   196  
   197  		mountPath = filepath.Join(podmanTest.TempDir, "scratchpad")
   198  		os.Mkdir(mountPath, 0755)
   199  		session = podmanTest.Podman([]string{"create", "--name", "test_tmpfs", "--mount", "type=tmpfs,target=/create/test", ALPINE, "grep", "/create/test", "/proc/self/mountinfo"})
   200  		session.WaitWithDefaultTimeout()
   201  		Expect(session.ExitCode()).To(Equal(0))
   202  		session = podmanTest.Podman([]string{"start", "test_tmpfs"})
   203  		session.WaitWithDefaultTimeout()
   204  		Expect(session.ExitCode()).To(Equal(0))
   205  		session = podmanTest.Podman([]string{"logs", "test_tmpfs"})
   206  		session.WaitWithDefaultTimeout()
   207  		Expect(session.ExitCode()).To(Equal(0))
   208  		Expect(session.OutputToString()).To(ContainSubstring("/create/test rw,nosuid,nodev,relatime - tmpfs"))
   209  	})
   210  
   211  	It("podman create --pod automatically", func() {
   212  		session := podmanTest.Podman([]string{"create", "--pod", "new:foobar", ALPINE, "ls"})
   213  		session.WaitWithDefaultTimeout()
   214  		Expect(session.ExitCode()).To(Equal(0))
   215  
   216  		check := podmanTest.Podman([]string{"pod", "ps", "--no-trunc"})
   217  		check.WaitWithDefaultTimeout()
   218  		match, _ := check.GrepString("foobar")
   219  		Expect(match).To(BeTrue())
   220  	})
   221  
   222  	It("podman run entrypoint and cmd test", func() {
   223  		name := "test101"
   224  		create := podmanTest.Podman([]string{"create", "--name", name, redis})
   225  		create.WaitWithDefaultTimeout()
   226  		Expect(create.ExitCode()).To(Equal(0))
   227  
   228  		ctrJSON := podmanTest.InspectContainer(name)
   229  		Expect(len(ctrJSON)).To(Equal(1))
   230  		Expect(len(ctrJSON[0].Config.Cmd)).To(Equal(1))
   231  		Expect(ctrJSON[0].Config.Cmd[0]).To(Equal("redis-server"))
   232  		Expect(ctrJSON[0].Config.Entrypoint).To(Equal("docker-entrypoint.sh"))
   233  	})
   234  
   235  	It("podman create --pull", func() {
   236  		session := podmanTest.PodmanNoCache([]string{"create", "--pull", "never", "--name=foo", "nginx"})
   237  		session.WaitWithDefaultTimeout()
   238  		Expect(session).To(ExitWithError())
   239  
   240  		session = podmanTest.PodmanNoCache([]string{"create", "--pull", "always", "--name=foo", "nginx"})
   241  		session.WaitWithDefaultTimeout()
   242  		Expect(session.ExitCode()).To(Equal(0))
   243  	})
   244  
   245  	It("podman create using image list by tag", func() {
   246  		session := podmanTest.PodmanNoCache([]string{"create", "--pull=always", "--override-arch=arm64", "--name=foo", ALPINELISTTAG})
   247  		session.WaitWithDefaultTimeout()
   248  		Expect(session.ExitCode()).To((Equal(0)))
   249  		session = podmanTest.PodmanNoCache([]string{"inspect", "--format", "{{.Image}}", "foo"})
   250  		session.WaitWithDefaultTimeout()
   251  		Expect(session.ExitCode()).To((Equal(0)))
   252  		Expect(string(session.Out.Contents())).To(ContainSubstring(ALPINEARM64ID))
   253  		session = podmanTest.PodmanNoCache([]string{"inspect", "--format", "{{.ImageName}}", "foo"})
   254  		session.WaitWithDefaultTimeout()
   255  		Expect(session.ExitCode()).To((Equal(0)))
   256  		Expect(string(session.Out.Contents())).To(ContainSubstring(ALPINELISTTAG))
   257  	})
   258  
   259  	It("podman create using image list by digest", func() {
   260  		session := podmanTest.PodmanNoCache([]string{"create", "--pull=always", "--override-arch=arm64", "--name=foo", ALPINELISTDIGEST})
   261  		session.WaitWithDefaultTimeout()
   262  		Expect(session.ExitCode()).To((Equal(0)))
   263  		session = podmanTest.PodmanNoCache([]string{"inspect", "--format", "{{.Image}}", "foo"})
   264  		session.WaitWithDefaultTimeout()
   265  		Expect(session.ExitCode()).To((Equal(0)))
   266  		Expect(string(session.Out.Contents())).To(ContainSubstring(ALPINEARM64ID))
   267  		session = podmanTest.PodmanNoCache([]string{"inspect", "--format", "{{.ImageName}}", "foo"})
   268  		session.WaitWithDefaultTimeout()
   269  		Expect(session.ExitCode()).To((Equal(0)))
   270  		Expect(string(session.Out.Contents())).To(ContainSubstring(ALPINELISTDIGEST))
   271  	})
   272  
   273  	It("podman create using image list instance by digest", func() {
   274  		session := podmanTest.PodmanNoCache([]string{"create", "--pull=always", "--override-arch=arm64", "--name=foo", ALPINEARM64DIGEST})
   275  		session.WaitWithDefaultTimeout()
   276  		Expect(session.ExitCode()).To((Equal(0)))
   277  		session = podmanTest.PodmanNoCache([]string{"inspect", "--format", "{{.Image}}", "foo"})
   278  		session.WaitWithDefaultTimeout()
   279  		Expect(session.ExitCode()).To((Equal(0)))
   280  		Expect(string(session.Out.Contents())).To(ContainSubstring(ALPINEARM64ID))
   281  		session = podmanTest.PodmanNoCache([]string{"inspect", "--format", "{{.ImageName}}", "foo"})
   282  		session.WaitWithDefaultTimeout()
   283  		Expect(session.ExitCode()).To((Equal(0)))
   284  		Expect(string(session.Out.Contents())).To(ContainSubstring(ALPINEARM64DIGEST))
   285  	})
   286  
   287  	It("podman create using cross-arch image list instance by digest", func() {
   288  		session := podmanTest.PodmanNoCache([]string{"create", "--pull=always", "--override-arch=arm64", "--name=foo", ALPINEARM64DIGEST})
   289  		session.WaitWithDefaultTimeout()
   290  		Expect(session.ExitCode()).To((Equal(0)))
   291  		session = podmanTest.PodmanNoCache([]string{"inspect", "--format", "{{.Image}}", "foo"})
   292  		session.WaitWithDefaultTimeout()
   293  		Expect(session.ExitCode()).To((Equal(0)))
   294  		Expect(string(session.Out.Contents())).To(ContainSubstring(ALPINEARM64ID))
   295  		session = podmanTest.PodmanNoCache([]string{"inspect", "--format", "{{.ImageName}}", "foo"})
   296  		session.WaitWithDefaultTimeout()
   297  		Expect(session.ExitCode()).To((Equal(0)))
   298  		Expect(string(session.Out.Contents())).To(ContainSubstring(ALPINEARM64DIGEST))
   299  	})
   300  
   301  	It("podman create --authfile with nonexist authfile", func() {
   302  		SkipIfRemote()
   303  		session := podmanTest.PodmanNoCache([]string{"create", "--authfile", "/tmp/nonexist", "--name=foo", ALPINE})
   304  		session.WaitWithDefaultTimeout()
   305  		Expect(session).To(Not(Equal(0)))
   306  	})
   307  
   308  	It("podman create with unset label", func() {
   309  		// Alpine is assumed to have no labels here, which seems safe
   310  		ctrName := "testctr"
   311  		session := podmanTest.Podman([]string{"create", "--label", "TESTKEY1=", "--label", "TESTKEY2", "--name", ctrName, ALPINE, "top"})
   312  		session.WaitWithDefaultTimeout()
   313  		Expect(session.ExitCode()).To(Equal(0))
   314  
   315  		inspect := podmanTest.Podman([]string{"inspect", ctrName})
   316  		inspect.WaitWithDefaultTimeout()
   317  		data := inspect.InspectContainerToJSON()
   318  		Expect(len(data)).To(Equal(1))
   319  		Expect(len(data[0].Config.Labels)).To(Equal(2))
   320  		_, ok1 := data[0].Config.Labels["TESTKEY1"]
   321  		Expect(ok1).To(BeTrue())
   322  		_, ok2 := data[0].Config.Labels["TESTKEY2"]
   323  		Expect(ok2).To(BeTrue())
   324  	})
   325  
   326  	It("podman create with set label", func() {
   327  		// Alpine is assumed to have no labels here, which seems safe
   328  		ctrName := "testctr"
   329  		session := podmanTest.Podman([]string{"create", "--label", "TESTKEY1=value1", "--label", "TESTKEY2=bar", "--name", ctrName, ALPINE, "top"})
   330  		session.WaitWithDefaultTimeout()
   331  		Expect(session.ExitCode()).To(Equal(0))
   332  
   333  		inspect := podmanTest.Podman([]string{"inspect", ctrName})
   334  		inspect.WaitWithDefaultTimeout()
   335  		data := inspect.InspectContainerToJSON()
   336  		Expect(len(data)).To(Equal(1))
   337  		Expect(len(data[0].Config.Labels)).To(Equal(2))
   338  		val1, ok1 := data[0].Config.Labels["TESTKEY1"]
   339  		Expect(ok1).To(BeTrue())
   340  		Expect(val1).To(Equal("value1"))
   341  		val2, ok2 := data[0].Config.Labels["TESTKEY2"]
   342  		Expect(ok2).To(BeTrue())
   343  		Expect(val2).To(Equal("bar"))
   344  	})
   345  })