From a58d4f54cf88da38d39c1935f1ec9d85d95e83c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20K=C5=99epinsk=C3=BD?= Date: Thu, 7 Mar 2024 21:50:06 +0100 Subject: [PATCH] fix pods tracking and internal error checking in statefulset tests --- .../statefulset/stateful_set_control_test.go | 37 +++++++++++++------ 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/pkg/controller/statefulset/stateful_set_control_test.go b/pkg/controller/statefulset/stateful_set_control_test.go index ddaef5324da..687197a3176 100644 --- a/pkg/controller/statefulset/stateful_set_control_test.go +++ b/pkg/controller/statefulset/stateful_set_control_test.go @@ -450,8 +450,8 @@ func CreatePodFailure(t *testing.T, set *apps.StatefulSet, invariants invariantF om, _, ssc := setupController(client) om.SetCreateStatefulPodError(apierrors.NewInternalError(errors.New("API server failed")), 2) - if err := scaleUpStatefulSetControl(set, ssc, om, invariants); err != nil && isOrHasInternalError(err) { - t.Errorf("StatefulSetControl did not return InternalError found %s", err) + if err := scaleUpStatefulSetControl(set, ssc, om, invariants); !isOrHasInternalError(err) { + t.Errorf("StatefulSetControl did not return InternalError, found %s", err) } // Update so set.Status is set for the next scaleUpStatefulSetControl call. var err error @@ -514,8 +514,8 @@ func UpdatePodFailure(t *testing.T, set *apps.StatefulSet, invariants invariantF om.podsIndexer.Update(pods[0]) // now it should fail - if _, err := ssc.UpdateStatefulSet(context.TODO(), set, pods); err != nil && isOrHasInternalError(err) { - t.Errorf("StatefulSetControl did not return InternalError found %s", err) + if _, err := ssc.UpdateStatefulSet(context.TODO(), set, pods); !isOrHasInternalError(err) { + t.Errorf("StatefulSetControl did not return InternalError, found %s", err) } } @@ -524,8 +524,8 @@ func UpdateSetStatusFailure(t *testing.T, set *apps.StatefulSet, invariants inva om, ssu, ssc := setupController(client) ssu.SetUpdateStatefulSetStatusError(apierrors.NewInternalError(errors.New("API server failed")), 2) - if err := scaleUpStatefulSetControl(set, ssc, om, invariants); err != nil && isOrHasInternalError(err) { - t.Errorf("StatefulSetControl did not return InternalError found %s", err) + if err := scaleUpStatefulSetControl(set, ssc, om, invariants); !isOrHasInternalError(err) { + t.Errorf("StatefulSetControl did not return InternalError, found %s", err) } // Update so set.Status is set for the next scaleUpStatefulSetControl call. var err error @@ -576,8 +576,8 @@ func PodRecreateDeleteFailure(t *testing.T, set *apps.StatefulSet, invariants in pods[0].Status.Phase = v1.PodFailed om.podsIndexer.Update(pods[0]) om.SetDeleteStatefulPodError(apierrors.NewInternalError(errors.New("API server failed")), 0) - if _, err := ssc.UpdateStatefulSet(context.TODO(), set, pods); err != nil && isOrHasInternalError(err) { - t.Errorf("StatefulSet failed to %s", err) + if _, err := ssc.UpdateStatefulSet(context.TODO(), set, pods); !isOrHasInternalError(err) { + t.Errorf("StatefulSetControl did not return InternalError, found %s", err) } if err := invariants(set, om); err != nil { t.Error(err) @@ -792,7 +792,7 @@ func TestStatefulSetControlScaleDownDeleteError(t *testing.T) { } *set.Spec.Replicas = 0 om.SetDeleteStatefulPodError(apierrors.NewInternalError(errors.New("API server failed")), 2) - if err := scaleDownStatefulSetControl(set, ssc, om, invariants); err != nil && isOrHasInternalError(err) { + if err := scaleDownStatefulSetControl(set, ssc, om, invariants); !isOrHasInternalError(err) { t.Errorf("StatefulSetControl failed to throw error on delete %s", err) } set, err = om.setsLister.StatefulSets(set.Namespace).Get(set.Name) @@ -2501,6 +2501,11 @@ func (om *fakeObjectManager) GetPod(namespace, podName string) (*v1.Pod, error) } func (om *fakeObjectManager) UpdatePod(pod *v1.Pod) error { + defer om.updatePodTracker.inc() + if om.updatePodTracker.errorReady() { + defer om.updatePodTracker.reset() + return om.updatePodTracker.getErr() + } return om.podsIndexer.Update(pod) } @@ -3356,6 +3361,16 @@ func newRevisionOrDie(set *apps.StatefulSet, revision int64) *apps.ControllerRev } func isOrHasInternalError(err error) bool { - agg, ok := err.(utilerrors.Aggregate) - return !ok && !apierrors.IsInternalError(err) || ok && len(agg.Errors()) > 0 && !apierrors.IsInternalError(agg.Errors()[0]) + if err == nil { + return false + } + var agg utilerrors.Aggregate + if errors.As(err, &agg) { + for _, e := range agg.Errors() { + if apierrors.IsInternalError(e) { + return true + } + } + } + return apierrors.IsInternalError(err) }