github.com/telepresenceio/telepresence/v2@v2.20.0-pro.6.0.20240517030216-236ea954e789/pkg/client/cli/helm/release.go (about) 1 package helm 2 3 import ( 4 "context" 5 "strings" 6 "time" 7 8 "helm.sh/helm/v3/pkg/action" 9 "helm.sh/helm/v3/pkg/release" 10 ) 11 12 // getHelmRelease gets the traffic-manager helm release; if it is not found, it will return nil. 13 func getHelmRelease(ctx context.Context, releaseName string, helmConfig *action.Configuration) (*release.Release, error) { 14 list := action.NewList(helmConfig) 15 list.Deployed = true 16 list.Failed = true 17 list.Pending = true 18 list.Uninstalled = true 19 list.Uninstalling = true 20 list.SetStateMask() 21 var releases []*release.Release 22 err := timedRun(ctx, func(timeout time.Duration) error { 23 // The List command never times out, so we need to do it here. 24 type rs struct { 25 err error 26 rs []*release.Release 27 } 28 doneCh := make(chan rs) 29 go func() { 30 rels, err := list.Run() 31 doneCh <- rs{err: err, rs: rels} 32 close(doneCh) 33 }() 34 ctx, cancel := context.WithTimeout(ctx, timeout) 35 defer cancel() 36 37 select { 38 case <-ctx.Done(): 39 return ctx.Err() 40 case rr := <-doneCh: 41 if rr.err != nil { 42 return rr.err 43 } 44 releases = rr.rs 45 return nil 46 } 47 }) 48 if err != nil { 49 return nil, err 50 } 51 for _, r := range releases { 52 if r.Name == releaseName { 53 return r, nil 54 } 55 } 56 return nil, nil 57 } 58 59 func releaseVer(rel *release.Release) string { 60 return strings.TrimPrefix(rel.Chart.Metadata.Version, "v") 61 }