{"record":{"id":"c47a2aca63eb4bf1","repo":"hashicorp/nomad","slug":"no-such-plugin-q-c47a2a","errorCode":null,"errorMessage":"no such plugin %q","messagePattern":"no such plugin %q","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"nomad/csi_endpoint.go","lineNumber":1639,"sourceCode":"\t\t}\n\t\tif vol == nil {\n\t\t\tmultierror.Append(&mErr, fmt.Errorf(\"no such volume %q\", snap.SourceVolumeID))\n\t\t\tcontinue\n\t\t}\n\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}","sourceCodeStart":1621,"sourceCodeEnd":1657,"githubUrl":"https://github.com/hashicorp/nomad/blob/482b49bf1aec006f089bcfc7e632d8f6ac303e5e/nomad/csi_endpoint.go#L1621-L1657","documentation":"CreateSnapshot looks up each volume's CSIPluginID in the state store. If CSIPluginByID returns no error but a nil plugin, Nomad has no record of that plugin and appends 'no such plugin %q' to the multierror, skipping that volume. This means the volume references a plugin that is not registered with the cluster.","triggerScenarios":"Snapshotting a volume whose CSI plugin was deregistered (all plugin node/controller allocations stopped and the plugin was GC'd), or whose plugin ID was renamed in the volume spec after registration.","commonSituations":"Plugin jobs stopped/removed before snapshotting; volume spec edited to point at a plugin ID that was never registered; cluster state restored from a snapshot missing the plugin registration; plugin garbage collection after node drain.","solutions":["Check the plugin ID with 'nomad volume status <volume-id>' and confirm it exists via 'nomad plugin status'","Re-register the plugin by running its CSI plugin job, then retry the snapshot","If the volume spec has a stale plugin_id, update the volume or use the correct current plugin name"],"exampleFix":"// before (volume references removed plugin)\nvolume \"data\" { plugin_id = \"aws-ebs-old\" ... }\n// after\nvolume \"data\" { plugin_id = \"aws-ebs\" ... }\nnomad volume update data.hcl","handlingStrategy":"validation","validationCode":"// verify plugin is registered before snapshotting\nplugins, _ := client.Plugins().List()\nfound := false\nfor _, p := range plugins { if p.ID == pluginID { found = true } }\nif !found { return fmt.Errorf(\"plugin %q is not registered\", pluginID) }","typeGuard":null,"tryCatchPattern":"// multierror responses: inspect each message\nerr := client.Volumes().CreateSnapshot(req)\nif err != nil && strings.Contains(err.Error(), \"no such plugin\") {\n    // re-register plugin job, then retry\n}","preventionTips":["Run 'nomad plugin status' to confirm plugin registration before snapshots","Avoid GC of CSI plugin jobs while volumes referencing them exist","Keep volume plugin_id values in sync with the deployed plugin job's csi_plugin id"],"tags":["nomad","csi","plugin-registration"],"backgroundTag":"csi-plugin-not-found","analyzedSha":"482b49bf1aec006f089bcfc7e632d8f6ac303e5e","analyzedAt":"2026-09-04T07:54:14.808Z","contentChangedAt":"2026-09-04T07:54:14.808Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}