Templates: constrain validating required parameters by usage (#26167)

This commit is contained in:
andig 2025-12-24 11:46:17 +01:00 • committed by GitHub
parent b1914c30ea
commit 525480e416
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 54 additions and 1 deletions

View file

@ -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

View file

@ -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)
}