github.com/defensepoint-snyk-test/helm-new@v0.0.0-20211130153739-c57ea64d6603/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  }