{"record":{"id":"516b3fce4b76f19d","repo":"hashicorp/nomad","slug":"error-parsing-reserved-ports-for-network-q-w","errorCode":null,"errorMessage":"error parsing reserved_ports for network %q: %w","messagePattern":"error parsing reserved_ports for network %q: %w","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"nomad/structs/network.go","lineNumber":284,"sourceCode":"\n\t\t\t// Mark reserved ports as used without worrying about\n\t\t\t// collisions. This effectively merges\n\t\t\t// client.reserved.reserved_ports into each\n\t\t\t// host_network.\n\t\t\tused := idx.getUsedPortsFor(a.Address)\n\t\t\tfor _, p := range globalResPorts {\n\t\t\t\tused.Set(p)\n\t\t\t}\n\n\t\t\t// If ReservedPorts is set on the NodeNetwork, use it\n\t\t\t// and the global reserved ports.\n\t\t\tif a.ReservedPorts != \"\" {\n\t\t\t\trp, err := ParsePortRanges(a.ReservedPorts)\n\t\t\t\tif err != nil {\n\t\t\t\t\t// This is a fatal error that should\n\t\t\t\t\t// have been prevented by validation\n\t\t\t\t\t// upstream.\n\t\t\t\t\treturn fmt.Errorf(\"error parsing reserved_ports for network %q: %w\", a.Alias, err)\n\t\t\t\t}\n\t\t\t\tfor _, p := range rp {\n\t\t\t\t\tused.Set(uint(p))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set dynamic port range (applies to all addresses)\n\tif node.NodeResources != nil && node.NodeResources.MinDynamicPort > 0 {\n\t\tidx.MinDynamicPort = node.NodeResources.MinDynamicPort\n\t}\n\n\tif node.NodeResources != nil && node.NodeResources.MaxDynamicPort > 0 {\n\t\tidx.MaxDynamicPort = node.NodeResources.MaxDynamicPort\n\t}\n\n\treturn nil","sourceCodeStart":266,"sourceCodeEnd":302,"githubUrl":"https://github.com/hashicorp/nomad/blob/482b49bf1aec006f089bcfc7e632d8f6ac303e5e/nomad/structs/network.go#L266-L302","documentation":"SetNode failed while parsing per-network reserved ports (a.ReservedPorts) on one of the node's reserved network interfaces. ParsePortRanges returned an error and SetNode wraps it with the network alias to identify which network's port list is invalid. Like the node-level variant, this is expected to be prevented by upstream validation and is fatal for node admission into the scheduler index.","triggerScenarios":"A node's reserved_resources.networks entry has a network (identified by alias) whose reserved_ports value is malformed — non-numeric entries, out-of-65535-range ports, or reversed ranges — encountered when SetNode builds used-port bitmaps during AllocsFit or node updates.","commonSituations":"Bad reserved_ports under a specific network stanza in client config (e.g. bridge or host network alias), typo introduced by automation, or stale/invalid node state from an older client version.","solutions":["Correct the reserved_ports value on the network stanza named by the alias in the error so it is a valid port/range list","Run local validation (same rules as ParsePortRanges) on each network's reserved_ports before publishing node updates","Deregister/re-register the node if invalid values are already persisted in server state","Check which network alias failed — fix only that stanza — since the error names it explicitly"],"exampleFix":"// before\nnetwork { alias = \"public\" reserved_ports = \"22, 80800\" }\n// after\nnetwork { alias = \"public\" reserved_ports = \"22, 8080-8090\" }","handlingStrategy":"validation","validationCode":"for _, nw := range node.ReservedResources.Networks.Networks {\n\tif !validPortList(nw.ReservedPorts) {\n\t\treturn fmt.Errorf(\"network %q has invalid reserved_ports %q\", nw.Alias, nw.ReservedPorts)\n\t}\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Validate reserved_ports per network stanza, not just node-wide, before publishing node data","Ensure the alias named in the error's network stanza is corrected specifically","Generate client configs programmatically only through validated templates","Keep client versions current so reserved port validation runs before data reaches servers"],"tags":["nomad","scheduler","ports","network","validation"],"backgroundTag":"invalid-port-range","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"}