argoproj/argo-workflows · error
plugin %s load failed: %s
Error message
plugin %s load failed: %s
What it means
Driver.Load reached the plugin and got a response, but the plugin set Success=false and returned its own error string. This is a plugin-side business failure (e.g. source artifact not found in the plugin's backing store, invalid artifact configuration), not a transport problem.
Source
Thrown at workflow/artifacts/plugin/plugin.go:157
func (d *Driver) Close() error {
if d.conn != nil {
return d.conn.Close()
}
return nil
}
// Load implements ArtifactDriver.Load by calling the plugin service
func (d *Driver) Load(ctx context.Context, inputArtifact *wfv1.Artifact, path string) error {
grpcArtifact := convertToGRPC(inputArtifact)
resp, err := d.client.Load(ctx, &artifact.LoadArtifactRequest{
InputArtifact: grpcArtifact,
Path: path,
})
if err != nil {
return fmt.Errorf("plugin %s load failed: %w", d.pluginName, err)
}
if !resp.Success {
return fmt.Errorf("plugin %s load failed: %s", d.pluginName, resp.Error)
}
return nil
}
// OpenStream implements ArtifactDriver.OpenStream by calling the plugin service
func (d *Driver) OpenStream(ctx context.Context, a *wfv1.Artifact) (io.ReadCloser, error) {
grpcArtifact := convertToGRPC(a)
stream, err := d.client.OpenStream(ctx, &artifact.OpenStreamRequest{
Artifact: grpcArtifact,
})
if err != nil {
return nil, fmt.Errorf("plugin %s open stream failed: %w", d.pluginName, err)
}
reader, writer := io.Pipe()
go func() {
defer writer.Close()View on GitHub (pinned to 35bff19146)
Solutions
- Read the wrapped plugin error text in the message — it names the plugin-side cause
- Validate the artifact's plugin key and Configuration against the plugin's documentation
- Check the plugin's storage credentials and that the source object still exists
- Confirm the destination path is writable by the plugin inside the workflow pod
Example fix
// before
plugin:
key: artifacts/{{workflow.name}}/out.tgz
// after: fix wrong key
plugin:
key: artifacts/{{workflow.namespace}}/{{workflow.name}}/out.tgz Defensive patterns
Strategy: try-catch
Validate before calling
// validate artifact plugin config before submission
if art.Plugin == nil || art.Plugin.Key == "" {
return fmt.Errorf("artifact %q has empty plugin key", art.Name)
}
if err := validatePluginConfiguration(art.Plugin.Configuration); err != nil {
return fmt.Errorf("invalid plugin configuration for %q: %w", art.Plugin.Name, err)
} Try / catch
if err != nil {
return err // transport failure
}
// resp.Success==false surfaces as 'plugin %s load failed: <plugin text>' —
// match on the plugin's message to branch on known causes
if strings.Contains(err.Error(), "not found") {
return fmt.Errorf("artifact key missing upstream; regenerate the source artifact")
}
return err Prevention
- Validate artifact keys and plugin Configuration at workflow lint/submit time
- Grant the plugin's service account correct storage credentials before running workflows
- Log the plugin's resp.Error text verbatim — it is the authoritative cause
When it happens
Trigger: The Load RPC succeeded and returned LoadArtifactResponse{Success:false, Error:"..."}; the plugin could not fetch/ materialize the artifact at the requested path (bad key, missing object in storage, invalid plugin Configuration).
Common situations: Artifact key/Configuration typo in the workflow spec, plugin's storage credentials revoked or expired, object deleted upstream before the workflow ran, path not writable in the plugin's view of the volume.
Related errors
- failed to dial plugin %s at %q: %w
- plugin %s load failed: %w
- failed to create request: %w
- unsupported db type %s
- cannot use instance ID with Argo Server
AI-assisted analysis of argoproj/argo-workflows@35bff19146 (2026-09-03).
Data as JSON: /api/errors/6ab9fcdf3d18ca0f.
Report an issue: GitHub.