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