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 }