Skip to content

Commit

Permalink
Merge pull request #5559 from steven-sheehy/downloader-subcommands
Browse files Browse the repository at this point in the history
Add sub-command support to plugin downloader
  • Loading branch information
thomastaylor312 committed Jul 8, 2019
2 parents 9b1d8f9 + cff2746 commit 4cbbd10
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 2 deletions.
5 changes: 5 additions & 0 deletions docs/plugins.md
Expand Up @@ -144,6 +144,11 @@ The defined command will be invoked with the following scheme:
repo definition, stored in `$HELM_HOME/repository/repositories.yaml`. Downloader repo definition, stored in `$HELM_HOME/repository/repositories.yaml`. Downloader
plugin is expected to dump the raw content to stdout and report errors on stderr. plugin is expected to dump the raw content to stdout and report errors on stderr.


The downloader command also supports sub-commands or arguments, allowing you to specify
for example `bin/mydownloader subcommand -d` in the `plugin.yaml`. This is useful
if you want to use the same executable for the main plugin command and the downloader
command, but with a different sub-command for each.

## Environment Variables ## Environment Variables


When Helm executes a plugin, it passes the outer environment to the plugin, and When Helm executes a plugin, it passes the outer environment to the plugin, and
Expand Down
6 changes: 4 additions & 2 deletions pkg/getter/plugingetter.go
Expand Up @@ -21,6 +21,7 @@ import (
"os" "os"
"os/exec" "os/exec"
"path/filepath" "path/filepath"
"strings"


"k8s.io/helm/pkg/helm/environment" "k8s.io/helm/pkg/helm/environment"
"k8s.io/helm/pkg/plugin" "k8s.io/helm/pkg/plugin"
Expand Down Expand Up @@ -62,8 +63,9 @@ type pluginGetter struct {


// Get runs downloader plugin command // Get runs downloader plugin command
func (p *pluginGetter) Get(href string) (*bytes.Buffer, error) { func (p *pluginGetter) Get(href string) (*bytes.Buffer, error) {
argv := []string{p.certFile, p.keyFile, p.cAFile, href} commands := strings.Split(p.command, " ")
prog := exec.Command(filepath.Join(p.base, p.command), argv...) argv := append(commands[1:], p.certFile, p.keyFile, p.cAFile, href)
prog := exec.Command(filepath.Join(p.base, commands[0]), argv...)
plugin.SetupPluginEnv(p.settings, p.name, p.base) plugin.SetupPluginEnv(p.settings, p.name, p.base)
prog.Env = os.Environ() prog.Env = os.Environ()
buf := bytes.NewBuffer(nil) buf := bytes.NewBuffer(nil)
Expand Down
27 changes: 27 additions & 0 deletions pkg/getter/plugingetter_test.go
Expand Up @@ -94,3 +94,30 @@ func TestPluginGetter(t *testing.T) {
t.Errorf("Expected %q, got %q", expect, got) t.Errorf("Expected %q, got %q", expect, got)
} }
} }
func TestPluginSubCommands(t *testing.T) {
if runtime.GOOS == "windows" {
t.Skip("TODO: refactor this test to work on windows")
}

oldhh := os.Getenv("HELM_HOME")
defer os.Setenv("HELM_HOME", oldhh)
os.Setenv("HELM_HOME", "")

env := hh(false)
pg := newPluginGetter("echo -n", env, "test", ".")
g, err := pg("test://foo/bar", "", "", "")
if err != nil {
t.Fatal(err)
}

data, err := g.Get("test://foo/bar")
if err != nil {
t.Fatal(err)
}

expect := " test://foo/bar"
got := data.String()
if got != expect {
t.Errorf("Expected %q, got %q", expect, got)
}
}

0 comments on commit 4cbbd10

Please sign in to comment.