diff --git a/state/state.go b/state/state.go index 48357059..29a9ba32 100644 --- a/state/state.go +++ b/state/state.go @@ -503,7 +503,7 @@ func flagsForRelease(helm helmexec.Interface, basePath string, release *ReleaseS if len(release.SetValues) > 0 { val := []string{} 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, ",")) } @@ -518,7 +518,7 @@ func flagsForRelease(helm helmexec.Interface, basePath string, release *ReleaseS for _, set := range release.EnvValues { value, isSet := os.LookupEnv(set.Value) 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 { errMsg := fmt.Sprintf("\t%s", set.Value) envValErrs = append(envValErrs, errMsg) @@ -537,3 +537,9 @@ func flagsForRelease(helm helmexec.Interface, basePath string, release *ReleaseS return flags, nil } + +func escape(value string) string { + intermediate := strings.Replace(value, "{", "\\{", -1) + intermediate = strings.Replace(intermediate, "}", "\\}", -1) + return strings.Replace(intermediate, ",", "\\,", -1) +} diff --git a/state/state_test.go b/state/state_test.go index 111ec4b1..bc2605b4 100644 --- a/state/state_test.go +++ b/state/state_test.go @@ -502,7 +502,12 @@ func Test_normalizeChart(t *testing.T) { type mockHelmExec struct { charts []string repo []string - releases []string + releases []mockRelease +} + +type mockRelease struct { + name string + flags []string } 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") { 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) return nil } @@ -538,7 +543,7 @@ func (helm *mockHelmExec) ReleaseStatus(release string) error { if strings.Contains(release, "error") { return errors.New("error") } - helm.releases = append(helm.releases, release) + helm.releases = append(helm.releases, mockRelease{name: release, flags: []string{}}) return nil } func (helm *mockHelmExec) DeleteRelease(name string) error { @@ -606,7 +611,7 @@ func TestHelmState_SyncReleases(t *testing.T) { name string releases []ReleaseSpec helm *mockHelmExec - wantReleases []string + wantReleases []mockRelease }{ { name: "normal release", @@ -617,7 +622,28 @@ func TestHelmState_SyncReleases(t *testing.T) { }, }, 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 { @@ -673,7 +699,7 @@ func TestHelmState_ReleaseStatuses(t *testing.T) { name string releases []ReleaseSpec helm *mockHelmExec - want []string + want []mockRelease wantErr bool }{ { @@ -684,7 +710,7 @@ func TestHelmState_ReleaseStatuses(t *testing.T) { }, }, helm: &mockHelmExec{}, - want: []string{"releaseA"}, + want: []mockRelease{{"releaseA", []string{}}}, }, { name: "happy path",