github.com/darkowlzz/helm@v2.5.1-0.20171213183701-6707fe0468d4+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  }