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

  1. Enable the device plugin in the client config `plugin "<name>" {}` stanza and restart the Nomad agent
  2. Confirm the plugin binary exists in plugin_dir and is built for the right OS/arch
  3. 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

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


AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04). Data as JSON: /api/errors/a6a8a1013f324f0b. Report an issue: GitHub.