|
|
@ -17,13 +17,9 @@ package main
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"bytes"
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
"io/ioutil"
|
|
|
|
|
|
|
|
"os"
|
|
|
|
"os"
|
|
|
|
"path/filepath"
|
|
|
|
"path/filepath"
|
|
|
|
"regexp"
|
|
|
|
"regexp"
|
|
|
|
"runtime"
|
|
|
|
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"testing"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
|
|
|
|
"github.com/spf13/cobra"
|
|
|
|
"github.com/spf13/cobra"
|
|
|
@ -31,15 +27,9 @@ import (
|
|
|
|
"helm.sh/helm/v3/internal/test/ensure"
|
|
|
|
"helm.sh/helm/v3/internal/test/ensure"
|
|
|
|
"helm.sh/helm/v3/pkg/chart"
|
|
|
|
"helm.sh/helm/v3/pkg/chart"
|
|
|
|
"helm.sh/helm/v3/pkg/chart/loader"
|
|
|
|
"helm.sh/helm/v3/pkg/chart/loader"
|
|
|
|
"helm.sh/helm/v3/pkg/chartutil"
|
|
|
|
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
func TestPackage(t *testing.T) {
|
|
|
|
func TestPackage(t *testing.T) {
|
|
|
|
statFileMsg := "no such file or directory"
|
|
|
|
|
|
|
|
if runtime.GOOS == "windows" {
|
|
|
|
|
|
|
|
statFileMsg = "The system cannot find the file specified."
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tests := []struct {
|
|
|
|
tests := []struct {
|
|
|
|
name string
|
|
|
|
name string
|
|
|
|
flags map[string]string
|
|
|
|
flags map[string]string
|
|
|
@ -108,13 +98,6 @@ func TestPackage(t *testing.T) {
|
|
|
|
hasfile: "chart-missing-deps-0.1.0.tgz",
|
|
|
|
hasfile: "chart-missing-deps-0.1.0.tgz",
|
|
|
|
err: true,
|
|
|
|
err: true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
|
|
|
|
name: "package --values does-not-exist",
|
|
|
|
|
|
|
|
args: []string{"testdata/testcharts/alpine"},
|
|
|
|
|
|
|
|
flags: map[string]string{"values": "does-not-exist"},
|
|
|
|
|
|
|
|
expect: fmt.Sprintf("does-not-exist: %s", statFileMsg),
|
|
|
|
|
|
|
|
err: true,
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
name: "package testdata/testcharts/chart-bad-type",
|
|
|
|
name: "package testdata/testcharts/chart-bad-type",
|
|
|
|
args: []string{"testdata/testcharts/chart-bad-type"},
|
|
|
|
args: []string{"testdata/testcharts/chart-bad-type"},
|
|
|
@ -213,159 +196,6 @@ func TestSetAppVersion(t *testing.T) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func TestPackageValues(t *testing.T) {
|
|
|
|
|
|
|
|
defer resetEnv()()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
repoFile := "testdata/helmhome/helm/repositories.yaml"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
testCases := []struct {
|
|
|
|
|
|
|
|
desc string
|
|
|
|
|
|
|
|
args []string
|
|
|
|
|
|
|
|
valuefilesContents []string
|
|
|
|
|
|
|
|
flags map[string]string
|
|
|
|
|
|
|
|
expected []string
|
|
|
|
|
|
|
|
}{
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
desc: "helm package, single values file",
|
|
|
|
|
|
|
|
args: []string{"testdata/testcharts/alpine"},
|
|
|
|
|
|
|
|
flags: map[string]string{"repository-config": repoFile},
|
|
|
|
|
|
|
|
valuefilesContents: []string{"Name: chart-name-foo"},
|
|
|
|
|
|
|
|
expected: []string{"Name: chart-name-foo"},
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
desc: "helm package, multiple values files",
|
|
|
|
|
|
|
|
args: []string{"testdata/testcharts/alpine"},
|
|
|
|
|
|
|
|
flags: map[string]string{"repository-config": repoFile},
|
|
|
|
|
|
|
|
valuefilesContents: []string{"Name: chart-name-foo", "foo: bar"},
|
|
|
|
|
|
|
|
expected: []string{"Name: chart-name-foo", "foo: bar"},
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
desc: "helm package, with set option",
|
|
|
|
|
|
|
|
args: []string{"testdata/testcharts/alpine"},
|
|
|
|
|
|
|
|
flags: map[string]string{"set": "Name=chart-name-foo", "repository-config": repoFile},
|
|
|
|
|
|
|
|
expected: []string{"Name: chart-name-foo"},
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
desc: "helm package, set takes precedence over value file",
|
|
|
|
|
|
|
|
args: []string{"testdata/testcharts/alpine"},
|
|
|
|
|
|
|
|
valuefilesContents: []string{"Name: chart-name-foo"},
|
|
|
|
|
|
|
|
flags: map[string]string{"set": "Name=chart-name-bar", "repository-config": repoFile},
|
|
|
|
|
|
|
|
expected: []string{"Name: chart-name-bar"},
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for _, tc := range testCases {
|
|
|
|
|
|
|
|
var files []string
|
|
|
|
|
|
|
|
for _, contents := range tc.valuefilesContents {
|
|
|
|
|
|
|
|
f := createValuesFile(t, contents)
|
|
|
|
|
|
|
|
files = append(files, f)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
valueFiles := strings.Join(files, ",")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
expected, err := chartutil.ReadValues([]byte(strings.Join(tc.expected, "\n")))
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
t.Errorf("unexpected error parsing values: %q", err)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
outputDir := ensure.TempDir(t)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if len(tc.flags) == 0 {
|
|
|
|
|
|
|
|
tc.flags = make(map[string]string)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
tc.flags["destination"] = outputDir
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if len(valueFiles) > 0 {
|
|
|
|
|
|
|
|
tc.flags["values"] = valueFiles
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cmd := newPackageCmd(&bytes.Buffer{})
|
|
|
|
|
|
|
|
setFlags(cmd, tc.flags)
|
|
|
|
|
|
|
|
if err := cmd.RunE(cmd, tc.args); err != nil {
|
|
|
|
|
|
|
|
t.Fatalf("unexpected error: %q", err)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
outputFile := filepath.Join(outputDir, "alpine-0.1.0.tgz")
|
|
|
|
|
|
|
|
verifyOutputChartExists(t, outputFile)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
actual, err := getChartValues(outputFile)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
t.Fatalf("unexpected error extracting chart values: %q", err)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
verifyValues(t, actual, expected)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func TestNonExistentDirAndBadPermission(t *testing.T) {
|
|
|
|
|
|
|
|
nonExistentDir := "testdata/testcharts/non-existent-directory"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tests := []struct {
|
|
|
|
|
|
|
|
name string
|
|
|
|
|
|
|
|
flags map[string]string
|
|
|
|
|
|
|
|
args []string
|
|
|
|
|
|
|
|
expect string
|
|
|
|
|
|
|
|
hasfile string
|
|
|
|
|
|
|
|
err bool
|
|
|
|
|
|
|
|
}{
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
name: "package testdata/testcharts/non-existent-directory",
|
|
|
|
|
|
|
|
args: []string{"testdata/testcharts/non-existent-directory"},
|
|
|
|
|
|
|
|
expect: fmt.Sprintf("stat %s: no such file or directory", nonExistentDir),
|
|
|
|
|
|
|
|
err: true,
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for _, tt := range tests {
|
|
|
|
|
|
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
|
|
|
|
|
|
var buf bytes.Buffer
|
|
|
|
|
|
|
|
c := newPackageCmd(&buf)
|
|
|
|
|
|
|
|
re := regexp.MustCompile(tt.expect)
|
|
|
|
|
|
|
|
err := c.RunE(c, tt.args)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
if tt.err && re.MatchString(err.Error()) {
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
t.Fatalf("%q: expected error %q, got %q", tt.name, tt.expect, err)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func createValuesFile(t *testing.T, data string) string {
|
|
|
|
|
|
|
|
outputDir := ensure.TempDir(t)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
outputFile := filepath.Join(outputDir, "values.yaml")
|
|
|
|
|
|
|
|
if err := ioutil.WriteFile(outputFile, []byte(data), 0644); err != nil {
|
|
|
|
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return outputFile
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func getChartValues(chartPath string) (chartutil.Values, error) {
|
|
|
|
|
|
|
|
chart, err := loader.Load(chartPath)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return chart.Values, nil
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func verifyValues(t *testing.T, actual, expected chartutil.Values) {
|
|
|
|
|
|
|
|
t.Helper()
|
|
|
|
|
|
|
|
for key, value := range expected.AsMap() {
|
|
|
|
|
|
|
|
if got := actual[key]; got != value {
|
|
|
|
|
|
|
|
t.Errorf("Expected %q, got %q (%v)", value, got, actual)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func verifyOutputChartExists(t *testing.T, chartPath string) {
|
|
|
|
|
|
|
|
if chartFile, err := os.Stat(chartPath); err != nil {
|
|
|
|
|
|
|
|
t.Errorf("expected file %q, got err %q", chartPath, err)
|
|
|
|
|
|
|
|
} else if chartFile.Size() == 0 {
|
|
|
|
|
|
|
|
t.Errorf("file %q has zero bytes.", chartPath)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func setFlags(cmd *cobra.Command, flags map[string]string) {
|
|
|
|
func setFlags(cmd *cobra.Command, flags map[string]string) {
|
|
|
|
dest := cmd.Flags()
|
|
|
|
dest := cmd.Flags()
|
|
|
|
for f, v := range flags {
|
|
|
|
for f, v := range flags {
|
|
|
|