Add the option to specify an alternative helm binary (#181)
`helm` may not be version compatible. Add an option to specify an alternative `helm` command on runtime, possibly according to the version of tiller running on your cluster.
This commit is contained in:
		
							parent
							
								
									88e84e5ae8
								
							
						
					
					
						commit
						9f57f8be7d
					
				|  | @ -11,6 +11,7 @@ const ( | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type execer struct { | type execer struct { | ||||||
|  | 	helmBinary  string | ||||||
| 	runner      Runner | 	runner      Runner | ||||||
| 	writer      io.Writer | 	writer      io.Writer | ||||||
| 	kubeContext string | 	kubeContext string | ||||||
|  | @ -20,6 +21,7 @@ type execer struct { | ||||||
| // New for running helm commands
 | // New for running helm commands
 | ||||||
| func New(writer io.Writer, kubeContext string) *execer { | func New(writer io.Writer, kubeContext string) *execer { | ||||||
| 	return &execer{ | 	return &execer{ | ||||||
|  | 		helmBinary:  command, | ||||||
| 		writer:      writer, | 		writer:      writer, | ||||||
| 		kubeContext: kubeContext, | 		kubeContext: kubeContext, | ||||||
| 		runner:      &ShellRunner{}, | 		runner:      &ShellRunner{}, | ||||||
|  | @ -30,6 +32,10 @@ func (helm *execer) SetExtraArgs(args ...string) { | ||||||
| 	helm.extra = args | 	helm.extra = args | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (helm *execer) SetHelmBinary(bin string) { | ||||||
|  | 	helm.helmBinary = bin | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (helm *execer) AddRepo(name, repository, certfile, keyfile, username, password string) error { | func (helm *execer) AddRepo(name, repository, certfile, keyfile, username, password string) error { | ||||||
| 	var args []string | 	var args []string | ||||||
| 	args = append(args, "repo", "add", name, repository) | 	args = append(args, "repo", "add", name, repository) | ||||||
|  | @ -114,8 +120,8 @@ func (helm *execer) exec(args ...string) ([]byte, error) { | ||||||
| 	if helm.kubeContext != "" { | 	if helm.kubeContext != "" { | ||||||
| 		cmdargs = append(cmdargs, "--kube-context", helm.kubeContext) | 		cmdargs = append(cmdargs, "--kube-context", helm.kubeContext) | ||||||
| 	} | 	} | ||||||
| 	helm.write([]byte(fmt.Sprintf("exec: helm %s\n", strings.Join(cmdargs, " ")))) | 	helm.write([]byte(fmt.Sprintf("exec: %s %s\n", helm.helmBinary, strings.Join(cmdargs, " ")))) | ||||||
| 	return helm.runner.Execute(command, cmdargs) | 	return helm.runner.Execute(helm.helmBinary, cmdargs) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (helm *execer) write(out []byte) { | func (helm *execer) write(out []byte) { | ||||||
|  |  | ||||||
|  | @ -56,6 +56,17 @@ func Test_SetExtraArgs(t *testing.T) { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func Test_SetHelmBinary(t *testing.T) { | ||||||
|  | 	helm := New(new(bytes.Buffer), "dev") | ||||||
|  | 	if helm.helmBinary != "helm" { | ||||||
|  | 		t.Error("helmexec.command - default command is not helm") | ||||||
|  | 	} | ||||||
|  | 	helm.SetHelmBinary("foo") | ||||||
|  | 	if helm.helmBinary != "foo" { | ||||||
|  | 		t.Errorf("helmexec.SetHelmBinary() - actual = %s expect = foo", helm.helmBinary) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func Test_AddRepo(t *testing.T) { | func Test_AddRepo(t *testing.T) { | ||||||
| 	var buffer bytes.Buffer | 	var buffer bytes.Buffer | ||||||
| 	helm := MockExecer(&buffer, "dev") | 	helm := MockExecer(&buffer, "dev") | ||||||
|  | @ -237,6 +248,15 @@ func Test_exec(t *testing.T) { | ||||||
| 	if buffer.String() != expected { | 	if buffer.String() != expected { | ||||||
| 		t.Errorf("helmexec.exec()\nactual = %v\nexpect = %v", buffer.String(), expected) | 		t.Errorf("helmexec.exec()\nactual = %v\nexpect = %v", buffer.String(), expected) | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	buffer.Reset() | ||||||
|  | 	helm = MockExecer(&buffer, "") | ||||||
|  | 	helm.SetHelmBinary("overwritten") | ||||||
|  | 	helm.exec("version") | ||||||
|  | 	expected = "exec: overwritten version\n" | ||||||
|  | 	if buffer.String() != expected { | ||||||
|  | 		t.Errorf("helmexec.exec()\nactual = %v\nexpect = %v", buffer.String(), expected) | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func Test_Lint(t *testing.T) { | func Test_Lint(t *testing.T) { | ||||||
|  |  | ||||||
|  | @ -3,6 +3,7 @@ package helmexec | ||||||
| // Interface for executing helm commands
 | // Interface for executing helm commands
 | ||||||
| type Interface interface { | type Interface interface { | ||||||
| 	SetExtraArgs(args ...string) | 	SetExtraArgs(args ...string) | ||||||
|  | 	SetHelmBinary(bin string) | ||||||
| 
 | 
 | ||||||
| 	AddRepo(name, repository, certfile, keyfile, username, password string) error | 	AddRepo(name, repository, certfile, keyfile, username, password string) error | ||||||
| 	UpdateRepo() error | 	UpdateRepo() error | ||||||
|  |  | ||||||
							
								
								
									
										25
									
								
								main.go
								
								
								
								
							
							
						
						
									
										25
									
								
								main.go
								
								
								
								
							|  | @ -31,6 +31,10 @@ func main() { | ||||||
| 	app.Usage = "" | 	app.Usage = "" | ||||||
| 	app.Version = Version | 	app.Version = Version | ||||||
| 	app.Flags = []cli.Flag{ | 	app.Flags = []cli.Flag{ | ||||||
|  | 		cli.StringFlag{ | ||||||
|  | 			Name:  "helm-binary, b", | ||||||
|  | 			Usage: "path to helm binary", | ||||||
|  | 		}, | ||||||
| 		cli.StringFlag{ | 		cli.StringFlag{ | ||||||
| 			Name:  "file, f", | 			Name:  "file, f", | ||||||
| 			Value: DefaultHelmfile, | 			Value: DefaultHelmfile, | ||||||
|  | @ -74,6 +78,9 @@ func main() { | ||||||
| 					if len(args) > 0 { | 					if len(args) > 0 { | ||||||
| 						helm.SetExtraArgs(args...) | 						helm.SetExtraArgs(args...) | ||||||
| 					} | 					} | ||||||
|  | 					if c.String("helm-binary") != "" { | ||||||
|  | 						helm.SetHelmBinary(c.String("helm-binary")) | ||||||
|  | 					} | ||||||
| 
 | 
 | ||||||
| 					return state.SyncRepos(helm) | 					return state.SyncRepos(helm) | ||||||
| 				}) | 				}) | ||||||
|  | @ -104,6 +111,9 @@ func main() { | ||||||
| 					if len(args) > 0 { | 					if len(args) > 0 { | ||||||
| 						helm.SetExtraArgs(args...) | 						helm.SetExtraArgs(args...) | ||||||
| 					} | 					} | ||||||
|  | 					if c.String("helm-binary") != "" { | ||||||
|  | 						helm.SetHelmBinary(c.String("helm-binary")) | ||||||
|  | 					} | ||||||
| 
 | 
 | ||||||
| 					values := c.StringSlice("values") | 					values := c.StringSlice("values") | ||||||
| 					workers := c.Int("concurrency") | 					workers := c.Int("concurrency") | ||||||
|  | @ -141,6 +151,9 @@ func main() { | ||||||
| 					if len(args) > 0 { | 					if len(args) > 0 { | ||||||
| 						helm.SetExtraArgs(args...) | 						helm.SetExtraArgs(args...) | ||||||
| 					} | 					} | ||||||
|  | 					if c.String("helm-binary") != "" { | ||||||
|  | 						helm.SetHelmBinary(c.String("helm-binary")) | ||||||
|  | 					} | ||||||
| 
 | 
 | ||||||
| 					if c.Bool("sync-repos") { | 					if c.Bool("sync-repos") { | ||||||
| 						if errs := state.SyncRepos(helm); errs != nil && len(errs) > 0 { | 						if errs := state.SyncRepos(helm); errs != nil && len(errs) > 0 { | ||||||
|  | @ -180,6 +193,9 @@ func main() { | ||||||
| 					if len(args) > 0 { | 					if len(args) > 0 { | ||||||
| 						helm.SetExtraArgs(strings.Split(args, " ")...) | 						helm.SetExtraArgs(strings.Split(args, " ")...) | ||||||
| 					} | 					} | ||||||
|  | 					if c.String("helm-binary") != "" { | ||||||
|  | 						helm.SetHelmBinary(c.String("helm-binary")) | ||||||
|  | 					} | ||||||
| 
 | 
 | ||||||
| 					values := c.StringSlice("values") | 					values := c.StringSlice("values") | ||||||
| 					workers := c.Int("concurrency") | 					workers := c.Int("concurrency") | ||||||
|  | @ -221,6 +237,9 @@ func main() { | ||||||
| 					if len(args) > 0 { | 					if len(args) > 0 { | ||||||
| 						helm.SetExtraArgs(args...) | 						helm.SetExtraArgs(args...) | ||||||
| 					} | 					} | ||||||
|  | 					if c.String("helm-binary") != "" { | ||||||
|  | 						helm.SetHelmBinary(c.String("helm-binary")) | ||||||
|  | 					} | ||||||
| 
 | 
 | ||||||
| 					values := c.StringSlice("values") | 					values := c.StringSlice("values") | ||||||
| 					workers := c.Int("concurrency") | 					workers := c.Int("concurrency") | ||||||
|  | @ -252,6 +271,9 @@ func main() { | ||||||
| 					if len(args) > 0 { | 					if len(args) > 0 { | ||||||
| 						helm.SetExtraArgs(args...) | 						helm.SetExtraArgs(args...) | ||||||
| 					} | 					} | ||||||
|  | 					if c.String("helm-binary") != "" { | ||||||
|  | 						helm.SetHelmBinary(c.String("helm-binary")) | ||||||
|  | 					} | ||||||
| 
 | 
 | ||||||
| 					return state.ReleaseStatuses(helm, workers) | 					return state.ReleaseStatuses(helm, workers) | ||||||
| 				}) | 				}) | ||||||
|  | @ -302,6 +324,9 @@ func main() { | ||||||
| 					if len(args) > 0 { | 					if len(args) > 0 { | ||||||
| 						helm.SetExtraArgs(args...) | 						helm.SetExtraArgs(args...) | ||||||
| 					} | 					} | ||||||
|  | 					if c.String("helm-binary") != "" { | ||||||
|  | 						helm.SetHelmBinary(c.String("helm-binary")) | ||||||
|  | 					} | ||||||
| 
 | 
 | ||||||
| 					return state.TestReleases(helm, cleanup, timeout) | 					return state.TestReleases(helm, cleanup, timeout) | ||||||
| 				}) | 				}) | ||||||
|  |  | ||||||
|  | @ -521,6 +521,9 @@ func (helm *mockHelmExec) UpdateDeps(chart string) error { | ||||||
| func (helm *mockHelmExec) SetExtraArgs(args ...string) { | func (helm *mockHelmExec) SetExtraArgs(args ...string) { | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
|  | func (helm *mockHelmExec) SetHelmBinary(bin string) { | ||||||
|  | 	return | ||||||
|  | } | ||||||
| func (helm *mockHelmExec) AddRepo(name, repository, certfile, keyfile, username, password string) error { | func (helm *mockHelmExec) AddRepo(name, repository, certfile, keyfile, username, password string) error { | ||||||
| 	helm.repo = []string{name, repository, certfile, keyfile, username, password} | 	helm.repo = []string{name, repository, certfile, keyfile, username, password} | ||||||
| 	return nil | 	return nil | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue