hashicorp/nomad · error

invalid constraint: %v

Error message

invalid constraint: %v

What it means

When the HCL spec contains `constraint` blocks, decodeHostVolume delegates to parseConstraints and wraps any failure as `invalid constraint: %v`. It means one of the constraint blocks is structurally or semantically invalid for Nomad (missing required keys like attribute/operand/value, or a bad distinct_hosts value).

Source

Thrown at command/volume_create_host.go:258

	capacity, err := parseCapacityBytes(list.Filter("capacity"))
	if err != nil {
		return nil, fmt.Errorf("invalid capacity: %v", err)
	}
	vol.CapacityBytes = capacity
	capacityMin, err := parseCapacityBytes(list.Filter("capacity_min"))
	if err != nil {
		return nil, fmt.Errorf("invalid capacity_min: %v", err)
	}
	vol.RequestedCapacityMinBytes = capacityMin
	capacityMax, err := parseCapacityBytes(list.Filter("capacity_max"))
	if err != nil {
		return nil, fmt.Errorf("invalid capacity_max: %v", err)
	}
	vol.RequestedCapacityMaxBytes = capacityMax

	if o := list.Filter("constraint"); len(o.Items) > 0 {
		if err := parseConstraints(&vol.Constraints, o); err != nil {
			return nil, fmt.Errorf("invalid constraint: %v", err)
		}
	}
	if o := list.Filter("capability"); len(o.Items) > 0 {
		if err := parseHostVolumeCapabilities(&vol.RequestedCapabilities, o); err != nil {
			return nil, fmt.Errorf("invalid capability: %v", err)
		}
	}

	return vol, nil
}

func parseHostVolumeCapabilities(result *[]*api.HostVolumeCapability, list *ast.ObjectList) error {
	for _, o := range list.Elem().Items {
		valid := []string{"access_mode", "attachment_mode"}
		if err := helper.CheckHCLKeys(o.Val, valid); err != nil {
			return err
		}

View on GitHub (pinned to 482b49bf1a)

Solutions

  1. Check the inner error after `invalid constraint:` — it names the failing key
  2. Provide required constraint fields: `attribute`, `operand`, and `value` where applicable
  3. For anti-affinity use exactly `distinct_hosts = true` (boolean)
  4. Compare against a working job-file constraint example and mirror its structure

Example fix

// before
constraint {
  distinct_hosts = "yes"
}

// after
constraint {
  distinct_hosts = true
}
Defensive patterns

Strategy: validation

Validate before calling

for _, c := range spec.Constraint {
	if c.DistinctHosts != nil && c.Attribute == "" {
		// ok: distinct_hosts standalone
	} else if c.Attribute == "" || c.Operand == "" {
		return fmt.Errorf("constraint %#v needs attribute and operand", c)
	}
}

Try / catch

if err := parseConstraints(&vol.Constraints, o); err != nil {
	return fmt.Errorf("check constraint blocks (attribute/operand/value, distinct_hosts=true): %v", err)
}

Prevention

When it happens

Trigger: `nomad volume create` (host) with a `constraint { ... }` block that parseConstraints cannot process — e.g. missing `attribute`, unsupported key, or malformed `distinct_hosts` value.

Common situations: Copy-pasted job constraints that reference keys the volume parser doesn't accept; using `distinct_hosts = "yes"` instead of true/false; omitting the `attribute`/`operand` fields.

Related errors


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