hashicorp/nomad · error

plugin does not support listing snapshots

Error message

plugin does not support listing snapshots

What it means

Nomad's CSI ListSnapshots RPC forwards a ControllerListSnapshots request to a CSI plugin's controller. This error is thrown when the target CSI plugin exists but its controller capabilities do not advertise CSI ControllerService Capability LIST_SNAPSHOTS, so Nomad refuses to send a call the plugin cannot answer.

Source

Thrown at nomad/csi_endpoint.go:1788

	// NOTE: this is the plugin's namespace, not the volume(s) because they
	// might not even be registered
	if !allowVolume(aclObj, args.RequestNamespace()) {
		return structs.ErrPermissionDenied
	}
	snap, err := v.srv.fsm.State().Snapshot()
	if err != nil {
		return err
	}

	plugin, err := snap.CSIPluginByID(nil, args.PluginID)
	if err != nil {
		return err
	}
	if plugin == nil {
		return fmt.Errorf("no such plugin")
	}
	if !plugin.HasControllerCapability(structs.CSIControllerSupportsListSnapshots) {
		return fmt.Errorf("plugin does not support listing snapshots")
	}

	method := "ClientCSI.ControllerListSnapshots"
	cReq := &cstructs.ClientCSIControllerListSnapshotsRequest{
		MaxEntries:    args.PerPage,
		StartingToken: args.NextToken,
		Secrets:       args.Secrets,
	}
	cReq.PluginID = plugin.ID
	cResp := &cstructs.ClientCSIControllerListSnapshotsResponse{}

	err = v.srv.RPC(method, cReq, cResp)
	if err != nil {
		return err
	}
	if args.PerPage > 0 && args.PerPage < int32(len(cResp.Entries)) {
		// this should be done in the plugin already, but enforce it
		reply.Snapshots = cResp.Entries[:args.PerPage]

View on GitHub (pinned to 482b49bf1a)

Solutions

  1. Verify the plugin's controller capabilities: nomad plugin status <plugin-id> and check it advertises list-snapshots support
  2. Upgrade the CSI plugin/driver to a version that implements ControllerListSnapshots (CSI spec >= 1.2 with LIST_SNAPSHOTS controller capability)
  3. List snapshots directly from the storage backend or via the driver's own tooling instead of through Nomad
  4. If using an external snapshotter, ensure the snapshot controller sidecar is deployed alongside the driver

Example fix

// before: querying snapshots against a plugin without the capability
nomad plugin status aws-ebs-csi-driver   # no list-snapshots cap
nomad csi snapshot list
// Error: plugin does not support listing snapshots

// after: upgrade the driver or check capability first
capabilities=$(curl -s --unix-socket /run/csi/socket http://localhost/... )
# deploy a driver build that declares LIST_SNAPSHOTS controller capability, then:
nomad csi snapshot list
Defensive patterns

Strategy: validation

Validate before calling

p, err := client.CSIPlugins().Get(pluginID)
if err != nil { return err }
if !hasCap(p.ControllerCapabilities, "LIST_SNAPSHOTS") {
    return fmt.Errorf("plugin %s cannot list snapshots", pluginID)
}

Type guard

func supportsListSnapshots(caps []string) bool {
    for _, c := range caps {
        if c == "LIST_SNAPSHOTS" { return true }
    }
    return false
}

Try / catch

snaps, err := client.CSISnapshots().List(opts)
if err != nil {
    if strings.Contains(err.Error(), "does not support listing snapshots") {
        return nil, fmt.Errorf("driver %s lacks snapshot support; use backend tooling", driver)
    }
    return nil, err
}

Prevention

When it happens

Trigger: Calling GET /v1/plugins/snapshots (or ClientCSI ControllerListSnapshots via nomad csi snapshot list) against a plugin that was registered without CSIControllerSupportsListSnapshots in its controller capability set — typically a plugin whose controller only supports create/delete/attach, or a controller-only plugin built from an older CSI spec.

Common situations: Using a storage vendor's driver version that predates snapshot listing support; a plugin registered as controller-capable for other operations but without LIST_SNAPSHOTS; misconfigured plugin csi_spec_version; attempting snapshot listing on drivers that only implement node-level snapshots.

Related errors


AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04). Data as JSON: /api/errors/ac186c98f01953f9. Report an issue: GitHub.