1
2
3
4 package namespace_test
5
6 import (
7 "strings"
8 "testing"
9
10 "github.com/stretchr/testify/assert"
11 "sigs.k8s.io/kustomize/api/filters/namespace"
12 "sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig"
13 filtertest_test "sigs.k8s.io/kustomize/api/testutils/filtertest"
14 "sigs.k8s.io/kustomize/api/types"
15 "sigs.k8s.io/kustomize/kyaml/yaml"
16 )
17
18 var mutationTrackerStub = filtertest_test.MutationTrackerStub{}
19
20 var tests = []TestCase{
21 {
22 name: "add",
23 input: `
24 apiVersion: example.com/v1
25 kind: Foo
26 metadata:
27 name: instance
28 ---
29 apiVersion: example.com/v1
30 kind: Bar
31 metadata:
32 name: instance
33 `,
34 expected: `
35 apiVersion: example.com/v1
36 kind: Foo
37 metadata:
38 name: instance
39 namespace: foo
40 ---
41 apiVersion: example.com/v1
42 kind: Bar
43 metadata:
44 name: instance
45 namespace: foo
46 `,
47 filter: namespace.Filter{Namespace: "foo"},
48 },
49
50 {
51 name: "null_ns",
52 input: `
53 apiVersion: example.com/v1
54 kind: Foo
55 metadata:
56 name: instance
57 namespace: null
58 ---
59 apiVersion: example.com/v1
60 kind: Bar
61 metadata:
62 name: instance
63 namespace: null
64 `,
65 expected: `
66 apiVersion: example.com/v1
67 kind: Foo
68 metadata:
69 name: instance
70 namespace: foo
71 ---
72 apiVersion: example.com/v1
73 kind: Bar
74 metadata:
75 name: instance
76 namespace: foo
77 `,
78 filter: namespace.Filter{Namespace: "foo"},
79 },
80
81 {
82 name: "add-recurse",
83 input: `
84 apiVersion: example.com/v1
85 kind: Foo
86 ---
87 apiVersion: example.com/v1
88 kind: Bar
89 `,
90 expected: `
91 apiVersion: example.com/v1
92 kind: Foo
93 metadata:
94 namespace: foo
95 ---
96 apiVersion: example.com/v1
97 kind: Bar
98 metadata:
99 namespace: foo
100 `,
101 filter: namespace.Filter{Namespace: "foo"},
102 },
103
104 {
105 name: "update",
106 input: `
107 apiVersion: example.com/v1
108 kind: Foo
109 metadata:
110 name: instance
111 # update this namespace
112 namespace: bar
113 ---
114 apiVersion: example.com/v1
115 kind: Bar
116 metadata:
117 name: instance
118 namespace: bar
119 `,
120 expected: `
121 apiVersion: example.com/v1
122 kind: Foo
123 metadata:
124 name: instance
125 # update this namespace
126 namespace: foo
127 ---
128 apiVersion: example.com/v1
129 kind: Bar
130 metadata:
131 name: instance
132 namespace: foo
133 `,
134 filter: namespace.Filter{Namespace: "foo"},
135 },
136
137 {
138 name: "update-rolebinding",
139 input: `
140 apiVersion: example.com/v1
141 kind: RoleBinding
142 subjects:
143 - name: default
144 ---
145 apiVersion: example.com/v1
146 kind: RoleBinding
147 subjects:
148 - name: default
149 namespace: foo
150 ---
151 apiVersion: example.com/v1
152 kind: RoleBinding
153 subjects:
154 - name: something
155 ---
156 apiVersion: example.com/v1
157 kind: RoleBinding
158 subjects:
159 - name: something
160 namespace: foo
161 `,
162 expected: `
163 apiVersion: example.com/v1
164 kind: RoleBinding
165 subjects:
166 - name: default
167 namespace: bar
168 metadata:
169 namespace: bar
170 ---
171 apiVersion: example.com/v1
172 kind: RoleBinding
173 subjects:
174 - name: default
175 namespace: bar
176 metadata:
177 namespace: bar
178 ---
179 apiVersion: example.com/v1
180 kind: RoleBinding
181 subjects:
182 - name: something
183 metadata:
184 namespace: bar
185 ---
186 apiVersion: example.com/v1
187 kind: RoleBinding
188 subjects:
189 - name: something
190 namespace: foo
191 metadata:
192 namespace: bar
193 `,
194 filter: namespace.Filter{Namespace: "bar"},
195 },
196
197 {
198 name: "update-clusterrolebinding",
199 input: `
200 apiVersion: rbac.authorization.k8s.io/v1
201 kind: ClusterRoleBinding
202 subjects:
203 - name: default
204 ---
205 apiVersion: rbac.authorization.k8s.io/v1
206 kind: ClusterRoleBinding
207 subjects:
208 - name: default
209 namespace: foo
210 ---
211 apiVersion: rbac.authorization.k8s.io/v1
212 kind: ClusterRoleBinding
213 subjects:
214 - name: something
215 ---
216 apiVersion: rbac.authorization.k8s.io/v1
217 kind: ClusterRoleBinding
218 subjects:
219 - name: something
220 namespace: foo
221 `,
222 expected: `
223 apiVersion: rbac.authorization.k8s.io/v1
224 kind: ClusterRoleBinding
225 subjects:
226 - name: default
227 namespace: bar
228 ---
229 apiVersion: rbac.authorization.k8s.io/v1
230 kind: ClusterRoleBinding
231 subjects:
232 - name: default
233 namespace: bar
234 ---
235 apiVersion: rbac.authorization.k8s.io/v1
236 kind: ClusterRoleBinding
237 subjects:
238 - name: something
239 ---
240 apiVersion: rbac.authorization.k8s.io/v1
241 kind: ClusterRoleBinding
242 subjects:
243 - name: something
244 namespace: foo
245 `,
246 filter: namespace.Filter{Namespace: "bar"},
247 },
248
249 {
250 name: "data-fieldspecs",
251 input: `
252 apiVersion: example.com/v1
253 kind: Foo
254 metadata:
255 name: instance
256 ---
257 apiVersion: example.com/v1
258 kind: Bar
259 metadata:
260 name: instance
261 `,
262 expected: `
263 apiVersion: example.com/v1
264 kind: Foo
265 metadata:
266 name: instance
267 namespace: foo
268 a:
269 b:
270 c: foo
271 ---
272 apiVersion: example.com/v1
273 kind: Bar
274 metadata:
275 name: instance
276 namespace: foo
277 a:
278 b:
279 c: foo
280 `,
281 filter: namespace.Filter{Namespace: "foo"},
282 fsslice: []types.FieldSpec{
283 {
284 Path: "a/b/c",
285 CreateIfNotPresent: true,
286 },
287 },
288 },
289
290 {
291 name: "mutation tracker",
292 input: `
293 apiVersion: example.com/v1
294 kind: Foo
295 metadata:
296 name: instance
297 ---
298 apiVersion: example.com/v1
299 kind: RoleBinding
300 subjects:
301 - name: default
302 `,
303 expected: `
304 apiVersion: example.com/v1
305 kind: Foo
306 metadata:
307 name: instance
308 namespace: bar
309 a:
310 b:
311 c: bar
312 ---
313 apiVersion: example.com/v1
314 kind: RoleBinding
315 subjects:
316 - name: default
317 namespace: bar
318 metadata:
319 namespace: bar
320 a:
321 b:
322 c: bar
323 `,
324 filter: namespace.Filter{Namespace: "bar"},
325 fsslice: []types.FieldSpec{
326 {
327 Path: "a/b/c",
328 CreateIfNotPresent: true,
329 },
330 },
331 mutationTracker: mutationTrackerStub.MutationTracker,
332 expectedSetValueArgs: []filtertest_test.SetValueArg{
333 {
334 Value: "bar",
335 Tag: "!!str",
336 NodePath: []string{"metadata", "namespace"},
337 },
338 {
339 Value: "bar",
340 Tag: "!!str",
341 NodePath: []string{"a", "b", "c"},
342 },
343 {
344 Value: "bar",
345 Tag: "!!str",
346 NodePath: []string{"metadata", "namespace"},
347 },
348 {
349 Value: "bar",
350 Tag: "!!str",
351 NodePath: []string{"namespace"},
352 },
353 {
354 Value: "bar",
355 Tag: "!!str",
356 NodePath: []string{"a", "b", "c"},
357 },
358 },
359 },
360
361 {
362 name: "numeric",
363 input: `
364 apiVersion: example.com/v1
365 kind: Foo
366 metadata:
367 name: instance
368 ---
369 apiVersion: example.com/v1
370 kind: Bar
371 metadata:
372 name: instance
373 `,
374 expected: `
375 apiVersion: example.com/v1
376 kind: Foo
377 metadata:
378 name: instance
379 namespace: "01234"
380 ---
381 apiVersion: example.com/v1
382 kind: Bar
383 metadata:
384 name: instance
385 namespace: "01234"
386 `,
387 filter: namespace.Filter{Namespace: "01234"},
388 },
389 }
390
391 type TestCase struct {
392 name string
393 input string
394 expected string
395 filter namespace.Filter
396 fsslice types.FsSlice
397 mutationTracker func(key, value, tag string, node *yaml.RNode)
398 expectedSetValueArgs []filtertest_test.SetValueArg
399 }
400
401 var config = builtinconfig.MakeDefaultConfig()
402
403 func TestNamespace_Filter(t *testing.T) {
404 for i := range tests {
405 mutationTrackerStub.Reset()
406 test := tests[i]
407 test.filter.WithMutationTracker(test.mutationTracker)
408 t.Run(test.name, func(t *testing.T) {
409 test.filter.FsSlice = append(config.NameSpace, test.fsslice...)
410 if !assert.Equal(t,
411 strings.TrimSpace(test.expected),
412 strings.TrimSpace(
413 filtertest_test.RunFilter(t, test.input, test.filter))) {
414 t.FailNow()
415 }
416 assert.Equal(t, test.expectedSetValueArgs, mutationTrackerStub.SetValueArgs())
417 })
418 }
419 }
420
View as plain text