fix: ValuesTemplate quote issue (#787)

* fix: ValuesTemplate quote issue

Signed-off-by: yxxhero <aiopsclub@163.com>

* optimize goccy yaml options

Signed-off-by: yxxhero <aiopsclub@163.com>

* add more options

Signed-off-by: yxxhero <aiopsclub@163.com>

* fix tests

Signed-off-by: yxxhero <aiopsclub@163.com>

* fix tests

Signed-off-by: yxxhero <aiopsclub@163.com>

---------

Signed-off-by: yxxhero <aiopsclub@163.com>
This commit is contained in:
yxxhero 2023-04-14 12:03:26 +08:00 committed by GitHub
parent 219602ebc7
commit 7c72e2ba3e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 60 additions and 3 deletions

45
pkg/state/release_test.go Normal file
View File

@ -0,0 +1,45 @@
package state
import (
"testing"
"github.com/stretchr/testify/require"
"github.com/helmfile/helmfile/pkg/filesystem"
"github.com/helmfile/helmfile/pkg/runtime"
"github.com/helmfile/helmfile/pkg/tmpl"
)
func TestExecuteTemplateExpressions(t *testing.T) {
render := tmpl.NewFileRenderer(filesystem.DefaultFileSystem(), "", map[string]interface{}{
"Values": map[string]interface{}{
"foo": map[string]interface{}{
"releaseName": "foo",
},
},
"Release": map[string]interface{}{
"Name": "foo",
},
})
v := runtime.GoccyGoYaml
runtime.GoccyGoYaml = true
t.Cleanup(func() {
runtime.GoccyGoYaml = v
})
rs := ReleaseSpec{
Name: "foo",
Chart: "bar",
Namespace: "baz",
ValuesTemplate: []interface{}{
map[string]interface{}{
"fullnameOverride": "{{ .Values | get (printf \"%s.releaseName\" .Release.Name) .Release.Name }}",
},
},
}
result, err := rs.ExecuteTemplateExpressions(render)
require.NoErrorf(t, err, "failed to execute template expressions: %v", err)
require.Equalf(t, result.ValuesTemplate[0].(map[string]interface{})["fullnameOverride"], "foo", "failed to execute template expressions")
}

View File

@ -67,6 +67,8 @@ func Marshal(v interface{}) ([]byte, error) {
yamlEncoder := yaml.NewEncoder(
&b,
yaml.Indent(2),
yaml.UseSingleQuote(true),
yaml.UseLiteralStyleIfMultiline(true),
)
err := yamlEncoder.Encode(v)
defer func() {

View File

@ -11,6 +11,13 @@ import (
func testYamlMarshal(t *testing.T, goccyGoYaml bool) {
t.Helper()
var yamlLibraryName string
if goccyGoYaml {
yamlLibraryName = "goccy/go-yaml"
} else {
yamlLibraryName = "gopkg.in/yaml.v2"
}
v := runtime.GoccyGoYaml
runtime.GoccyGoYaml = goccyGoYaml
t.Cleanup(func() {
@ -25,7 +32,7 @@ func testYamlMarshal(t *testing.T, goccyGoYaml bool) {
Annotation string `yaml:"annotation"`
} `yaml:"info"`
expected string
expected map[string]string
}{
{
Name: "John",
@ -41,14 +48,17 @@ func testYamlMarshal(t *testing.T, goccyGoYaml bool) {
// - https://github.com/helmfile/helmfile/pull/675
Annotation: "on",
}},
expected: "name: John\ninfo:\n- age: 20\n address: New York\n annotation: \"on\"\n",
expected: map[string]string{
"goccy/go-yaml": "name: John\ninfo:\n- age: 20\n address: New York\n annotation: 'on'\n",
"gopkg.in/yaml.v2": "name: John\ninfo:\n- age: 20\n address: New York\n annotation: \"on\"\n",
},
},
}
for _, tt := range tests {
actual, err := Marshal(tt)
require.NoError(t, err)
require.Equal(t, tt.expected, string(actual))
require.Equal(t, tt.expected[yamlLibraryName], string(actual))
}
}