From 2a2b321a1abc4a927759bc9c7c9eb5fb686d6abc Mon Sep 17 00:00:00 2001 From: Cyril MARIN Date: Fri, 8 Dec 2023 13:14:58 +0100 Subject: [PATCH 01/12] fix: filter images by image-list annotation Signed-off-by: Cyril MARIN Signed-off-by: Aleksandr Petrov --- Dockerfile | 3 +- pkg/argocd/argocd.go | 21 ++++++-- pkg/argocd/argocd_test.go | 3 ++ pkg/argocd/update_test.go | 104 ++++++++++++++++++++++++++------------ 4 files changed, 92 insertions(+), 39 deletions(-) diff --git a/Dockerfile b/Dockerfile index e294a173..6e592fdf 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,8 +17,7 @@ RUN apk update && \ apk add ca-certificates git openssh-client aws-cli tini && \ rm -rf /var/cache/apk/* -RUN mkdir -p /usr/local/bin -RUN mkdir -p /app/config +RUN mkdir -p /usr/local/bin /app/config RUN adduser --home "/app" --disabled-password --uid 1000 argocd COPY --from=builder /src/argocd-image-updater/dist/argocd-image-updater /usr/local/bin/ diff --git a/pkg/argocd/argocd.go b/pkg/argocd/argocd.go index 26039030..1a5078de 100644 --- a/pkg/argocd/argocd.go +++ b/pkg/argocd/argocd.go @@ -478,19 +478,32 @@ func SetKustomizeImage(app *v1alpha1.Application, newImage *image.ContainerImage return nil } +// ImageIsAllowed checks whether img is declared in image-list annotation +func ImageIsAllowed(img *image.ContainerImage, list *image.ContainerImageList) bool { + for _, i := range *list { + if i.ImageName == img.ImageName { + return true + } + } + return false +} + // GetImagesFromApplication returns the list of known images for the given application func GetImagesFromApplication(app *v1alpha1.Application) image.ContainerImageList { images := make(image.ContainerImageList, 0) + annotations := app.Annotations + imagesFromAnnotations := parseImageList(annotations) for _, imageStr := range app.Status.Summary.Images { - image := image.NewFromIdentifier(imageStr) - images = append(images, image) + img := image.NewFromIdentifier(imageStr) + if ImageIsAllowed(img, imagesFromAnnotations) { + images = append(images, img) + } } // The Application may wish to update images that don't create a container we can detect. // Check the image list for images with a force-update annotation, and add them if they are not already present. - annotations := app.Annotations - for _, img := range *parseImageList(annotations) { + for _, img := range *imagesFromAnnotations { if img.HasForceUpdateOptionAnnotation(annotations) { img.ImageTag = nil // the tag from the image list will be a version constraint, which isn't a valid tag images = append(images, img) diff --git a/pkg/argocd/argocd_test.go b/pkg/argocd/argocd_test.go index cbe5b078..28c52d6f 100644 --- a/pkg/argocd/argocd_test.go +++ b/pkg/argocd/argocd_test.go @@ -27,6 +27,9 @@ func Test_GetImagesFromApplication(t *testing.T) { ObjectMeta: v1.ObjectMeta{ Name: "test-app", Namespace: "argocd", + Annotations: map[string]string{ + common.ImageUpdaterAnnotation: "nginx:1.12.2,that/image,quay.io/dexidp/dex:v1.23.0", + }, }, Spec: v1alpha1.ApplicationSpec{}, Status: v1alpha1.ApplicationStatus{ diff --git a/pkg/argocd/update_test.go b/pkg/argocd/update_test.go index 83aded3b..bae5c278 100644 --- a/pkg/argocd/update_test.go +++ b/pkg/argocd/update_test.go @@ -107,11 +107,15 @@ func Test_UpdateApplication(t *testing.T) { kubeClient := kube.KubernetesClient{ Clientset: fake.NewFakeKubeClient(), } + annotations := map[string]string{ + common.ImageUpdaterAnnotation: "jannfis/foobar:1.0.0", + } appImages := &ApplicationImages{ Application: v1alpha1.Application{ ObjectMeta: v1.ObjectMeta{ - Name: "guestbook", - Namespace: "guestbook", + Name: "guestbook", + Namespace: "guestbook", + Annotations: annotations, }, Spec: v1alpha1.ApplicationSpec{ Source: &v1alpha1.ApplicationSource{ @@ -173,11 +177,15 @@ func Test_UpdateApplication(t *testing.T) { kubeClient := kube.KubernetesClient{ Clientset: fake.NewFakeKubeClient(), } + annotations := map[string]string{ + common.ImageUpdaterAnnotation: "jannfis/foobar:1.0.0,jannfis/barbar:1.0.0", + } appImages := &ApplicationImages{ Application: v1alpha1.Application{ ObjectMeta: v1.ObjectMeta{ - Name: "guestbook", - Namespace: "guestbook", + Name: "guestbook", + Namespace: "guestbook", + Annotations: annotations, }, Spec: v1alpha1.ApplicationSpec{ Source: &v1alpha1.ApplicationSource{ @@ -360,11 +368,15 @@ func Test_UpdateApplication(t *testing.T) { kubeClient := kube.KubernetesClient{ Clientset: fake.NewFakeKubeClient(), } + annotations := map[string]string{ + common.ImageUpdaterAnnotation: "jannfis/foobar:1.0.x", + } appImages := &ApplicationImages{ Application: v1alpha1.Application{ ObjectMeta: v1.ObjectMeta{ - Name: "guestbook", - Namespace: "guestbook", + Name: "guestbook", + Namespace: "guestbook", + Annotations: annotations, }, Spec: v1alpha1.ApplicationSpec{ Source: &v1alpha1.ApplicationSource{ @@ -418,14 +430,16 @@ func Test_UpdateApplication(t *testing.T) { kubeClient := kube.KubernetesClient{ Clientset: fake.NewFakeClientsetWithResources(fixture.NewSecret("foo", "bar", map[string][]byte{"creds": []byte("myuser:mypass")})), } + annotations := map[string]string{ + common.ImageUpdaterAnnotation: "jannfis/foobar:1.0.0", + fmt.Sprintf(common.PullSecretAnnotation, "dummy"): "secret:foo/bar#creds", + } appImages := &ApplicationImages{ Application: v1alpha1.Application{ ObjectMeta: v1.ObjectMeta{ - Name: "guestbook", - Namespace: "guestbook", - Annotations: map[string]string{ - fmt.Sprintf(common.PullSecretAnnotation, "dummy"): "secret:foo/bar#creds", - }, + Name: "guestbook", + Namespace: "guestbook", + Annotations: annotations, }, Spec: v1alpha1.ApplicationSpec{ Source: &v1alpha1.ApplicationSource{ @@ -532,11 +546,15 @@ func Test_UpdateApplication(t *testing.T) { kubeClient := kube.KubernetesClient{ Clientset: fake.NewFakeKubeClient(), } + annotations := map[string]string{ + common.ImageUpdaterAnnotation: "jannfis/foobar:1.0.1", + } appImages := &ApplicationImages{ Application: v1alpha1.Application{ ObjectMeta: v1.ObjectMeta{ - Name: "guestbook", - Namespace: "guestbook", + Name: "guestbook", + Namespace: "guestbook", + Annotations: annotations, }, Spec: v1alpha1.ApplicationSpec{ Source: &v1alpha1.ApplicationSource{ @@ -722,15 +740,17 @@ func Test_UpdateApplication(t *testing.T) { kubeClient := kube.KubernetesClient{ Clientset: fake.NewFakeKubeClient(), } + annotations := map[string]string{ + common.ImageUpdaterAnnotation: "dummy=jannfis/foobar", + fmt.Sprintf(common.AllowTagsOptionAnnotation, "dummy"): "regexp:^foobar$", + fmt.Sprintf(common.UpdateStrategyAnnotation, "dummy"): "name", + } appImages := &ApplicationImages{ Application: v1alpha1.Application{ ObjectMeta: v1.ObjectMeta{ - Name: "guestbook", - Namespace: "guestbook", - Annotations: map[string]string{ - fmt.Sprintf(common.AllowTagsOptionAnnotation, "dummy"): "regexp:^foobar$", - fmt.Sprintf(common.UpdateStrategyAnnotation, "dummy"): "name", - }, + Name: "guestbook", + Namespace: "guestbook", + Annotations: annotations, }, Spec: v1alpha1.ApplicationSpec{ Source: &v1alpha1.ApplicationSource{ @@ -798,15 +818,17 @@ func Test_UpdateApplication(t *testing.T) { kubeClient := kube.KubernetesClient{ Clientset: fake.NewFakeKubeClient(), } + annotations := map[string]string{ + common.ImageUpdaterAnnotation: "dummy=jannfis/foobar", + fmt.Sprintf(common.IgnoreTagsOptionAnnotation, "dummy"): "*", + fmt.Sprintf(common.UpdateStrategyAnnotation, "dummy"): "name", + } appImages := &ApplicationImages{ Application: v1alpha1.Application{ ObjectMeta: v1.ObjectMeta{ - Name: "guestbook", - Namespace: "guestbook", - Annotations: map[string]string{ - fmt.Sprintf(common.IgnoreTagsOptionAnnotation, "dummy"): "*", - fmt.Sprintf(common.UpdateStrategyAnnotation, "dummy"): "name", - }, + Name: "guestbook", + Namespace: "guestbook", + Annotations: annotations, }, Spec: v1alpha1.ApplicationSpec{ Source: &v1alpha1.ApplicationSource{ @@ -858,11 +880,15 @@ func Test_UpdateApplication(t *testing.T) { kubeClient := kube.KubernetesClient{ Clientset: fake.NewFakeKubeClient(), } + annotations := map[string]string{ + common.ImageUpdaterAnnotation: "example.io/jannfis/example:1.0.x", + } appImages := &ApplicationImages{ Application: v1alpha1.Application{ ObjectMeta: v1.ObjectMeta{ - Name: "guestbook", - Namespace: "guestbook", + Name: "guestbook", + Namespace: "guestbook", + Annotations: annotations, }, Spec: v1alpha1.ApplicationSpec{ Source: &v1alpha1.ApplicationSource{ @@ -911,11 +937,15 @@ func Test_UpdateApplication(t *testing.T) { kubeClient := kube.KubernetesClient{ Clientset: fake.NewFakeKubeClient(), } + annotations := map[string]string{ + common.ImageUpdaterAnnotation: "jannfis/foobar:1.0.0", + } appImages := &ApplicationImages{ Application: v1alpha1.Application{ ObjectMeta: v1.ObjectMeta{ - Name: "guestbook", - Namespace: "guestbook", + Name: "guestbook", + Namespace: "guestbook", + Annotations: annotations, }, Spec: v1alpha1.ApplicationSpec{ Source: &v1alpha1.ApplicationSource{ @@ -967,11 +997,15 @@ func Test_UpdateApplication(t *testing.T) { kubeClient := kube.KubernetesClient{ Clientset: fake.NewFakeKubeClient(), } + annotations := map[string]string{ + common.ImageUpdaterAnnotation: "jannfis/foobar:1.0.0", + } appImages := &ApplicationImages{ Application: v1alpha1.Application{ ObjectMeta: v1.ObjectMeta{ - Name: "guestbook", - Namespace: "guestbook", + Name: "guestbook", + Namespace: "guestbook", + Annotations: annotations, }, Spec: v1alpha1.ApplicationSpec{ Source: &v1alpha1.ApplicationSource{ @@ -1023,11 +1057,15 @@ func Test_UpdateApplication(t *testing.T) { kubeClient := kube.KubernetesClient{ Clientset: fake.NewFakeKubeClient(), } + annotations := map[string]string{ + common.ImageUpdaterAnnotation: "jannfis/foobar:stable", + } appImages := &ApplicationImages{ Application: v1alpha1.Application{ ObjectMeta: v1.ObjectMeta{ - Name: "guestbook", - Namespace: "guestbook", + Name: "guestbook", + Namespace: "guestbook", + Annotations: annotations, }, Spec: v1alpha1.ApplicationSpec{ Source: &v1alpha1.ApplicationSource{ From 4d29ab309987a0a22c854a3d24fc7d198b74d642 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrov Date: Fri, 5 Jan 2024 21:03:06 +0700 Subject: [PATCH 02/12] fixed support for image aliases Signed-off-by: Aleksandr Petrov --- pkg/argocd/argocd.go | 8 ++++++-- pkg/argocd/update.go | 14 ++++++-------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/pkg/argocd/argocd.go b/pkg/argocd/argocd.go index 1a5078de..6fdfb29e 100644 --- a/pkg/argocd/argocd.go +++ b/pkg/argocd/argocd.go @@ -494,9 +494,13 @@ func GetImagesFromApplication(app *v1alpha1.Application) image.ContainerImageLis annotations := app.Annotations imagesFromAnnotations := parseImageList(annotations) + appImgs := make(image.ContainerImageList, 0, len(app.Status.Summary.Images)) for _, imageStr := range app.Status.Summary.Images { - img := image.NewFromIdentifier(imageStr) - if ImageIsAllowed(img, imagesFromAnnotations) { + appImgs = append(appImgs, image.NewFromIdentifier(imageStr)) + } + + for _, img := range *imagesFromAnnotations { + if ImageIsAllowed(img, &appImgs) { images = append(images, img) } } diff --git a/pkg/argocd/update.go b/pkg/argocd/update.go index d5afa498..665f8852 100644 --- a/pkg/argocd/update.go +++ b/pkg/argocd/update.go @@ -419,18 +419,16 @@ func marshalParamsOverride(app *v1alpha1.Application, originalData []byte) ([]by images := GetImagesAndAliasesFromApplication(app) for _, c := range images { - - if c.ImageAlias == "" { - continue + image := c.ImageAlias + if image == "" { + image = c.ImageName } - - helmAnnotationParamName, helmAnnotationParamVersion := getHelmParamNamesFromAnnotation(app.Annotations, c) - + helmAnnotationParamName, helmAnnotationParamVersion := getHelmParamNamesFromAnnotation(app.Annotations, image) if helmAnnotationParamName == "" { - return nil, fmt.Errorf("could not find an image-name annotation for image %s", c.ImageName) + return nil, fmt.Errorf("could not find an image-name annotation for image %s", image) } if helmAnnotationParamVersion == "" { - return nil, fmt.Errorf("could not find an image-tag annotation for image %s", c.ImageName) + return nil, fmt.Errorf("could not find an image-tag annotation for image %s", image) } helmParamName := getHelmParam(appSource.Helm.Parameters, helmAnnotationParamName) From f13442204040715ed4cffab893d108161b619277 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrov Date: Fri, 5 Jan 2024 21:49:43 +0700 Subject: [PATCH 03/12] Fix issue with merging Helm values in marshalParamsOverride function Signed-off-by: Aleksandr Petrov --- pkg/argocd/update.go | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/pkg/argocd/update.go b/pkg/argocd/update.go index 665f8852..406d2077 100644 --- a/pkg/argocd/update.go +++ b/pkg/argocd/update.go @@ -418,6 +418,7 @@ func marshalParamsOverride(app *v1alpha1.Application, originalData []byte) ([]by if strings.HasPrefix(app.Annotations[common.WriteBackTargetAnnotation], common.HelmPrefix) { images := GetImagesAndAliasesFromApplication(app) + var helmValues string for _, c := range images { image := c.ImageAlias if image == "" { @@ -442,16 +443,16 @@ func marshalParamsOverride(app *v1alpha1.Application, originalData []byte) ([]by } // Build string with YAML format to merge with originalData values - helmValues := fmt.Sprintf("%s: %s\n%s: %s", helmAnnotationParamName, helmParamName.Value, helmAnnotationParamVersion, helmParamVersion.Value) - - var mergedParams *conflate.Conflate - mergedParams, err = conflate.FromData(originalData, []byte(helmValues)) - if err != nil { - return nil, err - } + helmValues += fmt.Sprintf("%s: %s\n%s: %s\n", helmAnnotationParamName, helmParamName.Value, helmAnnotationParamVersion, helmParamVersion.Value) + } - override, err = mergedParams.MarshalYAML() + var mergedParams *conflate.Conflate + mergedParams, err = conflate.FromData(originalData, []byte(helmValues)) + if err != nil { + return nil, err } + + override, err = mergedParams.MarshalYAML() } else { var params helmOverride newParams := helmOverride{ From d63414e025261d44422694f86e44c74a7a0ed090 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrov Date: Fri, 5 Jan 2024 22:31:57 +0700 Subject: [PATCH 04/12] Refactor helm values merging logic Signed-off-by: Aleksandr Petrov --- pkg/argocd/update.go | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/pkg/argocd/update.go b/pkg/argocd/update.go index 406d2077..69680817 100644 --- a/pkg/argocd/update.go +++ b/pkg/argocd/update.go @@ -21,7 +21,6 @@ import ( "github.com/argoproj/argo-cd/v2/pkg/apiclient/application" "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" - "github.com/miracl/conflate" "gopkg.in/yaml.v2" ) @@ -416,9 +415,13 @@ func marshalParamsOverride(app *v1alpha1.Application, originalData []byte) ([]by } if strings.HasPrefix(app.Annotations[common.WriteBackTargetAnnotation], common.HelmPrefix) { - images := GetImagesAndAliasesFromApplication(app) + params := make(map[interface{}]interface{}) + err = yaml.Unmarshal(originalData, ¶ms) + if err != nil { + return nil, err + } - var helmValues string + images := GetImagesAndAliasesFromApplication(app) for _, c := range images { image := c.ImageAlias if image == "" { @@ -442,17 +445,11 @@ func marshalParamsOverride(app *v1alpha1.Application, originalData []byte) ([]by return nil, fmt.Errorf("%s parameter not found", helmAnnotationParamVersion) } - // Build string with YAML format to merge with originalData values - helmValues += fmt.Sprintf("%s: %s\n%s: %s\n", helmAnnotationParamName, helmParamName.Value, helmAnnotationParamVersion, helmParamVersion.Value) - } - - var mergedParams *conflate.Conflate - mergedParams, err = conflate.FromData(originalData, []byte(helmValues)) - if err != nil { - return nil, err + setNestedField(params, helmAnnotationParamName, helmParamName.Value) + setNestedField(params, helmAnnotationParamVersion, helmParamVersion.Value) } - override, err = mergedParams.MarshalYAML() + override, err = yaml.Marshal(params) } else { var params helmOverride newParams := helmOverride{ @@ -486,6 +483,18 @@ func marshalParamsOverride(app *v1alpha1.Application, originalData []byte) ([]by return override, nil } +func setNestedField(data map[interface{}]interface{}, fieldPath string, newValue string) { + fields := strings.Split(fieldPath, ".") + lastFieldIndex := len(fields) - 1 + for i, name := range fields { + if i == lastFieldIndex { + data[name] = newValue + } else { + data = data[name].(map[interface{}]interface{}) + } + } +} + func mergeHelmOverride(t *helmOverride, o *helmOverride) { for _, param := range o.Helm.Parameters { idx := slices.IndexFunc(t.Helm.Parameters, func(tp v1alpha1.HelmParameter) bool { return tp.Name == param.Name }) From 4124eb5987aef89793ffc8c90a9ba80a8db2aeb6 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrov Date: Mon, 8 Jan 2024 19:51:06 +0700 Subject: [PATCH 05/12] refactored Signed-off-by: Aleksandr Petrov --- pkg/argocd/argocd.go | 17 ++++------------- pkg/argocd/update.go | 39 +++++++++++++++++++++------------------ 2 files changed, 25 insertions(+), 31 deletions(-) diff --git a/pkg/argocd/argocd.go b/pkg/argocd/argocd.go index 6fdfb29e..c38eaf7d 100644 --- a/pkg/argocd/argocd.go +++ b/pkg/argocd/argocd.go @@ -478,29 +478,20 @@ func SetKustomizeImage(app *v1alpha1.Application, newImage *image.ContainerImage return nil } -// ImageIsAllowed checks whether img is declared in image-list annotation -func ImageIsAllowed(img *image.ContainerImage, list *image.ContainerImageList) bool { - for _, i := range *list { - if i.ImageName == img.ImageName { - return true - } - } - return false -} - // GetImagesFromApplication returns the list of known images for the given application func GetImagesFromApplication(app *v1alpha1.Application) image.ContainerImageList { images := make(image.ContainerImageList, 0) annotations := app.Annotations imagesFromAnnotations := parseImageList(annotations) - appImgs := make(image.ContainerImageList, 0, len(app.Status.Summary.Images)) + appImgs := make(map[string]struct{}, len(app.Status.Summary.Images)) for _, imageStr := range app.Status.Summary.Images { - appImgs = append(appImgs, image.NewFromIdentifier(imageStr)) + img := image.NewFromIdentifier(imageStr) + appImgs[img.ImageName] = struct{}{} } for _, img := range *imagesFromAnnotations { - if ImageIsAllowed(img, &appImgs) { + if _, ok := appImgs[img.ImageName]; ok { images = append(images, img) } } diff --git a/pkg/argocd/update.go b/pkg/argocd/update.go index 69680817..58b6c9a3 100644 --- a/pkg/argocd/update.go +++ b/pkg/argocd/update.go @@ -415,12 +415,13 @@ func marshalParamsOverride(app *v1alpha1.Application, originalData []byte) ([]by } if strings.HasPrefix(app.Annotations[common.WriteBackTargetAnnotation], common.HelmPrefix) { - params := make(map[interface{}]interface{}) - err = yaml.Unmarshal(originalData, ¶ms) + values := make(map[interface{}]interface{}) + err = yaml.Unmarshal(originalData, &values) if err != nil { return nil, err } + newValues := make(map[string]string) images := GetImagesAndAliasesFromApplication(app) for _, c := range images { image := c.ImageAlias @@ -439,17 +440,17 @@ func marshalParamsOverride(app *v1alpha1.Application, originalData []byte) ([]by if helmParamName == nil { return nil, fmt.Errorf("%s parameter not found", helmAnnotationParamName) } + newValues[helmAnnotationParamName] = helmParamName.Value helmParamVersion := getHelmParam(appSource.Helm.Parameters, helmAnnotationParamVersion) if helmParamVersion == nil { return nil, fmt.Errorf("%s parameter not found", helmAnnotationParamVersion) } - - setNestedField(params, helmAnnotationParamName, helmParamName.Value) - setNestedField(params, helmAnnotationParamVersion, helmParamVersion.Value) + newValues[helmAnnotationParamVersion] = helmParamVersion.Value } + mergeHelmValues(values, newValues) - override, err = yaml.Marshal(params) + override, err = yaml.Marshal(values) } else { var params helmOverride newParams := helmOverride{ @@ -483,18 +484,6 @@ func marshalParamsOverride(app *v1alpha1.Application, originalData []byte) ([]by return override, nil } -func setNestedField(data map[interface{}]interface{}, fieldPath string, newValue string) { - fields := strings.Split(fieldPath, ".") - lastFieldIndex := len(fields) - 1 - for i, name := range fields { - if i == lastFieldIndex { - data[name] = newValue - } else { - data = data[name].(map[interface{}]interface{}) - } - } -} - func mergeHelmOverride(t *helmOverride, o *helmOverride) { for _, param := range o.Helm.Parameters { idx := slices.IndexFunc(t.Helm.Parameters, func(tp v1alpha1.HelmParameter) bool { return tp.Name == param.Name }) @@ -506,6 +495,20 @@ func mergeHelmOverride(t *helmOverride, o *helmOverride) { } } +func mergeHelmValues(values map[interface{}]interface{}, newValues map[string]string) { + for fieldPath, newValue := range newValues { + fields := strings.Split(fieldPath, ".") + lastFieldIndex := len(fields) - 1 + for i, name := range fields { + if i == lastFieldIndex { + values[name] = newValue + } else { + values = values[name].(map[interface{}]interface{}) + } + } + } +} + func mergeKustomizeOverride(t *kustomizeOverride, o *kustomizeOverride) { for _, image := range *o.Kustomize.Images { idx := t.Kustomize.Images.Find(image) From 89f0d0f6e0c0c71538a79ec9668e4d0d5d361352 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrov Date: Mon, 8 Jan 2024 20:08:16 +0700 Subject: [PATCH 06/12] rolled back Dockerfile Signed-off-by: Aleksandr Petrov --- Dockerfile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6e592fdf..42ef659a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,7 +17,8 @@ RUN apk update && \ apk add ca-certificates git openssh-client aws-cli tini && \ rm -rf /var/cache/apk/* -RUN mkdir -p /usr/local/bin /app/config +RUN mkdir -p /usr/local/bin +RUN mkdir -p /app/config RUN adduser --home "/app" --disabled-password --uid 1000 argocd COPY --from=builder /src/argocd-image-updater/dist/argocd-image-updater /usr/local/bin/ @@ -25,4 +26,4 @@ COPY hack/git-ask-pass.sh /usr/local/bin/git-ask-pass.sh USER 1000 -ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/argocd-image-updater"] +ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/argocd-image-updater"] \ No newline at end of file From 18faa8cec174ff24e098fce69484bfc98fe8d274 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrov Date: Wed, 10 Jan 2024 16:11:07 +0700 Subject: [PATCH 07/12] fixed bugs and tests Signed-off-by: Aleksandr Petrov --- go.mod | 22 ++-------------------- go.sum | 4 ---- pkg/argocd/argocd.go | 9 +++++---- pkg/argocd/update.go | 10 +++++++--- pkg/argocd/update_test.go | 18 ++++++++++-------- 5 files changed, 24 insertions(+), 39 deletions(-) diff --git a/go.mod b/go.mod index e7d6b0ad..ec0cff97 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,6 @@ require ( github.com/distribution/distribution/v3 v3.0.0-20230722181636-7b502560cad4 github.com/go-git/go-git/v5 v5.11.0 github.com/google/uuid v1.3.1 - github.com/miracl/conflate v1.3.2 github.com/opencontainers/go-digest v1.0.0 github.com/opencontainers/image-spec v1.1.0-rc4 github.com/patrickmn/go-cache v2.1.0+incompatible @@ -36,25 +35,6 @@ require ( sigs.k8s.io/kustomize/kyaml v0.13.9 ) -require ( - cloud.google.com/go v0.110.7 // indirect - cloud.google.com/go/iam v1.1.1 // indirect - cloud.google.com/go/storage v1.33.0 // indirect - github.com/BurntSushi/toml v0.3.1 // indirect - github.com/ghodss/yaml v1.0.0 // indirect - github.com/google/s2a-go v0.1.4 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.5 // indirect - github.com/googleapis/gax-go/v2 v2.12.0 // indirect - github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect - github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect - github.com/xeipuuv/gojsonschema v1.2.0 // indirect - go.opencensus.io v0.24.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.132.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect -) - require ( cloud.google.com/go/compute v1.23.0 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect @@ -165,6 +145,8 @@ require ( golang.org/x/tools v0.13.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect google.golang.org/grpc v1.59.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/go.sum b/go.sum index 3f385a59..3491f54a 100644 --- a/go.sum +++ b/go.sum @@ -481,11 +481,7 @@ github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xlab/treeprint v1.1.0 h1:G/1DjNkPpfZCFt9CSh6b5/nY4VimlbHF3Rh4obvtzDk= github.com/xlab/treeprint v1.1.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= diff --git a/pkg/argocd/argocd.go b/pkg/argocd/argocd.go index c38eaf7d..81d007f0 100644 --- a/pkg/argocd/argocd.go +++ b/pkg/argocd/argocd.go @@ -484,15 +484,16 @@ func GetImagesFromApplication(app *v1alpha1.Application) image.ContainerImageLis annotations := app.Annotations imagesFromAnnotations := parseImageList(annotations) - appImgs := make(map[string]struct{}, len(app.Status.Summary.Images)) + appImgs := make(map[string]*image.ContainerImage, len(app.Status.Summary.Images)) for _, imageStr := range app.Status.Summary.Images { img := image.NewFromIdentifier(imageStr) - appImgs[img.ImageName] = struct{}{} + appImgs[img.ImageName] = img } for _, img := range *imagesFromAnnotations { - if _, ok := appImgs[img.ImageName]; ok { - images = append(images, img) + if appImg, ok := appImgs[img.ImageName]; ok { + appImg.ImageAlias = img.ImageAlias + images = append(images, appImg) } } diff --git a/pkg/argocd/update.go b/pkg/argocd/update.go index 58b6c9a3..ad757e4f 100644 --- a/pkg/argocd/update.go +++ b/pkg/argocd/update.go @@ -499,12 +499,16 @@ func mergeHelmValues(values map[interface{}]interface{}, newValues map[string]st for fieldPath, newValue := range newValues { fields := strings.Split(fieldPath, ".") lastFieldIndex := len(fields) - 1 + node := values for i, name := range fields { if i == lastFieldIndex { - values[name] = newValue - } else { - values = values[name].(map[interface{}]interface{}) + node[name] = newValue + + break + } else if _, ok := node[name]; !ok { + node[name] = make(map[interface{}]interface{}) } + node = node[name].(map[interface{}]interface{}) } } } diff --git a/pkg/argocd/update_test.go b/pkg/argocd/update_test.go index bae5c278..ccc1d2f0 100644 --- a/pkg/argocd/update_test.go +++ b/pkg/argocd/update_test.go @@ -1364,8 +1364,9 @@ helm: t.Run("Valid Helm source with Helm values file", func(t *testing.T) { expected := ` -image.name: nginx -image.tag: v1.0.0 +image: + name: nginx + tag: v1.0.0 replicas: 1 ` app := v1alpha1.Application{ @@ -1410,8 +1411,9 @@ replicas: 1 } originalData := []byte(` -image.name: nginx -image.tag: v0.0.0 +image: + name: nginx + tag: v0.0.0 replicas: 1 `) yaml, err := marshalParamsOverride(&app, originalData) @@ -1461,7 +1463,7 @@ replicas: 1 }, } - originalData := []byte(`random content`) + originalData := []byte(`random: content`) _, err := marshalParamsOverride(&app, originalData) assert.Error(t, err) assert.Equal(t, "could not find an image-tag annotation for image nginx", err.Error()) @@ -1508,7 +1510,7 @@ replicas: 1 }, } - originalData := []byte(`random content`) + originalData := []byte(`random: content`) _, err := marshalParamsOverride(&app, originalData) assert.Error(t, err) assert.Equal(t, "could not find an image-name annotation for image nginx", err.Error()) @@ -1556,7 +1558,7 @@ replicas: 1 }, } - originalData := []byte(`random content`) + originalData := []byte(`random: content`) _, err := marshalParamsOverride(&app, originalData) assert.Error(t, err) assert.Equal(t, "wrongimage.name parameter not found", err.Error()) @@ -1604,7 +1606,7 @@ replicas: 1 }, } - originalData := []byte(`random content`) + originalData := []byte(`random: content`) _, err := marshalParamsOverride(&app, originalData) assert.Error(t, err) assert.Equal(t, "wrongimage.tag parameter not found", err.Error()) From 077148b75e7a0e2d75caaab106bb55d2609e1183 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrov Date: Thu, 18 Jan 2024 19:06:57 +0700 Subject: [PATCH 08/12] Fix repeated image handling in GetImagesFromApplication function Signed-off-by: Aleksandr Petrov --- pkg/argocd/argocd.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pkg/argocd/argocd.go b/pkg/argocd/argocd.go index 81d007f0..a481831d 100644 --- a/pkg/argocd/argocd.go +++ b/pkg/argocd/argocd.go @@ -487,13 +487,14 @@ func GetImagesFromApplication(app *v1alpha1.Application) image.ContainerImageLis appImgs := make(map[string]*image.ContainerImage, len(app.Status.Summary.Images)) for _, imageStr := range app.Status.Summary.Images { img := image.NewFromIdentifier(imageStr) - appImgs[img.ImageName] = img + appImgs[img.GetFullNameWithoutTag()] = img } for _, img := range *imagesFromAnnotations { - if appImg, ok := appImgs[img.ImageName]; ok { - appImg.ImageAlias = img.ImageAlias - images = append(images, appImg) + if appImg, ok := appImgs[img.GetFullNameWithoutTag()]; ok { + i := *appImg + i.ImageAlias = img.ImageAlias + images = append(images, &i) } } From b41295577d66243d420817cda3338331035c6abd Mon Sep 17 00:00:00 2001 From: Aleksandr Petrov Date: Thu, 18 Jan 2024 19:46:28 +0700 Subject: [PATCH 09/12] Update image mapping in GetImagesFromApplication function Signed-off-by: Aleksandr Petrov --- pkg/argocd/argocd.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/argocd/argocd.go b/pkg/argocd/argocd.go index a481831d..97057995 100644 --- a/pkg/argocd/argocd.go +++ b/pkg/argocd/argocd.go @@ -487,11 +487,11 @@ func GetImagesFromApplication(app *v1alpha1.Application) image.ContainerImageLis appImgs := make(map[string]*image.ContainerImage, len(app.Status.Summary.Images)) for _, imageStr := range app.Status.Summary.Images { img := image.NewFromIdentifier(imageStr) - appImgs[img.GetFullNameWithoutTag()] = img + appImgs[img.ImageName] = img } for _, img := range *imagesFromAnnotations { - if appImg, ok := appImgs[img.GetFullNameWithoutTag()]; ok { + if appImg, ok := appImgs[img.ImageName]; ok { i := *appImg i.ImageAlias = img.ImageAlias images = append(images, &i) From c6988313aa711e6270e820ec899855ca1e17de06 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrov Date: Fri, 22 Mar 2024 14:00:33 +0700 Subject: [PATCH 10/12] refactored mergeHelmValues function to use yaml.MapSlice to keep yaml file order Signed-off-by: Aleksandr Petrov --- pkg/argocd/update.go | 45 ++++++++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/pkg/argocd/update.go b/pkg/argocd/update.go index ad757e4f..0289c899 100644 --- a/pkg/argocd/update.go +++ b/pkg/argocd/update.go @@ -415,7 +415,7 @@ func marshalParamsOverride(app *v1alpha1.Application, originalData []byte) ([]by } if strings.HasPrefix(app.Annotations[common.WriteBackTargetAnnotation], common.HelmPrefix) { - values := make(map[interface{}]interface{}) + var values yaml.MapSlice err = yaml.Unmarshal(originalData, &values) if err != nil { return nil, err @@ -448,7 +448,7 @@ func marshalParamsOverride(app *v1alpha1.Application, originalData []byte) ([]by } newValues[helmAnnotationParamVersion] = helmParamVersion.Value } - mergeHelmValues(values, newValues) + mergeHelmValues(&values, newValues) override, err = yaml.Marshal(values) } else { @@ -495,21 +495,38 @@ func mergeHelmOverride(t *helmOverride, o *helmOverride) { } } -func mergeHelmValues(values map[interface{}]interface{}, newValues map[string]string) { - for fieldPath, newValue := range newValues { - fields := strings.Split(fieldPath, ".") - lastFieldIndex := len(fields) - 1 - node := values - for i, name := range fields { - if i == lastFieldIndex { - node[name] = newValue +func mergeHelmValues(values *yaml.MapSlice, newValues map[string]string) { + var update func(values *yaml.MapSlice, path []string, newValue string) + update = func(values *yaml.MapSlice, path []string, newValue string) { + if len(path) == 0 { + return + } - break - } else if _, ok := node[name]; !ok { - node[name] = make(map[interface{}]interface{}) + for i := range *values { + if (*values)[i].Key == path[0] { + if len(path) == 1 { + (*values)[i].Value = newValue + } else if v, ok := (*values)[i].Value.(yaml.MapSlice); ok { + update(&v, path[1:], newValue) + (*values)[i].Value = v + } + return } - node = node[name].(map[interface{}]interface{}) } + + // If the key was not found and we're not at the end of the path, insert a new MapSlice + if len(path) > 1 { + newMapSlice := yaml.MapSlice{} + update(&newMapSlice, path[1:], newValue) + *values = append(*values, yaml.MapItem{Key: path[0], Value: newMapSlice}) + } else if len(path) == 1 { + // If the key was not found and we're at the end of the path, insert a new key-value pair + *values = append(*values, yaml.MapItem{Key: path[0], Value: newValue}) + } + } + + for path, newValue := range newValues { + update(values, strings.Split(path, "."), newValue) } } From 11d924bb61d2be06b788f373eccbeb8f530770df Mon Sep 17 00:00:00 2001 From: Aleksandr Petrov Date: Fri, 14 Jun 2024 13:35:07 +0700 Subject: [PATCH 11/12] fixed deps after rebase Signed-off-by: Aleksandr Petrov --- go.mod | 4 ++-- go.sum | 36 ------------------------------------ 2 files changed, 2 insertions(+), 38 deletions(-) diff --git a/go.mod b/go.mod index ec0cff97..bca523d8 100644 --- a/go.mod +++ b/go.mod @@ -145,8 +145,8 @@ require ( golang.org/x/tools v0.13.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect google.golang.org/grpc v1.59.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/go.sum b/go.sum index 3491f54a..8a98992a 100644 --- a/go.sum +++ b/go.sum @@ -1,21 +1,14 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.110.7 h1:rJyC7nWRg2jWGZ4wSJ5nY65GTdYJkg0cd/uXb+ACI6o= -cloud.google.com/go v0.110.7/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/iam v1.1.1 h1:lW7fzj15aVIXYHREOqjRBV9PsH0Z6u8Y46a1YGvQP4Y= -cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= -cloud.google.com/go/storage v1.33.0 h1:PVrDOkIC8qQVa1P3SXGpQvfuJhN2LHOoyZvWs8D2X5M= -cloud.google.com/go/storage v1.33.0/go.mod h1:Hhh/dogNRGca7IWv1RC2YqEn0c0G77ctA/OxflYkiD8= dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= @@ -88,11 +81,7 @@ github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEM github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/coreos/go-oidc/v3 v3.6.0 h1:AKVxfYw1Gmkn/w96z0DbT/B/xFnzTd3MkZvWLjF4n/o= @@ -131,7 +120,6 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= @@ -151,7 +139,6 @@ github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4 github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fvbommel/sortorder v1.0.1 h1:dSnXLt4mJYH25uDDGa3biZNQsozaUWDSWeKJ0qqFfzE= github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= @@ -208,7 +195,6 @@ github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOW github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= @@ -228,7 +214,6 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -242,21 +227,13 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= -github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= -github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= -github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -333,8 +310,6 @@ github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfr github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= github.com/minio/minio-go/v7 v7.0.58/go.mod h1:NUDy4A4oXPq1l2yK6LTSvCEzAMeIcoz9lcj5dbzSrRE= github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= -github.com/miracl/conflate v1.3.2 h1:ZESwG8pEfwZE9hQ5nPfG/ik+Mnl8jxCGQZSy0qV92nc= -github.com/miracl/conflate v1.3.2/go.mod h1:6UvcI1qeZJSdytXlb0i6bsYnXWCl1UF59DRh/jSJOy4= github.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= @@ -491,8 +466,6 @@ github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/gopher-lua v1.1.0 h1:BojcDhfyDWgU2f2TOzYK/g5p2gxMrku8oupLDqlnSqE= github.com/yuin/gopher-lua v1.1.0/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 h1:SpGay3w+nEwMpfVnbqOLH5gY52/foP8RE8UzTZ1pdSE= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= @@ -516,7 +489,6 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= @@ -559,7 +531,6 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= @@ -666,7 +637,6 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= @@ -703,10 +673,6 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/api v0.132.0 h1:8t2/+qZ26kAOGSmOiHwVycqVaDg7q3JDILrNi/Z6rvc= -google.golang.org/api v0.132.0/go.mod h1:AeTBC6GpJnJSRJjktDcPX0QwtS8pGYZOV6MSuSCusw0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= @@ -730,10 +696,8 @@ google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= From 17ac9d9c2ec9bdde9723d8d119cff85c9921f89e Mon Sep 17 00:00:00 2001 From: Aleksandr Petrov Date: Fri, 14 Jun 2024 14:47:20 +0700 Subject: [PATCH 12/12] fixed after rebase Signed-off-by: Aleksandr Petrov --- pkg/argocd/argocd.go | 19 ++++--------------- pkg/argocd/update.go | 13 +++++++------ 2 files changed, 11 insertions(+), 21 deletions(-) diff --git a/pkg/argocd/argocd.go b/pkg/argocd/argocd.go index 97057995..ac18b2e5 100644 --- a/pkg/argocd/argocd.go +++ b/pkg/argocd/argocd.go @@ -481,26 +481,15 @@ func SetKustomizeImage(app *v1alpha1.Application, newImage *image.ContainerImage // GetImagesFromApplication returns the list of known images for the given application func GetImagesFromApplication(app *v1alpha1.Application) image.ContainerImageList { images := make(image.ContainerImageList, 0) - annotations := app.Annotations - imagesFromAnnotations := parseImageList(annotations) - - appImgs := make(map[string]*image.ContainerImage, len(app.Status.Summary.Images)) for _, imageStr := range app.Status.Summary.Images { - img := image.NewFromIdentifier(imageStr) - appImgs[img.ImageName] = img - } - - for _, img := range *imagesFromAnnotations { - if appImg, ok := appImgs[img.ImageName]; ok { - i := *appImg - i.ImageAlias = img.ImageAlias - images = append(images, &i) - } + image := image.NewFromIdentifier(imageStr) + images = append(images, image) } // The Application may wish to update images that don't create a container we can detect. // Check the image list for images with a force-update annotation, and add them if they are not already present. - for _, img := range *imagesFromAnnotations { + annotations := app.Annotations + for _, img := range *parseImageList(annotations) { if img.HasForceUpdateOptionAnnotation(annotations) { img.ImageTag = nil // the tag from the image list will be a version constraint, which isn't a valid tag images = append(images, img) diff --git a/pkg/argocd/update.go b/pkg/argocd/update.go index 0289c899..ea420f82 100644 --- a/pkg/argocd/update.go +++ b/pkg/argocd/update.go @@ -424,16 +424,17 @@ func marshalParamsOverride(app *v1alpha1.Application, originalData []byte) ([]by newValues := make(map[string]string) images := GetImagesAndAliasesFromApplication(app) for _, c := range images { - image := c.ImageAlias - if image == "" { - image = c.ImageName + + if c.ImageAlias == "" { + continue } - helmAnnotationParamName, helmAnnotationParamVersion := getHelmParamNamesFromAnnotation(app.Annotations, image) + + helmAnnotationParamName, helmAnnotationParamVersion := getHelmParamNamesFromAnnotation(app.Annotations, c) if helmAnnotationParamName == "" { - return nil, fmt.Errorf("could not find an image-name annotation for image %s", image) + return nil, fmt.Errorf("could not find an image-name annotation for image %s", c.ImageName) } if helmAnnotationParamVersion == "" { - return nil, fmt.Errorf("could not find an image-tag annotation for image %s", image) + return nil, fmt.Errorf("could not find an image-tag annotation for image %s", c.ImageName) } helmParamName := getHelmParam(appSource.Helm.Parameters, helmAnnotationParamName)