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  }