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  })