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 }