argoproj/argo-workflows · error

getting archived workflows not supported

Error message

getting archived workflows not supported

What it means

nullWorkflowArchive is the no-op archive implementation used when the workflow archive is not configured. GetWorkflow always returns this error because there is no archive database to read from. It replaces the real sqldb-backed archive when persistence is disabled.

Source

Thrown at persist/sqldb/null_workflow_archive.go:39

func (r *nullWorkflowArchive) ArchiveWorkflow(ctx context.Context, wf *wfv1.Workflow) error {
	return nil
}

func (r *nullWorkflowArchive) ListWorkflows(ctx context.Context, options sutils.ListOptions) (wfv1.Workflows, error) {
	return wfv1.Workflows{}, nil
}

func (r *nullWorkflowArchive) CountWorkflows(ctx context.Context, options sutils.ListOptions) (int64, error) {
	return 0, nil
}

func (r *nullWorkflowArchive) HasMoreWorkflows(ctx context.Context, options sutils.ListOptions) (bool, error) {
	return false, nil
}

func (r *nullWorkflowArchive) GetWorkflow(ctx context.Context, uid string, namespace string, name string) (*wfv1.Workflow, error) {
	return nil, fmt.Errorf("getting archived workflows not supported")
}

func (r *nullWorkflowArchive) GetWorkflowForEstimator(ctx context.Context, namespace string, requirements []labels.Requirement) (*wfv1.Workflow, error) {
	return nil, fmt.Errorf("getting archived workflow for estimator not supported")
}

func (r *nullWorkflowArchive) DeleteWorkflow(ctx context.Context, uid string) error {
	return fmt.Errorf("deleting archived workflows not supported")
}

func (r *nullWorkflowArchive) DeleteExpiredWorkflows(ctx context.Context, ttl time.Duration) error {
	return nil
}

func (r *nullWorkflowArchive) ListWorkflowsLabelKeys(ctx context.Context) (*wfv1.LabelKeys, error) {
	return &wfv1.LabelKeys{}, nil
}

View on GitHub (pinned to 35bff19146)

Solutions

  1. Configure persistence in the workflow-controller-configmap (postgres/mysql endpoint, archive: true) and restart the controller and server.
  2. If archiving is intentionally off, retrieve the workflow directly (kubectl get wf) rather than from the archive.
  3. Check that the server is pointed at the deployment where archiving is actually enabled.
  4. Handle the error in UI/CLI flows by hiding archive features when the archive is not configured.

Example fix

// before (workflow-controller-configmap)
// persistence: {}
// after
// persistence:
//   connectionPool:
//     maxIdleConns: 100
//   postgresql:
//     host: postgres
//     database: postgres
// archive: true
Defensive patterns

Strategy: type-guard

Validate before calling

// feature-detect archive support before calling
if !archivingEnabled(hybridCtx) {
    return errors.New("workflow archive is not configured on this server")
}

Type guard

func archiveConfigured(archive workflowarchive.Archive) bool {
    _, err := archive.GetWorkflow(ctx, "__probe__", "", "")
    return err == nil || !strings.Contains(err.Error(), "not supported")
}

Try / catch

wf, err := archive.GetWorkflow(ctx, uid, ns, name)
if err != nil && strings.Contains(err.Error(), "not supported") {
    return nil, status.Error(codes.Unimplemented, "workflow archive is not configured")
}

Prevention

When it happens

Trigger: Any request to fetch an archived workflow by UID (argo CLI `argo archive get`, server archived-workflow API, or UI) when persistence/workflow archive is not configured on the server/controller.

Common situations: Deployments without the persistence section in workflow-controller-configmap; users hitting archive endpoints of a server with no database; accidentally scaling down or misconfiguring the archive DB so the null archive is wired.

Related errors


AI-assisted analysis of argoproj/argo-workflows@35bff19146 (2026-09-03). Data as JSON: /api/errors/8df0ff881a1ed5e5. Report an issue: GitHub.