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 }