@@ -18,6 +18,7 @@ import (
18
18
"github.com/argoproj/gitops-engine/pkg/cache"
19
19
"github.com/argoproj/gitops-engine/pkg/cache/mocks"
20
20
"github.com/argoproj/gitops-engine/pkg/health"
21
+ "github.com/argoproj/gitops-engine/pkg/utils/kube"
21
22
"github.com/stretchr/testify/mock"
22
23
"k8s.io/client-go/kubernetes/fake"
23
24
@@ -319,6 +320,216 @@ func Test_asResourceNode_owner_refs(t *testing.T) {
319
320
assert .Equal (t , expected , resNode )
320
321
}
321
322
323
+ func Test_getAppRecursive (t * testing.T ) {
324
+ for _ , tt := range []struct {
325
+ name string
326
+ r * cache.Resource
327
+ ns map [kube.ResourceKey ]* cache.Resource
328
+ wantName string
329
+ wantOK assert.BoolAssertionFunc
330
+ }{
331
+ {
332
+ name : "ok: cm1->app1" ,
333
+ r : & cache.Resource {
334
+ Ref : v1.ObjectReference {
335
+ Name : "cm1" ,
336
+ },
337
+ OwnerRefs : []metav1.OwnerReference {
338
+ {Name : "app1" },
339
+ },
340
+ },
341
+ ns : map [kube.ResourceKey ]* cache.Resource {
342
+ kube .NewResourceKey ("" , "" , "" , "app1" ): {
343
+ Info : & ResourceInfo {
344
+ AppName : "app1" ,
345
+ },
346
+ },
347
+ },
348
+ wantName : "app1" ,
349
+ wantOK : assert .True ,
350
+ },
351
+ {
352
+ name : "ok: cm1->cm2->app1" ,
353
+ r : & cache.Resource {
354
+ Ref : v1.ObjectReference {
355
+ Name : "cm1" ,
356
+ },
357
+ OwnerRefs : []metav1.OwnerReference {
358
+ {Name : "cm2" },
359
+ },
360
+ },
361
+ ns : map [kube.ResourceKey ]* cache.Resource {
362
+ kube .NewResourceKey ("" , "" , "" , "cm2" ): {
363
+ Ref : v1.ObjectReference {
364
+ Name : "cm2" ,
365
+ },
366
+ OwnerRefs : []metav1.OwnerReference {
367
+ {Name : "app1" },
368
+ },
369
+ },
370
+ kube .NewResourceKey ("" , "" , "" , "app1" ): {
371
+ Info : & ResourceInfo {
372
+ AppName : "app1" ,
373
+ },
374
+ },
375
+ },
376
+ wantName : "app1" ,
377
+ wantOK : assert .True ,
378
+ },
379
+ {
380
+ name : "cm1->cm2->app1 & cm1->cm3->app1" ,
381
+ r : & cache.Resource {
382
+ Ref : v1.ObjectReference {
383
+ Name : "cm1" ,
384
+ },
385
+ OwnerRefs : []metav1.OwnerReference {
386
+ {Name : "cm2" },
387
+ {Name : "cm3" },
388
+ },
389
+ },
390
+ ns : map [kube.ResourceKey ]* cache.Resource {
391
+ kube .NewResourceKey ("" , "" , "" , "cm2" ): {
392
+ Ref : v1.ObjectReference {
393
+ Name : "cm2" ,
394
+ },
395
+ OwnerRefs : []metav1.OwnerReference {
396
+ {Name : "app1" },
397
+ },
398
+ },
399
+ kube .NewResourceKey ("" , "" , "" , "cm3" ): {
400
+ Ref : v1.ObjectReference {
401
+ Name : "cm3" ,
402
+ },
403
+ OwnerRefs : []metav1.OwnerReference {
404
+ {Name : "app1" },
405
+ },
406
+ },
407
+ kube .NewResourceKey ("" , "" , "" , "app1" ): {
408
+ Info : & ResourceInfo {
409
+ AppName : "app1" ,
410
+ },
411
+ },
412
+ },
413
+ wantName : "app1" ,
414
+ wantOK : assert .True ,
415
+ },
416
+ {
417
+ // Nothing cycle.
418
+ // Issue #11699, fixed #12667.
419
+ name : "ok: cm1->cm2 & cm1->cm3->cm2 & cm1->cm3->app1" ,
420
+ r : & cache.Resource {
421
+ Ref : v1.ObjectReference {
422
+ Name : "cm1" ,
423
+ },
424
+ OwnerRefs : []metav1.OwnerReference {
425
+ {Name : "cm2" },
426
+ {Name : "cm3" },
427
+ },
428
+ },
429
+ ns : map [kube.ResourceKey ]* cache.Resource {
430
+ kube .NewResourceKey ("" , "" , "" , "cm2" ): {
431
+ Ref : v1.ObjectReference {
432
+ Name : "cm2" ,
433
+ },
434
+ },
435
+ kube .NewResourceKey ("" , "" , "" , "cm3" ): {
436
+ Ref : v1.ObjectReference {
437
+ Name : "cm3" ,
438
+ },
439
+ OwnerRefs : []metav1.OwnerReference {
440
+ {Name : "cm2" },
441
+ {Name : "app1" },
442
+ },
443
+ },
444
+ kube .NewResourceKey ("" , "" , "" , "app1" ): {
445
+ Info : & ResourceInfo {
446
+ AppName : "app1" ,
447
+ },
448
+ },
449
+ },
450
+ wantName : "app1" ,
451
+ wantOK : assert .True ,
452
+ },
453
+ {
454
+ name : "cycle: cm1<->cm2" ,
455
+ r : & cache.Resource {
456
+ Ref : v1.ObjectReference {
457
+ Name : "cm1" ,
458
+ },
459
+ OwnerRefs : []metav1.OwnerReference {
460
+ {Name : "cm2" },
461
+ },
462
+ },
463
+ ns : map [kube.ResourceKey ]* cache.Resource {
464
+ kube .NewResourceKey ("" , "" , "" , "cm1" ): {
465
+ Ref : v1.ObjectReference {
466
+ Name : "cm1" ,
467
+ },
468
+ OwnerRefs : []metav1.OwnerReference {
469
+ {Name : "cm2" },
470
+ },
471
+ },
472
+ kube .NewResourceKey ("" , "" , "" , "cm2" ): {
473
+ Ref : v1.ObjectReference {
474
+ Name : "cm2" ,
475
+ },
476
+ OwnerRefs : []metav1.OwnerReference {
477
+ {Name : "cm1" },
478
+ },
479
+ },
480
+ },
481
+ wantName : "" ,
482
+ wantOK : assert .False ,
483
+ },
484
+ {
485
+ name : "cycle: cm1->cm2->cm3->cm1" ,
486
+ r : & cache.Resource {
487
+ Ref : v1.ObjectReference {
488
+ Name : "cm1" ,
489
+ },
490
+ OwnerRefs : []metav1.OwnerReference {
491
+ {Name : "cm2" },
492
+ },
493
+ },
494
+ ns : map [kube.ResourceKey ]* cache.Resource {
495
+ kube .NewResourceKey ("" , "" , "" , "cm1" ): {
496
+ Ref : v1.ObjectReference {
497
+ Name : "cm1" ,
498
+ },
499
+ OwnerRefs : []metav1.OwnerReference {
500
+ {Name : "cm2" },
501
+ },
502
+ },
503
+ kube .NewResourceKey ("" , "" , "" , "cm2" ): {
504
+ Ref : v1.ObjectReference {
505
+ Name : "cm2" ,
506
+ },
507
+ OwnerRefs : []metav1.OwnerReference {
508
+ {Name : "cm3" },
509
+ },
510
+ },
511
+ kube .NewResourceKey ("" , "" , "" , "cm3" ): {
512
+ Ref : v1.ObjectReference {
513
+ Name : "cm3" ,
514
+ },
515
+ OwnerRefs : []metav1.OwnerReference {
516
+ {Name : "cm1" },
517
+ },
518
+ },
519
+ },
520
+ wantName : "" ,
521
+ wantOK : assert .False ,
522
+ },
523
+ } {
524
+ t .Run (tt .name , func (t * testing.T ) {
525
+ visited := map [kube.ResourceKey ]bool {}
526
+ got , ok := getAppRecursive (tt .r , tt .ns , visited )
527
+ assert .Equal (t , tt .wantName , got )
528
+ tt .wantOK (t , ok )
529
+ })
530
+ }
531
+ }
532
+
322
533
func TestSkipResourceUpdate (t * testing.T ) {
323
534
var (
324
535
hash1_x string = "x"
0 commit comments