Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions pkg/controller/reconciler/jinjatemplate/parser/parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
53 changes: 37 additions & 16 deletions pkg/controller/reconciler/jinjatemplate/reconciler.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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())
}
Expand Down