github.com/hanks177/podman/v4@v4.1.3-0.20220613032544-16d90015bc83/test/e2e/manifest_test.go (about) 1 package integration 2 3 import ( 4 "os" 5 "path/filepath" 6 "strings" 7 8 podmanRegistry "github.com/hanks177/podman/v4/hack/podman-registry-go" 9 . "github.com/hanks177/podman/v4/test/utils" 10 . "github.com/onsi/ginkgo" 11 . "github.com/onsi/gomega" 12 . "github.com/onsi/gomega/gexec" 13 ) 14 15 var _ = Describe("Podman manifest", func() { 16 var ( 17 tempdir string 18 err error 19 podmanTest *PodmanTestIntegration 20 ) 21 22 const ( 23 imageList = "docker://k8s.gcr.io/pause:3.1" 24 imageListInstance = "docker://k8s.gcr.io/pause@sha256:f365626a556e58189fc21d099fc64603db0f440bff07f77c740989515c544a39" 25 imageListARM64InstanceDigest = "sha256:f365626a556e58189fc21d099fc64603db0f440bff07f77c740989515c544a39" 26 imageListAMD64InstanceDigest = "sha256:59eec8837a4d942cc19a52b8c09ea75121acc38114a2c68b98983ce9356b8610" 27 imageListARMInstanceDigest = "sha256:c84b0a3a07b628bc4d62e5047d0f8dff80f7c00979e1e28a821a033ecda8fe53" 28 imageListPPC64LEInstanceDigest = "sha256:bcf9771c0b505e68c65440474179592ffdfa98790eb54ffbf129969c5e429990" 29 imageListS390XInstanceDigest = "sha256:882a20ee0df7399a445285361d38b711c299ca093af978217112c73803546d5e" 30 ) 31 32 BeforeEach(func() { 33 tempdir, err = CreateTempDirInTempDir() 34 if err != nil { 35 os.Exit(1) 36 } 37 podmanTest = PodmanTestCreate(tempdir) 38 podmanTest.Setup() 39 }) 40 41 AfterEach(func() { 42 podmanTest.Cleanup() 43 f := CurrentGinkgoTestDescription() 44 processTestResult(f) 45 46 }) 47 It("create w/o image", func() { 48 session := podmanTest.Podman([]string{"manifest", "create", "foo"}) 49 session.WaitWithDefaultTimeout() 50 Expect(session).Should(Exit(0)) 51 }) 52 53 It("create w/ image", func() { 54 session := podmanTest.Podman([]string{"manifest", "create", "foo", imageList}) 55 session.WaitWithDefaultTimeout() 56 Expect(session).Should(Exit(0)) 57 }) 58 59 It("inspect", func() { 60 session := podmanTest.Podman([]string{"manifest", "inspect", BB}) 61 session.WaitWithDefaultTimeout() 62 Expect(session).Should(Exit(0)) 63 64 session = podmanTest.Podman([]string{"manifest", "inspect", "quay.io/libpod/busybox"}) 65 session.WaitWithDefaultTimeout() 66 Expect(session).Should(Exit(0)) 67 68 // inspect manifest of single image 69 session = podmanTest.Podman([]string{"manifest", "inspect", "quay.io/libpod/busybox@sha256:6655df04a3df853b029a5fac8836035ac4fab117800c9a6c4b69341bb5306c3d"}) 70 session.WaitWithDefaultTimeout() 71 Expect(session).Should(Exit(0)) 72 }) 73 74 It("add w/ inspect", func() { 75 session := podmanTest.Podman([]string{"manifest", "create", "foo"}) 76 session.WaitWithDefaultTimeout() 77 Expect(session).Should(Exit(0)) 78 id := strings.TrimSpace(string(session.Out.Contents())) 79 80 session = podmanTest.Podman([]string{"manifest", "inspect", id}) 81 session.WaitWithDefaultTimeout() 82 Expect(session).Should(Exit(0)) 83 84 session = podmanTest.Podman([]string{"manifest", "add", "--arch=arm64", "foo", imageListInstance}) 85 session.WaitWithDefaultTimeout() 86 Expect(session).Should(Exit(0)) 87 88 session = podmanTest.Podman([]string{"manifest", "inspect", "foo"}) 89 session.WaitWithDefaultTimeout() 90 Expect(session).Should(Exit(0)) 91 Expect(session.OutputToString()).To(ContainSubstring(imageListARM64InstanceDigest)) 92 }) 93 94 It("tag", func() { 95 session := podmanTest.Podman([]string{"manifest", "create", "foobar"}) 96 session.WaitWithDefaultTimeout() 97 Expect(session).Should(Exit(0)) 98 session = podmanTest.Podman([]string{"manifest", "add", "foobar", "quay.io/libpod/busybox"}) 99 session.WaitWithDefaultTimeout() 100 Expect(session).Should(Exit(0)) 101 session = podmanTest.Podman([]string{"tag", "foobar", "foobar2"}) 102 session.WaitWithDefaultTimeout() 103 Expect(session).Should(Exit(0)) 104 session = podmanTest.Podman([]string{"manifest", "inspect", "foobar"}) 105 session.WaitWithDefaultTimeout() 106 Expect(session).Should(Exit(0)) 107 session2 := podmanTest.Podman([]string{"manifest", "inspect", "foobar2"}) 108 session2.WaitWithDefaultTimeout() 109 Expect(session2).Should(Exit(0)) 110 Expect(session2.OutputToString()).To(Equal(session.OutputToString())) 111 }) 112 113 It(" add --all", func() { 114 session := podmanTest.Podman([]string{"manifest", "create", "foo"}) 115 session.WaitWithDefaultTimeout() 116 Expect(session).Should(Exit(0)) 117 session = podmanTest.Podman([]string{"manifest", "add", "--all", "foo", imageList}) 118 session.WaitWithDefaultTimeout() 119 Expect(session).Should(Exit(0)) 120 session = podmanTest.Podman([]string{"manifest", "inspect", "foo"}) 121 session.WaitWithDefaultTimeout() 122 Expect(session).Should(Exit(0)) 123 Expect(session.OutputToString()).To( 124 And( 125 ContainSubstring(imageListAMD64InstanceDigest), 126 ContainSubstring(imageListARMInstanceDigest), 127 ContainSubstring(imageListARM64InstanceDigest), 128 ContainSubstring(imageListPPC64LEInstanceDigest), 129 ContainSubstring(imageListS390XInstanceDigest), 130 )) 131 }) 132 133 It("add --os", func() { 134 session := podmanTest.Podman([]string{"manifest", "create", "foo"}) 135 session.WaitWithDefaultTimeout() 136 Expect(session).Should(Exit(0)) 137 session = podmanTest.Podman([]string{"manifest", "add", "--os", "bar", "foo", imageList}) 138 session.WaitWithDefaultTimeout() 139 Expect(session).Should(Exit(0)) 140 session = podmanTest.Podman([]string{"manifest", "inspect", "foo"}) 141 session.WaitWithDefaultTimeout() 142 Expect(session).Should(Exit(0)) 143 Expect(session.OutputToString()).To(ContainSubstring(`"os": "bar"`)) 144 }) 145 146 It("annotate", func() { 147 SkipIfRemote("Not supporting annotate on remote connections") 148 session := podmanTest.Podman([]string{"manifest", "create", "foo"}) 149 session.WaitWithDefaultTimeout() 150 Expect(session).Should(Exit(0)) 151 session = podmanTest.Podman([]string{"manifest", "add", "foo", imageListInstance}) 152 session.WaitWithDefaultTimeout() 153 Expect(session).Should(Exit(0)) 154 session = podmanTest.Podman([]string{"manifest", "annotate", "--arch", "bar", "foo", imageListARM64InstanceDigest}) 155 session.WaitWithDefaultTimeout() 156 Expect(session).Should(Exit(0)) 157 session = podmanTest.Podman([]string{"manifest", "inspect", "foo"}) 158 session.WaitWithDefaultTimeout() 159 Expect(session).Should(Exit(0)) 160 Expect(session.OutputToString()).To(ContainSubstring(`"architecture": "bar"`)) 161 }) 162 163 It("remove digest", func() { 164 session := podmanTest.Podman([]string{"manifest", "create", "foo"}) 165 session.WaitWithDefaultTimeout() 166 Expect(session).Should(Exit(0)) 167 session = podmanTest.Podman([]string{"manifest", "add", "--all", "foo", imageList}) 168 session.WaitWithDefaultTimeout() 169 Expect(session).Should(Exit(0)) 170 session = podmanTest.Podman([]string{"manifest", "inspect", "foo"}) 171 session.WaitWithDefaultTimeout() 172 Expect(session).Should(Exit(0)) 173 Expect(session.OutputToString()).To(ContainSubstring(imageListARM64InstanceDigest)) 174 session = podmanTest.Podman([]string{"manifest", "remove", "foo", imageListARM64InstanceDigest}) 175 session.WaitWithDefaultTimeout() 176 Expect(session).Should(Exit(0)) 177 session = podmanTest.Podman([]string{"manifest", "inspect", "foo"}) 178 session.WaitWithDefaultTimeout() 179 Expect(session).Should(Exit(0)) 180 Expect(session.OutputToString()).To( 181 And( 182 ContainSubstring(imageListAMD64InstanceDigest), 183 ContainSubstring(imageListARMInstanceDigest), 184 ContainSubstring(imageListPPC64LEInstanceDigest), 185 ContainSubstring(imageListS390XInstanceDigest), 186 Not( 187 ContainSubstring(imageListARM64InstanceDigest)), 188 )) 189 }) 190 191 It("remove not-found", func() { 192 session := podmanTest.Podman([]string{"manifest", "create", "foo"}) 193 session.WaitWithDefaultTimeout() 194 Expect(session).Should(Exit(0)) 195 session = podmanTest.Podman([]string{"manifest", "add", "foo", imageList}) 196 session.WaitWithDefaultTimeout() 197 Expect(session).Should(Exit(0)) 198 session = podmanTest.Podman([]string{"manifest", "remove", "foo", "sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"}) 199 session.WaitWithDefaultTimeout() 200 Expect(session).To(ExitWithError()) 201 202 session = podmanTest.Podman([]string{"manifest", "rm", "foo"}) 203 session.WaitWithDefaultTimeout() 204 Expect(session).Should(Exit(0)) 205 }) 206 207 It("push --all", func() { 208 SkipIfRemote("manifest push to dir not supported in remote mode") 209 session := podmanTest.Podman([]string{"manifest", "create", "foo"}) 210 session.WaitWithDefaultTimeout() 211 Expect(session).Should(Exit(0)) 212 session = podmanTest.Podman([]string{"manifest", "add", "--all", "foo", imageList}) 213 session.WaitWithDefaultTimeout() 214 Expect(session).Should(Exit(0)) 215 dest := filepath.Join(podmanTest.TempDir, "pushed") 216 err := os.MkdirAll(dest, os.ModePerm) 217 Expect(err).To(BeNil()) 218 defer func() { 219 os.RemoveAll(dest) 220 }() 221 session = podmanTest.Podman([]string{"manifest", "push", "--all", "foo", "dir:" + dest}) 222 session.WaitWithDefaultTimeout() 223 Expect(session).Should(Exit(0)) 224 225 files, err := filepath.Glob(dest + string(os.PathSeparator) + "*") 226 Expect(err).ShouldNot(HaveOccurred()) 227 check := SystemExec("sha256sum", files) 228 check.WaitWithDefaultTimeout() 229 Expect(check).Should(Exit(0)) 230 prefix := "sha256:" 231 Expect(check.OutputToString()).To( 232 And( 233 ContainSubstring(strings.TrimPrefix(imageListAMD64InstanceDigest, prefix)), 234 ContainSubstring(strings.TrimPrefix(imageListARMInstanceDigest, prefix)), 235 ContainSubstring(strings.TrimPrefix(imageListPPC64LEInstanceDigest, prefix)), 236 ContainSubstring(strings.TrimPrefix(imageListS390XInstanceDigest, prefix)), 237 ContainSubstring(strings.TrimPrefix(imageListARM64InstanceDigest, prefix)), 238 )) 239 }) 240 241 It("push", func() { 242 SkipIfRemote("manifest push to dir not supported in remote mode") 243 session := podmanTest.Podman([]string{"manifest", "create", "foo"}) 244 session.WaitWithDefaultTimeout() 245 Expect(session).Should(Exit(0)) 246 session = podmanTest.Podman([]string{"manifest", "add", "--all", "foo", imageList}) 247 session.WaitWithDefaultTimeout() 248 Expect(session).Should(Exit(0)) 249 dest := filepath.Join(podmanTest.TempDir, "pushed") 250 err := os.MkdirAll(dest, os.ModePerm) 251 Expect(err).To(BeNil()) 252 defer func() { 253 os.RemoveAll(dest) 254 }() 255 session = podmanTest.Podman([]string{"push", "foo", "dir:" + dest}) 256 session.WaitWithDefaultTimeout() 257 Expect(session).Should(Exit(0)) 258 files, err := filepath.Glob(dest + string(os.PathSeparator) + "*") 259 Expect(err).To(BeNil()) 260 check := SystemExec("sha256sum", files) 261 check.WaitWithDefaultTimeout() 262 Expect(check).Should(Exit(0)) 263 264 prefix := "sha256:" 265 Expect(check.OutputToString()).To( 266 And( 267 ContainSubstring(strings.TrimPrefix(imageListAMD64InstanceDigest, prefix)), 268 ContainSubstring(strings.TrimPrefix(imageListARMInstanceDigest, prefix)), 269 ContainSubstring(strings.TrimPrefix(imageListPPC64LEInstanceDigest, prefix)), 270 ContainSubstring(strings.TrimPrefix(imageListS390XInstanceDigest, prefix)), 271 ContainSubstring(strings.TrimPrefix(imageListARM64InstanceDigest, prefix)), 272 )) 273 }) 274 275 It("authenticated push", func() { 276 registryOptions := &podmanRegistry.Options{ 277 Image: "docker-archive:" + imageTarPath(registry), 278 } 279 registry, err := podmanRegistry.StartWithOptions(registryOptions) 280 Expect(err).To(BeNil()) 281 282 session := podmanTest.Podman([]string{"manifest", "create", "foo"}) 283 session.WaitWithDefaultTimeout() 284 Expect(session).Should(Exit(0)) 285 286 session = podmanTest.Podman([]string{"pull", ALPINE}) 287 session.WaitWithDefaultTimeout() 288 Expect(session).Should(Exit(0)) 289 290 session = podmanTest.Podman([]string{"tag", ALPINE, "localhost:" + registry.Port + "/alpine:latest"}) 291 session.WaitWithDefaultTimeout() 292 Expect(session).Should(Exit(0)) 293 294 push := podmanTest.Podman([]string{"push", "--tls-verify=false", "--creds=" + registry.User + ":" + registry.Password, "--format=v2s2", "localhost:" + registry.Port + "/alpine:latest"}) 295 push.WaitWithDefaultTimeout() 296 Expect(push).Should(Exit(0)) 297 298 session = podmanTest.Podman([]string{"manifest", "add", "--tls-verify=false", "--creds=" + registry.User + ":" + registry.Password, "foo", "localhost:" + registry.Port + "/alpine:latest"}) 299 session.WaitWithDefaultTimeout() 300 Expect(session).Should(Exit(0)) 301 302 push = podmanTest.Podman([]string{"manifest", "push", "--tls-verify=false", "--creds=" + registry.User + ":" + registry.Password, "foo", "localhost:" + registry.Port + "/credstest"}) 303 push.WaitWithDefaultTimeout() 304 Expect(push).Should(Exit(0)) 305 306 push = podmanTest.Podman([]string{"manifest", "push", "--tls-verify=false", "--creds=podmantest:wrongpasswd", "foo", "localhost:" + registry.Port + "/credstest"}) 307 push.WaitWithDefaultTimeout() 308 Expect(push).To(ExitWithError()) 309 310 err = registry.Stop() 311 Expect(err).To(BeNil()) 312 }) 313 314 It("push with error", func() { 315 session := podmanTest.Podman([]string{"manifest", "push", "badsrcvalue", "baddestvalue"}) 316 session.WaitWithDefaultTimeout() 317 Expect(session).Should(ExitWithError()) 318 Expect(session.ErrorToString()).NotTo(BeEmpty()) 319 }) 320 321 It("push --rm", func() { 322 SkipIfRemote("remote does not support --rm") 323 session := podmanTest.Podman([]string{"manifest", "create", "foo"}) 324 session.WaitWithDefaultTimeout() 325 Expect(session).Should(Exit(0)) 326 session = podmanTest.Podman([]string{"manifest", "add", "foo", imageList}) 327 session.WaitWithDefaultTimeout() 328 Expect(session).Should(Exit(0)) 329 dest := filepath.Join(podmanTest.TempDir, "pushed") 330 err := os.MkdirAll(dest, os.ModePerm) 331 Expect(err).To(BeNil()) 332 defer func() { 333 os.RemoveAll(dest) 334 }() 335 session = podmanTest.Podman([]string{"manifest", "push", "--purge", "foo", "dir:" + dest}) 336 session.WaitWithDefaultTimeout() 337 Expect(session).Should(Exit(0)) 338 session = podmanTest.Podman([]string{"manifest", "inspect", "foo"}) 339 session.WaitWithDefaultTimeout() 340 Expect(session).To(ExitWithError()) 341 342 session = podmanTest.Podman([]string{"manifest", "rm", "foo1", "foo2"}) 343 session.WaitWithDefaultTimeout() 344 Expect(session).To(ExitWithError()) 345 }) 346 347 It("exists", func() { 348 manifestList := "manifest-list" 349 session := podmanTest.Podman([]string{"manifest", "create", manifestList}) 350 session.WaitWithDefaultTimeout() 351 Expect(session).Should(Exit(0)) 352 353 session = podmanTest.Podman([]string{"manifest", "exists", manifestList}) 354 session.WaitWithDefaultTimeout() 355 Expect(session).Should(Exit(0)) 356 357 session = podmanTest.Podman([]string{"manifest", "exists", "no-manifest"}) 358 session.WaitWithDefaultTimeout() 359 Expect(session).Should(Exit(1)) 360 }) 361 362 It("rm should not remove referenced images", func() { 363 manifestList := "manifestlist" 364 imageName := "quay.io/libpod/busybox" 365 366 session := podmanTest.Podman([]string{"pull", imageName}) 367 session.WaitWithDefaultTimeout() 368 Expect(session).Should(Exit(0)) 369 370 session = podmanTest.Podman([]string{"manifest", "create", manifestList}) 371 session.WaitWithDefaultTimeout() 372 Expect(session).Should(Exit(0)) 373 374 session = podmanTest.Podman([]string{"manifest", "add", manifestList, imageName}) 375 session.WaitWithDefaultTimeout() 376 Expect(session).Should(Exit(0)) 377 378 session = podmanTest.Podman([]string{"manifest", "rm", manifestList}) 379 session.WaitWithDefaultTimeout() 380 Expect(session).Should(Exit(0)) 381 382 // image should still show up 383 session = podmanTest.Podman([]string{"image", "exists", imageName}) 384 session.WaitWithDefaultTimeout() 385 Expect(session).Should(Exit(0)) 386 }) 387 })