Merge pull request #130326 from elizabeth-dev/statefulset-framework-return-errors

test(statefulset): return errors in framework function GetPodList for upstream handling
This commit is contained in:
Kubernetes Prow Robot 2025-02-21 00:06:26 -08:00 committed by GitHub
commit fa03b93d25
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 89 additions and 29 deletions

View File

@ -206,7 +206,9 @@ var _ = SIGDescribe("StatefulSet", func() {
ginkgo.By("Saturating stateful set " + ss.Name)
e2estatefulset.Saturate(ctx, c, ss)
pods := e2estatefulset.GetPodList(ctx, c, ss)
pods, err := e2estatefulset.GetPodList(ctx, c, ss)
framework.ExpectNoError(err)
gomega.Expect(pods.Items).To(gomega.HaveLen(int(*ss.Spec.Replicas)))
ginkgo.By("Checking that stateful set pods are created with ControllerRef")
@ -354,7 +356,9 @@ var _ = SIGDescribe("StatefulSet", func() {
currentRevision, updateRevision := ss.Status.CurrentRevision, ss.Status.UpdateRevision
gomega.Expect(currentRevision).To(gomega.Equal(updateRevision), "StatefulSet %s/%s created with update revision %s not equal to current revision %s",
ss.Namespace, ss.Name, updateRevision, currentRevision)
pods := e2estatefulset.GetPodList(ctx, c, ss)
pods, err := e2estatefulset.GetPodList(ctx, c, ss)
framework.ExpectNoError(err)
for i := range pods.Items {
gomega.Expect(pods.Items[i].Labels).To(gomega.HaveKeyWithValue(appsv1.StatefulSetRevisionLabel, currentRevision), "Pod %s/%s revision %s is not equal to currentRevision %s",
pods.Items[i].Namespace,
@ -443,7 +447,9 @@ var _ = SIGDescribe("StatefulSet", func() {
deleteStatefulPodAtIndex(ctx, c, 2, ss)
e2estatefulset.WaitForRunningAndReady(ctx, c, 3, ss)
ss = getStatefulSet(ctx, c, ss.Namespace, ss.Name)
pods = e2estatefulset.GetPodList(ctx, c, ss)
pods, err = e2estatefulset.GetPodList(ctx, c, ss)
framework.ExpectNoError(err)
for i := range pods.Items {
if i < int(*ss.Spec.UpdateStrategy.RollingUpdate.Partition) {
gomega.Expect(pods.Items[i].Spec.Containers[0].Image).To(gomega.Equal(oldImage), "Pod %s/%s has image %s not equal to current image %s",
@ -580,7 +586,9 @@ var _ = SIGDescribe("StatefulSet", func() {
currentRevision, updateRevision := ss.Status.CurrentRevision, ss.Status.UpdateRevision
gomega.Expect(currentRevision).To(gomega.Equal(updateRevision), "StatefulSet %s/%s created with update revision %s not equal to current revision %s",
ss.Namespace, ss.Name, updateRevision, currentRevision)
pods := e2estatefulset.GetPodList(ctx, c, ss)
pods, err := e2estatefulset.GetPodList(ctx, c, ss)
framework.ExpectNoError(err)
for i := range pods.Items {
gomega.Expect(pods.Items[i].Labels).To(gomega.HaveKeyWithValue(appsv1.StatefulSetRevisionLabel, currentRevision), "Pod %s/%s revision %s is not equal to current revision %s",
pods.Items[i].Namespace,
@ -595,7 +603,9 @@ var _ = SIGDescribe("StatefulSet", func() {
deleteStatefulPodAtIndex(ctx, c, 2, ss)
e2estatefulset.WaitForRunningAndReady(ctx, c, 3, ss)
ss = getStatefulSet(ctx, c, ss.Namespace, ss.Name)
pods = e2estatefulset.GetPodList(ctx, c, ss)
pods, err = e2estatefulset.GetPodList(ctx, c, ss)
framework.ExpectNoError(err)
for i := range pods.Items {
gomega.Expect(pods.Items[i].Labels).To(gomega.HaveKeyWithValue(appsv1.StatefulSetRevisionLabel, currentRevision), "Pod %s/%s revision %s is not equal to current revision %s",
pods.Items[i].Namespace,
@ -624,7 +634,9 @@ var _ = SIGDescribe("StatefulSet", func() {
deleteStatefulPodAtIndex(ctx, c, 2, ss)
e2estatefulset.WaitForRunningAndReady(ctx, c, 3, ss)
ss = getStatefulSet(ctx, c, ss.Namespace, ss.Name)
pods = e2estatefulset.GetPodList(ctx, c, ss)
pods, err = e2estatefulset.GetPodList(ctx, c, ss)
framework.ExpectNoError(err)
for i := range pods.Items {
gomega.Expect(pods.Items[i].Spec.Containers[0].Image).To(gomega.Equal(newImage), "Pod %s/%s has image %s not equal to new image %s",
pods.Items[i].Namespace,
@ -1816,7 +1828,9 @@ var _ = SIGDescribe("StatefulSet", func() {
e2estatefulset.WaitForStatusReadyReplicas(ctx, c, ss, 2)
ginkgo.By("Confirming 2 replicas, with start ordinal 0")
pods := e2estatefulset.GetPodList(ctx, c, ss)
pods, err := e2estatefulset.GetPodList(ctx, c, ss)
framework.ExpectNoError(err)
err = expectPodNames(pods, []string{"ss-0", "ss-1"})
framework.ExpectNoError(err)
@ -1851,7 +1865,9 @@ var _ = SIGDescribe("StatefulSet", func() {
e2estatefulset.WaitForStatusReadyReplicas(ctx, c, ss, 2)
ginkgo.By("Confirming 2 replicas, with start ordinal 2")
pods := e2estatefulset.GetPodList(ctx, c, ss)
pods, err := e2estatefulset.GetPodList(ctx, c, ss)
framework.ExpectNoError(err)
err = expectPodNames(pods, []string{"ss-2", "ss-3"})
framework.ExpectNoError(err)
@ -1885,7 +1901,9 @@ var _ = SIGDescribe("StatefulSet", func() {
e2estatefulset.WaitForStatusReadyReplicas(ctx, c, ss, 2)
ginkgo.By("Confirming 2 replicas, with start ordinal 3")
pods := e2estatefulset.GetPodList(ctx, c, ss)
pods, err := e2estatefulset.GetPodList(ctx, c, ss)
framework.ExpectNoError(err)
err = expectPodNames(pods, []string{"ss-3", "ss-4"})
framework.ExpectNoError(err)
@ -1918,7 +1936,9 @@ var _ = SIGDescribe("StatefulSet", func() {
e2estatefulset.WaitForStatusReadyReplicas(ctx, c, ss, 2)
ginkgo.By("Confirming 2 replicas, with start ordinal 3")
pods := e2estatefulset.GetPodList(ctx, c, ss)
pods, err := e2estatefulset.GetPodList(ctx, c, ss)
framework.ExpectNoError(err)
err = expectPodNames(pods, []string{"ss-3", "ss-4"})
framework.ExpectNoError(err)
@ -2170,7 +2190,9 @@ func rollbackTest(ctx context.Context, c clientset.Interface, ns string, ss *app
currentRevision, updateRevision := ss.Status.CurrentRevision, ss.Status.UpdateRevision
gomega.Expect(currentRevision).To(gomega.Equal(updateRevision), "StatefulSet %s/%s created with update revision %s not equal to current revision %s",
ss.Namespace, ss.Name, updateRevision, currentRevision)
pods := e2estatefulset.GetPodList(ctx, c, ss)
pods, err := e2estatefulset.GetPodList(ctx, c, ss)
framework.ExpectNoError(err)
for i := range pods.Items {
gomega.Expect(pods.Items[i].Labels).To(gomega.HaveKeyWithValue(appsv1.StatefulSetRevisionLabel, currentRevision), "Pod %s/%s revision %s is not equal to current revision %s",
pods.Items[i].Namespace,
@ -2198,7 +2220,9 @@ func rollbackTest(ctx context.Context, c clientset.Interface, ns string, ss *app
gomega.Expect(currentRevision).NotTo(gomega.Equal(updateRevision), "Current revision should not equal update revision during rolling update")
ginkgo.By("Updating Pods in reverse ordinal order")
pods = e2estatefulset.GetPodList(ctx, c, ss)
pods, err = e2estatefulset.GetPodList(ctx, c, ss)
framework.ExpectNoError(err)
e2estatefulset.SortStatefulPods(pods)
err = restorePodHTTPProbe(ss, &pods.Items[1])
framework.ExpectNoError(err)
@ -2237,7 +2261,9 @@ func rollbackTest(ctx context.Context, c clientset.Interface, ns string, ss *app
gomega.Expect(currentRevision).NotTo(gomega.Equal(updateRevision), "Current revision should not equal update revision during roll back")
ginkgo.By("Rolling back update in reverse ordinal order")
pods = e2estatefulset.GetPodList(ctx, c, ss)
pods, err = e2estatefulset.GetPodList(ctx, c, ss)
framework.ExpectNoError(err)
e2estatefulset.SortStatefulPods(pods)
restorePodHTTPProbe(ss, &pods.Items[1])
ss, _ = e2estatefulset.WaitForPodReady(ctx, c, ss, pods.Items[1].Name)
@ -2280,7 +2306,9 @@ func deletingPodForRollingUpdatePartitionTest(ctx context.Context, f *framework.
currentRevision, updateRevision := ss.Status.CurrentRevision, ss.Status.UpdateRevision
gomega.Expect(currentRevision).To(gomega.Equal(updateRevision), fmt.Sprintf("StatefulSet %s/%s created with update revision %s not equal to current revision %s",
ss.Namespace, ss.Name, updateRevision, currentRevision))
pods := e2estatefulset.GetPodList(ctx, c, ss)
pods, err := e2estatefulset.GetPodList(ctx, c, ss)
framework.ExpectNoError(err)
for i := range pods.Items {
gomega.Expect(pods.Items[i].Labels[appsv1.StatefulSetRevisionLabel]).To(gomega.Equal(currentRevision), fmt.Sprintf("Pod %s/%s revision %s is not equal to currentRevision %s",
pods.Items[i].Namespace,
@ -2372,7 +2400,9 @@ func deletingPodForRollingUpdatePartitionTest(ctx context.Context, f *framework.
})
ginkgo.By("Verify pod images after pod-0 deletion and recreation")
pods = e2estatefulset.GetPodList(ctx, c, ss)
pods, err = e2estatefulset.GetPodList(ctx, c, ss)
framework.ExpectNoError(err)
for i := range pods.Items {
if i < int(*ss.Spec.UpdateStrategy.RollingUpdate.Partition) {
gomega.Expect(pods.Items[i].Spec.Containers[0].Image).To(gomega.Equal(oldImage), fmt.Sprintf("Pod %s/%s has image %s not equal to current image %s",
@ -2406,7 +2436,9 @@ func confirmStatefulPodCount(ctx context.Context, c clientset.Interface, count i
start := time.Now()
deadline := start.Add(timeout)
for t := time.Now(); t.Before(deadline) && ctx.Err() == nil; t = time.Now() {
podList := e2estatefulset.GetPodList(ctx, c, ss)
podList, err := e2estatefulset.GetPodList(ctx, c, ss)
framework.ExpectNoError(err)
statefulPodCount := len(podList.Items)
if statefulPodCount != count {
e2epod.LogPodStates(podList.Items)

View File

@ -156,7 +156,9 @@ func PauseNewPods(ss *appsv1.StatefulSet) {
// or if it finds more than one paused Pod existing at the same time.
// This is a no-op if there are no paused pods.
func ResumeNextPod(ctx context.Context, c clientset.Interface, ss *appsv1.StatefulSet) {
podList := GetPodList(ctx, c, ss)
podList, err := GetPodList(ctx, c, ss)
framework.ExpectNoError(err)
resumedPod := ""
for _, pod := range podList.Items {
if pod.Status.Phase != v1.PodRunning {

View File

@ -64,12 +64,13 @@ func CreateStatefulSet(ctx context.Context, c clientset.Interface, manifestPath,
}
// GetPodList gets the current Pods in ss.
func GetPodList(ctx context.Context, c clientset.Interface, ss *appsv1.StatefulSet) *v1.PodList {
func GetPodList(ctx context.Context, c clientset.Interface, ss *appsv1.StatefulSet) (*v1.PodList, error) {
selector, err := metav1.LabelSelectorAsSelector(ss.Spec.Selector)
framework.ExpectNoError(err)
podList, err := c.CoreV1().Pods(ss.Namespace).List(ctx, metav1.ListOptions{LabelSelector: selector.String()})
framework.ExpectNoError(err)
return podList
if err != nil {
return nil, err
}
return c.CoreV1().Pods(ss.Namespace).List(ctx, metav1.ListOptions{LabelSelector: selector.String()})
}
// DeleteAllStatefulSets deletes all StatefulSet API Objects in Namespace ns.
@ -154,7 +155,11 @@ func Scale(ctx context.Context, c clientset.Interface, ss *appsv1.StatefulSet, c
var statefulPodList *v1.PodList
pollErr := wait.PollUntilContextTimeout(ctx, StatefulSetPoll, StatefulSetTimeout, true, func(ctx context.Context) (bool, error) {
statefulPodList = GetPodList(ctx, c, ss)
statefulPodList, err := GetPodList(ctx, c, ss)
if err != nil {
return false, err
}
if int32(len(statefulPodList.Items)) == count {
return true, nil
}
@ -193,7 +198,11 @@ func Restart(ctx context.Context, c clientset.Interface, ss *appsv1.StatefulSet)
// CheckHostname verifies that all Pods in ss have the correct Hostname. If the returned error is not nil than verification failed.
func CheckHostname(ctx context.Context, c clientset.Interface, ss *appsv1.StatefulSet) error {
cmd := "printf $(hostname)"
podList := GetPodList(ctx, c, ss)
podList, err := GetPodList(ctx, c, ss)
if err != nil {
return err
}
for _, statefulPod := range podList.Items {
hostname, err := e2epodoutput.RunHostCmdWithRetries(statefulPod.Namespace, statefulPod.Name, cmd, StatefulSetPoll, StatefulPodTimeout)
if err != nil {
@ -237,7 +246,11 @@ func CheckServiceName(ss *appsv1.StatefulSet, expectedServiceName string) error
// CheckPodIndexLabel asserts that the pods for ss have expected index label and values.
func CheckPodIndexLabel(ctx context.Context, c clientset.Interface, ss *appsv1.StatefulSet) error {
pods := GetPodList(ctx, c, ss)
pods, err := GetPodList(ctx, c, ss)
if err != nil {
return err
}
labelIndices := sets.NewInt()
for _, pod := range pods.Items {
ix, err := strconv.Atoi(pod.Labels[appsv1.PodIndexLabel])
@ -257,7 +270,11 @@ func CheckPodIndexLabel(ctx context.Context, c clientset.Interface, ss *appsv1.S
// ExecInStatefulPods executes cmd in all Pods in ss. If a error occurs it is returned and cmd is not execute in any subsequent Pods.
func ExecInStatefulPods(ctx context.Context, c clientset.Interface, ss *appsv1.StatefulSet, cmd string) error {
podList := GetPodList(ctx, c, ss)
podList, err := GetPodList(ctx, c, ss)
if err != nil {
return err
}
for _, statefulPod := range podList.Items {
stdout, err := e2epodoutput.RunHostCmdWithRetries(statefulPod.Namespace, statefulPod.Name, cmd, StatefulSetPoll, StatefulPodTimeout)
framework.Logf("stdout of %v on %v: %v", cmd, statefulPod.Name, stdout)

View File

@ -34,7 +34,11 @@ import (
func WaitForRunning(ctx context.Context, c clientset.Interface, numPodsRunning, numPodsReady int32, ss *appsv1.StatefulSet) {
pollErr := wait.PollUntilContextTimeout(ctx, StatefulSetPoll, StatefulSetTimeout, true,
func(ctx context.Context) (bool, error) {
podList := GetPodList(ctx, c, ss)
podList, err := GetPodList(ctx, c, ss)
if err != nil {
return false, err
}
SortStatefulPods(podList)
if int32(len(podList.Items)) < numPodsRunning {
framework.Logf("Found %d stateful pods, waiting for %d", len(podList.Items), numPodsRunning)
@ -67,7 +71,11 @@ func WaitForState(ctx context.Context, c clientset.Interface, ss *appsv1.Statefu
if err != nil {
return false, err
}
podList := GetPodList(ctx, c, ssGet)
podList, err := GetPodList(ctx, c, ssGet)
if err != nil {
return false, err
}
return until(ssGet, podList)
})
if pollErr != nil {

View File

@ -1157,7 +1157,8 @@ func createStatefulSet(ctx context.Context, config *localTestConfig, ssReplicas
}
func validateStatefulSet(ctx context.Context, config *localTestConfig, ss *appsv1.StatefulSet, anti bool) {
pods := e2estatefulset.GetPodList(ctx, config.client, ss)
pods, err := e2estatefulset.GetPodList(ctx, config.client, ss)
framework.ExpectNoError(err)
nodes := sets.NewString()
for _, pod := range pods.Items {