diff --git a/test/e2e/apps/statefulset.go b/test/e2e/apps/statefulset.go index 302fc2f768f..2bbd7474d43 100644 --- a/test/e2e/apps/statefulset.go +++ b/test/e2e/apps/statefulset.go @@ -1124,6 +1124,22 @@ var _ = SIGDescribe("StatefulSet", func() { appTester.run() }) }) + // Make sure minReadySeconds is honored + // Don't mark it as conformance yet + ginkgo.It("MinReadySeconds should be honored when enabled [Feature:StatefulSetMinReadySeconds] [alpha]", func() { + ssName := "test-ss" + headlessSvcName := "test" + // Define StatefulSet Labels + ssPodLabels := map[string]string{ + "name": "sample-pod", + "pod": WebserverImageName, + } + ss := e2estatefulset.NewStatefulSet(ssName, ns, headlessSvcName, 1, nil, nil, ssPodLabels) + setHTTPProbe(ss) + ss, err := c.AppsV1().StatefulSets(ns).Create(context.TODO(), ss, metav1.CreateOptions{}) + framework.ExpectNoError(err) + e2estatefulset.WaitForStatusAvailableReplicas(c, ss, 1) + }) }) func kubectlExecWithRetries(ns string, args ...string) (out string) { diff --git a/test/e2e/framework/statefulset/wait.go b/test/e2e/framework/statefulset/wait.go index de329a0d60e..b1fb70a5cfe 100644 --- a/test/e2e/framework/statefulset/wait.go +++ b/test/e2e/framework/statefulset/wait.go @@ -121,6 +121,31 @@ func WaitForStatusReadyReplicas(c clientset.Interface, ss *appsv1.StatefulSet, e } } +// WaitForStatusAvailableReplicas waits for the ss.Status.Available to be equal to expectedReplicas +func WaitForStatusAvailableReplicas(c clientset.Interface, ss *appsv1.StatefulSet, expectedReplicas int32) { + framework.Logf("Waiting for statefulset status.AvailableReplicas updated to %d", expectedReplicas) + + ns, name := ss.Namespace, ss.Name + pollErr := wait.PollImmediate(StatefulSetPoll, StatefulSetTimeout, + func() (bool, error) { + ssGet, err := c.AppsV1().StatefulSets(ns).Get(context.TODO(), name, metav1.GetOptions{}) + if err != nil { + return false, err + } + if ssGet.Status.ObservedGeneration < ss.Generation { + return false, nil + } + if ssGet.Status.AvailableReplicas != expectedReplicas { + framework.Logf("Waiting for stateful set status.AvailableReplicas to become %d, currently %d", expectedReplicas, ssGet.Status.ReadyReplicas) + return false, nil + } + return true, nil + }) + if pollErr != nil { + framework.Failf("Failed waiting for stateful set status.AvailableReplicas updated to %d: %v", expectedReplicas, pollErr) + } +} + // WaitForStatusReplicas waits for the ss.Status.Replicas to be equal to expectedReplicas func WaitForStatusReplicas(c clientset.Interface, ss *appsv1.StatefulSet, expectedReplicas int32) { framework.Logf("Waiting for statefulset status.replicas updated to %d", expectedReplicas)