hashicorp/nomad · warning
Job registration, dispatch, and scale are disabled by the sc
Error message
Job registration, dispatch, and scale are disabled by the scheduler configuration
What it means
ErrJobRegistrationDisabled indicates the scheduler configuration has disabled job registration, dispatch, and scaling cluster-wide. Handlers like job register, doRegister, Scale, and Dispatch map their failures through errCodeFromHandler to this sentinel, and the HTTP layer rewrites it to a 403 (command/agent/http.go:765-766). It is a server-side policy state, not an ACL problem.
Source
Thrown at nomad/structs/errors.go:60
errDeploymentTerminalNoFail = "can't fail terminal deployment" errDeploymentTerminalNoPause = "can't pause terminal deployment" errDeploymentTerminalNoPromote = "can't promote terminal deployment" errDeploymentTerminalNoResume = "can't resume terminal deployment" errDeploymentTerminalNoUnblock = "can't unblock terminal deployment" errDeploymentTerminalNoRun = "can't run terminal deployment" errDeploymentTerminalNoSetHealth = "can't set health of allocations for a terminal deployment" errDeploymentRunningNoUnblock = "can't unblock running deployment" ) var ( ErrNoLeader = errors.New(errNoLeader) ErrNotReadyForConsistentReads = errors.New(errNotReadyForConsistentReads) ErrNoRegionPath = errors.New(errNoRegionPath) ErrTokenNotFound = errors.New(errTokenNotFound) ErrTokenExpired = errors.New(errTokenExpired) ErrTokenInvalid = errors.New(errTokenInvalid) ErrPermissionDenied = errors.New(errPermissionDenied) ErrJobRegistrationDisabled = errors.New(errJobRegistrationDisabled) ErrNoNodeConn = errors.New(errNoNodeConn) ErrUnknownMethod = errors.New(errUnknownMethod) ErrUnknownNomadVersion = errors.New(errUnknownNomadVersion) ErrNodeLacksRpc = errors.New(errNodeLacksRpc) ErrMissingAllocID = errors.New(errMissingAllocID) ErrIncompatibleFiltering = errors.New(errIncompatibleFiltering) ErrMalformedChooseParameter = errors.New(errMalformedChooseParameter) // ErrResultPaginatorCreation is returned by list RPC handlers when the // result paginator cannot be built, for example when the server cannot // evaluate a requested filter expression. api.ResultPaginatorErrorContent // duplicates its message so the CLI can match it without importing structs. // Keep the two in sync. ErrResultPaginatorCreation = errors.New(errResultPaginatorCreation) ErrUnknownNode = errors.New(ErrUnknownNodePrefix) ErrDeploymentTerminalNoCancel = errors.New(errDeploymentTerminalNoCancel)
View on GitHub (pinned to 482b49bf1a)
Solutions
- Re-enable via 'nomad scheduler set-config -job-registration-enabled=true' (or update the scheduler config via API)
- Retry the job registration after the operator lifts the change freeze
- Check current state with 'nomad scheduler get-config' before deploying
- Avoid blanket 403-handling retries: this error will persist until config changes
Example fix
// before # scheduler config: job_registration_enabled = false nomad job run app.nomad # -> 403 Job registration... disabled // after nomad scheduler set-config -job-registration-enabled=true nomad job run app.nomad
Defensive patterns
Strategy: retry
Validate before calling
cfg, err := client.Operator().SchedulerGetConfiguration(nil)
if err == nil && cfg.SchedulerConfig != nil && !cfg.SchedulerConfig.JobRegistrationEnabled {
return errors.New("job registration is disabled by scheduler config; aborting deploy")
} Type guard
func IsJobRegistrationDisabled(err error) bool {
return err != nil && strings.Contains(err.Error(), structs.ErrJobRegistrationDisabled.Error())
} Try / catch
err := client.Jobs().Register(job, nil, nil)
if strings.HasSuffix(err.Error(), structs.ErrJobRegistrationDisabled.Error()) {
// do not hot-retry; wait for operators to re-enable registration
} Prevention
- Check 'nomad scheduler get-config' as a pre-deploy gate in CI
- Coordinate deploys with maintenance/change-freeze windows
- Alert on scheduler config changes in the cluster
- Treat this 403 as terminal, not transient, in retry logic
When it happens
Trigger: Calling jobs/register, job dispatch, or job scale endpoints when the region's scheduler config has JobRegistrationEnabled (or equivalent) set to false; errCodeFromHandler translating handler errors carrying this message.
Common situations: Operators setting the scheduler config to freeze changes during incident/maintenance windows (a change freeze); clusters migrated or bootstrapped with registration disabled by default; automation (CI deploys) running during such a freeze.
Related errors
- timeout cannot be negative
- unexpected ClockSkewLeeway type: %v
- failed to get scheduler configuration: %v
- unknown scheduler '%s'
- failed to get scheduler configuration: %v
AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04).
Data as JSON: /api/errors/09df34f0ae5b8681.
Report an issue: GitHub.