{"record":{"id":"716b5f1dbd25eb4a","repo":"hashicorp/nomad","slug":"plugin-q-does-not-support-snapshot","errorCode":null,"errorMessage":"plugin %q does not support snapshot","messagePattern":"plugin %q does not support snapshot","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"nomad/csi_endpoint.go","lineNumber":1644,"sourceCode":"\n\t\tpluginID := snap.PluginID\n\t\tif pluginID == \"\" {\n\t\t\tpluginID = vol.PluginID\n\t\t}\n\n\t\tplugin, err := state.CSIPluginByID(nil, pluginID)\n\t\tif err != nil {\n\t\t\tmultierror.Append(&mErr,\n\t\t\t\tfmt.Errorf(\"error querying plugin %q: %v\", pluginID, err))\n\t\t\tcontinue\n\t\t}\n\t\tif plugin == nil {\n\t\t\tmultierror.Append(&mErr, fmt.Errorf(\"no such plugin %q\", pluginID))\n\t\t\tcontinue\n\t\t}\n\t\tif !plugin.HasControllerCapability(structs.CSIControllerSupportsCreateDeleteSnapshot) {\n\t\t\tmultierror.Append(&mErr,\n\t\t\t\tfmt.Errorf(\"plugin %q does not support snapshot\", pluginID))\n\t\t\tcontinue\n\t\t}\n\n\t\tsecrets := vol.Secrets\n\t\t// merge request secrets onto volume secrets\n\t\tmaps.Copy(secrets, snap.Secrets)\n\n\t\tcReq := &cstructs.ClientCSIControllerCreateSnapshotRequest{\n\t\t\tExternalSourceVolumeID: vol.ExternalID,\n\t\t\tName:                   snap.Name,\n\t\t\tSecrets:                secrets,\n\t\t\tParameters:             snap.Parameters,\n\t\t}\n\t\tcReq.PluginID = pluginID\n\t\tcResp := &cstructs.ClientCSIControllerCreateSnapshotResponse{}\n\t\terr = v.serializedControllerRPC(pluginID, func() error {\n\t\t\treturn v.srv.RPC(method, cReq, cResp)\n\t\t})","sourceCodeStart":1626,"sourceCodeEnd":1662,"githubUrl":"https://github.com/hashicorp/nomad/blob/482b49bf1aec006f089bcfc7e632d8f6ac303e5e/nomad/csi_endpoint.go#L1626-L1662","documentation":"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.","triggerScenarios":"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).","commonSituations":"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.","solutions":["Verify capabilities with 'nomad plugin status <plugin-id>' — look for Create/Delete Snapshot under ControllerCapabilities","Update the CSI plugin to a version/driver that supports snapshots and redeploy its job with the CreateDeleteSnapshot controller capability","Use the storage provider's native snapshot tooling if the driver cannot support snapshots"],"exampleFix":"// before (plugin job capabilities)\ncsi_plugin { id = \"my-plugin\" type = \"controller\" capabilities = [\"supports_attach_detach\"] }\n// after\ncsi_plugin { id = \"my-plugin\" type = \"controller\" capabilities = [\"supports_attach_detach\", \"supports_create_delete_snapshot\"] }","handlingStrategy":"validation","validationCode":"// check controller capabilities before issuing snapshot\np, _ := client.Plugins().Get(pluginID)\nif p != nil && !contains(p.ControllerCapabilities, \"supports_create_delete_snapshot\") {\n    return fmt.Errorf(\"plugin %s cannot snapshot\", pluginID)\n}","typeGuard":null,"tryCatchPattern":"if err != nil && strings.Contains(err.Error(), \"does not support snapshot\") {\n    // fall back to provider-native snapshot tooling\n}","preventionTips":["Check plugin capabilities with 'nomad plugin status' before designing snapshot workflows","Deploy CSI driver versions that advertise snapshot capabilities","Include supports_create_delete_snapshot in the controller job's csi_plugin capabilities block"],"tags":["nomad","csi","capability","snapshot"],"backgroundTag":"csi-capability-not-supported","analyzedSha":"482b49bf1aec006f089bcfc7e632d8f6ac303e5e","analyzedAt":"2026-09-04T07:54:14.808Z","contentChangedAt":"2026-09-04T07:54:14.808Z","schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}