{"record":{"id":"746eb3c609f78b3f","repo":"hashicorp/nomad","slug":"invalid-constraint-v","errorCode":null,"errorMessage":"invalid constraint: %v","messagePattern":"invalid constraint: (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"command/volume_create_host.go","lineNumber":258,"sourceCode":"\tcapacity, err := parseCapacityBytes(list.Filter(\"capacity\"))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"invalid capacity: %v\", err)\n\t}\n\tvol.CapacityBytes = capacity\n\tcapacityMin, err := parseCapacityBytes(list.Filter(\"capacity_min\"))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"invalid capacity_min: %v\", err)\n\t}\n\tvol.RequestedCapacityMinBytes = capacityMin\n\tcapacityMax, err := parseCapacityBytes(list.Filter(\"capacity_max\"))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"invalid capacity_max: %v\", err)\n\t}\n\tvol.RequestedCapacityMaxBytes = capacityMax\n\n\tif o := list.Filter(\"constraint\"); len(o.Items) > 0 {\n\t\tif err := parseConstraints(&vol.Constraints, o); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"invalid constraint: %v\", err)\n\t\t}\n\t}\n\tif o := list.Filter(\"capability\"); len(o.Items) > 0 {\n\t\tif err := parseHostVolumeCapabilities(&vol.RequestedCapabilities, o); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"invalid capability: %v\", err)\n\t\t}\n\t}\n\n\treturn vol, nil\n}\n\nfunc parseHostVolumeCapabilities(result *[]*api.HostVolumeCapability, list *ast.ObjectList) error {\n\tfor _, o := range list.Elem().Items {\n\t\tvalid := []string{\"access_mode\", \"attachment_mode\"}\n\t\tif err := helper.CheckHCLKeys(o.Val, valid); err != nil {\n\t\t\treturn err\n\t\t}\n","sourceCodeStart":240,"sourceCodeEnd":276,"githubUrl":"https://github.com/hashicorp/nomad/blob/482b49bf1aec006f089bcfc7e632d8f6ac303e5e/command/volume_create_host.go#L240-L276","documentation":"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).","triggerScenarios":"`nomad volume create` (host) with a `constraint { ... }` block that parseConstraints cannot process — e.g. missing `attribute`, unsupported key, or malformed `distinct_hosts` value.","commonSituations":"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.","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"],"exampleFix":"// before\nconstraint {\n  distinct_hosts = \"yes\"\n}\n\n// after\nconstraint {\n  distinct_hosts = true\n}","handlingStrategy":"validation","validationCode":"for _, c := range spec.Constraint {\n\tif c.DistinctHosts != nil && c.Attribute == \"\" {\n\t\t// ok: distinct_hosts standalone\n\t} else if c.Attribute == \"\" || c.Operand == \"\" {\n\t\treturn fmt.Errorf(\"constraint %#v needs attribute and operand\", c)\n\t}\n}","typeGuard":null,"tryCatchPattern":"if err := parseConstraints(&vol.Constraints, o); err != nil {\n\treturn fmt.Errorf(\"check constraint blocks (attribute/operand/value, distinct_hosts=true): %v\", err)\n}","preventionTips":["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"],"tags":["hcl","nomad","constraint","validation"],"backgroundTag":"invalid-constraint-definition","analyzedSha":"482b49bf1aec006f089bcfc7e632d8f6ac303e5e","analyzedAt":"2026-09-04T07:54:14.808Z","contentChangedAt":"2026-09-04T07:54:14.808Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}