diff --git a/test/e2e/retry_test.go b/test/e2e/retry_test.go new file mode 100644 index 000000000000..7a49eb80ed2a --- /dev/null +++ b/test/e2e/retry_test.go @@ -0,0 +1,53 @@ +//go:build functional +// +build functional + +package e2e + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/suite" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + wfv1 "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1" + "github.com/argoproj/argo-workflows/v3/test/e2e/fixtures" +) + +type RetryTestSuite struct { + fixtures.E2ESuite +} + +func (s *RetryTestSuite) TestRetryLimit() { + s.Given(). + Workflow(` +metadata: + generateName: test-backoff- +spec: + entrypoint: main + templates: + - name: main + retryStrategy: + limit: 0 + backoff: + duration: 2s + factor: 2 + maxDuration: 5m + container: + name: main + image: 'argoproj/argosay:v2' + args: [ exit, "1" ] +`). + When(). + SubmitWorkflow(). + WaitForWorkflow(fixtures.ToBeFailed). + Then(). + ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { + assert.Equal(t, wfv1.WorkflowPhase("Failed"), status.Phase) + assert.Equal(t, "No more retries left", status.Message) + }) +} + +func TestRetrySuite(t *testing.T) { + suite.Run(t, new(RetryTestSuite)) +} diff --git a/workflow/controller/operator.go b/workflow/controller/operator.go index 8c06712f378d..0497b5c9698d 100644 --- a/workflow/controller/operator.go +++ b/workflow/controller/operator.go @@ -909,7 +909,7 @@ func (woc *wfOperationCtx) processNodeRetries(node *wfv1.NodeStatus, retryStrate } // See if we have waited past the deadline - if time.Now().Before(waitingDeadline) { + if time.Now().Before(waitingDeadline) && int32(len(node.Children)) <= retryStrategy.Limit.IntVal { woc.requeueAfter(timeToWait) retryMessage := fmt.Sprintf("Backoff for %s", humanize.Duration(timeToWait)) return woc.markNodePhase(node.Name, node.Phase, retryMessage), false, nil