{"record":{"id":"f9e4623d2ca6bcc2","repo":"hashicorp/nomad","slug":"invalid-capability-v","errorCode":null,"errorMessage":"invalid capability: %v","messagePattern":"invalid capability: (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"command/volume_create_host.go","lineNumber":263,"sourceCode":"\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\n\t\tot, ok := o.Val.(*ast.ObjectType)\n\t\tif !ok {\n\t\t\tbreak\n\t\t}\n","sourceCodeStart":245,"sourceCodeEnd":281,"githubUrl":"https://github.com/hashicorp/nomad/blob/482b49bf1aec006f089bcfc7e632d8f6ac303e5e/command/volume_create_host.go#L245-L281","documentation":"When the HCL spec contains `capability` blocks, decodeHostVolume calls parseHostVolumeCapabilities and wraps failures as `invalid capability: %v`. It indicates a capability block that doesn't decode into the expected access_mode/attachment_mode structure.","triggerScenarios":"`nomad volume create` (host) with a `capability { ... }` block missing `access_mode`/`attachment_mode` or using unrecognized mode strings.","commonSituations":"Using CSI capability values not supported for host volumes, misspelling access_mode (e.g. 'acces_mode'), or nesting the block incorrectly so HCL decodes the wrong shape.","solutions":["Check the inner error after `invalid capability:` for the exact problem","Provide `access_mode` and `attachment_mode` inside each capability block (e.g. `access_mode = \"single-node-writer\"`)","Verify block nesting: capability must be a top-level block of the volume spec, not nested elsewhere","Cross-check mode strings against the CSI spec vocabulary Nomad accepts"],"exampleFix":"// before\ncapability {\n  mode = \"rw\"\n}\n\n// after\ncapability {\n  access_mode = \"single-node-writer\"\n  attachment_mode = \"file-system\"\n}","handlingStrategy":"validation","validationCode":"validAccessModes := map[string]bool{\"single-node-reader\":true,\"single-node-writer\":true,\"multi-node-reader-only\":true,\"multi-node-single-writer\":true,\"multi-node-multi-writer\":true}\nvalidAttachModes := map[string]bool{\"file-system\":true,\"block-device\":true}\nfor _, c := range spec.Capability {\n\tif !validAccessModes[c.AccessMode] || !validAttachModes[c.AttachmentMode] {\n\t\treturn fmt.Errorf(\"capability %#v has unknown access_mode/attachment_mode\", c)\n\t}\n}","typeGuard":null,"tryCatchPattern":"if err := parseHostVolumeCapabilities(&vol.RequestedCapabilities, o); err != nil {\n\treturn fmt.Errorf(\"capability blocks need valid access_mode and attachment_mode: %v\", err)\n}","preventionTips":["Spell access_mode and attachment_mode exactly","Use only CSI-standard mode strings Nomad supports","Keep capability blocks at the top level of the volume spec","Cross-check against Nomad CSI volume documentation"],"tags":["hcl","nomad","csi","validation"],"backgroundTag":"invalid-capability-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"}