mirror of https://github.com/helm/helm.git
				
				
				
			ref(tests): simplify cmd test setup/teardown
Ensure proper cleanup of `HELM_HOME` and `HELM_DEBUG`
This commit is contained in:
		
							parent
							
								
									34da765eff
								
							
						
					
					
						commit
						a02a598c33
					
				
							
								
								
									
										2
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										2
									
								
								Makefile
								
								
								
								
							|  | @ -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: | ||||
|  |  | |||
|  | @ -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) | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -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) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  |  | |||
|  | @ -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) | ||||
| } | ||||
|  |  | |||
|  | @ -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), | ||||
| 	} | ||||
|  |  | |||
|  | @ -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) | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -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) | ||||
| } | ||||
|  |  | |||
|  | @ -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()) | ||||
|  |  | |||
|  | @ -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) | ||||
| 
 | ||||
|  |  | |||
|  | @ -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) | ||||
| } | ||||
|  |  | |||
|  | @ -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) | ||||
| } | ||||
|  |  | |||
|  | @ -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) | ||||
| } | ||||
|  |  | |||
|  | @ -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) | ||||
| } | ||||
|  |  | |||
|  | @ -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) | ||||
| } | ||||
|  |  | |||
|  | @ -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) } | ||||
| } | ||||
|  |  | |||
|  | @ -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) | ||||
| } | ||||
|  |  | |||
|  | @ -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) | ||||
|  |  | |||
|  | @ -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 { | ||||
|  |  | |||
|  | @ -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) | ||||
| } | ||||
|  |  | |||
|  | @ -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) { | ||||
|  |  | |||
|  | @ -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) | ||||
|  |  | |||
|  | @ -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) | ||||
| } | ||||
|  |  | |||
|  | @ -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" | ||||
| 
 | ||||
|  |  | |||
|  | @ -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 { | ||||
|  |  | |||
|  | @ -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" | ||||
| 
 | ||||
|  |  | |||
|  | @ -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", | ||||
|  |  | |||
|  | @ -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) | ||||
| } | ||||
|  |  | |||
|  | @ -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 | ||||
| } | ||||
|  | @ -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) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
|  | @ -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) | ||||
| } | ||||
|  |  | |||
|  | @ -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) | ||||
| } | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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) | ||||
| } | ||||
|  |  | |||
|  | @ -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) | ||||
| } | ||||
|  |  | |||
|  | @ -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) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -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() | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue