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
- Check the inner error after `invalid constraint:` — it names the failing key
- Provide required constraint fields: `attribute`, `operand`, and `value` where applicable
- For anti-affinity use exactly `distinct_hosts = true` (boolean)
- 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
- Mirror constraint syntax from a working Nomad job file
- Use bare true/false for distinct_hosts, never "yes"/1
- Always include attribute and operand for standard constraints
- Validate specs with a linter before submitting
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
- <combined HCL diagnostics from str.String()>
- Missing constraint operand
- no attribute provided but is required by operator
- invalid variables limit: %v
- %s must be integer; got (%T) %[2]v
AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04).
Data as JSON: /api/errors/746eb3c609f78b3f.
Report an issue: GitHub.