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:
parent
c5d530632b
commit
eea4746ae2
|
|
@ -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)
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue