hashicorp/nomad · error
plugin has no controller
Error message
plugin has no controller
What it means
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.
Source
Thrown at nomad/csi_endpoint.go:1179
if !allowVolume(aclObj, vol.Namespace) {
return structs.ErrPermissionDenied
}
// Check if override is set and we do not have permissions
if args.PolicyOverride {
if !aclObj.AllowNsOp(vol.Namespace, acl.NamespaceCapabilitySentinelOverride) {
return structs.ErrPermissionDenied
}
}
if err = vol.Validate(); err != nil {
return err
}
plugin, err := v.pluginValidateVolume(vol)
if err != nil {
return err
}
if !plugin.ControllerRequired {
return fmt.Errorf("plugin has no controller")
}
if !plugin.HasControllerCapability(structs.CSIControllerSupportsCreateDelete) {
return fmt.Errorf("plugin does not support creating volumes")
}
// if the volume already exists, we'll update it instead
// current will be nil if it does not exist.
current, err := snap.CSIVolumeByID(nil, vol.Namespace, vol.ID)
if err != nil {
return err
}
validatedVols = append(validatedVols,
validated{vol, plugin, current})
warn, err := v.enforceEnterprisePolicy(snap, vol, current, args.GetIdentity().GetACLToken(), args.PolicyOverride)
if warn != nil {
reply.Warnings = warn.Error()View on GitHub (pinned to 482b49bf1a)
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
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at nomad/csi_endpoint.go:1179 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04).
Data as JSON: /api/errors/3b0940c487cc091b.
Report an issue: GitHub.