@@ -403,3 +403,89 @@ func TestStatefulSetStatusWithPodFail(t *testing.T) {
403
403
t .Fatalf ("StatefulSet %s status has %d replicas, want replicas %d: %v" , sts .Name , gotReplicas , wantReplicas , err )
404
404
}
405
405
}
406
+
407
+ func TestAutodeleteOwnerRefs (t * testing.T ) {
408
+ tests := []struct {
409
+ name string
410
+ policy appsv1.StatefulSetPersistentVolumeClaimRetentionPolicy
411
+ expectPodOwnerRef bool
412
+ expectSetOwnerRef bool
413
+ }{
414
+ {
415
+ name : "always retain" ,
416
+ policy : appsv1.StatefulSetPersistentVolumeClaimRetentionPolicy {
417
+ WhenDeleted : appsv1 .RetainPersistentVolumeClaimRetentionPolicyType ,
418
+ WhenScaled : appsv1 .RetainPersistentVolumeClaimRetentionPolicyType ,
419
+ },
420
+ expectPodOwnerRef : false ,
421
+ expectSetOwnerRef : false ,
422
+ },
423
+ {
424
+ name : "delete on scaledown only" ,
425
+ policy : appsv1.StatefulSetPersistentVolumeClaimRetentionPolicy {
426
+ WhenDeleted : appsv1 .RetainPersistentVolumeClaimRetentionPolicyType ,
427
+ WhenScaled : appsv1 .DeletePersistentVolumeClaimRetentionPolicyType ,
428
+ },
429
+ expectPodOwnerRef : true ,
430
+ expectSetOwnerRef : false ,
431
+ },
432
+ {
433
+ name : "delete with set only" ,
434
+ policy : appsv1.StatefulSetPersistentVolumeClaimRetentionPolicy {
435
+ WhenDeleted : appsv1 .DeletePersistentVolumeClaimRetentionPolicyType ,
436
+ WhenScaled : appsv1 .RetainPersistentVolumeClaimRetentionPolicyType ,
437
+ },
438
+ expectPodOwnerRef : false ,
439
+ expectSetOwnerRef : true ,
440
+ },
441
+ {
442
+ name : "always delete" ,
443
+ policy : appsv1.StatefulSetPersistentVolumeClaimRetentionPolicy {
444
+ WhenDeleted : appsv1 .DeletePersistentVolumeClaimRetentionPolicyType ,
445
+ WhenScaled : appsv1 .DeletePersistentVolumeClaimRetentionPolicyType ,
446
+ },
447
+ expectPodOwnerRef : true ,
448
+ expectSetOwnerRef : true ,
449
+ },
450
+ }
451
+ for _ , test := range tests {
452
+ t .Run (test .name , func (t * testing.T ) {
453
+ defer featuregatetesting .SetFeatureGateDuringTest (t , utilfeature .DefaultFeatureGate , features .StatefulSetAutoDeletePVC , true )()
454
+ closeFn , rm , informers , c := scSetup (t )
455
+ defer closeFn ()
456
+ ns := framework .CreateNamespaceOrDie (c , "test-autodelete-ownerrefs" , t )
457
+ defer framework .DeleteNamespaceOrDie (c , ns , t )
458
+ cancel := runControllerAndInformers (rm , informers )
459
+ defer cancel ()
460
+
461
+ sts := newSTS ("sts" , ns .Name , 3 )
462
+ sts .Spec .PersistentVolumeClaimRetentionPolicy = & test .policy
463
+ stss , _ := createSTSsPods (t , c , []* appsv1.StatefulSet {sts }, []* v1.Pod {})
464
+ sts = stss [0 ]
465
+ waitSTSStable (t , c , sts )
466
+
467
+ // Verify StatefulSet ownerref has been added as appropriate.
468
+ pvcClient := c .CoreV1 ().PersistentVolumeClaims (ns .Name )
469
+ pvcs := getStatefulSetPVCs (t , pvcClient , sts )
470
+ for _ , pvc := range pvcs {
471
+ verifyOwnerRef (t , pvc , "StatefulSet" , test .expectSetOwnerRef )
472
+ verifyOwnerRef (t , pvc , "Pod" , false )
473
+ }
474
+
475
+ // Scale down to 1 pod and verify Pod ownerrefs as appropriate.
476
+ one := int32 (1 )
477
+ sts .Spec .Replicas = & one
478
+ waitSTSStable (t , c , sts )
479
+
480
+ pvcs = getStatefulSetPVCs (t , pvcClient , sts )
481
+ for i , pvc := range pvcs {
482
+ verifyOwnerRef (t , pvc , "StatefulSet" , test .expectSetOwnerRef )
483
+ if i == 0 {
484
+ verifyOwnerRef (t , pvc , "Pod" , false )
485
+ } else {
486
+ verifyOwnerRef (t , pvc , "Pod" , test .expectPodOwnerRef )
487
+ }
488
+ }
489
+ })
490
+ }
491
+ }
0 commit comments