mirror of
https://github.com/helmfile/helmfile.git
synced 2026-10-01 03:58:07 +02:00
This feature is supposed to help advanced use-cases like Conventional Directory Structure explained in several issues like #428. Newly added configuration keys `templates`, `missingFileHandler`, and the ability to defer executing template expressions in `values`, `secrets`, `namespace`, and `chart` of releases allows you to abstract away repetitions into a reusable template: ```yaml templates: default: &default missingFileHandler: Warn namespace: "{{`{{ .Release.Name }}`}}" chart: stable/{{`{{ .Release.Name }}`}} values: - config/{{`{{ .Release.Name }}`}}/values.yaml - config/{{`{{ .Release.Name }}`}}/{{`{{ .Environment.Name }}`}}.yaml secrets: - config/{{`{{ .Release.Name }}`}}/secrets.yaml - config/{{`{{ .Release.Name }}`}}/{{`{{ .Environment.Name }}`}}-secrets.yaml releases: - name: envoy <<: *default ``` See the updated documentation for more details. Resolves #428
70 lines
1.9 KiB
Go
70 lines
1.9 KiB
Go
package state
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/roboll/helmfile/tmpl"
|
|
"gopkg.in/yaml.v2"
|
|
)
|
|
|
|
func (r ReleaseSpec) ExecuteTemplateExpressions(renderer *tmpl.FileRenderer) (*ReleaseSpec, error) {
|
|
var result *ReleaseSpec
|
|
var err error
|
|
|
|
result, err = r.Clone()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed executing template expressions in release \"%s\": %v", r.Name, err)
|
|
}
|
|
|
|
{
|
|
ts := result.Chart
|
|
result.Chart, err = renderer.RenderTemplateContentToString([]byte(ts))
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed executing template expressions in release \"%s\".chart = \"%s\": %v", r.Name, ts, err)
|
|
}
|
|
}
|
|
|
|
{
|
|
ts := result.Namespace
|
|
result.Namespace, err = renderer.RenderTemplateContentToString([]byte(ts))
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed executing template expressions in release \"%s\".namespace = \"%s\": %v", r.Name, ts, err)
|
|
}
|
|
}
|
|
|
|
for i, t := range result.Values {
|
|
switch ts := t.(type) {
|
|
case string:
|
|
s, err := renderer.RenderTemplateContentToBuffer([]byte(ts))
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed executing template expressions in release \"%s\".values[%d] = \"%s\": %v", r.Name, i, ts, err)
|
|
}
|
|
result.Values[i] = s.String()
|
|
}
|
|
}
|
|
|
|
for i, ts := range result.Secrets {
|
|
s, err := renderer.RenderTemplateContentToBuffer([]byte(ts))
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed executing template expressions in release \"%s\".secrets[%d] = \"%s\": %v", r.Name, i, ts, err)
|
|
}
|
|
result.Secrets[i] = s.String()
|
|
}
|
|
|
|
return result, nil
|
|
}
|
|
|
|
func (r ReleaseSpec) Clone() (*ReleaseSpec, error) {
|
|
serialized, err := yaml.Marshal(r)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed cloning release \"%s\": %v", r.Name, err)
|
|
}
|
|
|
|
var deserialized ReleaseSpec
|
|
|
|
if err := yaml.Unmarshal(serialized, &deserialized); err != nil {
|
|
return nil, fmt.Errorf("failed cloning release \"%s\": %v", r.Name, err)
|
|
}
|
|
|
|
return &deserialized, nil
|
|
}
|