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 }