From fa7ae4c5a0fdaaf835591d35e32a4651be7a46b3 Mon Sep 17 00:00:00 2001 From: Lyupcho Kotev Date: Thu, 18 Jul 2024 20:17:12 +0200 Subject: Fix updates to multiple images when using helm values file (#790) Signed-off-by: Lyupcho Kotev --- pkg/argocd/update.go | 19 ++++------ pkg/argocd/update_test.go | 96 +++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 100 insertions(+), 15 deletions(-) (limited to 'pkg') diff --git a/pkg/argocd/update.go b/pkg/argocd/update.go index 9669b9a..6bff79c 100644 --- a/pkg/argocd/update.go +++ b/pkg/argocd/update.go @@ -435,8 +435,13 @@ func marshalParamsOverride(app *v1alpha1.Application, originalData []byte) ([]by if strings.HasPrefix(app.Annotations[common.WriteBackTargetAnnotation], common.HelmPrefix) { images := GetImagesAndAliasesFromApplication(app) - for _, c := range images { + helmNewValues := yaml.MapSlice{} + err = yaml.Unmarshal(originalData, &helmNewValues) + if err != nil { + return nil, err + } + for _, c := range images { if c.ImageAlias == "" { continue } @@ -460,14 +465,6 @@ func marshalParamsOverride(app *v1alpha1.Application, originalData []byte) ([]by return nil, fmt.Errorf("%s parameter not found", helmAnnotationParamVersion) } - // Create new values structure - //var helmNewValues map[string]interface{} - helmNewValues := yaml.MapSlice{} - err = yaml.Unmarshal(originalData, &helmNewValues) - if err != nil { - return nil, err - } - err = setHelmValue(helmNewValues, helmAnnotationParamName, helmParamName.Value) if err != nil { return nil, fmt.Errorf("failed to set image parameter name value: %v", err) @@ -476,9 +473,9 @@ func marshalParamsOverride(app *v1alpha1.Application, originalData []byte) ([]by if err != nil { return nil, fmt.Errorf("failed to set image parameter version value: %v", err) } - - override, err = yaml.Marshal(helmNewValues) } + + override, err = yaml.Marshal(helmNewValues) } else { var params helmOverride newParams := helmOverride{ diff --git a/pkg/argocd/update_test.go b/pkg/argocd/update_test.go index cd70391..ca00460 100644 --- a/pkg/argocd/update_test.go +++ b/pkg/argocd/update_test.go @@ -1383,6 +1383,94 @@ replicas: 1 assert.Equal(t, strings.TrimSpace(strings.ReplaceAll(expected, "\t", " ")), strings.TrimSpace(string(yaml))) }) + t.Run("Valid Helm source with Helm values file with multiple images", func(t *testing.T) { + expected := ` +nginx.image.name: nginx +nginx.image.tag: v1.0.0 +redis.image.name: redis +redis.image.tag: v1.0.0 +replicas: 1 +` + app := v1alpha1.Application{ + ObjectMeta: v1.ObjectMeta{ + Name: "testapp", + Annotations: map[string]string{ + "argocd-image-updater.argoproj.io/image-list": "nginx=nginx, redis=redis", + "argocd-image-updater.argoproj.io/write-back-method": "git", + "argocd-image-updater.argoproj.io/write-back-target": "helmvalues:./test-values.yaml", + "argocd-image-updater.argoproj.io/nginx.helm.image-name": "nginx.image.name", + "argocd-image-updater.argoproj.io/nginx.helm.image-tag": "nginx.image.tag", + "argocd-image-updater.argoproj.io/redis.helm.image-name": "redis.image.name", + "argocd-image-updater.argoproj.io/redis.helm.image-tag": "redis.image.tag", + }, + }, + Spec: v1alpha1.ApplicationSpec{ + Sources: []v1alpha1.ApplicationSource{ + { + Chart: "my-app", + Helm: &v1alpha1.ApplicationSourceHelm{ + ReleaseName: "my-app", + ValueFiles: []string{"$values/some/dir/values.yaml"}, + Parameters: []v1alpha1.HelmParameter{ + { + Name: "nginx.image.name", + Value: "nginx", + ForceString: true, + }, + { + Name: "nginx.image.tag", + Value: "v1.0.0", + ForceString: true, + }, + { + Name: "redis.image.name", + Value: "redis", + ForceString: true, + }, + { + Name: "redis.image.tag", + Value: "v1.0.0", + ForceString: true, + }, + }, + }, + RepoURL: "https://example.com/example", + TargetRevision: "main", + }, + { + Ref: "values", + RepoURL: "https://example.com/example2", + TargetRevision: "main", + }, + }, + }, + Status: v1alpha1.ApplicationStatus{ + SourceTypes: []v1alpha1.ApplicationSourceType{ + v1alpha1.ApplicationSourceTypeHelm, + "", + }, + Summary: v1alpha1.ApplicationSummary{ + Images: []string{ + "nginx:v0.0.0", + "redis:v0.0.0", + }, + }, + }, + } + + originalData := []byte(` +nginx.image.name: nginx +nginx.image.tag: v0.0.0 +redis.image.name: redis +redis.image.tag: v0.0.0 +replicas: 1 +`) + yaml, err := marshalParamsOverride(&app, originalData) + require.NoError(t, err) + assert.NotEmpty(t, yaml) + assert.Equal(t, strings.TrimSpace(strings.ReplaceAll(expected, "\t", " ")), strings.TrimSpace(string(yaml))) + }) + t.Run("Failed to setValue image parameter name", func(t *testing.T) { app := v1alpha1.Application{ ObjectMeta: v1.ObjectMeta{ @@ -1528,7 +1616,7 @@ replicas: 1 }, } - originalData := []byte(`random content`) + originalData := []byte(`random: yaml`) _, err := marshalParamsOverride(&app, originalData) assert.Error(t, err) assert.Equal(t, "could not find an image-tag annotation for image nginx", err.Error()) @@ -1575,7 +1663,7 @@ replicas: 1 }, } - originalData := []byte(`random content`) + originalData := []byte(`random: yaml`) _, err := marshalParamsOverride(&app, originalData) assert.Error(t, err) assert.Equal(t, "could not find an image-name annotation for image nginx", err.Error()) @@ -1623,7 +1711,7 @@ replicas: 1 }, } - originalData := []byte(`random content`) + originalData := []byte(`random: yaml`) _, err := marshalParamsOverride(&app, originalData) assert.Error(t, err) assert.Equal(t, "wrongimage.name parameter not found", err.Error()) @@ -1671,7 +1759,7 @@ replicas: 1 }, } - originalData := []byte(`random content`) + originalData := []byte(`random: yaml`) _, err := marshalParamsOverride(&app, originalData) assert.Error(t, err) assert.Equal(t, "wrongimage.tag parameter not found", err.Error()) -- cgit v1.2.3