From 525480e4169db9b2ba9539bb53dc54907b9c382e Mon Sep 17 00:00:00 2001 From: andig Date: Wed, 24 Dec 2025 11:46:17 +0100 Subject: [PATCH] Templates: constrain validating required parameters by usage (#26167) --- util/templates/template.go | 14 ++++++++++- util/templates/template_test.go | 41 +++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/util/templates/template.go b/util/templates/template.go index dfb6933b8..294f72815 100644 --- a/util/templates/template.go +++ b/util/templates/template.go @@ -11,6 +11,7 @@ import ( "text/template" "github.com/Masterminds/sprig/v3" + "github.com/spf13/cast" ) // Template describes is a proxy device for use with cli and automated testing @@ -302,6 +303,14 @@ func (t *Template) RenderResult(renderMode int, other map[string]any) ([]byte, m res := make(map[string]any) + var usage string + for k, v := range values { + if strings.ToLower(k) == "usage" { + usage = strings.ToLower(cast.ToString(v)) + break + } + } + // TODO this is an utterly horrible hack // // When decoding the actual values ("other" parameter) into the @@ -359,7 +368,10 @@ func (t *Template) RenderResult(renderMode int, other map[string]any) ([]byte, m // validate required fields from yaml if s == "" && p.IsRequired() && (renderMode == RenderModeUnitTest || renderMode == RenderModeInstance && !testing.Testing()) { - return nil, nil, fmt.Errorf("missing required `%s`", p.Name) + // validate required per usage + if len(p.Usages) == 0 || slices.Contains(p.Usages, usage) { + return nil, nil, fmt.Errorf("missing required `%s`", p.Name) + } } res[out] = s diff --git a/util/templates/template_test.go b/util/templates/template_test.go index b54e33573..6504755a9 100644 --- a/util/templates/template_test.go +++ b/util/templates/template_test.go @@ -65,3 +65,44 @@ func TestRequired(t *testing.T) { }) require.NoError(t, err) } + +func TestRequiredPerUsage(t *testing.T) { + tmpl := &Template{ + TemplateDefinition: TemplateDefinition{ + Params: []Param{ + { + Name: "usage", + }, + { + Name: "param", + Required: true, + Usages: []string{"battery"}, + }, + }, + }, + } + + _, _, err := tmpl.RenderResult(RenderModeUnitTest, map[string]any{ + "Param": nil, + "Usage": nil, + }) + require.NoError(t, err) + + _, _, err = tmpl.RenderResult(RenderModeUnitTest, map[string]any{ + "Param": nil, + "Usage": "pv", + }) + require.NoError(t, err) + + _, _, err = tmpl.RenderResult(RenderModeUnitTest, map[string]any{ + "Param": nil, + "Usage": "battery", + }) + require.Error(t, err) + + _, _, err = tmpl.RenderResult(RenderModeUnitTest, map[string]any{ + "Param": "foo", + "Usage": "battery", + }) + require.NoError(t, err) +}