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

  1. Read the wrapped plugin error text in the message — it names the plugin-side cause
  2. Validate the artifact's plugin key and Configuration against the plugin's documentation
  3. Check the plugin's storage credentials and that the source object still exists
  4. 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

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


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