github.com/koderover/helm@v2.17.0+incompatible/pkg/tiller/release_uninstall.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 tiller
    18  
    19  import (
    20  	"fmt"
    21  	"strings"
    22  
    23  	ctx "golang.org/x/net/context"
    24  
    25  	"k8s.io/helm/pkg/hooks"
    26  	"k8s.io/helm/pkg/proto/hapi/release"
    27  	"k8s.io/helm/pkg/proto/hapi/services"
    28  	relutil "k8s.io/helm/pkg/releaseutil"
    29  	"k8s.io/helm/pkg/timeconv"
    30  )
    31  
    32  // UninstallRelease deletes all of the resources associated with this release, and marks the release DELETED.
    33  func (s *ReleaseServer) UninstallRelease(c ctx.Context, req *services.UninstallReleaseRequest) (*services.UninstallReleaseResponse, error) {
    34  	if err := validateReleaseName(req.Name); err != nil {
    35  		s.Log("uninstallRelease: Release name is invalid: %s", req.Name)
    36  		return nil, err
    37  	}
    38  
    39  	rels, err := s.env.Releases.History(req.Name)
    40  	if err != nil {
    41  		s.Log("uninstall: Release not loaded: %s", req.Name)
    42  		return nil, err
    43  	}
    44  	if len(rels) < 1 {
    45  		return nil, errMissingRelease
    46  	}
    47  
    48  	relutil.SortByRevision(rels)
    49  	rel := rels[len(rels)-1]
    50  
    51  	// TODO: Are there any cases where we want to force a delete even if it's
    52  	// already marked deleted?
    53  	if rel.Info.Status.Code == release.Status_DELETED {
    54  		if req.Purge {
    55  			if err := s.purgeReleases(rels...); err != nil {
    56  				s.Log("uninstall: Failed to purge the release: %s", err)
    57  				return nil, err
    58  			}
    59  			return &services.UninstallReleaseResponse{Release: rel}, nil
    60  		}
    61  		return nil, fmt.Errorf("the release named %q is already deleted", req.Name)
    62  	}
    63  
    64  	s.Log("uninstall: Deleting %s", req.Name)
    65  	rel.Info.Status.Code = release.Status_DELETING
    66  	rel.Info.Deleted = timeconv.Now()
    67  	rel.Info.Description = "Deletion in progress (or silently failed)"
    68  	res := &services.UninstallReleaseResponse{Release: rel}
    69  
    70  	if !req.DisableHooks {
    71  		if err := s.execHook(rel.Hooks, rel.Name, rel.Namespace, hooks.PreDelete, req.Timeout); err != nil {
    72  			return res, err
    73  		}
    74  	} else {
    75  		s.Log("delete hooks disabled for %s", req.Name)
    76  	}
    77  
    78  	// From here on out, the release is currently considered to be in Status_DELETING
    79  	// state.
    80  	if err := s.env.Releases.Update(rel); err != nil {
    81  		s.Log("uninstall: Failed to store updated release: %s", err)
    82  	}
    83  
    84  	kept, errs := s.ReleaseModule.Delete(rel, req, s.env)
    85  	res.Info = kept
    86  
    87  	es := make([]string, 0, len(errs))
    88  	for _, e := range errs {
    89  		s.Log("error: %v", e)
    90  		es = append(es, e.Error())
    91  	}
    92  
    93  	if !req.DisableHooks {
    94  		if err := s.execHook(rel.Hooks, rel.Name, rel.Namespace, hooks.PostDelete, req.Timeout); err != nil {
    95  			es = append(es, err.Error())
    96  		}
    97  	}
    98  
    99  	rel.Info.Status.Code = release.Status_DELETED
   100  	if req.Description == "" {
   101  		rel.Info.Description = "Deletion complete"
   102  	} else {
   103  		rel.Info.Description = req.Description
   104  	}
   105  
   106  	if req.Purge {
   107  		s.Log("purge requested for %s", req.Name)
   108  		err := s.purgeReleases(rels...)
   109  		if err != nil {
   110  			s.Log("uninstall: Failed to purge the release: %s", err)
   111  		}
   112  		return res, err
   113  	}
   114  
   115  	if err := s.env.Releases.Update(rel); err != nil {
   116  		s.Log("uninstall: Failed to store updated release: %s", err)
   117  	}
   118  
   119  	if len(es) > 0 {
   120  		return res, fmt.Errorf("deletion completed with %d error(s): %s", len(es), strings.Join(es, "; "))
   121  	}
   122  	return res, nil
   123  }
   124  
   125  func (s *ReleaseServer) purgeReleases(rels ...*release.Release) error {
   126  	for _, rel := range rels {
   127  		if _, err := s.env.Releases.Delete(rel.Name, rel.Version); err != nil {
   128  			return err
   129  		}
   130  	}
   131  	return nil
   132  }