diff --git a/test/e2e/apps/cronjob.go b/test/e2e/apps/cronjob.go index b83d368d3bc..bf96c302d1a 100644 --- a/test/e2e/apps/cronjob.go +++ b/test/e2e/apps/cronjob.go @@ -104,8 +104,8 @@ var _ = SIGDescribe("CronJob", func() { framework.ExpectNoError(err, "Failed to create CronJob in namespace %s", f.Namespace.Name) ginkgo.By("Ensuring no jobs are scheduled") - err = waitForNoJobs(ctx, f.ClientSet, f.Namespace.Name, cronJob.Name, false) - framework.ExpectError(err) + gomega.Consistently(ctx, framework.GetObject(f.ClientSet.BatchV1().CronJobs(f.Namespace.Name).Get, cronJob.Name, metav1.GetOptions{})).WithPolling(framework.Poll).WithTimeout(cronJobTimeout). + Should(gomega.HaveField("Status.Active", gomega.BeEmpty())) ginkgo.By("Ensuring no job exists by listing jobs explicitly") jobs, err := f.ClientSet.BatchV1().Jobs(f.Namespace.Name).List(ctx, metav1.ListOptions{}) @@ -145,8 +145,15 @@ var _ = SIGDescribe("CronJob", func() { gomega.Expect(activeJobs).To(gomega.HaveLen(1)) ginkgo.By("Ensuring no more jobs are scheduled") - err = waitForActiveJobs(ctx, f.ClientSet, f.Namespace.Name, cronJob.Name, 2) - framework.ExpectError(err) + gomega.Eventually(ctx, framework.GetObject(f.ClientSet.BatchV1().CronJobs(f.Namespace.Name).Get, cronJob.Name, metav1.GetOptions{})).WithPolling(framework.Poll).WithTimeout(cronJobTimeout). + Should(framework.MakeMatcher(func(cj *batchv1.CronJob) (func() string, error) { + if len(cj.Status.Active) < 2 { + return nil, nil + } + return func() string { + return fmt.Sprintf("unexpect active job number: %d\n", len(cj.Status.Active)) + }, nil + })) ginkgo.By("Removing cronjob") err = deleteCronJob(ctx, f.ClientSet, f.Namespace.Name, cronJob.Name) @@ -230,8 +237,24 @@ var _ = SIGDescribe("CronJob", func() { framework.ExpectNoError(err, "Failed to ensure at least on finished job exists in namespace %s", f.Namespace.Name) ginkgo.By("Ensuring no unexpected event has happened") - err = waitForEventWithReason(ctx, f.ClientSet, f.Namespace.Name, cronJob.Name, []string{"MissingJob", "UnexpectedJob"}) - framework.ExpectError(err) + gomega.Eventually(ctx, framework.HandleRetry(func(ctx context.Context) (*v1.EventList, error) { + sj, err := getCronJob(ctx, f.ClientSet, f.Namespace.Name, cronJob.Name) + if err != nil { + return nil, err + } + return f.ClientSet.CoreV1().Events(f.Namespace.Name).Search(scheme.Scheme, sj) + })).WithPolling(framework.Poll).WithTimeout(30 * time.Second).Should(framework.MakeMatcher(func(actual *v1.EventList) (failure func() string, err error) { + for _, e := range actual.Items { + for _, reason := range []string{"MissingJob", "UnexpectedJob"} { + if e.Reason == reason { + return func() string { + return fmt.Sprintf("unexpected event: %s\n", reason) + }, nil + } + } + } + return nil, nil + })) ginkgo.By("Removing cronjob") err = deleteCronJob(ctx, f.ClientSet, f.Namespace.Name, cronJob.Name) @@ -261,10 +284,7 @@ var _ = SIGDescribe("CronJob", func() { ginkgo.By("Ensuring job was deleted") _, err = e2ejob.GetJob(ctx, f.ClientSet, f.Namespace.Name, job.Name) - framework.ExpectError(err) - if !apierrors.IsNotFound(err) { - framework.Failf("Failed to delete %s cronjob in namespace %s", cronJob.Name, f.Namespace.Name) - } + gomega.Expect(err).To(gomega.MatchError(apierrors.IsNotFound, fmt.Sprintf("Failed to delete %s cronjob in namespace %s", cronJob.Name, f.Namespace.Name))) ginkgo.By("Ensuring the job is not in the cronjob active list") err = waitForJobNotActive(ctx, f.ClientSet, f.Namespace.Name, cronJob.Name, job.Name) @@ -308,10 +328,7 @@ var _ = SIGDescribe("CronJob", func() { badTimeZone := "bad-time-zone" cronJob.Spec.TimeZone = &badTimeZone _, err := createCronJob(ctx, f.ClientSet, f.Namespace.Name, cronJob) - framework.ExpectError(err, "CronJob creation should fail with invalid time zone error") - if !apierrors.IsInvalid(err) { - framework.Failf("Failed to create CronJob, invalid time zone.") - } + gomega.Expect(err).To(gomega.MatchError(apierrors.IsInvalid, "Failed to create CronJob, invalid time zone.")) }) /* @@ -614,24 +631,6 @@ func waitForActiveJobs(ctx context.Context, c clientset.Interface, ns, cronJobNa }) } -// Wait for jobs to appear in the active list of a cronjob or not. -// When failIfNonEmpty is set, this fails if the active set of jobs is still non-empty after -// the timeout. When failIfNonEmpty is not set, this fails if the active set of jobs is still -// empty after the timeout. -func waitForNoJobs(ctx context.Context, c clientset.Interface, ns, jobName string, failIfNonEmpty bool) error { - return wait.PollWithContext(ctx, framework.Poll, cronJobTimeout, func(ctx context.Context) (bool, error) { - curr, err := getCronJob(ctx, c, ns, jobName) - if err != nil { - return false, err - } - - if failIfNonEmpty { - return len(curr.Status.Active) == 0, nil - } - return len(curr.Status.Active) != 0, nil - }) -} - // Wait till a given job actually goes away from the Active list for a given cronjob func waitForJobNotActive(ctx context.Context, c clientset.Interface, ns, cronJobName, jobName string) error { return wait.PollWithContext(ctx, framework.Poll, cronJobTimeout, func(ctx context.Context) (bool, error) { diff --git a/test/e2e/apps/deployment.go b/test/e2e/apps/deployment.go index 616d2b43c7c..317bb29b74d 100644 --- a/test/e2e/apps/deployment.go +++ b/test/e2e/apps/deployment.go @@ -681,10 +681,7 @@ func stopDeployment(ctx context.Context, c clientset.Interface, ns, deploymentNa framework.Logf("Ensuring deployment %s was deleted", deploymentName) _, err = c.AppsV1().Deployments(ns).Get(ctx, deployment.Name, metav1.GetOptions{}) - framework.ExpectError(err) - if !apierrors.IsNotFound(err) { - framework.Failf("Expected deployment %s to be deleted", deploymentName) - } + gomega.Expect(err).To(gomega.MatchError(apierrors.IsNotFound, fmt.Sprintf("Expected deployment %s to be deleted", deploymentName))) framework.Logf("Ensuring deployment %s's RSes were deleted", deploymentName) selector, err := metav1.LabelSelectorAsSelector(deployment.Spec.Selector) framework.ExpectNoError(err) diff --git a/test/e2e/apps/disruption.go b/test/e2e/apps/disruption.go index 0bdf8521667..671e97d07d0 100644 --- a/test/e2e/apps/disruption.go +++ b/test/e2e/apps/disruption.go @@ -317,10 +317,9 @@ var _ = SIGDescribe("DisruptionController", func() { if c.shouldDeny { err = cs.CoreV1().Pods(ns).EvictV1(ctx, e) - framework.ExpectError(err, "pod eviction should fail") - if !apierrors.HasStatusCause(err, policyv1.DisruptionBudgetCause) { - framework.Fail("pod eviction should fail with DisruptionBudget cause") - } + gomega.Expect(err).To(gomega.MatchError(func(err error) bool { + return apierrors.HasStatusCause(err, policyv1.DisruptionBudgetCause) + }, "pod eviction should fail with DisruptionBudget cause")) } else { // Only wait for running pods in the "allow" case // because one of shouldDeny cases relies on the @@ -363,10 +362,9 @@ var _ = SIGDescribe("DisruptionController", func() { }, } err = cs.CoreV1().Pods(ns).EvictV1(ctx, e) - framework.ExpectError(err, "pod eviction should fail") - if !apierrors.HasStatusCause(err, policyv1.DisruptionBudgetCause) { - framework.Failf("pod eviction should fail with DisruptionBudget cause. The error was \"%v\"", err) - } + gomega.Expect(err).To(gomega.MatchError(func(err error) bool { + return apierrors.HasStatusCause(err, policyv1.DisruptionBudgetCause) + }, fmt.Sprintf("pod eviction should fail with DisruptionBudget cause. The error was \"%v\"\n", err))) ginkgo.By("Updating the pdb to allow a pod to be evicted") updatePDBOrDie(ctx, cs, ns, defaultName, func(pdb *policyv1.PodDisruptionBudget) *policyv1.PodDisruptionBudget { @@ -403,10 +401,9 @@ var _ = SIGDescribe("DisruptionController", func() { }, } err = cs.CoreV1().Pods(ns).EvictV1(ctx, e) - framework.ExpectError(err, "pod eviction should fail") - if !apierrors.HasStatusCause(err, policyv1.DisruptionBudgetCause) { - framework.Failf("pod eviction should fail with DisruptionBudget cause. The error was \"%v\"", err) - } + gomega.Expect(err).To(gomega.MatchError(func(err error) bool { + return apierrors.HasStatusCause(err, policyv1.DisruptionBudgetCause) + }, fmt.Sprintf("pod eviction should fail with DisruptionBudget cause. The error was \"%v\"\n", err))) ginkgo.By("Deleting the pdb to allow a pod to be evicted") deletePDBOrDie(ctx, cs, ns, defaultName) diff --git a/test/e2e/apps/job.go b/test/e2e/apps/job.go index a2337f666d4..ef970715b52 100644 --- a/test/e2e/apps/job.go +++ b/test/e2e/apps/job.go @@ -684,10 +684,7 @@ done`} ginkgo.By("Ensuring job was deleted") _, err = e2ejob.GetJob(ctx, f.ClientSet, f.Namespace.Name, job.Name) - framework.ExpectError(err, "failed to ensure job %s was deleted in namespace: %s", job.Name, f.Namespace.Name) - if !apierrors.IsNotFound(err) { - framework.Failf("failed to ensure job %s was deleted in namespace: %s", job.Name, f.Namespace.Name) - } + gomega.Expect(err).To(gomega.MatchError(apierrors.IsNotFound, fmt.Sprintf("failed to ensure job %s was deleted in namespace: %s", job.Name, f.Namespace.Name))) }) /*