Skip to content

Commit 15a09e4

Browse files
authored
feat(tenant): add templating support for additionalmetadatalist (#1613)
* feat(tenant): add templating support for additionalmetadatalist Signed-off-by: Hristo Hristov <[email protected]> * feat(tenant): add e2e tests Signed-off-by: Hristo Hristov <[email protected]> * feat(tenant): add e2e tests Signed-off-by: Hristo Hristov <[email protected]> * feat(tenant): add e2e tests Signed-off-by: Hristo Hristov <[email protected]> --------- Signed-off-by: Hristo Hristov <[email protected]>
1 parent b85d95e commit 15a09e4

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-0
lines changed

controllers/tenant/namespaces.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"maps"
1010
"strings"
1111

12+
"github.com/valyala/fasttemplate"
1213
"golang.org/x/sync/errgroup"
1314
corev1 "k8s.io/api/core/v1"
1415
"k8s.io/apimachinery/pkg/fields"
@@ -119,6 +120,23 @@ func buildNamespaceAnnotationsForTenant(tnt *capsulev1beta2.Tenant) map[string]s
119120
return annotations
120121
}
121122

123+
// applyTemplateMap applies templating to all values in the provided map in place.
124+
func applyTemplateMap(m map[string]string, tnt *capsulev1beta2.Tenant, ns *corev1.Namespace) {
125+
for k, v := range m {
126+
if !strings.Contains(v, "{{ ") && !strings.Contains(v, " }}") {
127+
continue
128+
}
129+
130+
t := fasttemplate.New(v, "{{ ", " }}")
131+
tmplString := t.ExecuteString(map[string]interface{}{
132+
"tenant.name": tnt.Name,
133+
"namespace": ns.Name,
134+
})
135+
136+
m[k] = tmplString
137+
}
138+
}
139+
122140
func buildNamespaceLabelsForTenant(tnt *capsulev1beta2.Tenant) map[string]string {
123141
labels := make(map[string]string)
124142

@@ -183,6 +201,9 @@ func SyncNamespaceMetadata(tnt *capsulev1beta2.Tenant, ns *corev1.Namespace) err
183201
continue
184202
}
185203

204+
applyTemplateMap(md.Labels, tnt, ns)
205+
applyTemplateMap(md.Annotations, tnt, ns)
206+
186207
maps.Copy(labels, md.Labels)
187208
maps.Copy(annotations, md.Annotations)
188209
}

e2e/namespace_additional_metadata_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ var _ = Describe("creating a Namespace for a Tenant with additional metadata", L
9292
return
9393
}, defaultTimeoutInterval, defaultPollInterval).Should(BeTrue())
9494
})
95+
9596
By("checking additional annotations", func() {
9697
Eventually(func() (ok bool) {
9798
Expect(k8sClient.Get(context.TODO(), types.NamespacedName{Name: ns.GetName()}, ns)).Should(Succeed())
@@ -172,6 +173,16 @@ var _ = Describe("creating a Namespace for a Tenant with additional metadata lis
172173
"k8s.io/custom-annotation_3": "bizz",
173174
},
174175
},
176+
{
177+
Labels: map[string]string{
178+
"projectcapsule.dev/templated-tenant-label": "{{ tenant.name }}",
179+
"projectcapsule.dev/templated-namespace-label": "{{ namespace }}",
180+
},
181+
Annotations: map[string]string{
182+
"projectcapsule.dev/templated-tenant-annotation": "{{ tenant.name }}",
183+
"projectcapsule.dev/templated-namespace-annotation": "{{ namespace }}",
184+
},
185+
},
175186
},
176187
},
177188
},
@@ -194,6 +205,30 @@ var _ = Describe("creating a Namespace for a Tenant with additional metadata lis
194205
NamespaceCreation(ns, tnt.Spec.Owners[0], defaultTimeoutInterval).Should(Succeed())
195206
TenantNamespaceList(tnt, defaultTimeoutInterval).Should(ContainElement(ns.GetName()))
196207

208+
By("checking templated annotations", func() {
209+
Eventually(func() (ok bool) {
210+
Expect(k8sClient.Get(context.TODO(), types.NamespacedName{Name: ns.GetName()}, ns)).Should(Succeed())
211+
if ok, _ = HaveKeyWithValue("projectcapsule.dev/templated-tenant-annotation", tnt.Name).Match(ns.Annotations); !ok {
212+
return
213+
}
214+
if ok, _ = HaveKeyWithValue("projectcapsule.dev/templated-namespace-annotation", ns.Name).Match(ns.Annotations); !ok {
215+
return
216+
}
217+
return
218+
}, defaultTimeoutInterval, defaultPollInterval).Should(BeTrue())
219+
})
220+
By("checking templated labels", func() {
221+
Eventually(func() (ok bool) {
222+
Expect(k8sClient.Get(context.TODO(), types.NamespacedName{Name: ns.GetName()}, ns)).Should(Succeed())
223+
if ok, _ = HaveKeyWithValue("projectcapsule.dev/templated-tenant-label", tnt.Name).Match(ns.Labels); !ok {
224+
return
225+
}
226+
if ok, _ = HaveKeyWithValue("projectcapsule.dev/templated-namespace-label", ns.Name).Match(ns.Labels); !ok {
227+
return
228+
}
229+
return
230+
}, defaultTimeoutInterval, defaultPollInterval).Should(BeTrue())
231+
})
197232
By("checking additional labels from entry without node selector", func() {
198233
Eventually(func() (ok bool) {
199234
Expect(k8sClient.Get(context.TODO(), types.NamespacedName{Name: ns.GetName()}, ns)).Should(Succeed())

0 commit comments

Comments
 (0)