ref(tests): simplify cmd test setup/teardown

Ensure proper cleanup of `HELM_HOME` and `HELM_DEBUG`
This commit is contained in:
Adam Reese 2018-05-14 09:23:21 -07:00
parent 34da765eff
commit a02a598c33
No known key found for this signature in database
GPG Key ID: 06F35E60A7A18DD6
42 changed files with 432 additions and 830 deletions

View File

@ -74,7 +74,7 @@ test: test-unit
test-unit:
@echo
@echo "==> Running unit tests <=="
HELM_HOME=/no/such/dir $(GO) test $(GOFLAGS) -run $(TESTS) $(PKG) $(TESTFLAGS)
HELM_HOME=/no_such_dir $(GO) test $(GOFLAGS) -run $(TESTS) $(PKG) $(TESTFLAGS)
.PHONY: test-style
test-style:

View File

@ -26,7 +26,6 @@ import (
"k8s.io/helm/pkg/chartutil"
"k8s.io/helm/pkg/hapi/chart"
"k8s.io/helm/pkg/helm/helmpath"
)
const createDesc = `
@ -51,11 +50,7 @@ will be overwritten, but other files will be left alone.
type createOptions struct {
starter string // --starter
// args
name string
home helmpath.Home
name string
}
func newCreateCmd(out io.Writer) *cobra.Command {
@ -66,7 +61,6 @@ func newCreateCmd(out io.Writer) *cobra.Command {
Short: "create a new chart with the given name",
Long: createDesc,
RunE: func(cmd *cobra.Command, args []string) error {
o.home = settings.Home
if len(args) == 0 {
return errors.New("the name of the new chart is required")
}
@ -93,7 +87,7 @@ func (o *createOptions) run(out io.Writer) error {
if o.starter != "" {
// Create from the starter
lstarter := filepath.Join(o.home.Starters(), o.starter)
lstarter := filepath.Join(settings.Home.Starters(), o.starter)
return chartutil.CreateFrom(cfile, filepath.Dir(o.name), lstarter)
}

View File

@ -28,23 +28,10 @@ import (
)
func TestCreateCmd(t *testing.T) {
cname := "testchart"
// Make a temp dir
tdir, err := ioutil.TempDir("", "helm-create-")
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(tdir)
tdir := testTempDir(t)
defer testChdir(t, tdir)()
// CD into it
pwd, err := os.Getwd()
if err != nil {
t.Fatal(err)
}
if err := os.Chdir(tdir); err != nil {
t.Fatal(err)
}
defer os.Chdir(pwd)
cname := "testchart"
// Run a create
if _, err := executeCommand(nil, "create "+cname); err != nil {
@ -73,28 +60,17 @@ func TestCreateCmd(t *testing.T) {
}
func TestCreateStarterCmd(t *testing.T) {
defer resetEnv()()
cname := "testchart"
// Make a temp dir
tdir, err := ioutil.TempDir("", "helm-create-")
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(tdir)
tdir := testTempDir(t)
thome, err := tempHelmHome(t)
if err != nil {
t.Fatal(err)
}
cleanup := resetEnv()
defer func() {
os.RemoveAll(thome.String())
cleanup()
}()
settings.Home = thome
hh := testHelmHome(t)
settings.Home = hh
// Create a starter.
starterchart := filepath.Join(thome.String(), "starters")
starterchart := hh.Starters()
os.Mkdir(starterchart, 0755)
if dest, err := chartutil.Create(&chart.Metadata{Name: "starterchart"}, starterchart); err != nil {
t.Fatalf("Could not create chart: %s", err)
@ -106,18 +82,10 @@ func TestCreateStarterCmd(t *testing.T) {
t.Fatalf("Could not write template: %s", err)
}
// CD into it
pwd, err := os.Getwd()
if err != nil {
t.Fatal(err)
}
if err := os.Chdir(tdir); err != nil {
t.Fatal(err)
}
defer os.Chdir(pwd)
defer testChdir(t, tdir)()
// Run a create
if _, err := executeCommand(nil, fmt.Sprintf("--home=%s create --starter=starterchart %s", thome, cname)); err != nil {
if _, err := executeCommand(nil, fmt.Sprintf("--home=%s create --starter=starterchart %s", hh, cname)); err != nil {
t.Errorf("Failed to run create: %s", err)
return
}
@ -149,9 +117,8 @@ func TestCreateStarterCmd(t *testing.T) {
for _, tpl := range c.Templates {
if tpl.Name == "templates/foo.tpl" {
found = true
data := tpl.Data
if string(data) != "test" {
t.Errorf("Expected template 'test', got %q", string(data))
if data := string(tpl.Data); data != "test" {
t.Errorf("Expected template 'test', got %q", data)
}
}
}

View File

@ -27,7 +27,7 @@ func TestDelete(t *testing.T) {
rels := []*release.Release{helm.ReleaseMock(&helm.MockReleaseOptions{Name: "aeneas"})}
tests := []releaseCase{
tests := []cmdTestCase{
{
name: "basic delete",
cmd: "delete aeneas",
@ -59,5 +59,5 @@ func TestDelete(t *testing.T) {
wantError: true,
},
}
testReleaseCmd(t, tests)
runTestCmd(t, tests)
}

View File

@ -22,7 +22,6 @@ import (
"k8s.io/helm/pkg/downloader"
"k8s.io/helm/pkg/getter"
"k8s.io/helm/pkg/helm/helmpath"
)
const dependencyBuildDesc = `
@ -40,10 +39,7 @@ type dependencyBuildOptions struct {
keyring string // --keyring
verify bool // --verify
// args
chartpath string
helmhome helmpath.Home
}
func newDependencyBuildCmd(out io.Writer) *cobra.Command {
@ -56,7 +52,6 @@ func newDependencyBuildCmd(out io.Writer) *cobra.Command {
Short: "rebuild the charts/ directory based on the requirements.lock file",
Long: dependencyBuildDesc,
RunE: func(cmd *cobra.Command, args []string) error {
o.helmhome = settings.Home
if len(args) > 0 {
o.chartpath = args[0]
}
@ -75,7 +70,7 @@ func (o *dependencyBuildOptions) run(out io.Writer) error {
man := &downloader.Manager{
Out: out,
ChartPath: o.chartpath,
HelmHome: o.helmhome,
HelmHome: settings.Home,
Keyring: o.keyring,
Getters: getter.All(settings),
}

View File

@ -27,22 +27,14 @@ import (
)
func TestDependencyBuildCmd(t *testing.T) {
hh, err := tempHelmHome(t)
if err != nil {
t.Fatal(err)
}
cleanup := resetEnv()
defer func() {
os.RemoveAll(hh.String())
cleanup()
}()
defer resetEnv()()
hh := testHelmHome(t)
settings.Home = hh
srv := repotest.NewServer(hh.String())
defer srv.Stop()
_, err = srv.CopyCharts("testdata/testcharts/*.tgz")
if err != nil {
if _, err := srv.CopyCharts("testdata/testcharts/*.tgz"); err != nil {
t.Fatal(err)
}

View File

@ -20,7 +20,7 @@ import (
)
func TestDependencyListCmd(t *testing.T) {
tests := []releaseCase{{
tests := []cmdTestCase{{
name: "No such chart",
cmd: "dependency list /no/such/chart",
golden: "output/dependency-list-no-chart.txt",
@ -38,5 +38,5 @@ func TestDependencyListCmd(t *testing.T) {
cmd: "dependency list testdata/testcharts/reqtest-0.1.0.tgz",
golden: "output/dependency-list-archive.txt",
}}
testReleaseCmd(t, tests)
runTestCmd(t, tests)
}

View File

@ -35,16 +35,9 @@ import (
)
func TestDependencyUpdateCmd(t *testing.T) {
hh, err := tempHelmHome(t)
if err != nil {
t.Fatal(err)
}
cleanup := resetEnv()
defer func() {
os.RemoveAll(hh.String())
cleanup()
}()
defer resetEnv()()
hh := testHelmHome(t)
settings.Home = hh
srv := repotest.NewServer(hh.String())
@ -125,16 +118,9 @@ func TestDependencyUpdateCmd(t *testing.T) {
}
func TestDependencyUpdateCmd_SkipRefresh(t *testing.T) {
hh, err := tempHelmHome(t)
if err != nil {
t.Fatal(err)
}
cleanup := resetEnv()
defer func() {
os.RemoveAll(hh.String())
cleanup()
}()
defer resetEnv()()
hh := testHelmHome(t)
settings.Home = hh
srv := repotest.NewServer(hh.String())
@ -163,16 +149,9 @@ func TestDependencyUpdateCmd_SkipRefresh(t *testing.T) {
}
func TestDependencyUpdateCmd_DontDeleteOldChartsOnError(t *testing.T) {
hh, err := tempHelmHome(t)
if err != nil {
t.Fatal(err)
}
cleanup := resetEnv()
defer func() {
os.RemoveAll(hh.String())
cleanup()
}()
defer resetEnv()()
hh := testHelmHome(t)
settings.Home = hh
srv := repotest.NewServer(hh.String())

View File

@ -28,20 +28,14 @@ import (
)
func TestFetchCmd(t *testing.T) {
hh, err := tempHelmHome(t)
if err != nil {
t.Fatal(err)
}
cleanup := resetEnv()
defer func() {
os.RemoveAll(hh.String())
cleanup()
}()
defer resetEnv()()
hh := testHelmHome(t)
settings.Home = hh
srv := repotest.NewServer(hh.String())
defer srv.Stop()
settings.Home = hh
// all flags will get "--home=TMDIR -d outdir" appended.
tests := []struct {
name string
@ -131,7 +125,7 @@ func TestFetchCmd(t *testing.T) {
}
for _, tt := range tests {
outdir := filepath.Join(hh.String(), "testout")
outdir := hh.Path("testout")
os.RemoveAll(outdir)
os.Mkdir(outdir, 0755)

View File

@ -24,7 +24,7 @@ import (
)
func TestGetHooks(t *testing.T) {
tests := []releaseCase{{
tests := []cmdTestCase{{
name: "get hooks with release",
cmd: "get hooks aeneas",
golden: "output/get-hooks.txt",
@ -35,5 +35,5 @@ func TestGetHooks(t *testing.T) {
golden: "output/get-hooks-no-args.txt",
wantError: true,
}}
testReleaseCmd(t, tests)
runTestCmd(t, tests)
}

View File

@ -24,7 +24,7 @@ import (
)
func TestGetManifest(t *testing.T) {
tests := []releaseCase{{
tests := []cmdTestCase{{
name: "get manifest with release",
cmd: "get manifest juno",
golden: "output/get-manifest.txt",
@ -35,5 +35,5 @@ func TestGetManifest(t *testing.T) {
golden: "output/get-manifest-no-args.txt",
wantError: true,
}}
testReleaseCmd(t, tests)
runTestCmd(t, tests)
}

View File

@ -24,7 +24,7 @@ import (
)
func TestGetCmd(t *testing.T) {
tests := []releaseCase{{
tests := []cmdTestCase{{
name: "get with a release",
cmd: "get thomas-guide",
golden: "output/get-release.txt",
@ -35,5 +35,5 @@ func TestGetCmd(t *testing.T) {
golden: "output/get-no-args.txt",
wantError: true,
}}
testReleaseCmd(t, tests)
runTestCmd(t, tests)
}

View File

@ -24,7 +24,7 @@ import (
)
func TestGetValuesCmd(t *testing.T) {
tests := []releaseCase{{
tests := []cmdTestCase{{
name: "get values with a release",
cmd: "get values thomas-guide",
golden: "output/get-values.txt",
@ -35,5 +35,5 @@ func TestGetValuesCmd(t *testing.T) {
golden: "output/get-values-args.txt",
wantError: true,
}}
testReleaseCmd(t, tests)
runTestCmd(t, tests)
}

View File

@ -18,14 +18,12 @@ package main // import "k8s.io/helm/cmd/helm"
import (
"fmt"
"io"
"log"
"os"
"strings"
"sync"
"github.com/pkg/errors"
"github.com/spf13/cobra"
// Import to initialize client auth plugins.
_ "k8s.io/client-go/plugin/pkg/client/auth"
"k8s.io/client-go/tools/clientcmd"
@ -42,83 +40,6 @@ var (
configOnce sync.Once
)
var globalUsage = `The Kubernetes package manager
To begin working with Helm, run the 'helm init' command:
$ helm init
This will set up any necessary local configuration.
Common actions from this point include:
- helm search: search for charts
- helm fetch: download a chart to your local directory to view
- helm install: upload the chart to Kubernetes
- helm list: list releases of charts
Environment:
$HELM_HOME set an alternative location for Helm files. By default, these are stored in ~/.helm
$HELM_NO_PLUGINS disable plugins. Set HELM_NO_PLUGINS=1 to disable plugins.
$KUBECONFIG set an alternative Kubernetes configuration file (default "~/.kube/config")
`
func newRootCmd(c helm.Interface, out io.Writer, args []string) *cobra.Command {
cmd := &cobra.Command{
Use: "helm",
Short: "The Helm package manager for Kubernetes.",
Long: globalUsage,
SilenceUsage: true,
}
flags := cmd.PersistentFlags()
settings.AddFlags(flags)
cmd.AddCommand(
// chart commands
newCreateCmd(out),
newDependencyCmd(out),
newFetchCmd(out),
newInspectCmd(out),
newLintCmd(out),
newPackageCmd(out),
newRepoCmd(out),
newSearchCmd(out),
newVerifyCmd(out),
// release commands
newDeleteCmd(c, out),
newGetCmd(c, out),
newHistoryCmd(c, out),
newInstallCmd(c, out),
newListCmd(c, out),
newReleaseTestCmd(c, out),
newRollbackCmd(c, out),
newStatusCmd(c, out),
newUpgradeCmd(c, out),
newCompletionCmd(out),
newHomeCmd(out),
newInitCmd(out),
newPluginCmd(out),
newTemplateCmd(out),
newVersionCmd(out),
// Hidden documentation generator command: 'helm docs'
newDocsCmd(out),
)
flags.Parse(args)
// set defaults from environment
settings.Init(flags)
// Find and add plugins
loadPlugins(cmd, out)
return cmd
}
func init() {
log.SetFlags(log.Lshortfile)
}

View File

@ -20,12 +20,10 @@ import (
"bytes"
"io/ioutil"
"os"
"path/filepath"
"strings"
"testing"
shellwords "github.com/mattn/go-shellwords"
"github.com/pkg/errors"
"github.com/spf13/cobra"
"k8s.io/helm/internal/test"
@ -35,6 +33,66 @@ import (
"k8s.io/helm/pkg/repo"
)
// base temp directory
var testingDir string
func init() {
var err error
testingDir, err = ioutil.TempDir(testingDir, "helm")
if err != nil {
panic(err)
}
}
func TestMain(m *testing.M) {
os.Unsetenv("HELM_HOME")
exitCode := m.Run()
os.RemoveAll(testingDir)
os.Exit(exitCode)
}
func testTempDir(t *testing.T) string {
t.Helper()
d, err := ioutil.TempDir(testingDir, "helm")
if err != nil {
t.Fatal(err)
}
return d
}
func runTestCmd(t *testing.T, tests []cmdTestCase) {
t.Helper()
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
defer resetEnv()()
c := &helm.FakeClient{
Rels: tt.rels,
TestRunStatus: tt.testRunStatus,
}
out, err := executeCommand(c, tt.cmd)
if (err != nil) != tt.wantError {
t.Errorf("expected error, got '%v'", err)
}
if tt.golden != "" {
test.AssertGoldenString(t, out, tt.golden)
}
})
}
}
// cmdTestCase describes a test case that works with releases.
type cmdTestCase struct {
name string
cmd string
golden string
wantError bool
// Rels are the available releases at the start of the test.
rels []*release.Release
testRunStatus map[string]release.TestRunStatus
}
func executeCommand(c helm.Interface, cmd string) (string, error) {
_, output, err := executeCommandC(c, cmd)
return output, err
@ -55,59 +113,8 @@ func executeCommandC(client helm.Interface, cmd string) (*cobra.Command, string,
return c, buf.String(), err
}
func testReleaseCmd(t *testing.T, tests []releaseCase) {
t.Helper()
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
c := &helm.FakeClient{
Rels: tt.rels,
TestRunStatus: tt.testRunStatus,
}
out, err := executeCommand(c, tt.cmd)
if (err != nil) != tt.wantError {
t.Errorf("expected error, got '%v'", err)
}
if tt.golden != "" {
test.AssertGoldenString(t, out, tt.golden)
}
})
}
}
// releaseCase describes a test case that works with releases.
type releaseCase struct {
name string
cmd string
golden string
wantError bool
// Rels are the available releases at the start of the test.
rels []*release.Release
testRunStatus map[string]release.TestRunStatus
}
// tempHelmHome sets up a Helm Home in a temp dir.
//
// This does not clean up the directory. You must do that yourself.
// You must also set helmHome yourself.
func tempHelmHome(t *testing.T) (helmpath.Home, error) {
oldhome := settings.Home
dir, err := ioutil.TempDir("", "helm_home-")
if err != nil {
return helmpath.Home("n/"), err
}
settings.Home = helmpath.Home(dir)
if err := ensureTestHome(t, settings.Home); err != nil {
return helmpath.Home("n/"), err
}
settings.Home = oldhome
return helmpath.Home(dir), nil
}
// ensureTestHome creates a home directory like ensureHome, but without remote references.
//
// t is used only for logging.
func ensureTestHome(t *testing.T, home helmpath.Home) error {
func ensureTestHome(t *testing.T, home helmpath.Home) {
t.Helper()
for _, p := range []string{
home.String(),
@ -117,7 +124,7 @@ func ensureTestHome(t *testing.T, home helmpath.Home) error {
home.Starters(),
} {
if err := os.MkdirAll(p, 0755); err != nil {
return errors.Wrapf(err, "could not create %s", p)
t.Fatal(err)
}
}
@ -130,96 +137,30 @@ func ensureTestHome(t *testing.T, home helmpath.Home) error {
Cache: "charts-index.yaml",
})
if err := rf.WriteFile(repoFile, 0644); err != nil {
return err
t.Fatal(err)
}
}
if r, err := repo.LoadRepositoriesFile(repoFile); err == repo.ErrRepoOutOfDate {
t.Log("Updating repository file format...")
if err := r.WriteFile(repoFile, 0644); err != nil {
return err
t.Fatal(err)
}
}
t.Logf("$HELM_HOME has been configured at %s.\n", home)
return nil
}
func TestRootCmd(t *testing.T) {
cleanup := resetEnv()
defer cleanup()
tests := []struct {
name, args, home string
envars map[string]string
}{
{
name: "defaults",
args: "home",
home: filepath.Join(os.Getenv("HOME"), "/.helm"),
},
{
name: "with --home set",
args: "--home /foo",
home: "/foo",
},
{
name: "subcommands with --home set",
args: "home --home /foo",
home: "/foo",
},
{
name: "with $HELM_HOME set",
args: "home",
envars: map[string]string{"HELM_HOME": "/bar"},
home: "/bar",
},
{
name: "subcommands with $HELM_HOME set",
args: "home",
envars: map[string]string{"HELM_HOME": "/bar"},
home: "/bar",
},
{
name: "with $HELM_HOME and --home set",
args: "home --home /foo",
envars: map[string]string{"HELM_HOME": "/bar"},
home: "/foo",
},
}
// ensure not set locally
os.Unsetenv("HELM_HOME")
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
defer os.Unsetenv("HELM_HOME")
for k, v := range tt.envars {
os.Setenv(k, v)
}
cmd, _, err := executeCommandC(nil, tt.args)
if err != nil {
t.Fatalf("unexpected error: %s", err)
}
if settings.Home.String() != tt.home {
t.Errorf("expected home %q, got %q", tt.home, settings.Home)
}
homeFlag := cmd.Flag("home").Value.String()
homeFlag = os.ExpandEnv(homeFlag)
if homeFlag != tt.home {
t.Errorf("expected home %q, got %q", tt.home, homeFlag)
}
})
}
// testHelmHome sets up a Helm Home in a temp dir.
func testHelmHome(t *testing.T) helmpath.Home {
t.Helper()
dir := helmpath.Home(testTempDir(t))
ensureTestHome(t, dir)
return dir
}
func resetEnv() func() {
origSettings := settings
origEnv := os.Environ()
origSettings, origEnv := settings, os.Environ()
return func() {
os.Clearenv()
settings = origSettings
for _, pair := range origEnv {
kv := strings.SplitN(pair, "=", 2)
@ -227,3 +168,15 @@ func resetEnv() func() {
}
}
}
func testChdir(t *testing.T, dir string) func() {
t.Helper()
old, err := os.Getwd()
if err != nil {
t.Fatal(err)
}
if err := os.Chdir(dir); err != nil {
t.Fatal(err)
}
return func() { os.Chdir(old) }
}

View File

@ -32,7 +32,7 @@ func TestHistoryCmd(t *testing.T) {
})
}
tests := []releaseCase{{
tests := []cmdTestCase{{
name: "get history for release",
cmd: "history angry-bird",
rels: []*rpb.Release{
@ -67,5 +67,5 @@ func TestHistoryCmd(t *testing.T) {
},
golden: "output/history.json",
}}
testReleaseCmd(t, tests)
runTestCmd(t, tests)
}

View File

@ -18,7 +18,6 @@ package main
import (
"bytes"
"io/ioutil"
"os"
"testing"
@ -26,14 +25,9 @@ import (
)
func TestEnsureHome(t *testing.T) {
home, err := ioutil.TempDir("", "helm_home")
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(home)
hh := helmpath.Home(testTempDir(t))
b := bytes.NewBuffer(nil)
hh := helmpath.Home(home)
settings.Home = hh
if err := ensureDirectories(hh, b); err != nil {
t.Error(err)

View File

@ -23,7 +23,7 @@ import (
)
func TestInstall(t *testing.T) {
tests := []releaseCase{
tests := []cmdTestCase{
// Install, base case
{
name: "basic install",
@ -120,7 +120,7 @@ func TestInstall(t *testing.T) {
},
}
testReleaseCmd(t, tests)
runTestCmd(t, tests)
}
type nameTemplateTestCase struct {

View File

@ -24,7 +24,7 @@ import (
)
func TestListCmd(t *testing.T) {
tests := []releaseCase{{
tests := []cmdTestCase{{
name: "with a release",
cmd: "list",
rels: []*release.Release{
@ -111,5 +111,5 @@ func TestListCmd(t *testing.T) {
golden: "output/list-with-old-releases.txt",
}}
testReleaseCmd(t, tests)
runTestCmd(t, tests)
}

View File

@ -53,6 +53,7 @@ func TestSetVersion(t *testing.T) {
}
func TestPackage(t *testing.T) {
defer resetEnv()()
tests := []struct {
name string
@ -132,32 +133,20 @@ func TestPackage(t *testing.T) {
},
}
// Because these tests are destructive, we run them in a tempdir.
origDir, err := os.Getwd()
if err != nil {
t.Fatal(err)
}
tmp, err := ioutil.TempDir("", "helm-package-test-")
if err != nil {
t.Fatal(err)
}
tmp := testTempDir(t)
t.Logf("Running tests in %s", tmp)
if err := os.Chdir(tmp); err != nil {
t.Fatal(err)
}
defer testChdir(t, tmp)()
if err := os.Mkdir("toot", 0777); err != nil {
t.Fatal(err)
}
ensureTestHome(t, helmpath.Home(tmp))
cleanup := resetEnv()
defer func() {
os.Chdir(origDir)
os.RemoveAll(tmp)
cleanup()
}()
settings.Home = helmpath.Home(tmp)
@ -210,22 +199,14 @@ func TestPackage(t *testing.T) {
}
func TestSetAppVersion(t *testing.T) {
defer resetEnv()()
var ch *chart.Chart
expectedAppVersion := "app-version-foo"
tmp, _ := ioutil.TempDir("", "helm-package-app-version-")
tmp := testTempDir(t)
thome, err := tempHelmHome(t)
if err != nil {
t.Fatal(err)
}
cleanup := resetEnv()
defer func() {
os.RemoveAll(tmp)
os.RemoveAll(thome.String())
cleanup()
}()
settings.Home = helmpath.Home(thome)
hh := testHelmHome(t)
settings.Home = helmpath.Home(hh)
c := newPackageCmd(&bytes.Buffer{})
flags := map[string]string{
@ -233,8 +214,7 @@ func TestSetAppVersion(t *testing.T) {
"app-version": expectedAppVersion,
}
setFlags(c, flags)
err = c.RunE(c, []string{"testdata/testcharts/alpine"})
if err != nil {
if err := c.RunE(c, []string{"testdata/testcharts/alpine"}); err != nil {
t.Errorf("unexpected error %q", err)
}
@ -244,7 +224,7 @@ func TestSetAppVersion(t *testing.T) {
} else if fi.Size() == 0 {
t.Errorf("file %q has zero bytes.", chartPath)
}
ch, err = chartutil.Load(chartPath)
ch, err := chartutil.Load(chartPath)
if err != nil {
t.Errorf("unexpected error loading packaged chart: %v", err)
}
@ -254,6 +234,8 @@ func TestSetAppVersion(t *testing.T) {
}
func TestPackageValues(t *testing.T) {
defer resetEnv()()
testCases := []struct {
desc string
args []string
@ -288,26 +270,13 @@ func TestPackageValues(t *testing.T) {
},
}
thome, err := tempHelmHome(t)
if err != nil {
t.Fatal(err)
}
cleanup := resetEnv()
defer func() {
os.RemoveAll(thome.String())
cleanup()
}()
settings.Home = thome
hh := testHelmHome(t)
settings.Home = hh
for _, tc := range testCases {
var files []string
for _, contents := range tc.valuefilesContents {
f, err := createValuesFile(contents)
if err != nil {
t.Errorf("%q unexpected error creating temporary values file: %q", tc.desc, err)
}
defer os.RemoveAll(filepath.Dir(f))
f := createValuesFile(t, contents)
files = append(files, f)
}
valueFiles := strings.Join(files, ",")
@ -322,11 +291,7 @@ func TestPackageValues(t *testing.T) {
}
func runAndVerifyPackageCommandValues(t *testing.T, args []string, flags map[string]string, valueFiles string, expected chartutil.Values) {
outputDir, err := ioutil.TempDir("", "helm-package")
if err != nil {
t.Errorf("unexpected error creating temporary output directory: %q", err)
}
defer os.RemoveAll(outputDir)
outputDir := testTempDir(t)
if len(flags) == 0 {
flags = make(map[string]string)
@ -339,16 +304,14 @@ func runAndVerifyPackageCommandValues(t *testing.T, args []string, flags map[str
cmd := newPackageCmd(&bytes.Buffer{})
setFlags(cmd, flags)
err = cmd.RunE(cmd, args)
if err != nil {
if err := cmd.RunE(cmd, args); err != nil {
t.Errorf("unexpected error: %q", err)
}
outputFile := filepath.Join(outputDir, "alpine-0.1.0.tgz")
verifyOutputChartExists(t, outputFile)
var actual chartutil.Values
actual, err = getChartValues(outputFile)
actual, err := getChartValues(outputFile)
if err != nil {
t.Errorf("unexpected error extracting chart values: %q", err)
}
@ -356,19 +319,15 @@ func runAndVerifyPackageCommandValues(t *testing.T, args []string, flags map[str
verifyValues(t, actual, expected)
}
func createValuesFile(data string) (string, error) {
outputDir, err := ioutil.TempDir("", "values-file")
if err != nil {
return "", err
}
func createValuesFile(t *testing.T, data string) string {
outputDir := testTempDir(t)
outputFile := filepath.Join(outputDir, "values.yaml")
if err = ioutil.WriteFile(outputFile, []byte(data), 0755); err != nil {
os.RemoveAll(outputFile)
return "", err
if err := ioutil.WriteFile(outputFile, []byte(data), 0755); err != nil {
t.Fatalf("err: %s", err)
}
return outputFile, nil
return outputFile
}
func getChartValues(chartPath string) (chartutil.Values, error) {

View File

@ -62,8 +62,7 @@ func TestManuallyProcessArgs(t *testing.T) {
}
func TestLoadPlugins(t *testing.T) {
cleanup := resetEnv()
defer cleanup()
defer resetEnv()()
settings.Home = "testdata/helmhome"
@ -133,8 +132,7 @@ func TestLoadPlugins(t *testing.T) {
}
func TestLoadPlugins_HelmNoPlugins(t *testing.T) {
cleanup := resetEnv()
defer cleanup()
defer resetEnv()()
settings.Home = "testdata/helmhome"
@ -151,6 +149,7 @@ func TestLoadPlugins_HelmNoPlugins(t *testing.T) {
}
func TestSetupEnv(t *testing.T) {
defer resetEnv()()
name := "pequod"
settings.Home = helmpath.Home("testdata/helmhome")
base := filepath.Join(settings.Home.Plugins(), name)

View File

@ -23,7 +23,7 @@ import (
)
func TestReleaseTesting(t *testing.T) {
tests := []releaseCase{{
tests := []cmdTestCase{{
name: "basic test",
cmd: "test example-release",
testRunStatus: map[string]release.TestRunStatus{"PASSED: green lights everywhere": release.TestRunSuccess},
@ -62,5 +62,5 @@ func TestReleaseTesting(t *testing.T) {
"PASSED: feel free to party again": release.TestRunSuccess},
wantError: true,
}}
testReleaseCmd(t, tests)
runTestCmd(t, tests)
}

View File

@ -26,50 +26,43 @@ import (
)
func TestRepoAddCmd(t *testing.T) {
srv, thome, err := repotest.NewTempServer("testdata/testserver/*.*")
defer resetEnv()()
srv, hh, err := repotest.NewTempServer("testdata/testserver/*.*")
if err != nil {
t.Fatal(err)
}
cleanup := resetEnv()
defer func() {
srv.Stop()
os.RemoveAll(thome.String())
cleanup()
os.RemoveAll(hh.String())
}()
if err := ensureTestHome(t, thome); err != nil {
t.Fatal(err)
}
ensureTestHome(t, hh)
settings.Home = hh
settings.Home = thome
tests := []releaseCase{{
tests := []cmdTestCase{{
name: "add a repository",
cmd: fmt.Sprintf("repo add test-name %s --home %s", srv.URL(), thome),
cmd: fmt.Sprintf("repo add test-name %s --home %s", srv.URL(), hh),
golden: "output/repo-add.txt",
}}
testReleaseCmd(t, tests)
runTestCmd(t, tests)
}
func TestRepoAdd(t *testing.T) {
ts, thome, err := repotest.NewTempServer("testdata/testserver/*.*")
defer resetEnv()()
ts, hh, err := repotest.NewTempServer("testdata/testserver/*.*")
if err != nil {
t.Fatal(err)
}
cleanup := resetEnv()
hh := thome
defer func() {
ts.Stop()
os.RemoveAll(thome.String())
cleanup()
os.RemoveAll(hh.String())
}()
if err := ensureTestHome(t, hh); err != nil {
t.Fatal(err)
}
settings.Home = thome
ensureTestHome(t, hh)
settings.Home = hh
const testRepoName = "test-name"

View File

@ -19,7 +19,6 @@ package main
import (
"bytes"
"io"
"io/ioutil"
"os"
"path/filepath"
"testing"
@ -29,11 +28,7 @@ import (
func TestRepoIndexCmd(t *testing.T) {
dir, err := ioutil.TempDir("", "helm-")
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(dir)
dir := testTempDir(t)
comp := filepath.Join(dir, "compressedchart-0.1.0.tgz")
if err := linkOrCopy("testdata/testcharts/compressedchart-0.1.0.tgz", comp); err != nil {

View File

@ -22,29 +22,24 @@ import (
"strings"
"testing"
"k8s.io/helm/pkg/helm/helmpath"
"k8s.io/helm/pkg/repo"
"k8s.io/helm/pkg/repo/repotest"
)
func TestRepoRemove(t *testing.T) {
ts, thome, err := repotest.NewTempServer("testdata/testserver/*.*")
defer resetEnv()()
ts, hh, err := repotest.NewTempServer("testdata/testserver/*.*")
if err != nil {
t.Fatal(err)
}
hh := helmpath.Home(thome)
cleanup := resetEnv()
defer func() {
ts.Stop()
os.RemoveAll(thome.String())
cleanup()
os.RemoveAll(hh.String())
}()
if err := ensureTestHome(t, hh); err != nil {
t.Fatal(err)
}
settings.Home = thome
ensureTestHome(t, hh)
settings.Home = hh
const testRepoName = "test-name"

View File

@ -30,18 +30,10 @@ import (
)
func TestUpdateCmd(t *testing.T) {
thome, err := tempHelmHome(t)
if err != nil {
t.Fatal(err)
}
defer resetEnv()()
cleanup := resetEnv()
defer func() {
os.RemoveAll(thome.String())
cleanup()
}()
settings.Home = thome
hh := testHelmHome(t)
settings.Home = hh
out := bytes.NewBuffer(nil)
// Instead of using the HTTP updater, we provide our own for this test.
@ -53,7 +45,7 @@ func TestUpdateCmd(t *testing.T) {
}
o := &repoUpdateOptions{
update: updater,
home: helmpath.Home(thome),
home: helmpath.Home(hh),
}
if err := o.run(out); err != nil {
t.Fatal(err)
@ -65,23 +57,19 @@ func TestUpdateCmd(t *testing.T) {
}
func TestUpdateCharts(t *testing.T) {
ts, thome, err := repotest.NewTempServer("testdata/testserver/*.*")
defer resetEnv()()
ts, hh, err := repotest.NewTempServer("testdata/testserver/*.*")
if err != nil {
t.Fatal(err)
}
hh := helmpath.Home(thome)
cleanup := resetEnv()
defer func() {
ts.Stop()
os.RemoveAll(thome.String())
cleanup()
os.RemoveAll(hh.String())
}()
if err := ensureTestHome(t, hh); err != nil {
t.Fatal(err)
}
settings.Home = thome
ensureTestHome(t, hh)
settings.Home = hh
r, err := repo.NewChartRepository(&repo.Entry{
Name: "charts",

View File

@ -21,7 +21,7 @@ import (
)
func TestRollbackCmd(t *testing.T) {
tests := []releaseCase{{
tests := []cmdTestCase{{
name: "rollback a release",
cmd: "rollback funny-honey 1",
golden: "output/rollback.txt",
@ -39,5 +39,5 @@ func TestRollbackCmd(t *testing.T) {
golden: "output/rollback-no-args.txt",
wantError: true,
}}
testReleaseCmd(t, tests)
runTestCmd(t, tests)
}

102
cmd/helm/root.go Normal file
View File

@ -0,0 +1,102 @@
/*
Copyright 2016 The Kubernetes Authors All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package main // import "k8s.io/helm/cmd/helm"
import (
"io"
"github.com/spf13/cobra"
"k8s.io/helm/pkg/helm"
)
var globalUsage = `The Kubernetes package manager
To begin working with Helm, run the 'helm init' command:
$ helm init
This will set up any necessary local configuration.
Common actions from this point include:
- helm search: search for charts
- helm fetch: download a chart to your local directory to view
- helm install: upload the chart to Kubernetes
- helm list: list releases of charts
Environment:
$HELM_HOME set an alternative location for Helm files. By default, these are stored in ~/.helm
$HELM_NO_PLUGINS disable plugins. Set HELM_NO_PLUGINS=1 to disable plugins.
$KUBECONFIG set an alternative Kubernetes configuration file (default "~/.kube/config")
`
func newRootCmd(c helm.Interface, out io.Writer, args []string) *cobra.Command {
cmd := &cobra.Command{
Use: "helm",
Short: "The Helm package manager for Kubernetes.",
Long: globalUsage,
SilenceUsage: true,
}
flags := cmd.PersistentFlags()
settings.AddFlags(flags)
cmd.AddCommand(
// chart commands
newCreateCmd(out),
newDependencyCmd(out),
newFetchCmd(out),
newInspectCmd(out),
newLintCmd(out),
newPackageCmd(out),
newRepoCmd(out),
newSearchCmd(out),
newVerifyCmd(out),
// release commands
newDeleteCmd(c, out),
newGetCmd(c, out),
newHistoryCmd(c, out),
newInstallCmd(c, out),
newListCmd(c, out),
newReleaseTestCmd(c, out),
newRollbackCmd(c, out),
newStatusCmd(c, out),
newUpgradeCmd(c, out),
newCompletionCmd(out),
newHomeCmd(out),
newInitCmd(out),
newPluginCmd(out),
newTemplateCmd(out),
newVersionCmd(out),
// Hidden documentation generator command: 'helm docs'
newDocsCmd(out),
)
flags.Parse(args)
// set defaults from environment
settings.Init(flags)
// Find and add plugins
loadPlugins(cmd, out)
return cmd
}

93
cmd/helm/root_test.go Normal file
View File

@ -0,0 +1,93 @@
/*
Copyright 2016 The Kubernetes Authors All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package main
import (
"os"
"path/filepath"
"testing"
)
func TestRootCmd(t *testing.T) {
defer resetEnv()()
tests := []struct {
name, args, home string
envars map[string]string
}{
{
name: "defaults",
args: "home",
home: filepath.Join(os.Getenv("HOME"), "/.helm"),
},
{
name: "with --home set",
args: "--home /foo",
home: "/foo",
},
{
name: "subcommands with --home set",
args: "home --home /foo",
home: "/foo",
},
{
name: "with $HELM_HOME set",
args: "home",
envars: map[string]string{"HELM_HOME": "/bar"},
home: "/bar",
},
{
name: "subcommands with $HELM_HOME set",
args: "home",
envars: map[string]string{"HELM_HOME": "/bar"},
home: "/bar",
},
{
name: "with $HELM_HOME and --home set",
args: "home --home /foo",
envars: map[string]string{"HELM_HOME": "/bar"},
home: "/foo",
},
}
// ensure not set locally
os.Unsetenv("HELM_HOME")
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
defer os.Unsetenv("HELM_HOME")
for k, v := range tt.envars {
os.Setenv(k, v)
}
cmd, _, err := executeCommandC(nil, tt.args)
if err != nil {
t.Fatalf("unexpected error: %s", err)
}
if settings.Home.String() != tt.home {
t.Errorf("expected home %q, got %q", tt.home, settings.Home)
}
homeFlag := cmd.Flag("home").Value.String()
homeFlag = os.ExpandEnv(homeFlag)
if homeFlag != tt.home {
t.Errorf("expected home %q, got %q", tt.home, homeFlag)
}
})
}
}

View File

@ -21,51 +21,52 @@ import (
)
func TestSearchCmd(t *testing.T) {
tests := []releaseCase{{
defer resetEnv()()
setHome := func(cmd string) string {
return cmd + " --home=testdata/helmhome"
}
tests := []cmdTestCase{{
name: "search for 'maria', expect one match",
cmd: "search maria",
cmd: setHome("search maria"),
golden: "output/search-single.txt",
}, {
name: "search for 'alpine', expect two matches",
cmd: "search alpine",
cmd: setHome("search alpine"),
golden: "output/search-multiple.txt",
}, {
name: "search for 'alpine' with versions, expect three matches",
cmd: "search alpine --versions",
cmd: setHome("search alpine --versions"),
golden: "output/search-multiple-versions.txt",
}, {
name: "search for 'alpine' with version constraint, expect one match with version 0.1.0",
cmd: "search alpine --version '>= 0.1, < 0.2'",
cmd: setHome("search alpine --version '>= 0.1, < 0.2'"),
golden: "output/search-constraint.txt",
}, {
name: "search for 'alpine' with version constraint, expect one match with version 0.1.0",
cmd: "search alpine --versions --version '>= 0.1, < 0.2'",
cmd: setHome("search alpine --versions --version '>= 0.1, < 0.2'"),
golden: "output/search-versions-constraint.txt",
}, {
name: "search for 'alpine' with version constraint, expect one match with version 0.2.0",
cmd: "search alpine --version '>= 0.1'",
cmd: setHome("search alpine --version '>= 0.1'"),
golden: "output/search-constraint-single.txt",
}, {
name: "search for 'alpine' with version constraint and --versions, expect two matches",
cmd: "search alpine --versions --version '>= 0.1'",
cmd: setHome("search alpine --versions --version '>= 0.1'"),
golden: "output/search-multiple-versions-constraints.txt",
}, {
name: "search for 'syzygy', expect no matches",
cmd: "search syzygy",
cmd: setHome("search syzygy"),
golden: "output/search-not-found.txt",
}, {
name: "search for 'alp[a-z]+', expect two matches",
cmd: "search alp[a-z]+ --regexp",
cmd: setHome("search alp[a-z]+ --regexp"),
golden: "output/search-regex.txt",
}, {
name: "search for 'alp[', expect failure to compile regexp",
cmd: "search alp[ --regexp",
cmd: setHome("search alp[ --regexp"),
wantError: true,
}}
cleanup := resetEnv()
defer cleanup()
settings.Home = "testdata/helmhome"
testReleaseCmd(t, tests)
runTestCmd(t, tests)
}

View File

@ -32,7 +32,7 @@ func TestStatusCmd(t *testing.T) {
}}
}
tests := []releaseCase{{
tests := []cmdTestCase{{
name: "get status of a deployed release",
cmd: "status flummoxed-chickadee",
golden: "output/status.txt",
@ -89,5 +89,5 @@ func TestStatusCmd(t *testing.T) {
},
}),
}}
testReleaseCmd(t, tests)
runTestCmd(t, tests)
}

View File

@ -1,47 +1,3 @@
REVISION: 1
RELEASED: Fri Sep 2 22:04:05 1977
CHART: testUpgradeChart-0.1.0
USER-SUPPLIED VALUES:
name: "value"
COMPUTED VALUES:
affinity: {}
fullnameOverride: ""
image:
pullPolicy: IfNotPresent
repository: nginx
tag: stable
ingress:
annotations: {}
enabled: false
hosts:
- chart-example.local
path: /
tls: []
name: value
nameOverride: ""
nodeSelector: {}
replicaCount: 1
resources: {}
service:
port: 80
type: ClusterIP
tolerations: []
HOOKS:
---
# pre-install-hook
apiVersion: v1
kind: Job
metadata:
annotations:
"helm.sh/hook": pre-install
MANIFEST:
apiVersion: v1
kind: Secret
metadata:
name: fixture
Release "crazy-bunny" has been upgraded. Happy Helming!
LAST DEPLOYED: 1977-09-02 22:04:05 +0000 UTC
NAMESPACE: default

View File

@ -1,47 +1,3 @@
REVISION: 1
RELEASED: Fri Sep 2 22:04:05 1977
CHART: testUpgradeChart-0.1.0
USER-SUPPLIED VALUES:
name: "value"
COMPUTED VALUES:
affinity: {}
fullnameOverride: ""
image:
pullPolicy: IfNotPresent
repository: nginx
tag: stable
ingress:
annotations: {}
enabled: false
hosts:
- chart-example.local
path: /
tls: []
name: value
nameOverride: ""
nodeSelector: {}
replicaCount: 1
resources: {}
service:
port: 80
type: ClusterIP
tolerations: []
HOOKS:
---
# pre-install-hook
apiVersion: v1
kind: Job
metadata:
annotations:
"helm.sh/hook": pre-install
MANIFEST:
apiVersion: v1
kind: Secret
metadata:
name: fixture
Release "zany-bunny" has been upgraded. Happy Helming!
LAST DEPLOYED: 1977-09-02 22:04:05 +0000 UTC
NAMESPACE: default

View File

@ -1,47 +1,3 @@
REVISION: 4
RELEASED: Fri Sep 2 22:04:05 1977
CHART: testUpgradeChart-0.1.0
USER-SUPPLIED VALUES:
name: "value"
COMPUTED VALUES:
affinity: {}
fullnameOverride: ""
image:
pullPolicy: IfNotPresent
repository: nginx
tag: stable
ingress:
annotations: {}
enabled: false
hosts:
- chart-example.local
path: /
tls: []
name: value
nameOverride: ""
nodeSelector: {}
replicaCount: 1
resources: {}
service:
port: 80
type: ClusterIP
tolerations: []
HOOKS:
---
# pre-install-hook
apiVersion: v1
kind: Job
metadata:
annotations:
"helm.sh/hook": pre-install
MANIFEST:
apiVersion: v1
kind: Secret
metadata:
name: fixture
Release "funny-bunny" has been upgraded. Happy Helming!
LAST DEPLOYED: 1977-09-02 22:04:05 +0000 UTC
NAMESPACE: default

View File

@ -1,47 +1,3 @@
REVISION: 5
RELEASED: Fri Sep 2 22:04:05 1977
CHART: testUpgradeChart-0.1.0
USER-SUPPLIED VALUES:
name: "value"
COMPUTED VALUES:
affinity: {}
fullnameOverride: ""
image:
pullPolicy: IfNotPresent
repository: nginx
tag: stable
ingress:
annotations: {}
enabled: false
hosts:
- chart-example.local
path: /
tls: []
name: value
nameOverride: ""
nodeSelector: {}
replicaCount: 1
resources: {}
service:
port: 80
type: ClusterIP
tolerations: []
HOOKS:
---
# pre-install-hook
apiVersion: v1
kind: Job
metadata:
annotations:
"helm.sh/hook": pre-install
MANIFEST:
apiVersion: v1
kind: Secret
metadata:
name: fixture
Release "funny-bunny" has been upgraded. Happy Helming!
LAST DEPLOYED: 1977-09-02 22:04:05 +0000 UTC
NAMESPACE: default

View File

@ -1,47 +1,3 @@
REVISION: 3
RELEASED: Fri Sep 2 22:04:05 1977
CHART: testUpgradeChart-0.1.0
USER-SUPPLIED VALUES:
name: "value"
COMPUTED VALUES:
affinity: {}
fullnameOverride: ""
image:
pullPolicy: IfNotPresent
repository: nginx
tag: stable
ingress:
annotations: {}
enabled: false
hosts:
- chart-example.local
path: /
tls: []
name: value
nameOverride: ""
nodeSelector: {}
replicaCount: 1
resources: {}
service:
port: 80
type: ClusterIP
tolerations: []
HOOKS:
---
# pre-install-hook
apiVersion: v1
kind: Job
metadata:
annotations:
"helm.sh/hook": pre-install
MANIFEST:
apiVersion: v1
kind: Secret
metadata:
name: fixture
Release "funny-bunny" has been upgraded. Happy Helming!
LAST DEPLOYED: 1977-09-02 22:04:05 +0000 UTC
NAMESPACE: default

View File

@ -1,47 +1,3 @@
REVISION: 2
RELEASED: Fri Sep 2 22:04:05 1977
CHART: testUpgradeChart-0.1.0
USER-SUPPLIED VALUES:
name: "value"
COMPUTED VALUES:
affinity: {}
fullnameOverride: ""
image:
pullPolicy: IfNotPresent
repository: nginx
tag: stable
ingress:
annotations: {}
enabled: false
hosts:
- chart-example.local
path: /
tls: []
name: value
nameOverride: ""
nodeSelector: {}
replicaCount: 1
resources: {}
service:
port: 80
type: ClusterIP
tolerations: []
HOOKS:
---
# pre-install-hook
apiVersion: v1
kind: Job
metadata:
annotations:
"helm.sh/hook": pre-install
MANIFEST:
apiVersion: v1
kind: Secret
metadata:
name: fixture
Release "crazy-bunny" has been upgraded. Happy Helming!
LAST DEPLOYED: 1977-09-02 22:04:05 +0000 UTC
NAMESPACE: default

View File

@ -1,47 +1,3 @@
REVISION: 2
RELEASED: Fri Sep 2 22:04:05 1977
CHART: testUpgradeChart-0.1.0
USER-SUPPLIED VALUES:
name: "value"
COMPUTED VALUES:
affinity: {}
fullnameOverride: ""
image:
pullPolicy: IfNotPresent
repository: nginx
tag: stable
ingress:
annotations: {}
enabled: false
hosts:
- chart-example.local
path: /
tls: []
name: value
nameOverride: ""
nodeSelector: {}
replicaCount: 1
resources: {}
service:
port: 80
type: ClusterIP
tolerations: []
HOOKS:
---
# pre-install-hook
apiVersion: v1
kind: Job
metadata:
annotations:
"helm.sh/hook": pre-install
MANIFEST:
apiVersion: v1
kind: Secret
metadata:
name: fixture
Release "funny-bunny" has been upgraded. Happy Helming!
LAST DEPLOYED: 1977-09-02 22:04:05 +0000 UTC
NAMESPACE: default

View File

@ -17,9 +17,6 @@ limitations under the License.
package main
import (
"io/ioutil"
"os"
"path/filepath"
"testing"
"k8s.io/helm/pkg/chartutil"
@ -29,8 +26,7 @@ import (
)
func TestUpgradeCmd(t *testing.T) {
tmpChart, _ := ioutil.TempDir("testdata", "tmp")
defer os.RemoveAll(tmpChart)
tmpChart := testTempDir(t)
cfile := &chart.Metadata{
Name: "testUpgradeChart",
Description: "A Helm chart for Kubernetes",
@ -38,9 +34,12 @@ func TestUpgradeCmd(t *testing.T) {
}
chartPath, err := chartutil.Create(cfile, tmpChart)
if err != nil {
t.Errorf("Error creating chart for upgrade: %v", err)
t.Fatalf("Error creating chart for upgrade: %v", err)
}
ch, err := chartutil.Load(chartPath)
if err != nil {
t.Fatalf("Error loading chart: %v", err)
}
ch, _ := chartutil.Load(chartPath)
_ = helm.ReleaseMock(&helm.MockReleaseOptions{
Name: "funny-bunny",
Chart: ch,
@ -55,11 +54,11 @@ func TestUpgradeCmd(t *testing.T) {
chartPath, err = chartutil.Create(cfile, tmpChart)
if err != nil {
t.Errorf("Error creating chart: %v", err)
t.Fatalf("Error creating chart: %v", err)
}
ch, err = chartutil.Load(chartPath)
if err != nil {
t.Errorf("Error loading updated chart: %v", err)
t.Fatalf("Error loading updated chart: %v", err)
}
// update chart version again
@ -71,22 +70,22 @@ func TestUpgradeCmd(t *testing.T) {
chartPath, err = chartutil.Create(cfile, tmpChart)
if err != nil {
t.Errorf("Error creating chart: %v", err)
t.Fatalf("Error creating chart: %v", err)
}
var ch2 *chart.Chart
ch2, err = chartutil.Load(chartPath)
if err != nil {
t.Errorf("Error loading updated chart: %v", err)
t.Fatalf("Error loading updated chart: %v", err)
}
missingDepsPath := filepath.Join("testdata/testcharts/chart-missing-deps")
badDepsPath := filepath.Join("testdata/testcharts/chart-bad-requirements")
missingDepsPath := "testdata/testcharts/chart-missing-deps"
badDepsPath := "testdata/testcharts/chart-bad-requirements"
relMock := func(n string, v int, ch *chart.Chart) *release.Release {
return helm.ReleaseMock(&helm.MockReleaseOptions{Name: n, Version: v, Chart: ch})
}
tests := []releaseCase{
tests := []cmdTestCase{
{
name: "upgrade a release",
cmd: "upgrade funny-bunny " + chartPath,
@ -142,5 +141,5 @@ func TestUpgradeCmd(t *testing.T) {
wantError: true,
},
}
testReleaseCmd(t, tests)
runTestCmd(t, tests)
}

View File

@ -20,7 +20,7 @@ import (
)
func TestVersion(t *testing.T) {
tests := []releaseCase{{
tests := []cmdTestCase{{
name: "default",
cmd: "version",
golden: "output/version.txt",
@ -29,5 +29,5 @@ func TestVersion(t *testing.T) {
cmd: "version --template='Version: {{.Version}}'",
golden: "output/version-template.txt",
}}
testReleaseCmd(t, tests)
runTestCmd(t, tests)
}

View File

@ -42,7 +42,7 @@ func AssertGoldenBytes(t TestingT, actual []byte, filename string) {
t.Helper()
if err := compare(actual, path(filename)); err != nil {
t.Fatalf("%+v", err)
t.Fatalf("%v", err)
}
}
@ -50,7 +50,7 @@ func AssertGoldenString(t TestingT, actual, filename string) {
t.Helper()
if err := compare([]byte(actual), path(filename)); err != nil {
t.Fatalf("%+v", err)
t.Fatalf("%v", err)
}
}

View File

@ -71,11 +71,10 @@ func TestEnvSettings(t *testing.T) {
},
}
cleanup := resetEnv()
defer cleanup()
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
defer resetEnv()()
for k, v := range tt.envars {
os.Setenv(k, v)
}
@ -103,8 +102,6 @@ func TestEnvSettings(t *testing.T) {
if settings.KubeContext != tt.kcontext {
t.Errorf("expected kube-context %q, got %q", tt.kcontext, settings.KubeContext)
}
cleanup()
})
}
}