reconciler.requeue

2 min read

reconciler.requeue schedules a re-enqueue of the CR after a successful reconcile. The CR is added back to the workqueue after after: elapses — no informer event is needed.

Failed reconciles use queue.retryBackoff, not requeue:.


Declaration

spec:
  crds:
    myapp:
      operatorBox:
        reconciler:
          requeue:
            after: '{{ .spec.checkInterval | default "60s" }}'
            when:
              - field: status.phase
                notEquals: "Complete"

Fields

FieldTypeDefaultDescription
afterduration or templateHow long to wait before re-enqueuing. A Go duration string ("30s", "5m", "1h") or a template expression evaluated against the live CR. Empty string disables requeue.
when[]ConditionAND conditions. Requeue only fires when all pass. Omit to requeue unconditionally after every successful reconcile.
or[]ConditionOR conditions. When both when: and or: are present, both must pass.

after: as a template

The expression is evaluated against the live CR at reconcile time using the full template context (fields, notes, profiles). Each CR can carry its own timing:

after: '{{ .spec.syncInterval | default "2m" }}'

If the expression renders to an empty string, "0s", or fails to parse as a duration, no requeue is scheduled.

Validation

ork validate rejects a non-template after: value that is not a valid Go duration:

✗ crd "myapp": requeue.after "every-minute" is not a valid duration or template expression.
  Use a Go duration string (e.g. "30s", "5m") or a template (e.g. '{{ .spec.interval | default "60s" }}')

Relationship to other timing fields

FieldError pathSuccess pathScope
queue.retryBackoffPer CRD
reconciler.resync✓ (uniform)Per CRD, all CRs
reconciler.requeue✓ (conditional)Per CR, template-driven

requeue: and resync: are additive — whichever fires first re-enqueues the CR.