github.com/argoproj/argo-cd/v3@v3.2.1/applicationset/generators/list.go (about)

     1  package generators
     2  
     3  import (
     4  	"encoding/json"
     5  	"errors"
     6  	"fmt"
     7  	"time"
     8  
     9  	"sigs.k8s.io/controller-runtime/pkg/client"
    10  	"sigs.k8s.io/yaml"
    11  
    12  	argoprojiov1alpha1 "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1"
    13  )
    14  
    15  var _ Generator = (*ListGenerator)(nil)
    16  
    17  type ListGenerator struct{}
    18  
    19  func NewListGenerator() Generator {
    20  	g := &ListGenerator{}
    21  	return g
    22  }
    23  
    24  func (g *ListGenerator) GetRequeueAfter(_ *argoprojiov1alpha1.ApplicationSetGenerator) time.Duration {
    25  	return NoRequeueAfter
    26  }
    27  
    28  func (g *ListGenerator) GetTemplate(appSetGenerator *argoprojiov1alpha1.ApplicationSetGenerator) *argoprojiov1alpha1.ApplicationSetTemplate {
    29  	return &appSetGenerator.List.Template
    30  }
    31  
    32  func (g *ListGenerator) GenerateParams(appSetGenerator *argoprojiov1alpha1.ApplicationSetGenerator, appSet *argoprojiov1alpha1.ApplicationSet, _ client.Client) ([]map[string]any, error) {
    33  	if appSetGenerator == nil {
    34  		return nil, ErrEmptyAppSetGenerator
    35  	}
    36  
    37  	if appSetGenerator.List == nil {
    38  		return nil, ErrEmptyAppSetGenerator
    39  	}
    40  
    41  	res := make([]map[string]any, len(appSetGenerator.List.Elements))
    42  
    43  	for i, tmpItem := range appSetGenerator.List.Elements {
    44  		params := map[string]any{}
    45  		var element map[string]any
    46  		err := json.Unmarshal(tmpItem.Raw, &element)
    47  		if err != nil {
    48  			return nil, fmt.Errorf("error unmarshling list element %w", err)
    49  		}
    50  
    51  		if appSet.Spec.GoTemplate {
    52  			res[i] = element
    53  		} else {
    54  			for key, value := range element {
    55  				if key == "values" {
    56  					values, ok := (value).(map[string]any)
    57  					if !ok {
    58  						return nil, errors.New("error parsing values map")
    59  					}
    60  					for k, v := range values {
    61  						value, ok := v.(string)
    62  						if !ok {
    63  							return nil, fmt.Errorf("error parsing value as string %w", err)
    64  						}
    65  						params["values."+k] = value
    66  					}
    67  				} else {
    68  					v, ok := value.(string)
    69  					if !ok {
    70  						return nil, fmt.Errorf("error parsing value as string %w", err)
    71  					}
    72  					params[key] = v
    73  				}
    74  				res[i] = params
    75  			}
    76  		}
    77  	}
    78  
    79  	// Append elements from ElementsYaml to the response
    80  	if appSetGenerator.List.ElementsYaml != "" {
    81  		var yamlElements []map[string]any
    82  		err := yaml.Unmarshal([]byte(appSetGenerator.List.ElementsYaml), &yamlElements)
    83  		if err != nil {
    84  			return nil, fmt.Errorf("error unmarshling decoded ElementsYaml %w", err)
    85  		}
    86  		res = append(res, yamlElements...)
    87  	}
    88  
    89  	return res, nil
    90  }