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  }