github.com/darkowlzz/helm@v2.5.1-0.20171213183701-6707fe0468d4+incompatible/pkg/tiller/release_uninstall.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 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 rel.Info.Description = "Deletion complete" 101 102 if req.Purge { 103 s.Log("purge requested for %s", req.Name) 104 err := s.purgeReleases(rels...) 105 if err != nil { 106 s.Log("uninstall: Failed to purge the release: %s", err) 107 } 108 return res, err 109 } 110 111 if err := s.env.Releases.Update(rel); err != nil { 112 s.Log("uninstall: Failed to store updated release: %s", err) 113 } 114 115 if len(es) > 0 { 116 return res, fmt.Errorf("deletion completed with %d error(s): %s", len(es), strings.Join(es, "; ")) 117 } 118 return res, nil 119 } 120 121 func (s *ReleaseServer) purgeReleases(rels ...*release.Release) error { 122 for _, rel := range rels { 123 if _, err := s.env.Releases.Delete(rel.Name, rel.Version); err != nil { 124 return err 125 } 126 } 127 return nil 128 }