diff --git a/cmd/helm/plugin_remove.go b/cmd/helm/plugin_remove.go index da2041f89..e7e522d51 100644 --- a/cmd/helm/plugin_remove.go +++ b/cmd/helm/plugin_remove.go @@ -16,9 +16,11 @@ limitations under the License. package main import ( + "errors" "fmt" "io" "os" + "strings" "k8s.io/helm/pkg/helm/helmpath" "k8s.io/helm/pkg/plugin" @@ -48,8 +50,8 @@ func newPluginRemoveCmd(out io.Writer) *cobra.Command { } func (pcmd *pluginRemoveCmd) complete(args []string) error { - if err := checkArgsLength(len(args), "plugin"); err != nil { - return err + if len(args) == 0 { + return errors.New("please provide plugin name to remove") } pcmd.names = args pcmd.home = settings.Home @@ -63,15 +65,21 @@ func (pcmd *pluginRemoveCmd) run() error { if err != nil { return err } - + var errorPlugins []string for _, name := range pcmd.names { if found := findPlugin(plugins, name); found != nil { if err := removePlugin(found, pcmd.home); err != nil { - return err + errorPlugins = append(errorPlugins, fmt.Sprintf("Failed to remove plugin %s, got error (%v)", name, err)) + } else { + fmt.Fprintf(pcmd.out, "Removed plugin: %s\n", name) } - fmt.Fprintf(pcmd.out, "Removed plugin: %s\n", name) + } else { + errorPlugins = append(errorPlugins, fmt.Sprintf("Plugin: %s not found", name)) } } + if len(errorPlugins) > 0 { + return fmt.Errorf(strings.Join(errorPlugins, "\n")) + } return nil } diff --git a/pkg/plugin/installer/installer.go b/pkg/plugin/installer/installer.go index 31ef9ae53..8da6e24e5 100644 --- a/pkg/plugin/installer/installer.go +++ b/pkg/plugin/installer/installer.go @@ -40,6 +40,10 @@ type Installer interface { // Install installs a plugin to $HELM_HOME. func Install(i Installer) error { + if _, pathErr := os.Stat(i.Path()); !os.IsNotExist(pathErr) { + return errors.New("plugin already exists") + } + return i.Install() } diff --git a/pkg/plugin/installer/local_installer_test.go b/pkg/plugin/installer/local_installer_test.go index a2a1b541c..6a7c957d6 100644 --- a/pkg/plugin/installer/local_installer_test.go +++ b/pkg/plugin/installer/local_installer_test.go @@ -31,7 +31,7 @@ func TestLocalInstaller(t *testing.T) { if err != nil { t.Fatal(err) } - defer os.Remove(hh) + defer os.RemoveAll(hh) home := helmpath.Home(hh) if err := os.MkdirAll(home.Plugins(), 0755); err != nil { @@ -43,7 +43,7 @@ func TestLocalInstaller(t *testing.T) { if err != nil { t.Fatal(err) } - defer os.Remove(tdir) + defer os.RemoveAll(tdir) if err := ioutil.WriteFile(filepath.Join(tdir, "plugin.yaml"), []byte{}, 0644); err != nil { t.Fatal(err) } diff --git a/pkg/plugin/installer/vcs_installer.go b/pkg/plugin/installer/vcs_installer.go index ce7a93b83..f9f181662 100644 --- a/pkg/plugin/installer/vcs_installer.go +++ b/pkg/plugin/installer/vcs_installer.go @@ -16,6 +16,7 @@ limitations under the License. package installer // import "k8s.io/helm/pkg/plugin/installer" import ( + "fmt" "os" "sort" @@ -112,7 +113,8 @@ func (i *VCSInstaller) solveVersion(repo vcs.Repo) (string, error) { return ver, nil } } - return "", nil + + return "", fmt.Errorf("requested version %q does not exist for plugin %q", i.Version, i.Repo.Remote()) } // setVersion attempts to checkout the version diff --git a/pkg/plugin/installer/vcs_installer_test.go b/pkg/plugin/installer/vcs_installer_test.go index e340bbe5a..081598c7c 100644 --- a/pkg/plugin/installer/vcs_installer_test.go +++ b/pkg/plugin/installer/vcs_installer_test.go @@ -16,8 +16,10 @@ limitations under the License. package installer // import "k8s.io/helm/pkg/plugin/installer" import ( + "fmt" "io/ioutil" "os" + "path/filepath" "testing" "k8s.io/helm/pkg/helm/helmpath" @@ -51,7 +53,7 @@ func TestVCSInstaller(t *testing.T) { if err != nil { t.Fatal(err) } - defer os.Remove(hh) + defer os.RemoveAll(hh) home := helmpath.Home(hh) if err := os.MkdirAll(home.Plugins(), 0755); err != nil { @@ -59,8 +61,9 @@ func TestVCSInstaller(t *testing.T) { } source := "https://github.com/adamreese/helm-env" + testRepoPath, _ := filepath.Abs("../testdata/plugdir/echo") repo := &testRepo{ - local: "../testdata/plugdir/echo", + local: testRepoPath, tags: []string{"0.1.0", "0.1.1"}, } @@ -87,4 +90,44 @@ func TestVCSInstaller(t *testing.T) { if i.Path() != home.Path("plugins", "helm-env") { t.Errorf("expected path '$HELM_HOME/plugins/helm-env', got %q", i.Path()) } + + // Install again to test plugin exists error + if err := Install(i); err == nil { + t.Error("expected error for plugin exists, got none") + } else if err.Error() != "plugin already exists" { + t.Errorf("expected error for plugin exists, got (%v)", err) + } +} + +func TestVCSInstallerNonExistentVersion(t *testing.T) { + hh, err := ioutil.TempDir("", "helm-home-") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(hh) + + home := helmpath.Home(hh) + if err := os.MkdirAll(home.Plugins(), 0755); err != nil { + t.Fatalf("Could not create %s: %s", home.Plugins(), err) + } + + source := "https://github.com/adamreese/helm-env" + version := "0.2.0" + + i, err := NewForSource(source, version, home) + if err != nil { + t.Errorf("unexpected error: %s", err) + } + + // ensure a VCSInstaller was returned + _, ok := i.(*VCSInstaller) + if !ok { + t.Error("expected a VCSInstaller") + } + + if err := Install(i); err == nil { + t.Error("expected error for version does not exists, got none") + } else if err.Error() != fmt.Sprintf("requested version %q does not exist for plugin %q", version, source) { + t.Errorf("expected error for version does not exists, got (%v)", err) + } }