diff --git a/pkg/controller/reconciler/jinjatemplate/parser/parser.go b/pkg/controller/reconciler/jinjatemplate/parser/parser.go index 3753292..18559b1 100644 --- a/pkg/controller/reconciler/jinjatemplate/parser/parser.go +++ b/pkg/controller/reconciler/jinjatemplate/parser/parser.go @@ -42,12 +42,12 @@ func (r *Loader) Get(name string) (io.Reader, error) { } -func New(templates map[string]string) (*Parser, error) { +func New(templates map[string]string, mainName string) (*Parser, error) { ts := pongo2.NewSet("choreo", &Loader{ templates: templates, }) - mainTemplate, err := ts.FromString(templates["main.jinja2"]) + mainTemplate, err := ts.FromString(templates[mainName]) if err != nil { return nil, err } diff --git a/pkg/controller/reconciler/jinjatemplate/parser/parser_test.go b/pkg/controller/reconciler/jinjatemplate/parser/parser_test.go index 02a4897..ff600b1 100644 --- a/pkg/controller/reconciler/jinjatemplate/parser/parser_test.go +++ b/pkg/controller/reconciler/jinjatemplate/parser/parser_test.go @@ -76,7 +76,7 @@ func TestRender(t *testing.T) { fmt.Println("input\n", u) - p, err := New(templateFiles) + p, err := New(templateFiles, "main.jinja2") if err != nil { t.Errorf("creating parser failed: %v", err) return diff --git a/pkg/controller/reconciler/jinjatemplate/reconciler.go b/pkg/controller/reconciler/jinjatemplate/reconciler.go index 17d5648..b6828e8 100644 --- a/pkg/controller/reconciler/jinjatemplate/reconciler.go +++ b/pkg/controller/reconciler/jinjatemplate/reconciler.go @@ -20,6 +20,8 @@ import ( "bytes" "context" "fmt" + "maps" + "strings" choreov1alpha1 "github.com/kform-dev/choreo/apis/choreo/v1alpha1" "github.com/kform-dev/choreo/pkg/client/go/resourceclient" @@ -43,10 +45,26 @@ func NewReconcilerFn(client resourceclient.Client, reconcileConfig *choreov1alph forgvk: reconcileConfig.GetForGVK(), owns: reconcileConfig.GetOwnsGVKs(), branch: branch, + parser: make([]*parser.Parser, 0), } - p, err := parser.New(reconcileConfig.Spec.Code) - if err != nil { - return nil, err + mains := make(map[string]string) + others := make(map[string]string) + for k, v := range reconcileConfig.Spec.Code { + if strings.HasSuffix(k, "main.jinja2") { + mains[k] = v + } else { + others[k] = v + } + } + for k, v := range mains { + code := make(map[string]string) + maps.Copy(code, others) + code[k] = v + p, err := parser.New(code, k) + if err != nil { + return nil, err + } + r.parser = append(r.parser, p) } r.parser = p return r, nil @@ -55,7 +73,7 @@ func NewReconcilerFn(client resourceclient.Client, reconcileConfig *choreov1alph type reconciler struct { name string - parser *parser.Parser + parser []*parser.Parser client resourceclient.Client forgvk schema.GroupVersionKind conditionType *string @@ -107,22 +125,25 @@ func (r *reconciler) Reconcile(ctx context.Context, req reconcile.Request) (reco return reconcile.Result{}, nil } - var buf bytes.Buffer - if err := r.parser.Render(ctx, "main.jinja2", u, &buf); err != nil { - return reconcile.Result{}, fmt.Errorf("jinja2 template %s parser failed err: %s", r.name, err.Error()) - } + for _, p := range r.parser { + var buf bytes.Buffer + if err := p.Render(ctx, "main.jinja2", u, &buf); err != nil { + return reconcile.Result{}, fmt.Errorf("jinja2 template %s parser failed err: %s", r.name, err.Error()) + } - //fmt.Println("config", buf.String()) + //fmt.Println("config", buf.String()) + + data := map[string]any{} + if err := yaml.Unmarshal(buf.Bytes(), &data); err != nil { + return reconcile.Result{}, fmt.Errorf("jinja2 template %s generate invalid yaml failed err: %s", r.name, err.Error()) + } - data := map[string]any{} - if err := yaml.Unmarshal(buf.Bytes(), &data); err != nil { - return reconcile.Result{}, fmt.Errorf("jinja2 template %s generate invalid yaml failed err: %s", r.name, err.Error()) + // apply the own resource generated by the template + newu := &unstructured.Unstructured{} + newu.Object = data + r.resources.AddNewResource(ctx, newu) } - // apply the own resource generated by the template - newu := &unstructured.Unstructured{} - newu.Object = data - r.resources.AddNewResource(ctx, newu) if err := r.resources.Apply(ctx); err != nil { return reconcile.Result{}, fmt.Errorf("apply failed for jinja2 template %s, err: %s", r.name, err.Error()) }