diff options
Diffstat (limited to 'pkg/argocd/update.go')
| -rw-r--r-- | pkg/argocd/update.go | 66 |
1 files changed, 59 insertions, 7 deletions
diff --git a/pkg/argocd/update.go b/pkg/argocd/update.go index 3f6f253..6a75c13 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" ) @@ -461,16 +460,24 @@ 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", helmAnnotationParamName, helmParamName.Value, helmAnnotationParamVersion, helmParamVersion.Value) - - var mergedParams *conflate.Conflate - mergedParams, err = conflate.FromData(originalData, []byte(helmValues)) + // Create new values structure + //var helmNewValues map[string]interface{} + helmNewValues := yaml.MapSlice{} + err = yaml.Unmarshal(originalData, &helmNewValues) if err != nil { return nil, err } - override, err = mergedParams.MarshalYAML() + err = setHelmValue(helmNewValues, helmAnnotationParamName, helmParamName.Value) + if err != nil { + return nil, fmt.Errorf("failed to set image parameter name value: %v", err) + } + err = setHelmValue(helmNewValues, helmAnnotationParamVersion, helmParamVersion.Value) + if err != nil { + return nil, fmt.Errorf("failed to set image parameter version value: %v", err) + } + + override, err = yaml.Marshal(helmNewValues) } } else { var params helmOverride @@ -527,6 +534,51 @@ func mergeKustomizeOverride(t *kustomizeOverride, o *kustomizeOverride) { } } +// Check if a key exists in a MapSlice and return its index and value +func findHelmValuesKey(m yaml.MapSlice, key string) (int, bool) { + for i, item := range m { + if item.Key == key { + return i, true + } + } + return -1, false +} + +// set value of the parameter passed from the annotations. +func setHelmValue(m yaml.MapSlice, key string, value interface{}) error { + // Check if the full key exists + if idx, found := findHelmValuesKey(m, key); found { + m[idx].Value = value + return nil + } + + var err error + keys := strings.Split(key, ".") + current := m + + for i, k := range keys { + if idx, found := findHelmValuesKey(current, k); found { + if i == len(keys)-1 { + // If we're at the final key, set the value and return + current[idx].Value = value + return nil + } else { + // Navigate deeper into the map + if nestedMap, ok := current[idx].Value.(yaml.MapSlice); ok { + current = nestedMap + } else { + return fmt.Errorf("unexpected type %T for key %s", current[idx].Value, k) + } + } + } else { + err = fmt.Errorf("key %s not found in the map", k) + break + } + } + + return err +} + func getWriteBackConfig(app *v1alpha1.Application, kubeClient *kube.KubernetesClient, argoClient ArgoCD) (*WriteBackConfig, error) { wbc := &WriteBackConfig{} // Default write-back is to use Argo CD API |
