github.com/containers/podman/v4@v4.9.4/test/e2e/import_test.go (about)

     1  package integration
     2  
     3  import (
     4  	"path/filepath"
     5  
     6  	. "github.com/containers/podman/v4/test/utils"
     7  	. "github.com/onsi/ginkgo/v2"
     8  	. "github.com/onsi/gomega"
     9  	. "github.com/onsi/gomega/gexec"
    10  )
    11  
    12  var _ = Describe("Podman import", func() {
    13  
    14  	It("podman import with source and reference", func() {
    15  		outfile := filepath.Join(podmanTest.TempDir, "container.tar")
    16  		_, ec, cid := podmanTest.RunLsContainer("")
    17  		Expect(ec).To(Equal(0))
    18  
    19  		export := podmanTest.Podman([]string{"export", "-o", outfile, cid})
    20  		export.WaitWithDefaultTimeout()
    21  		Expect(export).Should(ExitCleanly())
    22  
    23  		importImage := podmanTest.Podman([]string{"import", outfile, "foobar.com/imported-image:latest"})
    24  		importImage.WaitWithDefaultTimeout()
    25  		Expect(importImage).Should(Exit(0))
    26  		if !IsRemote() {
    27  			messages := importImage.ErrorToString()
    28  			Expect(messages).Should(ContainSubstring("Getting image source signatures"))
    29  			Expect(messages).Should(ContainSubstring("Copying blob"))
    30  			Expect(messages).Should(ContainSubstring("Writing manifest to image destination"))
    31  			Expect(messages).Should(Not(ContainSubstring("level=")), "Unexpected logrus messages in stderr")
    32  		}
    33  
    34  		results := podmanTest.Podman([]string{"inspect", "--type", "image", "foobar.com/imported-image:latest"})
    35  		results.WaitWithDefaultTimeout()
    36  		Expect(results).Should(ExitCleanly())
    37  	})
    38  
    39  	It("podman import with custom os, arch and variant", func() {
    40  		outfile := filepath.Join(podmanTest.TempDir, "container.tar")
    41  		_, ec, cid := podmanTest.RunLsContainer("")
    42  		Expect(ec).To(Equal(0))
    43  
    44  		export := podmanTest.Podman([]string{"export", "-o", outfile, cid})
    45  		export.WaitWithDefaultTimeout()
    46  		Expect(export).Should(ExitCleanly())
    47  
    48  		importImage := podmanTest.Podman([]string{"import", "-q", "--os", "testos", "--arch", "testarch", outfile, "foobar.com/imported-image:latest"})
    49  		importImage.WaitWithDefaultTimeout()
    50  		Expect(importImage).Should(ExitCleanly())
    51  
    52  		results := podmanTest.Podman([]string{"inspect", "--type", "image", "foobar.com/imported-image:latest"})
    53  		results.WaitWithDefaultTimeout()
    54  		Expect(results).Should(ExitCleanly())
    55  		Expect(results.OutputToString()).To(ContainSubstring("testos"))
    56  		Expect(results.OutputToString()).To(ContainSubstring("testarch"))
    57  	})
    58  
    59  	It("podman import without reference", func() {
    60  		outfile := filepath.Join(podmanTest.TempDir, "container.tar")
    61  		_, ec, cid := podmanTest.RunLsContainer("")
    62  		Expect(ec).To(Equal(0))
    63  
    64  		export := podmanTest.Podman([]string{"export", "-o", outfile, cid})
    65  		export.WaitWithDefaultTimeout()
    66  		Expect(export).Should(ExitCleanly())
    67  
    68  		importImage := podmanTest.Podman([]string{"import", "-q", outfile})
    69  		importImage.WaitWithDefaultTimeout()
    70  		Expect(importImage).Should(ExitCleanly())
    71  
    72  		// tag the image which proves it is in R/W storage
    73  		tag := podmanTest.Podman([]string{"tag", importImage.OutputToString(), "foo"})
    74  		tag.WaitWithDefaultTimeout()
    75  		Expect(tag).Should(ExitCleanly())
    76  	})
    77  
    78  	It("podman import with message flag", func() {
    79  		outfile := filepath.Join(podmanTest.TempDir, "container.tar")
    80  		_, ec, cid := podmanTest.RunLsContainer("")
    81  		Expect(ec).To(Equal(0))
    82  
    83  		export := podmanTest.Podman([]string{"export", "-o", outfile, cid})
    84  		export.WaitWithDefaultTimeout()
    85  		Expect(export).Should(ExitCleanly())
    86  
    87  		importImage := podmanTest.Podman([]string{"import", "-q", "--message", "importing container test message", outfile, "imported-image"})
    88  		importImage.WaitWithDefaultTimeout()
    89  		Expect(importImage).Should(ExitCleanly())
    90  
    91  		results := podmanTest.Podman([]string{"history", "imported-image", "--format", "{{.Comment}}"})
    92  		results.WaitWithDefaultTimeout()
    93  		Expect(results).Should(ExitCleanly())
    94  		Expect(results.OutputToStringArray()).To(ContainElement(HavePrefix("importing container test message")))
    95  	})
    96  
    97  	It("podman import with change flag CMD=<path>", func() {
    98  		outfile := filepath.Join(podmanTest.TempDir, "container.tar")
    99  		_, ec, cid := podmanTest.RunLsContainer("")
   100  		Expect(ec).To(Equal(0))
   101  
   102  		export := podmanTest.Podman([]string{"export", "-o", outfile, cid})
   103  		export.WaitWithDefaultTimeout()
   104  		Expect(export).Should(ExitCleanly())
   105  
   106  		importImage := podmanTest.Podman([]string{"import", "-q", "--change", "CMD=/bin/bash", outfile, "imported-image"})
   107  		importImage.WaitWithDefaultTimeout()
   108  		Expect(importImage).Should(ExitCleanly())
   109  
   110  		results := podmanTest.Podman([]string{"inspect", "imported-image"})
   111  		results.WaitWithDefaultTimeout()
   112  		Expect(results).Should(ExitCleanly())
   113  		imageData := results.InspectImageJSON()
   114  		Expect(imageData[0].Config.Cmd[0]).To(Equal("/bin/sh"))
   115  		Expect(imageData[0].Config.Cmd[1]).To(Equal("-c"))
   116  		Expect(imageData[0].Config.Cmd[2]).To(Equal("/bin/bash"))
   117  	})
   118  
   119  	It("podman import with change flag CMD <path>", func() {
   120  		outfile := filepath.Join(podmanTest.TempDir, "container.tar")
   121  		_, ec, cid := podmanTest.RunLsContainer("")
   122  		Expect(ec).To(Equal(0))
   123  
   124  		export := podmanTest.Podman([]string{"export", "-o", outfile, cid})
   125  		export.WaitWithDefaultTimeout()
   126  		Expect(export).Should(ExitCleanly())
   127  
   128  		importImage := podmanTest.Podman([]string{"import", "-q", "--change", "CMD /bin/sh", outfile, "imported-image"})
   129  		importImage.WaitWithDefaultTimeout()
   130  		Expect(importImage).Should(ExitCleanly())
   131  
   132  		results := podmanTest.Podman([]string{"inspect", "imported-image"})
   133  		results.WaitWithDefaultTimeout()
   134  		Expect(results).Should(ExitCleanly())
   135  		imageData := results.InspectImageJSON()
   136  		Expect(imageData[0].Config.Cmd[0]).To(Equal("/bin/sh"))
   137  		Expect(imageData[0].Config.Cmd[1]).To(Equal("-c"))
   138  		Expect(imageData[0].Config.Cmd[2]).To(Equal("/bin/sh"))
   139  	})
   140  
   141  	It("podman import with change flag CMD [\"path\",\"path'\"", func() {
   142  		outfile := filepath.Join(podmanTest.TempDir, "container.tar")
   143  		_, ec, cid := podmanTest.RunLsContainer("")
   144  		Expect(ec).To(Equal(0))
   145  
   146  		export := podmanTest.Podman([]string{"export", "-o", outfile, cid})
   147  		export.WaitWithDefaultTimeout()
   148  		Expect(export).Should(ExitCleanly())
   149  
   150  		importImage := podmanTest.Podman([]string{"import", "-q", "--change", "CMD [\"/bin/bash\"]", outfile, "imported-image"})
   151  		importImage.WaitWithDefaultTimeout()
   152  		Expect(importImage).Should(ExitCleanly())
   153  
   154  		results := podmanTest.Podman([]string{"inspect", "imported-image"})
   155  		results.WaitWithDefaultTimeout()
   156  		Expect(results).Should(ExitCleanly())
   157  		imageData := results.InspectImageJSON()
   158  		Expect(imageData[0].Config.Cmd[0]).To(Equal("/bin/bash"))
   159  	})
   160  
   161  	It("podman import with signature", func() {
   162  		SkipIfRemote("--signature-policy N/A for remote")
   163  
   164  		outfile := filepath.Join(podmanTest.TempDir, "container.tar")
   165  		_, ec, cid := podmanTest.RunLsContainer("")
   166  		Expect(ec).To(Equal(0))
   167  
   168  		export := podmanTest.Podman([]string{"export", "-o", outfile, cid})
   169  		export.WaitWithDefaultTimeout()
   170  		Expect(export).Should(ExitCleanly())
   171  
   172  		importImage := podmanTest.Podman([]string{"import", "-q", "--signature-policy", "/no/such/file", outfile})
   173  		importImage.WaitWithDefaultTimeout()
   174  		Expect(importImage).To(ExitWithError())
   175  
   176  		result := podmanTest.Podman([]string{"import", "-q", "--signature-policy", "/etc/containers/policy.json", outfile})
   177  		result.WaitWithDefaultTimeout()
   178  		if IsRemote() {
   179  			Expect(result).To(ExitWithError())
   180  			Expect(result.ErrorToString()).To(ContainSubstring("unknown flag"))
   181  			result := podmanTest.Podman([]string{"import", "-q", outfile})
   182  			result.WaitWithDefaultTimeout()
   183  		}
   184  		Expect(result).Should(ExitCleanly())
   185  	})
   186  })