@@ -74,8 +74,8 @@ type ResourceTemplateState struct {
7474 Template * template.Template
7575
7676 // Resource information, rendered and current
77- OldResource ResourceComposite // FIXME, refactoring - delete and replace with below
78- NewResource []ResourceComposite // FIXME, refactoring temp name
77+ OldResource ResourceComposite // FIXME, refactoring - delete and replace with below
78+ NewResources []ResourceComposite // FIXME, refactoring temp name
7979
8080 // Name of template (from template key in GatewayClassBlueprint, not Kubernetes resource name)
8181 TemplateName string
@@ -134,7 +134,7 @@ func parseTemplates(resourceTemplates map[string]string) ([]*ResourceTemplateSta
134134 if err != nil {
135135 return nil , fmt .Errorf ("cannot parse template %q: %w" , tmplKey , err )
136136 }
137- r .NewResource = make ([]ResourceComposite , 1 )
137+ r .NewResources = make ([]ResourceComposite , 0 )
138138 templates = append (templates , & r )
139139 }
140140
@@ -156,9 +156,10 @@ func renderTemplates(ctx context.Context, r ControllerDynClient, parent metav1.O
156156 logger := log .FromContext (ctx )
157157 ns := parent .GetNamespace ()
158158
159- for _ , tmpl := range templates {
160- if len (tmpl .NewResource ) == 0 {
161- tmpl .NewResource , err = template2Composite (r , tmpl .Template , values )
159+ for tIdx := range templates {
160+ tmpl := templates [tIdx ]
161+ if len (tmpl .NewResources ) == 0 {
162+ tmpl .NewResources , err = template2Composite (r , tmpl .Template , values )
162163 if err != nil {
163164 if isFinalAttempt {
164165 logger .Error (err , "cannot render template" , "templateName" , tmpl .TemplateName )
@@ -169,16 +170,9 @@ func renderTemplates(ctx context.Context, r ControllerDynClient, parent metav1.O
169170 continue
170171 }
171172 }
172- // FIXME, remove
173- // if tmplRes.Resource.GVR == nil {
174- // tmplRes.Resource.GVR, tmplRes.Resource.IsNamespaced, err = unstructuredToGVR(r, tmplRes.Resource.Rendered)
175- // if err != nil {
176- // logger.Error(err, "cannot detect GVR for resource", "templateName", tmplRes.TemplateName)
177- // continue
178- // }
179- // }
180173 rendered ++
181- for resIdx , res := range tmpl .NewResource {
174+ for resIdx := range tmpl .NewResources {
175+ res := & tmpl .NewResources [resIdx ]
182176 if res .Current == nil {
183177 var dynamicClient dynamic.ResourceInterface
184178 if res .IsNamespaced {
@@ -191,9 +185,9 @@ func renderTemplates(ctx context.Context, r ControllerDynClient, parent metav1.O
191185 logger .Error (err , "cannot get current resource" , "templateName" , tmpl .TemplateName , "resIdx" , resIdx )
192186 continue
193187 }
194- logger .Info ("update current" , "templatename" , tmpl .TemplateName , "current" , res .Current )
188+ logger .Info ("update current" , "templatename" , tmpl .TemplateName , "idx" , resIdx , " current" , res .Current )
195189 } else {
196- logger .Info ("already have update current" , "templatename" , tmpl .TemplateName , "current" , res .Current )
190+ logger .Info ("already have update current" , "templatename" , tmpl .TemplateName , "idx" , resIdx , " current" , res .Current )
197191 }
198192 }
199193 exists ++
@@ -205,17 +199,18 @@ func renderTemplates(ctx context.Context, r ControllerDynClient, parent metav1.O
205199// referencing values between resources, e.g. a status field from one
206200// resource may be used to template another resource
207201func buildResourceValues (templates []* ResourceTemplateState ) map [string ]any {
208- resources := map [string ]any {}
202+ resourceValues := map [string ]any {}
209203
210204 for _ , tmpl := range templates {
211- resources [ tmpl . TemplateName ] = make ([]map [string ]any , 0 )
212- for _ , res := range tmpl .NewResource {
205+ resSlice : = make ([]map [string ]any , 0 )
206+ for _ , res := range tmpl .NewResources {
213207 if res .Current != nil {
214- resources [ tmpl . TemplateName ] = append (resources [ tmpl . TemplateName ] , res )
208+ resSlice = append (resSlice , res . Current . UnstructuredContent () )
215209 }
216210 }
211+ resourceValues [tmpl .TemplateName ] = resSlice
217212 }
218- return resources
213+ return resourceValues
219214}
220215
221216// Apply a list of pre-rendered templates and set owner reference for
@@ -226,31 +221,33 @@ func applyTemplates(ctx context.Context, r ControllerDynClient, parent metav1.Ob
226221
227222 logger := log .FromContext (ctx )
228223
229- for _ , tmplRes := range templates {
230- if tmplRes .Resource .Rendered == nil || tmplRes .Resource .GVR == nil {
231- // We do not yet have enough information to render/apply this resource
232- continue
233- }
234- if tmplRes .Resource .IsNamespaced {
235- // Only namespaced objects can have namespaced object as owner
236- err = ctrl .SetControllerReference (parent , tmplRes .Resource .Rendered , r .Scheme ())
237- if err != nil {
238- logger .Error (err , "cannot set owner for namespaced template" , "templateName" , tmplRes .TemplateName )
239- errorCnt ++
224+ for _ , tmpl := range templates {
225+ for _ , res := range tmpl .NewResources {
226+ if res .Rendered == nil || res .GVR == nil {
227+ // We do not yet have enough information to render/apply this resource
228+ continue
229+ }
230+ if res .IsNamespaced {
231+ // Only namespaced objects can have namespaced object as owner
232+ err = ctrl .SetControllerReference (parent , res .Rendered , r .Scheme ())
233+ if err != nil {
234+ logger .Error (err , "cannot set owner for namespaced template" , "templateName" , tmpl .TemplateName )
235+ errorCnt ++
236+ } else {
237+ ns := parent .GetNamespace ()
238+ err = patchUnstructured (ctx , r , res .Rendered , res .GVR , & ns )
239+ if err != nil {
240+ logger .Error (err , "cannot apply namespaced template" , "templateName" , tmpl .TemplateName )
241+ errorCnt ++
242+ }
243+ }
240244 } else {
241- ns := parent .GetNamespace ()
242- err = patchUnstructured (ctx , r , tmplRes .Resource .Rendered , tmplRes .Resource .GVR , & ns )
245+ err = patchUnstructured (ctx , r , res .Rendered , res .GVR , nil )
243246 if err != nil {
244- logger .Error (err , "cannot apply namespaced template" , "templateName" , tmplRes .TemplateName )
247+ logger .Error (err , "cannot apply cluster-scoped template" , "templateName" , tmpl .TemplateName )
245248 errorCnt ++
246249 }
247250 }
248- } else {
249- err = patchUnstructured (ctx , r , tmplRes .Resource .Rendered , tmplRes .Resource .GVR , nil )
250- if err != nil {
251- logger .Error (err , "cannot apply cluster-scoped template" , "templateName" , tmplRes .TemplateName )
252- errorCnt ++
253- }
254251 }
255252 }
256253
@@ -305,32 +302,20 @@ func template2maps(tmpl *template.Template, tmplValues *TemplateValues) ([]map[s
305302 return resources , nil
306303}
307304
308- // FIXME delete replaced by template2Composite
309- // func template2Unstructured(tmpl *template.Template, tmplValues *TemplateValues) ([]unstructured.Unstructured, error) {
310- // rawResources, err := template2maps(tmpl, tmplValues)
311- // if err != nil {
312- // return nil, err
313- // }
314- // uu := make([]unstructured.Unstructured, 0, len(rawResources))
315- // for _, r := range rawResources {
316- // uu = append(uu, unstructured.Unstructured{Object: r})
317- // }
318- // return uu, nil
319- // }
320-
321305func template2Composite (r ControllerClient , tmpl * template.Template , tmplValues * TemplateValues ) ([]ResourceComposite , error ) {
322306 rawResources , err := template2maps (tmpl , tmplValues )
323307 if err != nil {
324308 return nil , err
325309 }
326310 composites := make ([]ResourceComposite , 0 , len (rawResources ))
327- for _ , r := range rawResources {
311+ for rawIdx := range rawResources {
328312 c := ResourceComposite {}
329- c .Rendered = & unstructured.Unstructured {Object : r }
313+ c .Rendered = & unstructured.Unstructured {Object : rawResources [ rawIdx ] }
330314 c .GVR , c .IsNamespaced , err = unstructuredToGVR (r , c .Rendered )
331315 if err != nil {
332316 return nil , err
333317 }
318+ composites = append (composites , c )
334319 }
335320 return composites , nil
336321}
0 commit comments