Skip to content

Commit 0a5260b

Browse files
committed
Add support to render template from string
Signed-off-by: Ivan Kolodiazhnyi <[email protected]>
1 parent eb2fa5f commit 0a5260b

File tree

2 files changed

+32
-22
lines changed

2 files changed

+32
-22
lines changed

pkg/render/render.go

+25-15
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ func RenderDir(manifestDir string, d *RenderData) ([]*unstructured.Unstructured,
6464
return nil
6565
}
6666

67-
objs, err := RenderTemplate(path, d)
67+
objs, err := RenderFileTemplate(path, d)
6868
if err != nil {
6969
return err
7070
}
@@ -77,10 +77,14 @@ func RenderDir(manifestDir string, d *RenderData) ([]*unstructured.Unstructured,
7777
return out, nil
7878
}
7979

80-
// RenderTemplate reads, renders, and attempts to parse a yaml or
80+
func RenderTemplate(template string, d *RenderData) (*bytes.Buffer, error) {
81+
return renderTemplate(template, d)
82+
}
83+
84+
// RenderFileTemplate reads, renders, and attempts to parse a yaml or
8185
// json file representing one or more k8s api objects
82-
func RenderTemplate(path string, d *RenderData) ([]*unstructured.Unstructured, error) {
83-
rendered, err := renderTemplate(path, d)
86+
func RenderFileTemplate(path string, d *RenderData) ([]*unstructured.Unstructured, error) {
87+
rendered, err := renderFileTemplate(path, d)
8488
if err != nil {
8589
return nil, err
8690
}
@@ -112,8 +116,9 @@ func RenderTemplate(path string, d *RenderData) ([]*unstructured.Unstructured, e
112116
return out, nil
113117
}
114118

115-
func renderTemplate(path string, d *RenderData) (*bytes.Buffer, error) {
116-
tmpl := template.New(path).Option("missingkey=error")
119+
func renderTemplate(rawTemplate string, d *RenderData) (*bytes.Buffer, error) {
120+
121+
tmpl := template.New("template").Option("missingkey=error")
117122
if d.Funcs != nil {
118123
tmpl.Funcs(d.Funcs)
119124
}
@@ -122,23 +127,28 @@ func renderTemplate(path string, d *RenderData) (*bytes.Buffer, error) {
122127
tmpl.Funcs(template.FuncMap{"getOr": getOr, "isSet": isSet})
123128
tmpl.Funcs(sprig.TxtFuncMap())
124129

125-
source, err := os.ReadFile(path)
126-
if err != nil {
127-
return nil, errors.Wrapf(err, "failed to read manifest %s", path)
128-
}
129-
130-
if _, err := tmpl.Parse(string(source)); err != nil {
131-
return nil, errors.Wrapf(err, "failed to parse manifest %s as template", path)
130+
if _, err := tmpl.Parse(rawTemplate); err != nil {
131+
return nil, errors.Wrapf(err, "failed to parse manifest %s as template", rawTemplate)
132132
}
133133

134134
rendered := bytes.Buffer{}
135135
if err := tmpl.Execute(&rendered, d.Data); err != nil {
136-
return nil, errors.Wrapf(err, "failed to render manifest %s", path)
136+
return nil, errors.Wrapf(err, "failed to render manifest %s", rawTemplate)
137137
}
138138

139139
return &rendered, nil
140140
}
141141

142+
func renderFileTemplate(path string, d *RenderData) (*bytes.Buffer, error) {
143+
144+
source, err := os.ReadFile(path)
145+
if err != nil {
146+
return nil, errors.Wrapf(err, "failed to read manifest %s", path)
147+
}
148+
149+
return renderTemplate(string(source[:]), d)
150+
}
151+
142152
func formateDeviceList(devs []DeviceInfo) string {
143153
out := ""
144154
for _, dev := range devs {
@@ -232,7 +242,7 @@ func filterTemplates(toFilter map[string]string, path string, d *RenderData) err
232242
}
233243

234244
// Render the template file
235-
renderedData, err := renderTemplate(path, d)
245+
renderedData, err := renderFileTemplate(path, d)
236246
if err != nil {
237247
return err
238248
}

pkg/render/render_test.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ func TestRenderSimple(t *testing.T) {
1212

1313
d := MakeRenderData()
1414

15-
o1, err := RenderTemplate("testdata/manifests/simple.yaml", &d)
15+
o1, err := RenderFileTemplate("testdata/manifests/simple.yaml", &d)
1616
g.Expect(err).NotTo(HaveOccurred())
1717

1818
g.Expect(o1).To(HaveLen(1))
@@ -36,7 +36,7 @@ func TestRenderSimple(t *testing.T) {
3636
g.Expect(o1[0].MarshalJSON()).To(MatchJSON(expected))
3737

3838
// test that json parses the same
39-
o2, err := RenderTemplate("testdata/manifests/simple.json", &d)
39+
o2, err := RenderFileTemplate("testdata/manifests/simple.json", &d)
4040
g.Expect(err).NotTo(HaveOccurred())
4141
g.Expect(o2).To(Equal(o1))
4242
}
@@ -47,7 +47,7 @@ func TestRenderMultiple(t *testing.T) {
4747
p := "testdata/manifests/multiple.yaml"
4848
d := MakeRenderData()
4949

50-
o, err := RenderTemplate(p, &d)
50+
o, err := RenderFileTemplate(p, &d)
5151
g.Expect(err).NotTo(HaveOccurred())
5252

5353
g.Expect(o).To(HaveLen(3))
@@ -64,19 +64,19 @@ func TestTemplate(t *testing.T) {
6464

6565
// Test that missing variables are detected
6666
d := MakeRenderData()
67-
_, err := RenderTemplate(p, &d)
67+
_, err := RenderFileTemplate(p, &d)
6868
g.Expect(err).To(HaveOccurred())
6969
g.Expect(err.Error()).To(HaveSuffix(`function "fname" not defined`))
7070

7171
// Set expected function (but not variable)
7272
d.Funcs["fname"] = func(s string) string { return "test-" + s }
73-
_, err = RenderTemplate(p, &d)
73+
_, err = RenderFileTemplate(p, &d)
7474
g.Expect(err).To(HaveOccurred())
7575
g.Expect(err.Error()).To(HaveSuffix(`has no entry for key "Namespace"`))
7676

7777
// now we can render
7878
d.Data["Namespace"] = "myns"
79-
o, err := RenderTemplate(p, &d)
79+
o, err := RenderFileTemplate(p, &d)
8080
g.Expect(err).NotTo(HaveOccurred())
8181

8282
g.Expect(o[0].GetName()).To(Equal("test-podname"))
@@ -95,7 +95,7 @@ func TestTemplateWithEmptyObject(t *testing.T) {
9595

9696
d := MakeRenderData()
9797
d.Data["Enable"] = true
98-
o, err := RenderTemplate(p, &d)
98+
o, err := RenderFileTemplate(p, &d)
9999
g.Expect(err).NotTo(HaveOccurred())
100100

101101
g.Expect(len(o)).To(Equal(2))

0 commit comments

Comments
 (0)