Escape names and values before passing to Helm

This is required to handle values with commas and/or curly braces.
This commit is contained in:
Bastian Eicher 2018-05-07 18:18:26 +02:00 committed by Andreas Bieber
parent c5d530632b
commit eea4746ae2
2 changed files with 41 additions and 9 deletions

View File

@ -503,7 +503,7 @@ func flagsForRelease(helm helmexec.Interface, basePath string, release *ReleaseS
if len(release.SetValues) > 0 { if len(release.SetValues) > 0 {
val := []string{} val := []string{}
for _, set := range release.SetValues { for _, set := range release.SetValues {
val = append(val, fmt.Sprintf("%s=%s", set.Name, set.Value)) val = append(val, fmt.Sprintf("%s=%s", escape(set.Name), escape(set.Value)))
} }
flags = append(flags, "--set", strings.Join(val, ",")) flags = append(flags, "--set", strings.Join(val, ","))
} }
@ -518,7 +518,7 @@ func flagsForRelease(helm helmexec.Interface, basePath string, release *ReleaseS
for _, set := range release.EnvValues { for _, set := range release.EnvValues {
value, isSet := os.LookupEnv(set.Value) value, isSet := os.LookupEnv(set.Value)
if isSet { if isSet {
val = append(val, fmt.Sprintf("%s=%s", set.Name, value)) val = append(val, fmt.Sprintf("%s=%s", escape(set.Name), escape(value)))
} else { } else {
errMsg := fmt.Sprintf("\t%s", set.Value) errMsg := fmt.Sprintf("\t%s", set.Value)
envValErrs = append(envValErrs, errMsg) envValErrs = append(envValErrs, errMsg)
@ -537,3 +537,9 @@ func flagsForRelease(helm helmexec.Interface, basePath string, release *ReleaseS
return flags, nil return flags, nil
} }
func escape(value string) string {
intermediate := strings.Replace(value, "{", "\\{", -1)
intermediate = strings.Replace(intermediate, "}", "\\}", -1)
return strings.Replace(intermediate, ",", "\\,", -1)
}

View File

@ -502,7 +502,12 @@ func Test_normalizeChart(t *testing.T) {
type mockHelmExec struct { type mockHelmExec struct {
charts []string charts []string
repo []string repo []string
releases []string releases []mockRelease
}
type mockRelease struct {
name string
flags []string
} }
func (helm *mockHelmExec) UpdateDeps(chart string) error { func (helm *mockHelmExec) UpdateDeps(chart string) error {
@ -527,7 +532,7 @@ func (helm *mockHelmExec) SyncRelease(name, chart string, flags ...string) error
if strings.Contains(name, "error") { if strings.Contains(name, "error") {
return errors.New("error") return errors.New("error")
} }
helm.releases = append(helm.releases, name) helm.releases = append(helm.releases, mockRelease{name: name, flags: flags})
helm.charts = append(helm.charts, chart) helm.charts = append(helm.charts, chart)
return nil return nil
} }
@ -538,7 +543,7 @@ func (helm *mockHelmExec) ReleaseStatus(release string) error {
if strings.Contains(release, "error") { if strings.Contains(release, "error") {
return errors.New("error") return errors.New("error")
} }
helm.releases = append(helm.releases, release) helm.releases = append(helm.releases, mockRelease{name: release, flags: []string{}})
return nil return nil
} }
func (helm *mockHelmExec) DeleteRelease(name string) error { func (helm *mockHelmExec) DeleteRelease(name string) error {
@ -606,7 +611,7 @@ func TestHelmState_SyncReleases(t *testing.T) {
name string name string
releases []ReleaseSpec releases []ReleaseSpec
helm *mockHelmExec helm *mockHelmExec
wantReleases []string wantReleases []mockRelease
}{ }{
{ {
name: "normal release", name: "normal release",
@ -617,7 +622,28 @@ func TestHelmState_SyncReleases(t *testing.T) {
}, },
}, },
helm: &mockHelmExec{}, helm: &mockHelmExec{},
wantReleases: []string{"releaseName"}, wantReleases: []mockRelease{{"releaseName", []string{}}},
},
{
name: "escaped values",
releases: []ReleaseSpec{
{
Name: "releaseName",
Chart: "foo",
SetValues: []SetValue{
{
Name: "someList",
Value: "a,b,c",
},
{
Name: "json",
Value: "{\"name\": \"john\"}",
},
},
},
},
helm: &mockHelmExec{},
wantReleases: []mockRelease{{"releaseName", []string{"--set", "someList=a\\,b\\,c,json=\\{\"name\": \"john\"\\}"}}},
}, },
} }
for _, tt := range tests { for _, tt := range tests {
@ -673,7 +699,7 @@ func TestHelmState_ReleaseStatuses(t *testing.T) {
name string name string
releases []ReleaseSpec releases []ReleaseSpec
helm *mockHelmExec helm *mockHelmExec
want []string want []mockRelease
wantErr bool wantErr bool
}{ }{
{ {
@ -684,7 +710,7 @@ func TestHelmState_ReleaseStatuses(t *testing.T) {
}, },
}, },
helm: &mockHelmExec{}, helm: &mockHelmExec{},
want: []string{"releaseA"}, want: []mockRelease{{"releaseA", []string{}}},
}, },
{ {
name: "happy path", name: "happy path",