argoproj/argo-workflows · warning

CodeNotImplemented

CodeNotImplemented

Error message

IsDirectory currently unimplemented for raw

What it means

The raw artifact driver (in-cluster data mounted via volumes) does not implement IsDirectory and returns CodeNotImplemented. Raw artifacts referencing a path cannot be probed for directory-ness through this interface.

Source

Thrown at workflow/artifacts/raw/raw.go:57

	return errors.Errorf(errors.CodeBadRequest, "Raw output artifacts unsupported")
}

// SaveStream is unsupported for raw output artifacts
func (a *ArtifactDriver) SaveStream(ctx context.Context, reader io.Reader, artifact *wfv1.Artifact) error {
	return errors.Errorf(errors.CodeBadRequest, "Raw output artifacts unsupported")
}

// Delete is unsupported for raw output artifacts
func (a *ArtifactDriver) Delete(ctx context.Context, s *wfv1.Artifact) error {
	return common.ErrDeleteNotSupported
}

func (a *ArtifactDriver) ListObjects(ctx context.Context, artifact *wfv1.Artifact) ([]string, error) {
	return nil, fmt.Errorf("ListObjects is currently not supported for this artifact type, but it will be in a future version")
}

func (a *ArtifactDriver) IsDirectory(ctx context.Context, artifact *wfv1.Artifact) (bool, error) {
	return false, errors.New(errors.CodeNotImplemented, "IsDirectory currently unimplemented for raw")
}

View on GitHub (pinned to 35bff19146)

Solutions

  1. Treat raw artifacts as files or pre-mount the volume and check with os.Stat in your own step.
  2. Use a driver that supports directories (S3/GCS/raw alternatives) if directory semantics are required.
  3. Patch the driver to implement IsDirectory with os.Stat(raw.Source.Path).IsDir().

Example fix

// after (custom patch)
func (a *ArtifactDriver) IsDirectory(ctx context.Context, artifact *wfv1.Artifact) (bool, error) {
	st, err := os.Stat(artifact.Raw.Source)
	if err != nil { return false, err }
	return st.IsDir(), nil
}
Defensive patterns

Strategy: fallback

Type guard

if art.Raw != nil {
    // raw driver has no IsDirectory; os.Stat the source directly
}

Try / catch

isDir, err := driver.IsDirectory(ctx, art)
if err != nil && strings.Contains(err.Error(), "currently unimplemented") {
    isDir = false
}

Prevention

When it happens

Trigger: Calling IsDirectory(ctx, artifact) on a raw artifact — e.g. artifact server or UI attempting directory expansion of a raw artifact path.

Common situations: Browsing raw artifacts in the UI; generic code paths that call IsDirectory on every artifact type.

Related errors


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