1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
|
// Copyright (c) Contributors to the Apptainer project, established as
// Apptainer a Series of LF Projects LLC.
// For website terms of use, trademark policy, privacy policy and other
// project policies see https://lfprojects.org/policies
// Copyright (c) 2019-2022, Sylabs Inc. All rights reserved.
// This software is licensed under a 3-clause BSD license. Please consult the
// LICENSE.md file distributed with the sources of this project regarding your
// rights to use or distribute this software.
// Package push tests only test the oras transport (and a invalid transport) against a local registry
package push
import (
"fmt"
"os"
"path/filepath"
"strings"
"testing"
"github.com/apptainer/apptainer/e2e/internal/e2e"
"github.com/apptainer/apptainer/e2e/internal/testhelper"
"github.com/pkg/errors"
)
type ctx struct {
env e2e.TestEnv
}
func (c ctx) testInvalidTransport(t *testing.T) {
e2e.EnsureImage(t, c.env)
tests := []struct {
name string
uri string
expectOp e2e.ApptainerCmdResultOp
expectExit int
}{
{
name: "push invalid transport",
uri: "nothing://bar/foo/foobar:latest",
expectOp: e2e.ExpectError(e2e.ContainMatch, "Unsupported transport type: nothing"),
expectExit: 255,
},
}
for _, tt := range tests {
args := []string{c.env.ImagePath, tt.uri}
c.env.RunApptainer(
t,
e2e.AsSubtest(tt.name),
e2e.WithProfile(e2e.UserProfile),
e2e.WithCommand("push"),
e2e.WithArgs(args...),
e2e.ExpectExit(tt.expectExit, tt.expectOp),
)
}
}
func (c ctx) testPushCmd(t *testing.T) {
e2e.EnsureImage(t, c.env)
// setup file and dir to use as invalid sources
orasInvalidDir, err := os.MkdirTemp(c.env.TestDir, "oras_push_dir-")
if err != nil {
err = errors.Wrap(err, "creating oras temporary directory")
t.Fatalf("unable to create src dir for push tests: %+v", err)
}
orasInvalidFile, err := e2e.WriteTempFile(orasInvalidDir, "oras_invalid_image-", "Invalid Image Contents")
if err != nil {
err = errors.Wrap(err, "creating oras temporary file")
t.Fatalf("unable to create src file for push tests: %+v", err)
}
tests := []struct {
desc string // case description
dstURI string // destination URI for image
imagePath string // src image path
expectedExitCode int // expected exit code for the test
noHTTPS bool // --no-https/--nohttps flag
}{
{
desc: "non existent image",
imagePath: filepath.Join(orasInvalidDir, "not_an_existing_file.sif"),
dstURI: fmt.Sprintf("oras://%s/non_existent:test", c.env.TestRegistry),
expectedExitCode: 255,
},
{
desc: "non SIF file",
imagePath: orasInvalidFile,
dstURI: fmt.Sprintf("oras://%s/non_sif:test", c.env.TestRegistry),
expectedExitCode: 255,
},
{
desc: "directory",
imagePath: orasInvalidDir,
dstURI: fmt.Sprintf("oras://%s/directory:test", c.env.TestRegistry),
expectedExitCode: 255,
},
// this will succeed, because go-containerregistry will automatically switch to insecure mode if it's locallhost
{
desc: "standard SIF push",
imagePath: c.env.ImagePath,
dstURI: fmt.Sprintf("oras://%s/standard_sif:test", c.env.InsecureRegistry),
expectedExitCode: 0,
},
{
desc: "standard SIF push with --no-https/--nohttps",
imagePath: c.env.ImagePath,
dstURI: fmt.Sprintf("oras://%s/standard_sif:test_nohttps", c.env.InsecureRegistry),
noHTTPS: true,
expectedExitCode: 0,
},
}
for _, tt := range tests {
tmpdir, err := os.MkdirTemp(c.env.TestDir, "pull_test.")
if err != nil {
t.Fatalf("Failed to create temporary directory for pull test: %+v", err)
}
defer os.RemoveAll(tmpdir)
// We create the list of arguments using a string instead of a slice of
// strings because using slices of strings most of the type ends up adding
// an empty elements to the list when passing it to the command, which
// will create a failure.
args := tt.dstURI
if tt.imagePath != "" {
args = tt.imagePath + " " + args
}
if tt.noHTTPS {
args = "--no-https" + " " + args
}
c.env.RunApptainer(
t,
e2e.AsSubtest(tt.desc),
e2e.WithProfile(e2e.UserProfile),
e2e.WithCommand("push"),
e2e.WithArgs(strings.Split(args, " ")...),
e2e.ExpectExit(tt.expectedExitCode),
)
}
}
// E2ETests is the main func to trigger the test suite
func E2ETests(env e2e.TestEnv) testhelper.Tests {
c := ctx{
env: env,
}
return testhelper.Tests{
"invalid transport": c.testInvalidTransport,
"oras": c.testPushCmd,
}
}
|