{"record":{"id":"28b789c32d955ee7","repo":"hashicorp/nomad","slug":"plugin-s-for-type-csi-node-not-found","errorCode":null,"errorMessage":"plugin %s for type csi-node not found","messagePattern":"plugin (.+?) for type csi-node not found","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"client/pluginmanager/csimanager/manager.go","lineNumber":106,"sourceCode":"\t\treturn fmt.Errorf(\"%s plugin '%s' did not become ready: %w\", pType, pID, err)\n\t}\n\tc.instancesLock.Lock()\n\tdefer c.instancesLock.Unlock()\n\tc.ensureInstance(p)\n\treturn nil\n}\n\nfunc (c *csiManager) ManagerForPlugin(ctx context.Context, pluginID string) (VolumeManager, error) {\n\tc.instancesLock.RLock()\n\tdefer c.instancesLock.RUnlock()\n\tnodePlugins, hasAnyNodePlugins := c.instances[\"csi-node\"]\n\tif !hasAnyNodePlugins {\n\t\treturn nil, fmt.Errorf(\"no storage node plugins found\")\n\t}\n\n\tmgr, hasPlugin := nodePlugins[pluginID]\n\tif !hasPlugin {\n\t\treturn nil, fmt.Errorf(\"plugin %s for type csi-node not found\", pluginID)\n\t}\n\n\treturn mgr.VolumeManager(ctx)\n}\n\n// Run starts a plugin manager and should return early\nfunc (c *csiManager) Run() {\n\tgo c.runLoop()\n}\n\nfunc (c *csiManager) runLoop() {\n\ttimer := time.NewTimer(0) // ensure we sync immediately in first pass\n\tcontrollerUpdates := c.registry.PluginsUpdatedCh(c.shutdownCtx, \"csi-controller\")\n\tnodeUpdates := c.registry.PluginsUpdatedCh(c.shutdownCtx, \"csi-node\")\n\tfor {\n\t\tselect {\n\t\tcase <-timer.C:\n\t\t\tc.resyncPluginsFromRegistry(\"csi-controller\")","sourceCodeStart":88,"sourceCodeEnd":124,"githubUrl":"https://github.com/hashicorp/nomad/blob/482b49bf1aec006f089bcfc7e632d8f6ac303e5e/client/pluginmanager/csimanager/manager.go#L88-L124","documentation":"ManagerForPlugin found registered csi-node plugins on this client but none matches the requested pluginID. This is an ID mismatch between the volume's plugin_id and the CSI plugins actually initialized in the manager's instances map.","triggerScenarios":"Mounting a CSI volume whose plugin_id does not match any node plugin registered on the client, e.g. typo in plugin_id in the volume spec, or volume created for a plugin deployed only on other nodes.","commonSituations":"Renaming a CSI plugin job without updating volume plugin_id; copy-pasting plugin_id from a controller plugin instead of the node plugin; multi-plugin clusters where the workload landed on a node running a different plugin.","solutions":["Verify plugin_id in the volume specification exactly matches the CSI node plugin ID on the node (nomad node status -verbose)","Correct the volume spec's plugin_id or rename the plugin job to match","Add scheduling constraints so allocations using this volume land on nodes running the specified plugin","Re-register the volume (nomad volume update/deregister+register) if the plugin ID changed"],"exampleFix":"// before: mismatched plugin id in volume spec\nvolume \"data\" {\n  type = \"csi\"\n  plugin_id = \"aws-ebs-controller\" // wrong\n  ...\n}\n\n// after\ntype csiVolume struct {\n  PluginID string `hcl:\"plugin_id\"`\n}\nfunc (v csiVolume) validate() error {\n  if v.PluginID != \"aws-ebs-node\" {\n    return fmt.Errorf(\"plugin_id must match the node plugin, got %q\", v.PluginID)\n  }\n  return nil\n}","handlingStrategy":"validation","validationCode":"node, _, _ := client.Nodes().Info(nodeID, nil)\nfound := false\nfor _, p := range node.CSIControllerPlugins { if p.ID == pluginID { found = true } }\nfor _, p := range node.CSINodePlugins { if p.ID == pluginID { found = true } }\nif !found {\n\treturn fmt.Errorf(\"plugin_id %q not registered on node %s; fix volume spec or plugin placement\", pluginID, nodeID)\n}","typeGuard":null,"tryCatchPattern":"mgr, err := manager.ManagerForPlugin(ctx, pluginID)\nif err != nil {\n\tif strings.Contains(err.Error(), \"for type csi-node not found\") {\n\t\treturn fmt.Errorf(\"plugin_id %q mismatch: check volume spec vs registered plugin IDs (nomad node status -verbose)\", pluginID)\n\t}\n\treturn err\n}","preventionTips":["Copy plugin_id from `nomad node status -verbose` CSI section rather than typing it","Rename volume plugin_id when renaming/redeploying the plugin job","Distinguish controller vs node plugin IDs; volumes need the node plugin ID","Validate volume specs against registered plugins in CI/pipeline before submission"],"tags":["csi","nomad","plugin-manager","storage","id-mismatch"],"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"}