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

  1. Remove the node pool configuration block from the namespace specification before applying it on the CE binary.
  2. Upgrade to HashiCorp Nomad Enterprise and apply a license that includes Node Pools Governance.
  3. 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

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


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