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

  1. Verify the target is a suspend step (`type: Suspend`) and still in Running/Pending phase; only active suspend nodes qualify.
  2. Fix the nodeFieldSelector expression so it matches the suspend node (e.g. `name=<suspend-step-name>`); list nodes with `argo get` to confirm names.
  3. Re-run `argo resume`/`argo set` before the suspend resumes, or resubmit/restart the workflow if the suspend window has passed.
  4. 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

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


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