{"record":{"id":"52dcb4ebb6f5f0ef","repo":"hashicorp/nomad","slug":"plugin-missing-s","errorCode":null,"errorMessage":"plugin missing: %s","messagePattern":"plugin missing: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"nomad/client_csi_endpoint.go","lineNumber":306,"sourceCode":"\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif pluginID == \"\" {\n\t\treturn nil, fmt.Errorf(\"missing plugin ID\")\n\t}\n\n\tws := memdb.NewWatchSet()\n\n\t// note: plugin IDs are not scoped to region but volumes are. so any Nomad\n\t// client we get for a controller is already in the same region for the\n\t// volume.\n\tplugin, err := snap.CSIPluginByID(ws, pluginID)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error getting plugin: %s, %v\", pluginID, err)\n\t}\n\tif plugin == nil {\n\t\treturn nil, fmt.Errorf(\"plugin missing: %s\", pluginID)\n\t}\n\n\tclientIDs := []string{}\n\n\tif len(plugin.Controllers) == 0 {\n\t\treturn nil, fmt.Errorf(\"failed to find instances of controller plugin %q\", pluginID)\n\t}\n\n\tvar merr error\n\tfor clientID, controller := range plugin.Controllers {\n\t\tif !controller.IsController() {\n\t\t\t// we don't have separate types for CSIInfo depending on whether\n\t\t\t// it's a controller or node. this error should never make it to\n\t\t\t// production\n\t\t\tmerr = errors.Join(merr, fmt.Errorf(\n\t\t\t\t\"plugin instance %q is not a controller but was registered as one - this is always a bug\", controller.AllocID))\n\t\t\tcontinue\n\t\t}","sourceCodeStart":288,"sourceCodeEnd":324,"githubUrl":"https://github.com/hashicorp/nomad/blob/482b49bf1aec006f089bcfc7e632d8f6ac303e5e/nomad/client_csi_endpoint.go#L288-L324","documentation":"After a successful lookup, if CSIPluginByID returns a nil plugin, clientIDsForController returns 'plugin missing: <id>'. The request named a pluginID that is not registered anywhere in the cluster's state store.","triggerScenarios":"Controller RPC referencing a pluginID that was never registered, or whose plugin job was deregistered/garbage-collected (plugin deregistration after the plugin job is purged).","commonSituations":"Typo'd plugin_id in a volume spec; CSI plugin job stopped long enough for the plugin to be deregistered; volume registered in one cluster but used against another; region mismatch where the plugin only runs elsewhere.","solutions":["Run `nomad plugin status` to list registered plugins and use an existing ID.","Deploy/run the CSI plugin job so it re-registers: `nomad job run <csi-plugin>.nomad.hcl`.","Correct the volume's plugin_id and re-register: `nomad volume deregister; nomad volume register`.","Check you are querying the right region/cluster where the plugin is registered."],"exampleFix":"// before: typo in volume spec\nplugin_id = \"aws-ebs-contoller\"   # plugin missing\n// after\nplugin_id = \"aws-ebs-controller\"\nnomad volume deregister ebs-vol && nomad volume register ebs.hcl","handlingStrategy":"validation","validationCode":"plugins, _, _ := client.Plugins().List(nil)\nfound := false\nfor _, p := range plugins { if p.ID == wantID { found = true } }\nif !found { return fmt.Errorf(\"plugin %q not registered\", wantID) }","typeGuard":"func pluginRegistered(plugins []*api.CSIPlugin, id string) bool {\n    for _, p := range plugins { if p.ID == id { return true } }\n    return false\n}","tryCatchPattern":"err := csi.ControllerListVolumes(args, reply)\nif err != nil && strings.Contains(err.Error(), \"plugin missing:\") {\n    return fmt.Errorf(\"register the plugin job first: %w\", err)\n}","preventionTips":["Cross-check plugin_id against `nomad plugin status` before use.","Deploy the CSI plugin job before registering volumes that reference it.","Use consistent plugin IDs via shared config/tooling.","Verify you target the correct region/cluster."],"tags":["csi","nomad","plugin-registration","missing-resource"],"backgroundTag":"csi-plugin-not-registered","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"}