github.com/werf/3p-helm@v2.8.1+incompatible/cmd/helm/reset.go (about) 1 /* 2 Copyright 2016 The Kubernetes Authors All rights reserved. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package main 18 19 import ( 20 "errors" 21 "fmt" 22 "io" 23 "os" 24 25 "github.com/spf13/cobra" 26 "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" 27 28 "k8s.io/helm/cmd/helm/installer" 29 "k8s.io/helm/pkg/helm" 30 "k8s.io/helm/pkg/helm/helmpath" 31 "k8s.io/helm/pkg/proto/hapi/release" 32 ) 33 34 const resetDesc = ` 35 This command uninstalls Tiller (the Helm server-side component) from your 36 Kubernetes Cluster and optionally deletes local configuration in 37 $HELM_HOME (default ~/.helm/) 38 ` 39 40 type resetCmd struct { 41 force bool 42 removeHelmHome bool 43 namespace string 44 out io.Writer 45 home helmpath.Home 46 client helm.Interface 47 kubeClient internalclientset.Interface 48 } 49 50 func newResetCmd(client helm.Interface, out io.Writer) *cobra.Command { 51 d := &resetCmd{ 52 out: out, 53 client: client, 54 } 55 56 cmd := &cobra.Command{ 57 Use: "reset", 58 Short: "uninstalls Tiller from a cluster", 59 Long: resetDesc, 60 PreRunE: func(cmd *cobra.Command, args []string) error { 61 if err := setupConnection(cmd, args); !d.force && err != nil { 62 return err 63 } 64 return nil 65 }, 66 RunE: func(cmd *cobra.Command, args []string) error { 67 if len(args) != 0 { 68 return errors.New("This command does not accept arguments") 69 } 70 71 d.namespace = settings.TillerNamespace 72 d.home = settings.Home 73 d.client = ensureHelmClient(d.client) 74 75 return d.run() 76 }, 77 } 78 79 f := cmd.Flags() 80 f.BoolVarP(&d.force, "force", "f", false, "forces Tiller uninstall even if there are releases installed, or if Tiller is not in ready state") 81 f.BoolVar(&d.removeHelmHome, "remove-helm-home", false, "if set deletes $HELM_HOME") 82 83 return cmd 84 } 85 86 // runReset uninstalls tiller from Kubernetes Cluster and deletes local config 87 func (d *resetCmd) run() error { 88 if d.kubeClient == nil { 89 c, err := getInternalKubeClient(settings.KubeContext) 90 if err != nil { 91 return fmt.Errorf("could not get kubernetes client: %s", err) 92 } 93 d.kubeClient = c 94 } 95 96 res, err := d.client.ListReleases( 97 helm.ReleaseListStatuses([]release.Status_Code{release.Status_DEPLOYED}), 98 ) 99 if !d.force && err != nil { 100 return prettyError(err) 101 } 102 103 if !d.force && res != nil && len(res.Releases) > 0 { 104 return fmt.Errorf("there are still %d deployed releases (Tip: use --force)", len(res.Releases)) 105 } 106 107 if err := installer.Uninstall(d.kubeClient, &installer.Options{Namespace: d.namespace}); err != nil { 108 return fmt.Errorf("error unstalling Tiller: %s", err) 109 } 110 111 if d.removeHelmHome { 112 if err := deleteDirectories(d.home, d.out); err != nil { 113 return err 114 } 115 } 116 117 fmt.Fprintln(d.out, "Tiller (the Helm server-side component) has been uninstalled from your Kubernetes Cluster.") 118 return nil 119 } 120 121 // deleteDirectories deletes $HELM_HOME 122 func deleteDirectories(home helmpath.Home, out io.Writer) error { 123 if _, err := os.Stat(home.String()); err == nil { 124 fmt.Fprintf(out, "Deleting %s \n", home.String()) 125 if err := os.RemoveAll(home.String()); err != nil { 126 return fmt.Errorf("Could not remove %s: %s", home.String(), err) 127 } 128 } 129 130 return nil 131 }