argoproj/argo-workflows · error
currently, set only targets suspend nodes: no suspend nodes
Error message
currently, set only targets suspend nodes: no suspend nodes matching nodeFieldSelector: %s
What it means
Thrown by FormulateSetOutputs (workflow/util/util.go:710) when an `argo set` operation (SetWorkflowOutputs or similar) finds no node that both is an active suspend node and matches the supplied nodeFieldSelector. The `set` command currently only supports modifying outputs of suspend nodes, so if the selector matches zero suspend nodes there is nothing to update and the operation aborts before updating the Workflow object.
Source
Thrown at workflow/util/util.go:710
node.Outputs.Parameters[i].ValueFrom = nil
nodeUpdated = true
hit = true
AddParamToGlobalScope(ctx, wf, node.Outputs.Parameters[i])
break
}
}
if !hit {
return true, fmt.Errorf("node is not expecting output parameter '%s'", name)
}
}
}
wf.Status.Nodes.Set(ctx, nodeID, node)
}
}
}
if !nodeUpdated {
return true, fmt.Errorf("currently, set only targets suspend nodes: no suspend nodes matching nodeFieldSelector: %s", nodeFieldSelector)
}
err = hydrator.Dehydrate(ctx, wf)
if err != nil {
return true, fmt.Errorf("unable to compress or offload workflow nodes: %w", err)
}
creator.LabelActor(ctx, wf, action)
_, err = wfIf.Update(ctx, wf, metav1.UpdateOptions{})
if err != nil {
if apierr.IsConflict(err) {
// Try again if we have a conflict
return false, nil
}
return true, err
}
return true, nil
})View on GitHub (pinned to 35bff19146)
Solutions
- Verify the target is a suspend step (`type: Suspend`) and still in Running/Pending phase; only active suspend nodes qualify.
- Fix the nodeFieldSelector expression so it matches the suspend node (e.g. `name=<suspend-step-name>`); list nodes with `argo get` to confirm names.
- Re-run `argo resume`/`argo set` before the suspend resumes, or resubmit/restart the workflow if the suspend window has passed.
- If you need to alter outputs of non-suspend nodes, that is unsupported — restructure the workflow to place the overridable outputs on a suspend step.
Example fix
// before: selector matches a non-suspend node argo set mywf --node-field-selector name=build-task --output-parameters result=abc // after: target the suspend step by its exact name argo set mywf --node-field-selector name=wait-for-approval --output-parameters result=abc
Defensive patterns
Strategy: validation
Validate before calling
wf, _ := client.ArgoprojV1alpha1().Workflows(ns).Get(ctx, name, metav1.GetOptions{})
for id, n := range wf.Status.Nodes {
if n.Type == wfv1.NodeTypeSuspend && n.Phase == wfv1.NodePhaseRunning {
fmt.Println("settable suspend node:", n.Name)
}
}
// only run `argo set` if the selector will match one of these names Prevention
- Only use `argo set` against nodes of type Suspend that are still Running
- Copy node names exactly from `argo get` output when building nodeFieldSelector
- Automate set operations right after the suspend starts, not after resume
- Remember `set` targets suspend nodes only — never point it at task/steps nodes
When it happens
Trigger: Calling `argo set <wf> <nodeId> --message ... --output-parameters ...` or the underlying util.SetWorkflowOutputs where the nodeFieldSelector matches no node in wf.Status.Nodes for which node.IsActiveSuspendNode() is true — e.g. the selector targets a running pod/steps node, the suspend already resumed (node no longer active), or the selector expression simply matches no nodes.
Common situations: Typing a nodeFieldSelector (e.g. `name=step1`) that refers to a regular task rather than a suspend step; attempting `argo set` after the suspend was already resumed or the workflow moved on; workflows whose suspend nodes are named differently than expected.
Related errors
- resolve UID: %w
- resolve UID: %w
- resolve UID: %w
- unable to parse node field selector '%s': %w
- resolve UID: %w
AI-assisted analysis of argoproj/argo-workflows@35bff19146 (2026-09-03).
Data as JSON: /api/errors/182bafca5a6ce187.
Report an issue: GitHub.