github.com/koderover/helm@v2.17.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  }