hashicorp/nomad · error
Node Pools Governance is unlicensed.
Error message
Node Pools Governance is unlicensed.
What it means
In Nomad's CE (community edition) build, NamespaceNodePoolConfiguration.Validate unconditionally rejects any non-nil node-pool namespace configuration because Node Pools Governance is an enterprise-only feature. The check is a stub: the CE binary simply has no license for this capability, so any namespace carrying this block fails validation.
Source
Thrown at nomad/structs/structs_ce.go:21
//go:build !ent
package structs
import (
"errors"
"fmt"
multierror "github.com/hashicorp/go-multierror"
)
func (n *Namespace) Canonicalize() {}
func (n *NamespaceNodePoolConfiguration) Canonicalize() {}
func (n *NamespaceNodePoolConfiguration) Validate() error {
if n != nil {
return errors.New("Node Pools Governance is unlicensed.")
}
return nil
}
func (n *NamespaceVaultConfiguration) Canonicalize() {}
func (n *NamespaceVaultConfiguration) Validate() error {
if n != nil {
return errors.New("Multi-Cluster Vault is unlicensed.")
}
return nil
}
func (n *NamespaceConsulConfiguration) Canonicalize() {}
func (n *NamespaceConsulConfiguration) Validate() error {
if n != nil {
return errors.New("Multi-Cluster Consul is unlicensed.")View on GitHub (pinned to 482b49bf1a)
Solutions
- Remove the node pool configuration block from the namespace specification before applying it on the CE binary.
- Upgrade to HashiCorp Nomad Enterprise and apply a license that includes Node Pools Governance.
- Nil out the NamespaceNodePoolConfiguration field programmatically if your automation constructs the namespace struct.
Example fix
// before
ns.NodePoolConfiguration = &structs.NamespaceNodePoolConfiguration{}
// after
ns.NodePoolConfiguration = nil // feature requires Nomad Enterprise Defensive patterns
Strategy: validation
Validate before calling
if ns.NodePoolConfiguration != nil {
return errors.New("node pool configuration requires Nomad Enterprise")
} Type guard
func nodePoolLicensed(cfg *structs.NamespaceNodePoolConfiguration) bool { return cfg == nil } Try / catch
if err := ns.Validate(); err != nil && strings.Contains(err.Error(), "unlicensed") {
// strip enterprise-only blocks or route to enterprise cluster
} Prevention
- Know which edition (OSS vs Enterprise) you are targeting before applying namespace specs
- Keep separate OSS/Enterprise namespace templates
- Strip enterprise-only blocks when exporting configs from Enterprise clusters
When it happens
Trigger: Submitting or validating a namespace (POST /v1/namespaces or nomad namespace apply) whose NamespaceNodePoolConfiguration is non-nil on a community-edition Nomad agent.
Common situations: Configs exported from an Enterprise cluster and applied to an OSS cluster; following Enterprise docs while running the OSS binary; tooling that always emits the node_pool_configuration block even when empty but present.
Related errors
- Feature "Node Pools Governance" is unlicensed
- Multi-Cluster Vault is unlicensed.
- Multi-Cluster Consul is unlicensed.
- Multiregion jobs are unlicensed.
- ErrMultipleNamespaces
AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04).
Data as JSON: /api/errors/7deab7fa2dfe3562.
Report an issue: GitHub.