github.com/Racer159/jackal@v0.32.7-0.20240401174413-0bd2339e4f2e/src/test/e2e/50_oci_publish_deploy_test.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // SPDX-FileCopyrightText: 2021-Present The Jackal Authors 3 4 // Package test provides e2e tests for Jackal. 5 package test 6 7 import ( 8 "context" 9 "fmt" 10 "path/filepath" 11 "strings" 12 "testing" 13 "time" 14 15 "github.com/Racer159/jackal/src/pkg/zoci" 16 "github.com/defenseunicorns/pkg/oci" 17 "github.com/stretchr/testify/require" 18 "github.com/stretchr/testify/suite" 19 "oras.land/oras-go/v2/registry" 20 "oras.land/oras-go/v2/registry/remote" 21 ) 22 23 type PublishDeploySuiteTestSuite struct { 24 suite.Suite 25 *require.Assertions 26 Reference registry.Reference 27 PackagesDir string 28 } 29 30 var badDeployRef = registry.Reference{ 31 Registry: "localhost:5000", 32 Repository: "jackal-test", 33 Reference: "bad-tag", 34 } 35 36 func (suite *PublishDeploySuiteTestSuite) SetupSuite() { 37 suite.Assertions = require.New(suite.T()) 38 suite.PackagesDir = "build" 39 40 e2e.SetupDockerRegistry(suite.T(), 555) 41 suite.Reference.Registry = "localhost:555" 42 } 43 44 func (suite *PublishDeploySuiteTestSuite) TearDownSuite() { 45 local := fmt.Sprintf("jackal-package-helm-charts-%s-0.0.1.tar.zst", e2e.Arch) 46 e2e.CleanFiles(local) 47 48 e2e.TeardownRegistry(suite.T(), 555) 49 } 50 51 func (suite *PublishDeploySuiteTestSuite) Test_0_Publish() { 52 suite.T().Log("E2E: Package Publish oci://") 53 54 // Publish package. 55 example := filepath.Join(suite.PackagesDir, fmt.Sprintf("jackal-package-helm-charts-%s-0.0.1.tar.zst", e2e.Arch)) 56 ref := suite.Reference.String() 57 stdOut, stdErr, err := e2e.Jackal("package", "publish", example, "oci://"+ref, "--insecure") 58 suite.NoError(err, stdOut, stdErr) 59 suite.Contains(stdErr, "Published "+ref) 60 61 // Pull the package via OCI. 62 stdOut, stdErr, err = e2e.Jackal("package", "pull", "oci://"+ref+"/helm-charts:0.0.1", "--insecure") 63 suite.NoError(err, stdOut, stdErr) 64 65 // Publish w/ package missing `metadata.version` field. 66 example = filepath.Join(suite.PackagesDir, fmt.Sprintf("jackal-package-component-actions-%s.tar.zst", e2e.Arch)) 67 _, stdErr, err = e2e.Jackal("package", "publish", example, "oci://"+ref, "--insecure") 68 suite.Error(err, stdErr) 69 70 // Inline publish package. 71 dir := filepath.Join("examples", "helm-charts") 72 stdOut, stdErr, err = e2e.Jackal("package", "create", dir, "-o", "oci://"+ref, "--insecure", "--oci-concurrency=5", "--confirm") 73 suite.NoError(err, stdOut, stdErr) 74 75 // Inline publish flavor. 76 dir = filepath.Join("examples", "package-flavors") 77 stdOut, stdErr, err = e2e.Jackal("package", "create", dir, "-o", "oci://"+ref, "--flavor", "oracle-cookie-crunch", "--insecure", "--confirm") 78 suite.NoError(err, stdOut, stdErr) 79 80 // Inspect published flavor. 81 stdOut, stdErr, err = e2e.Jackal("package", "inspect", "oci://"+ref+"/package-flavors:1.0.0-oracle-cookie-crunch", "--insecure") 82 suite.NoError(err, stdOut, stdErr) 83 84 // Inspect the published package. 85 stdOut, stdErr, err = e2e.Jackal("package", "inspect", "oci://"+ref+"/helm-charts:0.0.1", "--insecure") 86 suite.NoError(err, stdOut, stdErr) 87 } 88 89 func (suite *PublishDeploySuiteTestSuite) Test_1_Deploy() { 90 suite.T().Log("E2E: Package Deploy oci://") 91 92 // Build the fully qualified reference. 93 suite.Reference.Repository = "helm-charts" 94 suite.Reference.Reference = "0.0.1" 95 ref := suite.Reference.String() 96 97 // Deploy the package via OCI. 98 stdOut, stdErr, err := e2e.Jackal("package", "deploy", "oci://"+ref, "--insecure", "--confirm") 99 suite.NoError(err, stdOut, stdErr) 100 101 // Remove the package via OCI. 102 stdOut, stdErr, err = e2e.Jackal("package", "remove", "oci://"+ref, "--insecure", "--confirm") 103 suite.NoError(err, stdOut, stdErr) 104 105 // Test deploy w/ bad ref. 106 _, stdErr, err = e2e.Jackal("package", "deploy", "oci://"+badDeployRef.String(), "--insecure", "--confirm") 107 suite.Error(err, stdErr) 108 } 109 110 func (suite *PublishDeploySuiteTestSuite) Test_2_Pull_And_Deploy() { 111 suite.T().Log("E2E: Package Pull oci:// && Package Deploy tarball") 112 113 local := fmt.Sprintf("jackal-package-helm-charts-%s-0.0.1.tar.zst", e2e.Arch) 114 defer e2e.CleanFiles(local) 115 // Verify the package was pulled. 116 suite.FileExists(local) 117 118 // Deploy the local package. 119 stdOut, stdErr, err := e2e.Jackal("package", "deploy", local, "--confirm") 120 suite.NoError(err, stdOut, stdErr) 121 } 122 123 func (suite *PublishDeploySuiteTestSuite) Test_3_Copy() { 124 t := suite.T() 125 ref := suite.Reference.String() 126 dstRegistryPort := 556 127 dstRef := strings.Replace(ref, fmt.Sprint(555), fmt.Sprint(dstRegistryPort), 1) 128 129 e2e.SetupDockerRegistry(t, dstRegistryPort) 130 defer e2e.TeardownRegistry(t, dstRegistryPort) 131 132 src, err := zoci.NewRemote(ref, oci.PlatformForArch(e2e.Arch), oci.WithPlainHTTP(true)) 133 suite.NoError(err) 134 135 dst, err := zoci.NewRemote(dstRef, oci.PlatformForArch(e2e.Arch), oci.WithPlainHTTP(true)) 136 suite.NoError(err) 137 138 reg, err := remote.NewRegistry(strings.Split(dstRef, "/")[0]) 139 suite.NoError(err) 140 reg.PlainHTTP = true 141 attempt := 0 142 ctx := context.TODO() 143 for attempt <= 5 { 144 err = reg.Ping(ctx) 145 if err == nil { 146 break 147 } 148 attempt++ 149 time.Sleep(2 * time.Second) 150 } 151 require.Less(t, attempt, 5, "failed to ping registry") 152 153 err = zoci.CopyPackage(ctx, src, dst, 5) 154 suite.NoError(err) 155 156 srcRoot, err := src.FetchRoot(ctx) 157 suite.NoError(err) 158 159 for _, layer := range srcRoot.Layers { 160 ok, err := dst.Repo().Exists(ctx, layer) 161 suite.True(ok) 162 suite.NoError(err) 163 } 164 } 165 166 func TestPublishDeploySuite(t *testing.T) { 167 e2e.SetupWithCluster(t) 168 169 suite.Run(t, new(PublishDeploySuiteTestSuite)) 170 }