@@ -3,6 +3,7 @@ package argocd
3
3
import (
4
4
"context"
5
5
"fmt"
6
+ "golang.org/x/exp/slices"
6
7
"path/filepath"
7
8
"strings"
8
9
"sync"
@@ -375,7 +376,7 @@ func setAppImage(app *v1alpha1.Application, img *image.ContainerImage) error {
375
376
376
377
// marshalParamsOverride marshals the parameter overrides of a given application
377
378
// into YAML bytes
378
- func marshalParamsOverride (app * v1alpha1.Application ) ([]byte , error ) {
379
+ func marshalParamsOverride (app * v1alpha1.Application , originalData [] byte ) ([]byte , error ) {
379
380
var override []byte
380
381
var err error
381
382
@@ -385,21 +386,46 @@ func marshalParamsOverride(app *v1alpha1.Application) ([]byte, error) {
385
386
if app .Spec .Source .Kustomize == nil {
386
387
return []byte {}, nil
387
388
}
388
- params := kustomizeOverride {
389
+
390
+ var params kustomizeOverride
391
+ newParams := kustomizeOverride {
389
392
Kustomize : kustomizeImages {
390
393
Images : & app .Spec .Source .Kustomize .Images ,
391
394
},
392
395
}
396
+
397
+ if len (originalData ) == 0 {
398
+ override , err = yaml .Marshal (newParams )
399
+ break
400
+ }
401
+ err := yaml .Unmarshal (originalData , & params )
402
+ if err != nil {
403
+ override , err = yaml .Marshal (newParams )
404
+ break
405
+ }
406
+ mergeKustomizeOverride (& params , & newParams )
393
407
override , err = yaml .Marshal (params )
394
408
case ApplicationTypeHelm :
395
409
if app .Spec .Source .Helm == nil {
396
410
return []byte {}, nil
397
411
}
398
- params := helmOverride {
412
+ var params helmOverride
413
+ newParams := helmOverride {
399
414
Helm : helmParameters {
400
415
Parameters : app .Spec .Source .Helm .Parameters ,
401
416
},
402
417
}
418
+
419
+ if len (originalData ) == 0 {
420
+ override , err = yaml .Marshal (newParams )
421
+ break
422
+ }
423
+ err := yaml .Unmarshal (originalData , & params )
424
+ if err != nil {
425
+ override , err = yaml .Marshal (newParams )
426
+ break
427
+ }
428
+ mergeHelmOverride (& params , & newParams )
403
429
override , err = yaml .Marshal (params )
404
430
default :
405
431
err = fmt .Errorf ("unsupported application type" )
@@ -411,6 +437,28 @@ func marshalParamsOverride(app *v1alpha1.Application) ([]byte, error) {
411
437
return override , nil
412
438
}
413
439
440
+ func mergeHelmOverride (t * helmOverride , o * helmOverride ) {
441
+ for _ , param := range o .Helm .Parameters {
442
+ idx := slices .IndexFunc (t .Helm .Parameters , func (tp v1alpha1.HelmParameter ) bool { return tp .Name == param .Name })
443
+ if idx != - 1 {
444
+ t .Helm .Parameters [idx ] = param
445
+ continue
446
+ }
447
+ t .Helm .Parameters = append (t .Helm .Parameters , param )
448
+ }
449
+ }
450
+
451
+ func mergeKustomizeOverride (t * kustomizeOverride , o * kustomizeOverride ) {
452
+ for _ , image := range * o .Kustomize .Images {
453
+ idx := t .Kustomize .Images .Find (image )
454
+ if idx != - 1 {
455
+ (* t .Kustomize .Images )[idx ] = image
456
+ continue
457
+ }
458
+ * t .Kustomize .Images = append (* t .Kustomize .Images , image )
459
+ }
460
+ }
461
+
414
462
func getWriteBackConfig (app * v1alpha1.Application , kubeClient * kube.KubernetesClient , argoClient ArgoCD ) (* WriteBackConfig , error ) {
415
463
wbc := & WriteBackConfig {}
416
464
// Default write-back is to use Argo CD API
0 commit comments