argoproj/argo-workflows · error
no plugin executed the template
Error message
no plugin executed the template
What it means
executePluginTemplate iterates over every plugin registered with the agent and asks each to ExecuteTemplate. A plugin 'executes' the template by populating reply.Node. If every plugin returns without error but leaves reply.Node nil, no plugin claimed the template and this error is thrown.
Source
Thrown at workflow/executor/agent.go:389
Namespace: ae.Namespace,
UID: ae.workflowUID,
},
},
Template: &tmpl,
}
reply := &executorplugins.ExecuteTemplateReply{}
for _, plug := range ae.plugins {
if err := plug.ExecuteTemplate(ctx, args, reply); err != nil {
return 0, err
} else if reply.Node != nil {
*result = *reply.Node
if reply.Node.Phase == wfv1.NodeSucceeded {
return 0, nil
}
return reply.GetRequeue(), nil
}
}
return 0, fmt.Errorf("no plugin executed the template")
}
func IsWorkflowCompleted(wts *wfv1.WorkflowTaskSet) bool {
return wts.Labels[common.LabelKeyCompleted] == "true"
}
View on GitHub (pinned to 35bff19146)
Solutions
- Verify the plugin is deployed (ConfigMap/other) and listed in the controller config so the agent loads it
- Check plugin logs / agent logs to see whether the plugin received the ExecuteTemplate call
- Ensure the template's plugin: field references a plugin that exists and its ExecuteTemplate returns a non-nil reply.Node
- Test the plugin independently (it must set reply.Node even on failure) — returning nil Node means 'did not execute'
Example fix
// inside a plugin's ExecuteTemplate — before (returns success but no node)
func (p *MyPlugin) ExecuteTemplate(ctx context.Context, args plug.ExecuteTemplateArgs, reply *plug.ExecuteTemplateReply) error {
return nil
}
// after
func (p *MyPlugin) ExecuteTemplate(ctx context.Context, args plug.ExecuteTemplateArgs, reply *plug.ExecuteTemplateReply) error {
reply.Node = &wfv1.NodeResult{Phase: wfv1.NodeSucceeded, Message: "done"}
return nil
} Defensive patterns
Strategy: type-guard
Validate before calling
// Verify the plugin is installed and loaded before running workflows that use it: // kubectl get configmap -n <ns> | grep my-plugin // and confirm it appears in workflow-controller-configmap 'plugins:' list
Type guard
// A plugin claims a template only if it populates reply.Node:
if reply.Node == nil {
// plugin did not execute the template — treat as unclaimed
} Try / catch
result, err := agentProcessTask(ctx, tmpl)
if err != nil {
if strings.Contains(err.Error(), "no plugin executed the template") {
// fall back or surface actionable message: check plugin deployment/config
}
return err
} Prevention
- Deploy the plugin ConfigMap/binary in every namespace that uses it
- Register plugins in the workflow-controller configmap and restart the controller
- Ensure the plugin always sets reply.Node in ExecuteTemplate, even on failure
- Test plugins with a minimal template before production use
When it happens
Trigger: A template with tmpl.Plugin != nil is processed but no loaded executor plugin implements/claims it — e.g. the plugin named in the template is not deployed, the plugin socket is missing so the plugin list is empty, or the plugin's ExecuteTemplate returns success without setting reply.Node.
Common situations: Plugin CRD/configmap not applied to the namespace; workflow-controller's plugin configuration (workflow-controller-configmap plugins:) missing the plugin; plugin binary not running so the agent has zero plugins loaded; plugin matches no templates by its selection rules.
Related errors
- agent cannot execute: unknown task type: %v
- %s: %s
- failed to read container args file %s: %w
- failed to unmarshal container args: %w
- failed to write large arg %d to file: %w
AI-assisted analysis of argoproj/argo-workflows@35bff19146 (2026-09-03).
Data as JSON: /api/errors/aef2f5a108bc4af2.
Report an issue: GitHub.