github.com/latiif/helm@v2.15.0+incompatible/cmd/helm/reset.go (about) 1 /* 2 Copyright The Helm Authors. 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 "strings" 25 26 "github.com/spf13/cobra" 27 28 "k8s.io/client-go/kubernetes" 29 30 "k8s.io/helm/cmd/helm/installer" 31 "k8s.io/helm/pkg/helm" 32 "k8s.io/helm/pkg/helm/helmpath" 33 "k8s.io/helm/pkg/proto/hapi/release" 34 ) 35 36 const resetDesc = ` 37 This command uninstalls Tiller (the Helm server-side component) from your 38 Kubernetes Cluster and optionally deletes local configuration in 39 $HELM_HOME (default ~/.helm/) 40 ` 41 42 type resetCmd struct { 43 force bool 44 removeHelmHome bool 45 namespace string 46 out io.Writer 47 home helmpath.Home 48 client helm.Interface 49 kubeClient kubernetes.Interface 50 } 51 52 func newResetCmd(client helm.Interface, out io.Writer) *cobra.Command { 53 d := &resetCmd{ 54 out: out, 55 client: client, 56 } 57 58 cmd := &cobra.Command{ 59 Use: "reset", 60 Short: "Uninstalls Tiller from a cluster", 61 Long: resetDesc, 62 PreRunE: func(cmd *cobra.Command, args []string) error { 63 err := setupConnection() 64 if !d.force && err != nil { 65 return err 66 } 67 if d.force && err != nil && strings.EqualFold(err.Error(), "could not find tiller") { 68 return err 69 } 70 return nil 71 }, 72 RunE: func(cmd *cobra.Command, args []string) error { 73 if len(args) != 0 { 74 return errors.New("This command does not accept arguments") 75 } 76 77 d.namespace = settings.TillerNamespace 78 d.home = settings.Home 79 d.client = ensureHelmClient(d.client) 80 81 return d.run() 82 }, 83 } 84 85 f := cmd.Flags() 86 settings.AddFlagsTLS(f) 87 f.BoolVarP(&d.force, "force", "f", false, "Forces Tiller uninstall even if there are releases installed, or if Tiller is not in ready state. Releases are not deleted.)") 88 f.BoolVar(&d.removeHelmHome, "remove-helm-home", false, "If set, deletes $HELM_HOME") 89 90 // set defaults from environment 91 settings.InitTLS(f) 92 93 return cmd 94 } 95 96 // runReset uninstalls tiller from Kubernetes Cluster and deletes local config 97 func (d *resetCmd) run() error { 98 if d.kubeClient == nil { 99 _, c, err := getKubeClient(settings.KubeContext, settings.KubeConfig) 100 if err != nil { 101 return fmt.Errorf("could not get kubernetes client: %s", err) 102 } 103 d.kubeClient = c 104 } 105 106 res, err := d.client.ListReleases( 107 helm.ReleaseListStatuses([]release.Status_Code{release.Status_DEPLOYED}), 108 ) 109 if !d.force && err != nil { 110 return prettyError(err) 111 } 112 113 if !d.force && res != nil && len(res.Releases) > 0 { 114 return fmt.Errorf("there are still %d deployed releases (Tip: use --force to remove Tiller. Releases will not be deleted.)", len(res.Releases)) 115 } 116 117 if err := installer.Uninstall(d.kubeClient, &installer.Options{Namespace: d.namespace}); err != nil { 118 return fmt.Errorf("error uninstalling Tiller: %s", err) 119 } 120 121 if d.removeHelmHome { 122 if err := deleteDirectories(d.home, d.out); err != nil { 123 return err 124 } 125 } 126 127 fmt.Fprintln(d.out, "Tiller (the Helm server-side component) has been uninstalled from your Kubernetes Cluster.") 128 return nil 129 } 130 131 // deleteDirectories deletes $HELM_HOME 132 func deleteDirectories(home helmpath.Home, out io.Writer) error { 133 if _, err := os.Stat(home.String()); err == nil { 134 fmt.Fprintf(out, "Deleting %s \n", home.String()) 135 if err := os.RemoveAll(home.String()); err != nil { 136 return fmt.Errorf("Could not remove %s: %s", home.String(), err) 137 } 138 } 139 140 return nil 141 }