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