@@ -25,6 +25,9 @@ import (
25
25
"k8s.io/client-go/tools/record"
26
26
"sigs.k8s.io/controller-runtime/pkg/client"
27
27
"sigs.k8s.io/controller-runtime/pkg/client/fake"
28
+
29
+ clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
30
+ expv1 "sigs.k8s.io/cluster-api/exp/api/v1beta1"
28
31
)
29
32
30
33
func TestMachinePoolGetNodeReference (t * testing.T ) {
@@ -199,3 +202,231 @@ func TestMachinePoolGetNodeReference(t *testing.T) {
199
202
})
200
203
}
201
204
}
205
+
206
+ func TestMachinePoolPatchNodes (t * testing.T ) {
207
+ r := & MachinePoolReconciler {
208
+ Client : fake .NewClientBuilder ().Build (),
209
+ recorder : record .NewFakeRecorder (32 ),
210
+ }
211
+
212
+ nodeList := []client.Object {
213
+ & corev1.Node {
214
+ ObjectMeta : metav1.ObjectMeta {
215
+ Name : "node-1" ,
216
+ },
217
+ Spec : corev1.NodeSpec {
218
+ ProviderID : "aws://us-east-1/id-node-1" ,
219
+ Taints : []corev1.Taint {
220
+ clusterv1 .NodeUninitializedTaint ,
221
+ },
222
+ },
223
+ },
224
+ & corev1.Node {
225
+ ObjectMeta : metav1.ObjectMeta {
226
+ Name : "node-2" ,
227
+ Annotations : map [string ]string {
228
+ "foo" : "bar" ,
229
+ },
230
+ },
231
+ Spec : corev1.NodeSpec {
232
+ ProviderID : "aws://us-west-2/id-node-2" ,
233
+ Taints : []corev1.Taint {
234
+ {
235
+ Key : "some-other-taint" ,
236
+ Value : "SomeEffect" ,
237
+ },
238
+ clusterv1 .NodeUninitializedTaint ,
239
+ },
240
+ },
241
+ },
242
+ & corev1.Node {
243
+ ObjectMeta : metav1.ObjectMeta {
244
+ Name : "node-3" ,
245
+ Annotations : map [string ]string {
246
+ "cluster.x-k8s.io/cluster-name" : "cluster-1" ,
247
+ "cluster.x-k8s.io/cluster-namespace" : "my-namespace" ,
248
+ "cluster.x-k8s.io/owner-kind" : "MachinePool" ,
249
+ "cluster.x-k8s.io/owner-name" : "machinepool-3" ,
250
+ },
251
+ },
252
+ Spec : corev1.NodeSpec {
253
+ ProviderID : "aws://us-west-2/id-node-3" ,
254
+ Taints : []corev1.Taint {
255
+ {
256
+ Key : "some-other-taint" ,
257
+ Value : "SomeEffect" ,
258
+ },
259
+ clusterv1 .NodeUninitializedTaint ,
260
+ },
261
+ },
262
+ },
263
+ & corev1.Node {
264
+ ObjectMeta : metav1.ObjectMeta {
265
+ Name : "node-4" ,
266
+ Annotations : map [string ]string {
267
+ "cluster.x-k8s.io/cluster-name" : "cluster-1" ,
268
+ "cluster.x-k8s.io/cluster-namespace" : "my-namespace" ,
269
+ },
270
+ },
271
+ Spec : corev1.NodeSpec {
272
+ ProviderID : "aws://us-west-2/id-node-4" ,
273
+ Taints : []corev1.Taint {
274
+ {
275
+ Key : "some-other-taint" ,
276
+ Value : "SomeEffect" ,
277
+ },
278
+ },
279
+ },
280
+ },
281
+ }
282
+
283
+ testCases := []struct {
284
+ name string
285
+ machinePool * expv1.MachinePool
286
+ nodeRefs []corev1.ObjectReference
287
+ expectedNodes []corev1.Node
288
+ err error
289
+ }{
290
+ {
291
+ name : "Node with uninitialized taint should be patched" ,
292
+ machinePool : & expv1.MachinePool {
293
+ TypeMeta : metav1.TypeMeta {
294
+ Kind : "MachinePool" ,
295
+ },
296
+ ObjectMeta : metav1.ObjectMeta {
297
+ Name : "machinepool-1" ,
298
+ Namespace : "my-namespace" ,
299
+ },
300
+ Spec : expv1.MachinePoolSpec {
301
+ ClusterName : "cluster-1" ,
302
+ ProviderIDList : []string {"aws://us-east-1/id-node-1" },
303
+ },
304
+ },
305
+ nodeRefs : []corev1.ObjectReference {
306
+ {Name : "node-1" },
307
+ },
308
+ expectedNodes : []corev1.Node {
309
+ {
310
+ ObjectMeta : metav1.ObjectMeta {
311
+ Name : "node-1" ,
312
+ Annotations : map [string ]string {
313
+ "cluster.x-k8s.io/cluster-name" : "cluster-1" ,
314
+ "cluster.x-k8s.io/cluster-namespace" : "my-namespace" ,
315
+ "cluster.x-k8s.io/owner-kind" : "MachinePool" ,
316
+ "cluster.x-k8s.io/owner-name" : "machinepool-1" ,
317
+ },
318
+ },
319
+ Spec : corev1.NodeSpec {
320
+ Taints : nil ,
321
+ },
322
+ },
323
+ },
324
+ },
325
+ {
326
+ name : "Node with existing annotations and taints should be patched" ,
327
+ machinePool : & expv1.MachinePool {
328
+ TypeMeta : metav1.TypeMeta {
329
+ Kind : "MachinePool" ,
330
+ },
331
+ ObjectMeta : metav1.ObjectMeta {
332
+ Name : "machinepool-2" ,
333
+ Namespace : "my-namespace" ,
334
+ },
335
+ Spec : expv1.MachinePoolSpec {
336
+ ClusterName : "cluster-1" ,
337
+ ProviderIDList : []string {"aws://us-west-2/id-node-2" },
338
+ },
339
+ },
340
+ nodeRefs : []corev1.ObjectReference {
341
+ {Name : "node-2" },
342
+ {Name : "node-3" },
343
+ {Name : "node-4" },
344
+ },
345
+ expectedNodes : []corev1.Node {
346
+ {
347
+ ObjectMeta : metav1.ObjectMeta {
348
+ Name : "node-2" ,
349
+ Annotations : map [string ]string {
350
+ "cluster.x-k8s.io/cluster-name" : "cluster-1" ,
351
+ "cluster.x-k8s.io/cluster-namespace" : "my-namespace" ,
352
+ "cluster.x-k8s.io/owner-kind" : "MachinePool" ,
353
+ "cluster.x-k8s.io/owner-name" : "machinepool-2" ,
354
+ "foo" : "bar" ,
355
+ },
356
+ },
357
+ Spec : corev1.NodeSpec {
358
+ Taints : []corev1.Taint {
359
+ {
360
+ Key : "some-other-taint" ,
361
+ Value : "SomeEffect" ,
362
+ },
363
+ },
364
+ },
365
+ },
366
+ {
367
+ ObjectMeta : metav1.ObjectMeta {
368
+ Name : "node-3" ,
369
+ Annotations : map [string ]string {
370
+ "cluster.x-k8s.io/cluster-name" : "cluster-1" ,
371
+ "cluster.x-k8s.io/cluster-namespace" : "my-namespace" ,
372
+ "cluster.x-k8s.io/owner-kind" : "MachinePool" ,
373
+ "cluster.x-k8s.io/owner-name" : "machinepool-2" ,
374
+ },
375
+ },
376
+ Spec : corev1.NodeSpec {
377
+ Taints : []corev1.Taint {
378
+ {
379
+ Key : "some-other-taint" ,
380
+ Value : "SomeEffect" ,
381
+ },
382
+ },
383
+ },
384
+ },
385
+ {
386
+ ObjectMeta : metav1.ObjectMeta {
387
+ Name : "node-4" ,
388
+ Annotations : map [string ]string {
389
+ "cluster.x-k8s.io/cluster-name" : "cluster-1" ,
390
+ "cluster.x-k8s.io/cluster-namespace" : "my-namespace" ,
391
+ "cluster.x-k8s.io/owner-kind" : "MachinePool" ,
392
+ "cluster.x-k8s.io/owner-name" : "machinepool-2" ,
393
+ },
394
+ },
395
+ Spec : corev1.NodeSpec {
396
+ Taints : []corev1.Taint {
397
+ {
398
+ Key : "some-other-taint" ,
399
+ Value : "SomeEffect" ,
400
+ },
401
+ },
402
+ },
403
+ },
404
+ },
405
+ },
406
+ }
407
+
408
+ for _ , test := range testCases {
409
+ t .Run (test .name , func (t * testing.T ) {
410
+ g := NewWithT (t )
411
+
412
+ fakeClient := fake .NewClientBuilder ().WithObjects (nodeList ... ).Build ()
413
+
414
+ err := r .patchNodes (ctx , fakeClient , test .nodeRefs , test .machinePool )
415
+ if test .err == nil {
416
+ g .Expect (err ).To (BeNil ())
417
+ } else {
418
+ g .Expect (err ).NotTo (BeNil ())
419
+ g .Expect (err ).To (Equal (test .err ), "Expected error %v, got %v" , test .err , err )
420
+ }
421
+
422
+ // Check that the nodes have the desired taints and annotations
423
+ for _ , expected := range test .expectedNodes {
424
+ node := & corev1.Node {}
425
+ err := fakeClient .Get (ctx , client.ObjectKey {Name : expected .Name }, node )
426
+ g .Expect (err ).To (BeNil ())
427
+ g .Expect (node .Annotations ).To (Equal (expected .Annotations ))
428
+ g .Expect (node .Spec .Taints ).To (Equal (expected .Spec .Taints ))
429
+ }
430
+ })
431
+ }
432
+ }
0 commit comments