github.com/helmwave/helmwave@v0.36.4-0.20240509190856-b35563eba4c6/pkg/release/interface.go (about)

     1  package release
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"slices"
     7  
     8  	"github.com/helmwave/helmwave/pkg/helper"
     9  	"github.com/helmwave/helmwave/pkg/log"
    10  	"github.com/helmwave/helmwave/pkg/monitor"
    11  	"github.com/helmwave/helmwave/pkg/release/uniqname"
    12  	"github.com/invopop/jsonschema"
    13  	"gopkg.in/yaml.v3"
    14  	"helm.sh/helm/v3/pkg/action"
    15  	"helm.sh/helm/v3/pkg/chartutil"
    16  	"helm.sh/helm/v3/pkg/release"
    17  )
    18  
    19  // Config is an interface to manage particular helm release.
    20  type Config interface {
    21  	log.LoggerGetter
    22  	HelmActionRunner
    23  
    24  	Uniq() uniqname.UniqName
    25  	AllowFailure() bool
    26  	DryRun(dryRun bool)
    27  	ChartDepsUpd() error
    28  	DownloadChart(tmpDir string) error
    29  	BuildValues(ctx context.Context, dir, templater string) error
    30  	Name() string
    31  	Namespace() string
    32  	Chart() *Chart
    33  	SetChartName(string)
    34  	DependsOn() []*DependsOnReference
    35  	SetDependsOn(deps []*DependsOnReference)
    36  	Tags() []string
    37  	Repo() string
    38  	Values() []ValuesReference
    39  	HelmWait() bool
    40  	KubeContext() string
    41  	Cfg() *action.Configuration
    42  	HooksDisabled() bool
    43  	OfflineKubeVersion() *chartutil.KubeVersion
    44  	Validate() error
    45  	Monitors() []MonitorReference
    46  	NotifyMonitorsFailed(ctx context.Context, monitors ...monitor.Config)
    47  }
    48  
    49  type HelmActionRunner interface {
    50  	SyncDryRun(ctx context.Context, runHooks bool) (*release.Release, error)
    51  	Sync(ctx context.Context, runHooks bool) (*release.Release, error)
    52  	Uninstall(ctx context.Context) (*release.UninstallReleaseResponse, error)
    53  	Get(version int) (*release.Release, error)
    54  	List() (*release.Release, error)
    55  	Rollback(ctx context.Context, version int) error
    56  	Status() (*release.Release, error)
    57  }
    58  
    59  // Configs type of array Config.
    60  type Configs []Config
    61  
    62  // UnmarshalYAML is an unmarshaller for gopkg.in/yaml.v3 to parse YAML into `Config` interface.
    63  func (r *Configs) UnmarshalYAML(node *yaml.Node) error {
    64  	rr := make([]*config, 0)
    65  	if err := node.Decode(&rr); err != nil {
    66  		return fmt.Errorf("failed to decode release config from YAML: %w", err)
    67  	}
    68  
    69  	*r = helper.SlicesMap(rr, func(r *config) Config {
    70  		r.buildAfterUnmarshal(rr)
    71  
    72  		return r
    73  	})
    74  
    75  	return nil
    76  }
    77  
    78  func (Configs) JSONSchema() *jsonschema.Schema {
    79  	r := &jsonschema.Reflector{
    80  		DoNotReference:             true,
    81  		RequiredFromJSONSchemaTags: true,
    82  	}
    83  	var l []*config
    84  
    85  	return r.Reflect(&l)
    86  }
    87  
    88  func (r Configs) Contains(rel Config) (Config, bool) {
    89  	return r.ContainsUniq(rel.Uniq())
    90  }
    91  
    92  func (r Configs) ContainsUniq(uniq uniqname.UniqName) (Config, bool) {
    93  	i := slices.IndexFunc(r, func(rel Config) bool {
    94  		return rel.Uniq().Equal(uniq)
    95  	})
    96  
    97  	if i == -1 {
    98  		return nil, false
    99  	}
   100  
   101  	return r[i], true
   102  }