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

     1  package template
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"sigs.k8s.io/controller-runtime/pkg/client"
     7  
     8  	log "github.com/sirupsen/logrus"
     9  
    10  	"github.com/argoproj/argo-cd/v3/applicationset/generators"
    11  	"github.com/argoproj/argo-cd/v3/applicationset/utils"
    12  
    13  	argov1alpha1 "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1"
    14  )
    15  
    16  func GenerateApplications(logCtx *log.Entry, applicationSetInfo argov1alpha1.ApplicationSet, g map[string]generators.Generator, renderer utils.Renderer, client client.Client) ([]argov1alpha1.Application, argov1alpha1.ApplicationSetReasonType, error) {
    17  	var res []argov1alpha1.Application
    18  
    19  	var firstError error
    20  	var applicationSetReason argov1alpha1.ApplicationSetReasonType
    21  
    22  	for _, requestedGenerator := range applicationSetInfo.Spec.Generators {
    23  		t, err := generators.Transform(requestedGenerator, g, applicationSetInfo.Spec.Template, &applicationSetInfo, map[string]any{}, client)
    24  		if err != nil {
    25  			logCtx.WithError(err).WithField("generator", requestedGenerator).
    26  				Error("error generating application from params")
    27  			if firstError == nil {
    28  				firstError = err
    29  				applicationSetReason = argov1alpha1.ApplicationSetReasonApplicationParamsGenerationError
    30  			}
    31  			continue
    32  		}
    33  
    34  		for _, a := range t {
    35  			tmplApplication := GetTempApplication(a.Template)
    36  
    37  			for _, p := range a.Params {
    38  				app, err := renderer.RenderTemplateParams(tmplApplication, applicationSetInfo.Spec.SyncPolicy, p, applicationSetInfo.Spec.GoTemplate, applicationSetInfo.Spec.GoTemplateOptions)
    39  				if err != nil {
    40  					logCtx.WithError(err).WithField("params", a.Params).WithField("generator", requestedGenerator).
    41  						Error("error generating application from params")
    42  
    43  					if firstError == nil {
    44  						firstError = err
    45  						applicationSetReason = argov1alpha1.ApplicationSetReasonRenderTemplateParamsError
    46  					}
    47  					continue
    48  				}
    49  
    50  				if applicationSetInfo.Spec.TemplatePatch != nil {
    51  					patchedApplication, err := renderTemplatePatch(renderer, app, applicationSetInfo, p)
    52  					if err != nil {
    53  						log.WithError(err).WithField("params", a.Params).WithField("generator", requestedGenerator).
    54  							Error("error generating application from params")
    55  
    56  						if firstError == nil {
    57  							firstError = err
    58  							applicationSetReason = argov1alpha1.ApplicationSetReasonRenderTemplateParamsError
    59  						}
    60  						continue
    61  					}
    62  
    63  					app = patchedApplication
    64  				}
    65  
    66  				// The app's namespace must be the same as the AppSet's namespace to preserve the appsets-in-any-namespace
    67  				// security boundary.
    68  				app.Namespace = applicationSetInfo.Namespace
    69  				res = append(res, *app)
    70  			}
    71  		}
    72  		if log.IsLevelEnabled(log.DebugLevel) {
    73  			logCtx.WithField("generator", requestedGenerator).Debugf("apps from generator: %+v", res)
    74  		} else {
    75  			logCtx.Infof("generated %d applications", len(res))
    76  		}
    77  	}
    78  
    79  	return res, applicationSetReason, firstError
    80  }
    81  
    82  func renderTemplatePatch(r utils.Renderer, app *argov1alpha1.Application, applicationSetInfo argov1alpha1.ApplicationSet, params map[string]any) (*argov1alpha1.Application, error) {
    83  	replacedTemplate, err := r.Replace(*applicationSetInfo.Spec.TemplatePatch, params, applicationSetInfo.Spec.GoTemplate, applicationSetInfo.Spec.GoTemplateOptions)
    84  	if err != nil {
    85  		return nil, fmt.Errorf("error replacing values in templatePatch: %w", err)
    86  	}
    87  
    88  	return applyTemplatePatch(app, replacedTemplate)
    89  }
    90  
    91  func GetTempApplication(applicationSetTemplate argov1alpha1.ApplicationSetTemplate) *argov1alpha1.Application {
    92  	var tmplApplication argov1alpha1.Application
    93  	tmplApplication.Annotations = applicationSetTemplate.Annotations
    94  	tmplApplication.Labels = applicationSetTemplate.Labels
    95  	tmplApplication.Namespace = applicationSetTemplate.Namespace
    96  	tmplApplication.Name = applicationSetTemplate.Name
    97  	tmplApplication.Spec = applicationSetTemplate.Spec
    98  	tmplApplication.Finalizers = applicationSetTemplate.Finalizers
    99  
   100  	return &tmplApplication
   101  }