github.com/containers/podman/v2@v2.2.2-0.20210501105131-c1e07d070c4c/test/e2e/save_test.go (about)

     1  package integration
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"os/exec"
     7  	"path/filepath"
     8  	"strconv"
     9  	"strings"
    10  
    11  	"github.com/containers/podman/v2/pkg/rootless"
    12  	. "github.com/containers/podman/v2/test/utils"
    13  	. "github.com/onsi/ginkgo"
    14  	. "github.com/onsi/gomega"
    15  )
    16  
    17  var _ = Describe("Podman save", func() {
    18  	var (
    19  		tempdir    string
    20  		err        error
    21  		podmanTest *PodmanTestIntegration
    22  	)
    23  
    24  	BeforeEach(func() {
    25  		tempdir, err = CreateTempDirInTempDir()
    26  		if err != nil {
    27  			os.Exit(1)
    28  		}
    29  		podmanTest = PodmanTestCreate(tempdir)
    30  		podmanTest.Setup()
    31  	})
    32  
    33  	AfterEach(func() {
    34  		podmanTest.Cleanup()
    35  		f := CurrentGinkgoTestDescription()
    36  		processTestResult(f)
    37  
    38  	})
    39  
    40  	It("podman save output flag", func() {
    41  		outfile := filepath.Join(podmanTest.TempDir, "alpine.tar")
    42  
    43  		save := podmanTest.Podman([]string{"save", "-o", outfile, ALPINE})
    44  		save.WaitWithDefaultTimeout()
    45  		Expect(save.ExitCode()).To(Equal(0))
    46  	})
    47  
    48  	It("podman save oci flag", func() {
    49  		outfile := filepath.Join(podmanTest.TempDir, "alpine.tar")
    50  
    51  		save := podmanTest.Podman([]string{"save", "-o", outfile, "--format", "oci-archive", ALPINE})
    52  		save.WaitWithDefaultTimeout()
    53  		Expect(save.ExitCode()).To(Equal(0))
    54  	})
    55  
    56  	It("podman save with stdout", func() {
    57  		Skip("Pipe redirection in ginkgo probably won't work")
    58  		outfile := filepath.Join(podmanTest.TempDir, "alpine.tar")
    59  
    60  		save := podmanTest.Podman([]string{"save", ALPINE, ">", outfile})
    61  		save.WaitWithDefaultTimeout()
    62  		Expect(save.ExitCode()).To(Equal(0))
    63  	})
    64  
    65  	It("podman save quiet flag", func() {
    66  		outfile := filepath.Join(podmanTest.TempDir, "alpine.tar")
    67  
    68  		save := podmanTest.Podman([]string{"save", "-q", "-o", outfile, ALPINE})
    69  		save.WaitWithDefaultTimeout()
    70  		Expect(save.ExitCode()).To(Equal(0))
    71  	})
    72  
    73  	It("podman save bogus image", func() {
    74  		outfile := filepath.Join(podmanTest.TempDir, "alpine.tar")
    75  
    76  		save := podmanTest.Podman([]string{"save", "-o", outfile, "FOOBAR"})
    77  		save.WaitWithDefaultTimeout()
    78  		Expect(save).To(ExitWithError())
    79  	})
    80  
    81  	It("podman save to directory with oci format", func() {
    82  		if rootless.IsRootless() && podmanTest.RemoteTest {
    83  			Skip("Requires a fix in containers image for chown/lchown")
    84  		}
    85  		outdir := filepath.Join(podmanTest.TempDir, "save")
    86  
    87  		save := podmanTest.Podman([]string{"save", "--format", "oci-dir", "-o", outdir, ALPINE})
    88  		save.WaitWithDefaultTimeout()
    89  		Expect(save.ExitCode()).To(Equal(0))
    90  	})
    91  
    92  	It("podman save to directory with v2s2 docker format", func() {
    93  		if rootless.IsRootless() && podmanTest.RemoteTest {
    94  			Skip("Requires a fix in containers image for chown/lchown")
    95  		}
    96  		outdir := filepath.Join(podmanTest.TempDir, "save")
    97  
    98  		save := podmanTest.Podman([]string{"save", "--format", "docker-dir", "-o", outdir, ALPINE})
    99  		save.WaitWithDefaultTimeout()
   100  		Expect(save.ExitCode()).To(Equal(0))
   101  	})
   102  
   103  	It("podman save to directory with docker format and compression", func() {
   104  		if rootless.IsRootless() && podmanTest.RemoteTest {
   105  			Skip("Requires a fix in containers image for chown/lchown")
   106  		}
   107  		outdir := filepath.Join(podmanTest.TempDir, "save")
   108  
   109  		save := podmanTest.Podman([]string{"save", "--compress", "--format", "docker-dir", "-o", outdir, ALPINE})
   110  		save.WaitWithDefaultTimeout()
   111  		Expect(save.ExitCode()).To(Equal(0))
   112  	})
   113  
   114  	It("podman save bad filename", func() {
   115  		outdir := filepath.Join(podmanTest.TempDir, "save:colon")
   116  
   117  		save := podmanTest.Podman([]string{"save", "--compress", "--format", "docker-dir", "-o", outdir, ALPINE})
   118  		save.WaitWithDefaultTimeout()
   119  		Expect(save).To(ExitWithError())
   120  	})
   121  
   122  	It("podman save remove signature", func() {
   123  		podmanTest.AddImageToRWStore(ALPINE)
   124  		SkipIfRootless("FIXME: Need get in rootless push sign")
   125  		if podmanTest.Host.Arch == "ppc64le" {
   126  			Skip("No registry image for ppc64le")
   127  		}
   128  		tempGNUPGHOME := filepath.Join(podmanTest.TempDir, "tmpGPG")
   129  		err := os.Mkdir(tempGNUPGHOME, os.ModePerm)
   130  		Expect(err).To(BeNil())
   131  		origGNUPGHOME := os.Getenv("GNUPGHOME")
   132  		err = os.Setenv("GNUPGHOME", tempGNUPGHOME)
   133  		Expect(err).To(BeNil())
   134  		defer os.Setenv("GNUPGHOME", origGNUPGHOME)
   135  
   136  		port := 5000
   137  		session := podmanTest.Podman([]string{"run", "-d", "--name", "registry", "-p", strings.Join([]string{strconv.Itoa(port), strconv.Itoa(port)}, ":"), "quay.io/libpod/registry:2.6"})
   138  		session.WaitWithDefaultTimeout()
   139  		Expect(session.ExitCode()).To(Equal(0))
   140  		if !WaitContainerReady(podmanTest, "registry", "listening on", 20, 1) {
   141  			Skip("Cannot start docker registry.")
   142  		}
   143  
   144  		cmd := exec.Command("gpg", "--import", "sign/secret-key.asc")
   145  		err = cmd.Run()
   146  		Expect(err).To(BeNil())
   147  
   148  		cmd = exec.Command("cp", "/etc/containers/registries.d/default.yaml", "default.yaml")
   149  		if err = cmd.Run(); err != nil {
   150  			Skip("no signature store to verify")
   151  		}
   152  		defer func() {
   153  			cmd = exec.Command("cp", "default.yaml", "/etc/containers/registries.d/default.yaml")
   154  			cmd.Run()
   155  		}()
   156  
   157  		cmd = exec.Command("cp", "sign/key.gpg", "/tmp/key.gpg")
   158  		Expect(cmd.Run()).To(BeNil())
   159  		sigstore := `
   160  default-docker:
   161    sigstore: file:///var/lib/containers/sigstore
   162    sigstore-staging: file:///var/lib/containers/sigstore
   163  `
   164  		Expect(ioutil.WriteFile("/etc/containers/registries.d/default.yaml", []byte(sigstore), 0755)).To(BeNil())
   165  
   166  		session = podmanTest.Podman([]string{"tag", ALPINE, "localhost:5000/alpine"})
   167  		session.WaitWithDefaultTimeout()
   168  		Expect(session.ExitCode()).To(Equal(0))
   169  
   170  		session = podmanTest.Podman([]string{"push", "--tls-verify=false", "--sign-by", "foo@bar.com", "localhost:5000/alpine"})
   171  		session.WaitWithDefaultTimeout()
   172  		Expect(session.ExitCode()).To(Equal(0))
   173  
   174  		session = podmanTest.Podman([]string{"rmi", ALPINE, "localhost:5000/alpine"})
   175  		session.WaitWithDefaultTimeout()
   176  		Expect(session.ExitCode()).To(Equal(0))
   177  
   178  		session = podmanTest.Podman([]string{"pull", "--tls-verify=false", "--signature-policy=sign/policy.json", "localhost:5000/alpine"})
   179  		session.WaitWithDefaultTimeout()
   180  		Expect(session.ExitCode()).To(Equal(0))
   181  
   182  		outfile := filepath.Join(podmanTest.TempDir, "temp.tar")
   183  		save := podmanTest.Podman([]string{"save", "remove-signatures=true", "-o", outfile, "localhost:5000/alpine"})
   184  		save.WaitWithDefaultTimeout()
   185  		Expect(save).To(ExitWithError())
   186  	})
   187  
   188  	It("podman save image with digest reference", func() {
   189  		// pull a digest reference
   190  		session := podmanTest.Podman([]string{"pull", ALPINELISTDIGEST})
   191  		session.WaitWithDefaultTimeout()
   192  		Expect(session.ExitCode()).To(Equal(0))
   193  
   194  		// save a digest reference should exit without error.
   195  		outfile := filepath.Join(podmanTest.TempDir, "temp.tar")
   196  		save := podmanTest.Podman([]string{"save", "-o", outfile, ALPINELISTDIGEST})
   197  		save.WaitWithDefaultTimeout()
   198  		Expect(save.ExitCode()).To(Equal(0))
   199  	})
   200  
   201  	It("podman save --multi-image-archive (tagged images)", func() {
   202  		multiImageSave(podmanTest, RESTORE_IMAGES)
   203  	})
   204  
   205  	It("podman save --multi-image-archive (untagged images)", func() {
   206  		// Refer to images via ID instead of tag.
   207  		session := podmanTest.Podman([]string{"images", "--format", "{{.ID}}"})
   208  		session.WaitWithDefaultTimeout()
   209  		Expect(session.ExitCode()).To(Equal(0))
   210  		ids := session.OutputToStringArray()
   211  
   212  		Expect(len(RESTORE_IMAGES), len(ids))
   213  		multiImageSave(podmanTest, ids)
   214  	})
   215  })
   216  
   217  // Create a multi-image archive, remove all images, load it and
   218  // make sure that all images are (again) present.
   219  func multiImageSave(podmanTest *PodmanTestIntegration, images []string) {
   220  	// Create the archive.
   221  	outfile := filepath.Join(podmanTest.TempDir, "temp.tar")
   222  	session := podmanTest.Podman(append([]string{"save", "-o", outfile, "--multi-image-archive"}, images...))
   223  	session.WaitWithDefaultTimeout()
   224  	Expect(session.ExitCode()).To(Equal(0))
   225  
   226  	// Remove all images.
   227  	session = podmanTest.Podman([]string{"rmi", "-af"})
   228  	session.WaitWithDefaultTimeout()
   229  	Expect(session.ExitCode()).To(Equal(0))
   230  
   231  	// Now load the archive.
   232  	session = podmanTest.Podman([]string{"load", "-i", outfile})
   233  	session.WaitWithDefaultTimeout()
   234  	Expect(session.ExitCode()).To(Equal(0))
   235  	// Grep for each image in the `podman load` output.
   236  	for _, image := range images {
   237  		found, _ := session.GrepString(image)
   238  		Expect(found).Should(BeTrue())
   239  	}
   240  
   241  	// Make sure that each image has really been loaded.
   242  	for _, image := range images {
   243  		session = podmanTest.Podman([]string{"image", "exists", image})
   244  		session.WaitWithDefaultTimeout()
   245  		Expect(session.ExitCode()).To(Equal(0))
   246  	}
   247  }