@@ -90,6 +90,7 @@ func TestStatefulSetControl(t *testing.T) {
9090		{UpdatePodFailure , simpleSetFn },
9191		{UpdateSetStatusFailure , simpleSetFn },
9292		{PodRecreateDeleteFailure , simpleSetFn },
93+ 		{RecreatesPVCForPendingPod , simpleSetFn },
9394	}
9495
9596	for  _ , testCase  :=  range  testCases  {
@@ -443,6 +444,58 @@ func PodRecreateDeleteFailure(t *testing.T, set *apps.StatefulSet, invariants in
443444	}
444445}
445446
447+ func  RecreatesPVCForPendingPod (t  * testing.T , set  * apps.StatefulSet , invariants  invariantFunc ) {
448+ 	client  :=  fake .NewSimpleClientset ()
449+ 	spc , _ , ssc , stop  :=  setupController (client )
450+ 	defer  close (stop )
451+ 	selector , err  :=  metav1 .LabelSelectorAsSelector (set .Spec .Selector )
452+ 	if  err  !=  nil  {
453+ 		t .Error (err )
454+ 	}
455+ 	pods , err  :=  spc .podsLister .Pods (set .Namespace ).List (selector )
456+ 	if  err  !=  nil  {
457+ 		t .Error (err )
458+ 	}
459+ 	if  err  :=  ssc .UpdateStatefulSet (set , pods ); err  !=  nil  {
460+ 		t .Errorf ("Error updating StatefulSet %s" , err )
461+ 	}
462+ 	if  err  :=  invariants (set , spc ); err  !=  nil  {
463+ 		t .Error (err )
464+ 	}
465+ 	pods , err  =  spc .podsLister .Pods (set .Namespace ).List (selector )
466+ 	if  err  !=  nil  {
467+ 		t .Error (err )
468+ 	}
469+ 	for  _ , claim  :=  range  getPersistentVolumeClaims (set , pods [0 ]) {
470+ 		spc .claimsIndexer .Delete (& claim )
471+ 	}
472+ 	pods [0 ].Status .Phase  =  v1 .PodPending 
473+ 	oldCreationTimestamp  :=  pods [0 ].CreationTimestamp 
474+ 	pods [0 ].CreationTimestamp  =  metav1 .Now ()
475+ 	spc .podsIndexer .Update (pods [0 ])
476+ 	if  err  :=  ssc .UpdateStatefulSet (set , pods ); err  !=  nil  {
477+ 		t .Errorf ("Error updating StatefulSet %s" , err )
478+ 	}
479+ 	// The pod is still new, so the pvc should not be recreated yet 
480+ 	if  err  :=  invariants (set , spc ); err  ==  nil  {
481+ 		t .Error ("Statefulset pod should be missing pvc" )
482+ 	}
483+ 
484+ 	pods [0 ].CreationTimestamp  =  oldCreationTimestamp 
485+ 	spc .podsIndexer .Update (pods [0 ])
486+ 	if  err  :=  ssc .UpdateStatefulSet (set , pods ); err  !=  nil  {
487+ 		t .Errorf ("Error updating StatefulSet %s" , err )
488+ 	}
489+ 	// invariants check if there any missing PVCs for the Pods 
490+ 	if  err  :=  invariants (set , spc ); err  !=  nil  {
491+ 		t .Error (err )
492+ 	}
493+ 	pods , err  =  spc .podsLister .Pods (set .Namespace ).List (selector )
494+ 	if  err  !=  nil  {
495+ 		t .Error (err )
496+ 	}
497+ }
498+ 
446499func  TestStatefulSetControlScaleDownDeleteError (t  * testing.T ) {
447500	invariants  :=  assertMonotonicInvariants 
448501	set  :=  newStatefulSet (3 )
@@ -1767,6 +1820,13 @@ func (spc *fakeStatefulPodControl) DeleteStatefulPod(set *apps.StatefulSet, pod
17671820	return  nil 
17681821}
17691822
1823+ func  (spc  * fakeStatefulPodControl ) CreatePersistentVolumeClaims (set  * apps.StatefulSet , pod  * v1.Pod ) error  {
1824+ 	for  _ , claim  :=  range  getPersistentVolumeClaims (set , pod ) {
1825+ 		spc .claimsIndexer .Update (& claim )
1826+ 	}
1827+ 	return  nil 
1828+ }
1829+ 
17701830var  _  StatefulPodControlInterface  =  & fakeStatefulPodControl {}
17711831
17721832type  fakeStatefulSetStatusUpdater  struct  {
0 commit comments