{"record":{"id":"3b0940c487cc091b","repo":"hashicorp/nomad","slug":"plugin-has-no-controller","errorCode":null,"errorMessage":"plugin has no controller","messagePattern":"plugin has no controller","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"nomad/csi_endpoint.go","lineNumber":1179,"sourceCode":"\t\tif !allowVolume(aclObj, vol.Namespace) {\n\t\t\treturn structs.ErrPermissionDenied\n\t\t}\n\t\t// Check if override is set and we do not have permissions\n\t\tif args.PolicyOverride {\n\t\t\tif !aclObj.AllowNsOp(vol.Namespace, acl.NamespaceCapabilitySentinelOverride) {\n\t\t\t\treturn structs.ErrPermissionDenied\n\t\t\t}\n\t\t}\n\n\t\tif err = vol.Validate(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tplugin, err := v.pluginValidateVolume(vol)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif !plugin.ControllerRequired {\n\t\t\treturn fmt.Errorf(\"plugin has no controller\")\n\t\t}\n\t\tif !plugin.HasControllerCapability(structs.CSIControllerSupportsCreateDelete) {\n\t\t\treturn fmt.Errorf(\"plugin does not support creating volumes\")\n\t\t}\n\n\t\t// if the volume already exists, we'll update it instead\n\t\t// current will be nil if it does not exist.\n\t\tcurrent, err := snap.CSIVolumeByID(nil, vol.Namespace, vol.ID)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tvalidatedVols = append(validatedVols,\n\t\t\tvalidated{vol, plugin, current})\n\n\t\twarn, err := v.enforceEnterprisePolicy(snap, vol, current, args.GetIdentity().GetACLToken(), args.PolicyOverride)\n\t\tif warn != nil {\n\t\t\treply.Warnings = warn.Error()","sourceCodeStart":1161,"sourceCodeEnd":1197,"githubUrl":"https://github.com/hashicorp/nomad/blob/482b49bf1aec006f089bcfc7e632d8f6ac303e5e/nomad/csi_endpoint.go#L1161-L1197","documentation":"Fires in CSIVolume.Create: the plugin validated successfully but ControllerRequired is false, so it exposes no controller endpoint and cannot create volumes on demand; only static volumes can be registered against it.","triggerScenarios":"Thrown at nomad/csi_endpoint.go:1179 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Use volume register (static volumes) instead of create for controller-less plugins","Configure the plugin with a controller if dynamic creation is required","Choose a CSI plugin that provides a controller"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"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"}