Skip to content

Commit ad995e8

Browse files
committed
Tests passing
1 parent 02f714d commit ad995e8

File tree

4 files changed

+49
-87
lines changed

4 files changed

+49
-87
lines changed

controllers/gateway_controller_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ spec:
8585
status:
8686
template: |
8787
addresses:
88-
{{ toYaml .Resources.childGateway.status.addresses | nindent 2}}
88+
{{ toYaml (index .Resources.childGateway 0).status.addresses | nindent 2}}
8989
resourceTemplates:
9090
childGateway: |
9191
apiVersion: gateway.networking.k8s.io/v1beta1
@@ -116,7 +116,7 @@ spec:
116116
name: intermediate-configmap
117117
namespace: {{ .Gateway.metadata.namespace }}
118118
data:
119-
valueIntermediate: {{ .Resources.configMapTestSource.data.valueToRead1 }}
119+
valueIntermediate: {{ (index .Resources.configMapTestSource 0).data.valueToRead1 }}
120120
# Use references to multiple resources coupled with template pipeline and functions
121121
configMapTestDestination: |
122122
apiVersion: v1
@@ -125,7 +125,7 @@ spec:
125125
name: dst-configmap
126126
namespace: {{ .Gateway.metadata.namespace }}
127127
data:
128-
valueRead: {{ printf "%s, %s" .Resources.configMapTestIntermediate.data.valueIntermediate .Resources.configMapTestSource.data.valueToRead2 | upper }}
128+
valueRead: {{ printf "%s, %s" (index .Resources.configMapTestIntermediate 0).data.valueIntermediate (index .Resources.configMapTestSource 0).data.valueToRead2 | upper }}
129129
httpRouteTemplate:
130130
resourceTemplates:
131131
shadowHttproute: |

controllers/statuscheck.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ import (
4242
// `Ready` status condition, which is implemented through kstatus.
4343
func statusIsReady(templates []*ResourceTemplateState) (bool, error) {
4444
for _, tmpl := range templates {
45-
for _, res := range tmpl.NewResource {
45+
for _, res := range tmpl.NewResources {
4646
if res.Current == nil {
4747
return false, nil
4848
}
@@ -62,7 +62,7 @@ func statusIsReady(templates []*ResourceTemplateState) (bool, error) {
6262
func statusExistingTemplates(templates []*ResourceTemplateState) []string {
6363
var missing []string
6464
for _, tmpl := range templates {
65-
for resIdx, res := range tmpl.NewResource {
65+
for resIdx, res := range tmpl.NewResources {
6666
if res.Current == nil {
6767
missing = append(missing, fmt.Sprintf("%s[%d]", tmpl.TemplateName, resIdx))
6868
}

controllers/templating.go

Lines changed: 42 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -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
207201
func 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-
321305
func 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
}

controllers/templating_test.go

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ func TestParseTemplate(t *testing.T) {
5858
if tmpl == nil || err != nil {
5959
t.Fatalf("Error parsing templates %v", err)
6060
}
61-
if len(tmpl) != 2 {
62-
t.Fatalf("Template slice lenght mismatch, got %v, expected 2", len(tmpl))
61+
if len(tmpl) != 3 {
62+
t.Fatalf("Template slice lenght mismatch, got %v, expected 3", len(tmpl))
6363
}
6464
if tmpl[0].TemplateName != "t1" {
6565
t.Fatalf("Template[0] name, got %v, expected t1", tmpl[0].TemplateName)
@@ -94,26 +94,3 @@ func TestTemplate2map(t *testing.T) {
9494
t.Fatalf("Error rendering multi-resource, got len %v, expected 3", len(rawResources))
9595
}
9696
}
97-
98-
func TestTemplate2Unstructured(t *testing.T) {
99-
tmpl, err := helperGetResourceState()
100-
tmplValues := helperGetValues()
101-
u, err := template2Unstructured(tmpl[0].Template, tmplValues)
102-
if u == nil {
103-
t.Fatalf("Cannot render template to map: %v", err)
104-
}
105-
u, err = template2Unstructured(tmpl[1].Template, tmplValues)
106-
if err != nil {
107-
t.Fatalf("Error rendering empty resource, got err %v", err)
108-
}
109-
if len(u) != 0 {
110-
t.Fatalf("Error rendering empty resource, got %v, expected 0", len(u))
111-
}
112-
u, err = template2Unstructured(tmpl[2].Template, tmplValues)
113-
if err != nil {
114-
t.Fatalf("Error rendering multi-resource, got err %v", err)
115-
}
116-
if len(u) != 3 {
117-
t.Fatalf("Error rendering multi-resource, got len %v, expected 3", len(u))
118-
}
119-
}

0 commit comments

Comments
 (0)