hashicorp/nomad · error

plugin %q does not support snapshot

Error message

plugin %q does not support snapshot

What it means

Before issuing the controller RPC, CreateSnapshot checks that the volume's CSI plugin advertises the CSIControllerSupportsCreateDeleteSnapshot capability. If not, 'plugin %q does not support snapshot' is appended to the multierror. The plugin exists but its controller cannot create/delete snapshots.

Source

Thrown at nomad/csi_endpoint.go:1644

		pluginID := snap.PluginID
		if pluginID == "" {
			pluginID = vol.PluginID
		}

		plugin, err := state.CSIPluginByID(nil, pluginID)
		if err != nil {
			multierror.Append(&mErr,
				fmt.Errorf("error querying plugin %q: %v", pluginID, err))
			continue
		}
		if plugin == nil {
			multierror.Append(&mErr, fmt.Errorf("no such plugin %q", pluginID))
			continue
		}
		if !plugin.HasControllerCapability(structs.CSIControllerSupportsCreateDeleteSnapshot) {
			multierror.Append(&mErr,
				fmt.Errorf("plugin %q does not support snapshot", pluginID))
			continue
		}

		secrets := vol.Secrets
		// merge request secrets onto volume secrets
		maps.Copy(secrets, snap.Secrets)

		cReq := &cstructs.ClientCSIControllerCreateSnapshotRequest{
			ExternalSourceVolumeID: vol.ExternalID,
			Name:                   snap.Name,
			Secrets:                secrets,
			Parameters:             snap.Parameters,
		}
		cReq.PluginID = pluginID
		cResp := &cstructs.ClientCSIControllerCreateSnapshotResponse{}
		err = v.serializedControllerRPC(pluginID, func() error {
			return v.srv.RPC(method, cReq, cResp)
		})

View on GitHub (pinned to 482b49bf1a)

Solutions

  1. Verify capabilities with 'nomad plugin status <plugin-id>' — look for Create/Delete Snapshot under ControllerCapabilities
  2. Update the CSI plugin to a version/driver that supports snapshots and redeploy its job with the CreateDeleteSnapshot controller capability
  3. Use the storage provider's native snapshot tooling if the driver cannot support snapshots

Example fix

// before (plugin job capabilities)
csi_plugin { id = "my-plugin" type = "controller" capabilities = ["supports_attach_detach"] }
// after
csi_plugin { id = "my-plugin" type = "controller" capabilities = ["supports_attach_detach", "supports_create_delete_snapshot"] }
Defensive patterns

Strategy: validation

Validate before calling

// check controller capabilities before issuing snapshot
p, _ := client.Plugins().Get(pluginID)
if p != nil && !contains(p.ControllerCapabilities, "supports_create_delete_snapshot") {
    return fmt.Errorf("plugin %s cannot snapshot", pluginID)
}

Try / catch

if err != nil && strings.Contains(err.Error(), "does not support snapshot") {
    // fall back to provider-native snapshot tooling
}

Prevention

When it happens

Trigger: Running 'nomad volume snapshot create' against a plugin whose controller job was launched without the CREATE_DELETE_SNAPSHOT controller capability, or a plugin that only supports attach/detach (no snapshot controller support).

Common situations: Using a storage driver (or older driver version) without snapshot support; plugin task missing the CSI_CONTROLLER_PLUGIN role or capability config; operator assumes snapshot support from a plugin that only manages volumes.

Related errors


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