Skip to content

Commit 8daae64

Browse files
authored
fix: isolate template render parse state (#10365)
Fix empty file-template render isolation by cloning the template per ConfigMap key and keeping direct map iteration after review.
1 parent 98b80a2 commit 8daae64

4 files changed

Lines changed: 46 additions & 2 deletions

File tree

controllers/apps/component/transformer_component_template.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,11 @@ func (t *componentFileTemplateTransformer) renderFileTemplateData(transCtx *comp
314314

315315
tpl := template.New(fileTemplate.Name).Option("missingkey=error").Funcs(sprig.TxtFuncMap())
316316
for key, val := range data {
317-
ptpl, err := tpl.Parse(val)
317+
ptpl, err := tpl.Clone()
318+
if err != nil {
319+
return nil, err
320+
}
321+
ptpl, err = ptpl.Parse(val)
318322
if err != nil {
319323
return nil, err
320324
}

controllers/apps/component/transformer_component_template_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,22 @@ var _ = Describe("file templates transformer test", func() {
280280
})
281281
})
282282

283+
It("keeps empty template file content empty", func() {
284+
logConfCM.Data["member_leave.sh"] = "member_leave"
285+
logConfCM.Data["role_probe.sh"] = "role_probe"
286+
logConfCM.Data["switchover.sh"] = ""
287+
288+
transformer := &componentFileTemplateTransformer{}
289+
Expect(transformer.Transform(transCtx, dag)).Should(BeNil())
290+
291+
checkTemplateObject("logConf", func(obj *corev1.ConfigMap) {
292+
Expect(obj.Labels).Should(HaveKeyWithValue(kubeBlockFileTemplateLabelKey, "true"))
293+
Expect(obj.Data).Should(HaveKeyWithValue("member_leave.sh", "member_leave"))
294+
Expect(obj.Data).Should(HaveKeyWithValue("role_probe.sh", "role_probe"))
295+
Expect(obj.Data).Should(HaveKeyWithValue("switchover.sh", ""))
296+
})
297+
})
298+
283299
It("udf reconfigure", func() {
284300
transCtx.SynthesizeComponent.FileTemplates[0].ReconfigureRequired = ptr.To(true)
285301
transCtx.SynthesizeComponent.FileTemplates[0].ReconfigureAction = &appsv1.Action{

pkg/gotemplate/tpl_engine.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,11 @@ func (t *TplEngine) GetTplEngine() *template.Template {
113113

114114
func (t *TplEngine) Render(context string) (string, error) {
115115
var buf strings.Builder
116-
tpl, err := t.tpl.Parse(context)
116+
tpl, err := t.tpl.Clone()
117+
if err != nil {
118+
return "", err
119+
}
120+
tpl, err = tpl.Parse(context)
117121
if err != nil {
118122
return "", err
119123
}

pkg/gotemplate/tpl_engine_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,26 @@ my friend name is test2
8383
Expect(err).NotTo(HaveOccurred())
8484
Expect(context).To(Equal(expectString))
8585
})
86+
87+
It("Should render empty template content as empty", func() {
88+
engine := NewTplEngine(&TplValues{}, nil, "for_test", nil, nil)
89+
90+
rendered, err := engine.Render("member-leave")
91+
Expect(err).Should(Succeed())
92+
Expect(rendered).Should(Equal("member-leave"))
93+
94+
rendered, err = engine.Render("")
95+
Expect(err).Should(Succeed())
96+
Expect(rendered).Should(Equal(""))
97+
98+
rendered, err = engine.Render("role-probe")
99+
Expect(err).Should(Succeed())
100+
Expect(rendered).Should(Equal("role-probe"))
101+
102+
rendered, err = engine.Render("")
103+
Expect(err).Should(Succeed())
104+
Expect(rendered).Should(Equal(""))
105+
})
86106
})
87107

88108
// A call funcB.1 in B module

0 commit comments

Comments
 (0)