mirror of
https://github.com/helm/helm.git
synced 2026-06-30 19:57:48 +00:00
Update to func handling
Signed-off-by: Matt Farina <matt@mattfarina.com>
This commit is contained in:
@@ -101,8 +101,9 @@ type Configuration struct {
|
||||
//
|
||||
// TODO: This function is badly in need of a refactor.
|
||||
// TODO: As part of the refactor the duplicate code in cmd/helm/template.go should be removed
|
||||
// This code has to do with writing files to disk.
|
||||
func (cfg *Configuration) renderResources(ch *chart.Chart, values chartutil.Values, releaseName, outputDir string, subNotes, useReleaseName, includeCrds bool, pr postrender.PostRenderer, dryRun bool) ([]*release.Hook, *bytes.Buffer, string, error) {
|
||||
//
|
||||
// This code has to do with writing files to disk.
|
||||
func (cfg *Configuration) renderResources(ch *chart.Chart, values chartutil.Values, releaseName, outputDir string, subNotes, useReleaseName, includeCrds bool, pr postrender.PostRenderer, dryRun, enableDNS bool) ([]*release.Hook, *bytes.Buffer, string, error) {
|
||||
hs := []*release.Hook{}
|
||||
b := bytes.NewBuffer(nil)
|
||||
|
||||
@@ -130,9 +131,13 @@ func (cfg *Configuration) renderResources(ch *chart.Chart, values chartutil.Valu
|
||||
if err != nil {
|
||||
return hs, b, "", err
|
||||
}
|
||||
files, err2 = engine.RenderWithClient(ch, values, restConfig)
|
||||
e := engine.New(restConfig)
|
||||
e.EnableDNS = enableDNS
|
||||
files, err2 = e.Render(ch, values)
|
||||
} else {
|
||||
files, err2 = engine.Render(ch, values)
|
||||
var e engine.Engine
|
||||
e.EnableDNS = enableDNS
|
||||
files, err2 = e.Render(ch, values)
|
||||
}
|
||||
|
||||
if err2 != nil {
|
||||
|
||||
@@ -97,6 +97,8 @@ type Install struct {
|
||||
APIVersions chartutil.VersionSet
|
||||
// Used by helm template to render charts with .Release.IsUpgrade. Ignored if Dry-Run is false
|
||||
IsUpgrade bool
|
||||
// Enable DNS lookups when rendering templates
|
||||
EnableDNS bool
|
||||
// Used by helm template to add the release as part of OutputDir path
|
||||
// OutputDir/<ReleaseName>
|
||||
UseReleaseName bool
|
||||
@@ -257,7 +259,7 @@ func (i *Install) RunWithContext(ctx context.Context, chrt *chart.Chart, vals ma
|
||||
rel := i.createRelease(chrt, vals)
|
||||
|
||||
var manifestDoc *bytes.Buffer
|
||||
rel.Hooks, manifestDoc, rel.Info.Notes, err = i.cfg.renderResources(chrt, valuesToRender, i.ReleaseName, i.OutputDir, i.SubNotes, i.UseReleaseName, i.IncludeCRDs, i.PostRenderer, i.DryRun)
|
||||
rel.Hooks, manifestDoc, rel.Info.Notes, err = i.cfg.renderResources(chrt, valuesToRender, i.ReleaseName, i.OutputDir, i.SubNotes, i.UseReleaseName, i.IncludeCRDs, i.PostRenderer, i.DryRun, i.EnableDNS)
|
||||
// Even for errors, attach this if available
|
||||
if manifestDoc != nil {
|
||||
rel.Manifest = manifestDoc.String()
|
||||
@@ -457,10 +459,10 @@ func (i *Install) failRelease(rel *release.Release, err error) (*release.Release
|
||||
//
|
||||
// Roughly, this will return an error if name is
|
||||
//
|
||||
// - empty
|
||||
// - too long
|
||||
// - already in use, and not deleted
|
||||
// - used by a deleted release, and i.Replace is false
|
||||
// - empty
|
||||
// - too long
|
||||
// - already in use, and not deleted
|
||||
// - used by a deleted release, and i.Replace is false
|
||||
func (i *Install) availableName() error {
|
||||
start := i.ReleaseName
|
||||
|
||||
|
||||
@@ -103,6 +103,8 @@ type Upgrade struct {
|
||||
DependencyUpdate bool
|
||||
// Lock to control raceconditions when the process receives a SIGTERM
|
||||
Lock sync.Mutex
|
||||
// Enable DNS lookups when rendering templates
|
||||
EnableDNS bool
|
||||
}
|
||||
|
||||
type resultMessage struct {
|
||||
@@ -231,7 +233,7 @@ func (u *Upgrade) prepareUpgrade(name string, chart *chart.Chart, vals map[strin
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
hooks, manifestDoc, notesTxt, err := u.cfg.renderResources(chart, valuesToRender, "", "", u.SubNotes, false, false, u.PostRenderer, u.DryRun)
|
||||
hooks, manifestDoc, notesTxt, err := u.cfg.renderResources(chart, valuesToRender, "", "", u.SubNotes, false, false, u.PostRenderer, u.DryRun, u.EnableDNS)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
@@ -42,6 +42,15 @@ type Engine struct {
|
||||
LintMode bool
|
||||
// the rest config to connect to the kubernetes api
|
||||
config *rest.Config
|
||||
// EnableDNS tells the engine to allow DNS lookups when rendering templates
|
||||
EnableDNS bool
|
||||
}
|
||||
|
||||
// New creates a new instance of Engine using the passed in rest config.
|
||||
func New(config *rest.Config) Engine {
|
||||
return Engine{
|
||||
config: config,
|
||||
}
|
||||
}
|
||||
|
||||
// Render takes a chart, optional values, and value overrides, and attempts to render the Go templates.
|
||||
@@ -189,6 +198,14 @@ func (e Engine) initFunMap(t *template.Template, referenceTpls map[string]render
|
||||
funcMap["lookup"] = NewLookupFunction(e.config)
|
||||
}
|
||||
|
||||
// When DNS lookups are not enabled override the sprig function and return
|
||||
// an empty string.
|
||||
if !e.EnableDNS {
|
||||
funcMap["getHostByName"] = func(name string) string {
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
||||
t.Funcs(funcMap)
|
||||
}
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ package engine
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"path"
|
||||
"strings"
|
||||
"sync"
|
||||
"testing"
|
||||
@@ -89,6 +90,7 @@ func TestRender(t *testing.T) {
|
||||
{Name: "templates/test2", Data: []byte("{{.Values.global.callme | lower }}")},
|
||||
{Name: "templates/test3", Data: []byte("{{.noValue}}")},
|
||||
{Name: "templates/test4", Data: []byte("{{toJson .Values}}")},
|
||||
{Name: "templates/test5", Data: []byte("{{getHostByName \"helm.sh\"}}")},
|
||||
},
|
||||
Values: map[string]interface{}{"outer": "DEFAULT", "inner": "DEFAULT"},
|
||||
}
|
||||
@@ -117,6 +119,7 @@ func TestRender(t *testing.T) {
|
||||
"moby/templates/test2": "ishmael",
|
||||
"moby/templates/test3": "",
|
||||
"moby/templates/test4": `{"global":{"callme":"Ishmael"},"inner":"inn","outer":"spouter"}`,
|
||||
"moby/templates/test5": "",
|
||||
}
|
||||
|
||||
for name, data := range expect {
|
||||
@@ -200,6 +203,42 @@ func TestRenderInternals(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestRenderWIthDNS(t *testing.T) {
|
||||
c := &chart.Chart{
|
||||
Metadata: &chart.Metadata{
|
||||
Name: "moby",
|
||||
Version: "1.2.3",
|
||||
},
|
||||
Templates: []*chart.File{
|
||||
{Name: "templates/test1", Data: []byte("{{getHostByName \"helm.sh\"}}")},
|
||||
},
|
||||
Values: map[string]interface{}{},
|
||||
}
|
||||
|
||||
vals := map[string]interface{}{
|
||||
"Values": map[string]interface{}{},
|
||||
}
|
||||
|
||||
v, err := chartutil.CoalesceValues(c, vals)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to coalesce values: %s", err)
|
||||
}
|
||||
|
||||
var e Engine
|
||||
e.EnableDNS = true
|
||||
out, err := e.Render(c, v)
|
||||
if err != nil {
|
||||
t.Errorf("Failed to render templates: %s", err)
|
||||
}
|
||||
|
||||
for _, val := range c.Templates {
|
||||
fp := path.Join("moby", val.Name)
|
||||
if out[fp] == "" {
|
||||
t.Errorf("Expected IP address, got %q", out[fp])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestParallelRenderInternals(t *testing.T) {
|
||||
// Make sure that we can use one Engine to run parallel template renders.
|
||||
e := new(Engine)
|
||||
|
||||
Reference in New Issue
Block a user