From be84f6acdf600a6b8ca412442f75c984f70c0baa Mon Sep 17 00:00:00 2001 From: Kevin McDermott Date: Fri, 20 Jan 2023 09:33:37 +0000 Subject: [PATCH 1/2] Templating scope for generated results This adds the generated data to a .element scope in the templates to make it easier to add additional data without overwriting the changes. --- controllers/gitopsset_controller_test.go | 22 ++++++++++----------- controllers/templates/renderer.go | 6 +++++- controllers/templates/renderer_test.go | 12 +++++------ examples/list-generator/list-generator.yaml | 6 +++--- 4 files changed, 25 insertions(+), 21 deletions(-) diff --git a/controllers/gitopsset_controller_test.go b/controllers/gitopsset_controller_test.go index e13dd5f6..8bba146f 100644 --- a/controllers/gitopsset_controller_test.go +++ b/controllers/gitopsset_controller_test.go @@ -109,13 +109,13 @@ func TestReconciliation(t *testing.T) { { Content: runtime.RawExtension{ Raw: mustMarshalJSON(t, makeTestKustomization(nsn("unused", "unused"), func(ks *kustomizev1.Kustomization) { - ks.Name = "{{.cluster}}-demo" + ks.Name = "{{ .element.cluster }}-demo" ks.Annotations = map[string]string{ - "testing.cluster": "{{.cluster}}", + "testing.cluster": "{{ .element.cluster }}", "testing": "newVersion", } - ks.Spec.Path = "./templated/clusters/{{ .cluster }}/" - ks.Spec.KubeConfig = &meta.KubeConfigReference{SecretRef: meta.SecretKeyReference{Name: "{{ .cluster }}"}} + ks.Spec.Path = "./templated/clusters/{{ .element.cluster }}/" + ks.Spec.KubeConfig = &meta.KubeConfigReference{SecretRef: meta.SecretKeyReference{Name: "{{ .element.cluster }}"}} ks.Spec.Force = true })), }, @@ -199,13 +199,13 @@ func TestReconciliation(t *testing.T) { { Content: runtime.RawExtension{ Raw: mustMarshalJSON(t, makeTestKustomization(nsn("unused", "unused"), func(ks *kustomizev1.Kustomization) { - ks.Name = "{{.cluster}}-demo" + ks.Name = "{{ .element.cluster }}-demo" ks.Annotations = map[string]string{ - "testing.cluster": "{{.cluster}}", + "testing.cluster": "{{ .element.cluster }}", "testing": "newVersion", } - ks.Spec.Path = "./templated/clusters/{{ .cluster }}/" - ks.Spec.KubeConfig = &meta.KubeConfigReference{SecretRef: meta.SecretKeyReference{Name: "{{ .cluster }}"}} + ks.Spec.Path = "./templated/clusters/{{ .element.cluster }}/" + ks.Spec.KubeConfig = &meta.KubeConfigReference{SecretRef: meta.SecretKeyReference{Name: "{{ .element.cluster }}"}} ks.Spec.Force = true })), }, @@ -371,10 +371,10 @@ func makeTestGitOpsSet(t *testing.T, opts ...func(*templatesv1.GitOpsSet)) *temp Templates: []templatesv1.GitOpsSetTemplate{ { Content: runtime.RawExtension{ - Raw: mustMarshalJSON(t, makeTestKustomization(nsn("default", "{{.cluster}}-demo"), func(k *kustomizev1.Kustomization) { + Raw: mustMarshalJSON(t, makeTestKustomization(nsn("default", "{{ .element.cluster }}-demo"), func(k *kustomizev1.Kustomization) { k.Spec = kustomizev1.KustomizationSpec{ Interval: metav1.Duration{Duration: 5 * time.Minute}, - Path: "./clusters/{{.cluster}}/", + Path: "./clusters/{{ .element.cluster }}/", Prune: true, SourceRef: kustomizev1.CrossNamespaceSourceReference{ Kind: "GitRepository", @@ -382,7 +382,7 @@ func makeTestGitOpsSet(t *testing.T, opts ...func(*templatesv1.GitOpsSet)) *temp }, KubeConfig: &meta.KubeConfigReference{ SecretRef: meta.SecretKeyReference{ - Name: "{{.cluster}}", + Name: "{{ .element.cluster }}", }, }, } diff --git a/controllers/templates/renderer.go b/controllers/templates/renderer.go index 5a4fab86..f85ad55b 100644 --- a/controllers/templates/renderer.go +++ b/controllers/templates/renderer.go @@ -93,8 +93,12 @@ func render(b []byte, params map[string]any) ([]byte, error) { return nil, fmt.Errorf("failed to parse template: %w", err) } + data := map[string]any{ + "element": params, + } + var out bytes.Buffer - if err := t.Execute(&out, params); err != nil { + if err := t.Execute(&out, data); err != nil { return nil, fmt.Errorf("failed to render template: %w", err) } diff --git a/controllers/templates/renderer_test.go b/controllers/templates/renderer_test.go index 30708176..9ecc1559 100644 --- a/controllers/templates/renderer_test.go +++ b/controllers/templates/renderer_test.go @@ -63,7 +63,7 @@ func TestRender(t *testing.T) { s.Spec.Templates = []templatesv1.GitOpsSetTemplate{ { Content: runtime.RawExtension{ - Raw: mustMarshalJSON(t, makeTestService(types.NamespacedName{Name: "{{sanitize .env}}-demo"})), + Raw: mustMarshalJSON(t, makeTestService(types.NamespacedName{Name: "{{ sanitize .element.env }}-demo"})), }, }, } @@ -86,12 +86,12 @@ func TestRender(t *testing.T) { s.Spec.Templates = []templatesv1.GitOpsSetTemplate{ { Content: runtime.RawExtension{ - Raw: mustMarshalJSON(t, makeTestService(types.NamespacedName{Name: "{{ .env}}-demo1"})), + Raw: mustMarshalJSON(t, makeTestService(types.NamespacedName{Name: "{{ .element.env }}-demo1"})), }, }, { Content: runtime.RawExtension{ - Raw: mustMarshalJSON(t, makeTestService(types.NamespacedName{Name: "{{ .env}}-demo2"})), + Raw: mustMarshalJSON(t, makeTestService(types.NamespacedName{Name: "{{ .element.env }}-demo2"})), }, }, } @@ -206,7 +206,7 @@ func makeTestGitOpsSet(t *testing.T, opts ...func(*templatesv1.GitOpsSet)) *temp Templates: []templatesv1.GitOpsSetTemplate{ { Content: runtime.RawExtension{ - Raw: mustMarshalJSON(t, makeTestService(types.NamespacedName{Name: "{{.env}}-demo"})), + Raw: mustMarshalJSON(t, makeTestService(types.NamespacedName{Name: "{{ .element.env }}-demo"})), }, }, }, @@ -229,11 +229,11 @@ func makeTestService(name types.NamespacedName, opts ...func(*corev1.Service)) * Name: name.Name, Namespace: name.Namespace, Annotations: map[string]string{ - "app.kubernetes.io/instance": "{{ .env }}", + "app.kubernetes.io/instance": "{{ .element.env }}", }, }, Spec: corev1.ServiceSpec{ - ClusterIP: "{{ .externalIP }}", + ClusterIP: "{{ .element.externalIP }}", Ports: []corev1.ServicePort{ { Name: "http", diff --git a/examples/list-generator/list-generator.yaml b/examples/list-generator/list-generator.yaml index 5d88df8a..9b021a36 100644 --- a/examples/list-generator/list-generator.yaml +++ b/examples/list-generator/list-generator.yaml @@ -23,14 +23,14 @@ spec: kind: Kustomization apiVersion: kustomize.toolkit.fluxcd.io/v1beta2 metadata: - name: "{{ .env }}-demo" + name: "{{ .element.env }}-demo" labels: app.kubernetes.io/name: go-demo - app.kubernetes.io/instance: "{{ .env }}" + app.kubernetes.io/instance: "{{ .element.env }}" com.example/team: "{{ .team }}" spec: interval: 5m - path: "./examples/kustomize/environments/{{ .env }}" + path: "./examples/kustomize/environments/{{ .element.env }}" prune: true sourceRef: kind: GitRepository From fa18cdd4f491360ce102c44c4f0ee5f4982704a1 Mon Sep 17 00:00:00 2001 From: Kevin McDermott Date: Mon, 23 Jan 2023 15:17:43 +0000 Subject: [PATCH 2/2] Fix broken sprig test. --- controllers/templates/renderer_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controllers/templates/renderer_test.go b/controllers/templates/renderer_test.go index 9ecc1559..03ee4456 100644 --- a/controllers/templates/renderer_test.go +++ b/controllers/templates/renderer_test.go @@ -118,7 +118,7 @@ func TestRender(t *testing.T) { s.Spec.Templates = []templatesv1.GitOpsSetTemplate{ { Content: runtime.RawExtension{ - Raw: mustMarshalJSON(t, makeTestService(types.NamespacedName{Name: "{{ .env }}-demo1"}, setClusterIP("{{ first .ips }}"))), + Raw: mustMarshalJSON(t, makeTestService(types.NamespacedName{Name: "{{ .element.env }}-demo1"}, setClusterIP("{{ first .element.ips }}"))), }, }, }