@@ -36,6 +36,7 @@ import (
3636 "context"
3737 "fmt"
3838 "io"
39+ "sort"
3940 "strings"
4041 "text/template"
4142
@@ -52,7 +53,7 @@ import (
5253)
5354
5455// Information about a resource, rendered format as well as actual in API server
55- type Composite struct {
56+ type ResourceComposite struct {
5657 // The rendered resource
5758 Rendered * unstructured.Unstructured
5859
@@ -67,19 +68,19 @@ type Composite struct {
6768}
6869
6970// Rendering and applying templates is a multi-stage process. This
70- // structure holds information about a rendered template between
71- // stages
71+ // structure holds information about a template between stages
7272type ResourceTemplateState struct {
7373 // Compiled template
7474 Template * template.Template
7575
7676 // Resource information, rendered and current
77- Resource Composite
77+ Resource ResourceComposite // FIXME, refactoring - delete and replace with below
78+ NewResource []ResourceComposite // FIXME, refactoring temp name
7879
79- // Name of rendered resource (from template key in GatewayClassBlueprint, not Kubernetes resource name)
80+ // Name of template (from template key in GatewayClassBlueprint, not Kubernetes resource name)
8081 TemplateName string
8182
82- // Raw template for resource
83+ // Raw template
8384 StringTemplate string
8485}
8586
@@ -133,9 +134,13 @@ func parseTemplates(resourceTemplates map[string]string) ([]*ResourceTemplateSta
133134 if err != nil {
134135 return nil , fmt .Errorf ("cannot parse template %q: %w" , tmplKey , err )
135136 }
137+ r .NewResource = make ([]ResourceComposite , 1 )
136138 templates = append (templates , & r )
137139 }
138140
141+ // Sort to increase predictability
142+ sort .SliceStable (templates , func (i , j int ) bool { return templates [i ].TemplateName < templates [j ].TemplateName })
143+
139144 return templates , nil
140145}
141146
@@ -153,7 +158,7 @@ func renderTemplates(ctx context.Context, r ControllerDynClient, parent metav1.O
153158
154159 for _ , tmplRes := range templates {
155160 if tmplRes .Resource .Rendered == nil {
156- tmplRes .Resource .Rendered , err = template2Unstructured (tmplRes .Template , values )
161+ // tmplRes.Resource.Rendered, err = template2Unstructured(tmplRes.Template, values) // FIXME
157162 if err != nil {
158163 if isFinalAttempt {
159164 logger .Error (err , "cannot render template" , "templateName" , tmplRes .TemplateName )
@@ -199,9 +204,9 @@ func renderTemplates(ctx context.Context, r ControllerDynClient, parent metav1.O
199204func buildResourceValues (templates []* ResourceTemplateState ) map [string ]any {
200205 resources := map [string ]any {}
201206
202- for _ , tmplRes := range templates {
203- if tmplRes .Resource .Current != nil {
204- resources [tmplRes .TemplateName ] = tmplRes .Resource .Current .UnstructuredContent ()
207+ for _ , tmpl := range templates {
208+ if tmpl .Resource .Current != nil {
209+ resources [tmpl .TemplateName ] = tmpl .Resource .Current .UnstructuredContent ()
205210 }
206211 }
207212 return resources
@@ -272,26 +277,38 @@ func templateRender(tmpl *template.Template, templateValues *TemplateValues) (*b
272277 return & buffer , nil
273278}
274279
275- func template2map (tmpl * template.Template , tmplValues * TemplateValues ) (map [string ]any , error ) {
280+ func template2maps (tmpl * template.Template , tmplValues * TemplateValues ) ([] map [string ]any , error ) {
276281 renderBuffer , err := templateRender (tmpl , tmplValues )
277282 if err != nil {
278283 return nil , err
279284 }
280285
281- rawResource := map [string ]any {}
282- err = yaml .Unmarshal (renderBuffer .Bytes (), & rawResource )
283- if err != nil {
284- return nil , err
286+ rawSlice := bytes .SplitN (renderBuffer .Bytes (), []byte ("---" ), - 1 )
287+ resources := make ([]map [string ]any , 0 , len (rawSlice ))
288+ for _ , raw := range rawSlice {
289+ r := map [string ]any {}
290+ err = yaml .Unmarshal (raw , & r )
291+ if err != nil {
292+ return nil , err
293+ }
294+ if len (r ) == 0 {
295+ continue // Empty resource
296+ }
297+ resources = append (resources , r )
285298 }
286- return rawResource , nil
299+ return resources , nil
287300}
288301
289- func template2Unstructured (tmpl * template.Template , tmplValues * TemplateValues ) (* unstructured.Unstructured , error ) {
290- rawResource , err := template2map (tmpl , tmplValues )
302+ func template2Unstructured (tmpl * template.Template , tmplValues * TemplateValues ) ([] unstructured.Unstructured , error ) {
303+ rawResources , err := template2maps (tmpl , tmplValues )
291304 if err != nil {
292305 return nil , err
293306 }
294- return & unstructured.Unstructured {Object : rawResource }, nil
307+ uu := make ([]unstructured.Unstructured , 0 , len (rawResources ))
308+ for _ , r := range rawResources {
309+ uu = append (uu , unstructured.Unstructured {Object : r })
310+ }
311+ return uu , nil
295312}
296313
297314// Prepare a resource like Gateway or HTTPRoute for use in templates
0 commit comments