hashicorp/nomad · info
ErrPluginDisabled
ErrPluginDisabled
Error message
device is not enabled
What it means
ErrPluginDisabled is the sentinel error a Nomad device plugin returns when the plugin is not enabled. The device manager instance (client/devicemanager/instance.go) sees it from Fingerprint(), logs 'fingerprinting failed: plugin is not enabled', and treats it as a benign condition rather than a failure.
Source
Thrown at plugins/device/device.go:23
import (
"context"
"fmt"
"time"
multierror "github.com/hashicorp/go-multierror"
"github.com/hashicorp/nomad/plugins/base"
"github.com/hashicorp/nomad/plugins/shared/structs"
)
const (
// DeviceTypeGPU is a canonical device type for a GPU.
DeviceTypeGPU = "gpu"
)
var (
// ErrPluginDisabled indicates that the device plugin is disabled
ErrPluginDisabled = fmt.Errorf("device is not enabled")
)
// DevicePlugin is the interface for a plugin that can expose detected devices
// to Nomad and inform it how to mount them.
type DevicePlugin interface {
base.BasePlugin
// Fingerprint returns a stream of devices that are detected.
Fingerprint(ctx context.Context) (<-chan *FingerprintResponse, error)
// Reserve is used to reserve a set of devices and retrieve mount
// instructions.
Reserve(deviceIDs []string) (*ContainerReservation, error)
// Stats returns a stream of statistics per device collected at the passed
// interval.
Stats(ctx context.Context, interval time.Duration) (<-chan *StatsResponse, error)
}View on GitHub (pinned to 482b49bf1a)
Solutions
- Enable the device plugin in the client config `plugin "<name>" {}` stanza and restart the Nomad agent
- Confirm the plugin binary exists in plugin_dir and is built for the right OS/arch
- If the plugin is intentionally disabled, ignore the log line — the manager handles it gracefully and simply never fingerprints devices for that plugin
Example fix
# before: no device plugin stanza
# after (client.hcl)
plugin "nvidia-gpu" {
config {
# ...
}
} Defensive patterns
Strategy: type-guard
Validate before calling
// Go: check the sentinel before treating fingerprint failure as an error
fingerprintCh, err := devicePlugin.Fingerprint(ctx)
if errors.Is(err, device.ErrPluginDisabled) {
logger.Info("plugin not enabled; skipping")
return nil
} Type guard
// Go: sentinel check helper
func isPluginDisabled(err error) bool { return errors.Is(err, device.ErrPluginDisabled) } Try / catch
// Go
if err != nil {
if isPluginDisabled(err) {
return nil // graceful no-op
}
return err
} Prevention
- Enable required device plugins in the client `plugin` stanza and plugin_dir
- Treat ErrPluginDisabled as benign in device-manager consumers via errors.Is
- Document intentional plugin disabling so operators don't chase the log line
When it happens
Trigger: DevicePlugin.Fingerprint(ctx) called by the device manager while the plugin is disabled — e.g. the plugin loader did not load/enable the device plugin for this client.
Common situations: Nomad client config omits or disables the device plugin (plugin stanza missing); plugin binary not in plugin_dir; `client.options`/device plugin disabled intentionally; operator checking logs and wondering why GPUs aren't detected.
Related errors
- operation on unknown device(s) "%s/%s/%s" (%v): %v
- Error while detecting network interface %s during fingerprin
- devices updates already batched
- device vendor must be specified
- device type must be specified
AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04).
Data as JSON: /api/errors/a6a8a1013f324f0b.
Report an issue: GitHub.