argoproj/argo-workflows · error

artifact driver %s not found

Error message

artifact driver %s not found

What it means

GetArtifactDriver looks up an artifact driver by plugin name in the controller's Config (workflow-controller-configmap artifactDrivers list). If no configured driver matches the requested wfv1.ArtifactPluginName, it returns this error. It is called from GetArtifactDrivers, which resolves the plugin list referenced by an artifact plugin.

Source

Thrown at config/config.go:214

	ConnectionTimeoutSeconds int32 `json:"connectionTimeoutSeconds,omitempty" protobuf:"varint,3,opt,name=connectionTimeoutSeconds"`
}

const defaultArtifactConnectionTimeout = time.Duration(5) * time.Second

func (a ArtifactDriver) ConnectionTimeout() time.Duration {
	if a.ConnectionTimeoutSeconds != 0 {
		return time.Duration(a.ConnectionTimeoutSeconds) * time.Second
	}
	return defaultArtifactConnectionTimeout
}

func (c Config) GetArtifactDriver(name wfv1.ArtifactPluginName) (ArtifactDriver, error) {
	for _, driver := range c.ArtifactDrivers {
		if driver.Name == name {
			return driver, nil
		}
	}
	return ArtifactDriver{}, fmt.Errorf("artifact driver %s not found", name)
}

func (c Config) GetArtifactDrivers(plugins []wfv1.ArtifactPluginName) ([]ArtifactDriver, error) {
	drivers := []ArtifactDriver{}
	for _, plugin := range plugins {
		driver, err := c.GetArtifactDriver(plugin)
		if err != nil {
			return nil, err
		}
		drivers = append(drivers, driver)
	}
	return drivers, nil
}

func (c Config) GetExecutor() *apiv1.Container {
	if c.Executor != nil {
		return c.Executor
	}

View on GitHub (pinned to 35bff19146)

Solutions

  1. Add (or correct) the driver entry under `artifactDrivers:` in the workflow-controller-configmap so its `name` exactly matches the plugin name used in the artifact.
  2. Compare the plugin name in the failing workflow spec against the configured driver names for spelling/case mismatches.
  3. Restart the workflow-controller after editing the configmap so the new Config is picked up.
  4. Verify with `kubectl get cm workflow-controller-configmap -o yaml` that the driver section actually exists in the live config.

Example fix

// before (workflow-controller-configmap)
// artifactDrivers: []
// after
// artifactDrivers:
//   - name: my-plugin
//     ...driver config...
Defensive patterns

Strategy: validation

Validate before calling

// validate config before submitting workflows using artifact plugins
cfg, _ := getConfig()
for _, p := range workflowPluginsUsed(wf) {
    if _, err := cfg.GetArtifactDriver(p); err != nil {
        return fmt.Errorf("plugin %s not configured: %w", p, err)
    }
}

Type guard

func hasDriver(c config.Config, name wfv1.ArtifactPluginName) bool {
    _, err := c.GetArtifactDriver(name)
    return err == nil
}

Try / catch

driver, err := cfg.GetArtifactDriver(pluginName)
if err != nil {
    return nil, fmt.Errorf("artifact plugin %q not configured in controller configmap: %w", pluginName, err)
}

Prevention

When it happens

Trigger: An artifact references an artifact plugin whose name is absent from `artifactDrivers` in the workflow-controller-configmap, or the name is misspelled / casing differs, so the loop over c.ArtifactDrivers finds no match.

Common situations: Controller config updated with plugins but artifactDrivers not extended; typo in plugin name in a workflow spec vs configmap; configmap not reloaded after adding the driver entry.

Related errors


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