{"record":{"id":"7ec1476eac930b56","repo":"hashicorp/nomad","slug":"invalid-artifact-config-v","errorCode":null,"errorMessage":"invalid artifact config: %v","messagePattern":"invalid artifact config: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"command/agent/agent.go","lineNumber":1146,"sourceCode":"\t\tif ip.To4() != nil {\n\t\t\treturn nil, fmt.Errorf(\"invalid bridge_network_subnet_ipv6: not an IPv6 address: %s\", ipv6Subnet)\n\t\t}\n\t\tconf.BridgeNetworkAllocSubnetIPv6 = ipv6Subnet\n\t}\n\tconf.BridgeNetworkHairpinMode = agentConfig.Client.BridgeNetworkHairpinMode\n\n\tfor _, hn := range agentConfig.Client.HostNetworks {\n\t\tconf.HostNetworks[hn.Name] = hn\n\t}\n\tconf.BindWildcardDefaultHostNetwork = agentConfig.Client.BindWildcardDefaultHostNetwork\n\n\tif agentConfig.Client.NomadServiceDiscovery != nil {\n\t\tconf.NomadServiceDiscovery = *agentConfig.Client.NomadServiceDiscovery\n\t}\n\n\tartifactConfig, err := clientconfig.ArtifactConfigFromAgent(agentConfig.Client.Artifact)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"invalid artifact config: %v\", err)\n\t}\n\n\tconf.Artifact = artifactConfig\n\n\tdrainConfig, err := clientconfig.DrainConfigFromAgent(agentConfig.Client.Drain)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"invalid drain_on_shutdown config: %v\", err)\n\t}\n\tconf.Drain = drainConfig\n\n\tconf.Users = clientconfig.UsersConfigFromAgent(agentConfig.Client.Users)\n\n\t// Iterate the fingerprinter configs and populate the client mapping. The\n\t// validation function returns a suitable error that can be returned without\n\t// formatting.\n\tfor _, fingerprinterCfg := range agentConfig.Client.Fingerprinters {\n\t\tif err := fingerprinterCfg.Validate(); err != nil {\n\t\t\treturn nil, err","sourceCodeStart":1128,"sourceCodeEnd":1164,"githubUrl":"https://github.com/hashicorp/nomad/blob/482b49bf1aec006f089bcfc7e632d8f6ac303e5e/command/agent/agent.go#L1128-L1164","documentation":"convertClientConfig derives the artifact settings via clientconfig.ArtifactConfigFromAgent from the client.artifact block. If that config is invalid (e.g. bad timeout values or HTTP options), the error is wrapped as 'invalid artifact config' and the agent fails to start or reload.","triggerScenarios":"An invalid client.artifact stanza in the agent config — e.g. timeout strings that fail time.ParseDuration, negative/zero invalid values, or structurally bad HTTP options — during agent start or handleReload.","commonSituations":"Setting artifact timeout without a unit ('10' instead of '10m'), unsupported option keys after a Nomad version upgrade added new validation, or template rendering producing bad values.","solutions":["Fix the client.artifact block: use valid duration strings like '30m'/'1h' for timeout fields and valid option values","Read the wrapped %v detail in the log to identify the exact offending field","Check the Nomad version's agent docs for allowed artifact options","Test with `nomad agent -verify-only` before restarting the agent"],"exampleFix":"// before\nclient {\n  artifact {\n    http_rpc_timeout = \"10\"\n  }\n}\n// after\nclient {\n  artifact {\n    http_rpc_timeout = \"10m\"\n  }\n}","handlingStrategy":"validation","validationCode":"// Durations in the artifact block must parse as Go durations\nif _, err := time.ParseDuration(artifactTimeout); err != nil {\n    return fmt.Errorf(\"artifact timeout invalid: %w\", err)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always use unit-suffixed durations ('30m', '1h') in artifact config","Read the wrapped %v message for the exact offending field","Check the docs for your Nomad version's allowed artifact options","Validate with `nomad agent -verify-only`"],"tags":["nomad","config-validation","artifact"],"backgroundTag":"invalid-config-block","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"}