{"record":{"id":"c847c4f7e65eef3c","repo":"hashicorp/nomad","slug":"invalid-drain-on-shutdown-config-v","errorCode":null,"errorMessage":"invalid drain_on_shutdown config: %v","messagePattern":"invalid drain_on_shutdown config: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"command/agent/agent.go","lineNumber":1153,"sourceCode":"\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\n\t\t}\n\t\tconf.Fingerprinters[fingerprinterCfg.Name] = fingerprinterCfg\n\t}\n\n\tconf.LogFile = agentConfig.LogFile\n\tconf.DefaultIneligible = agentConfig.Client.DefaultIneligible\n","sourceCodeStart":1135,"sourceCodeEnd":1171,"githubUrl":"https://github.com/hashicorp/nomad/blob/482b49bf1aec006f089bcfc7e632d8f6ac303e5e/command/agent/agent.go#L1135-L1171","documentation":"The client.drain_on_shutdown block is converted by clientconfig.DrainConfigFromAgent; on invalid configuration (bad deadline/duration values etc.) the wrapped error is returned as this message, failing agent startup or reload.","triggerScenarios":"An invalid client.drain_on_shutdown stanza — e.g. drain deadline not a valid Go duration string, malformed ignore_system_jobs/healthiness options — during clientConfig build, agent start, or handleReload.","commonSituations":"Setting deadline = \"600\" instead of \"600s\" after upgrading Nomad (drain_on_shutdown added in Nomad 1.x), misindented HCL blocks, or invalid monitor_update_interval values.","solutions":["Correct the drain_on_shutdown values: durations must include units, e.g. deadline = \"15m\"","Inspect the wrapped %v error for the exact offending field","Verify config with `nomad agent -verify-only`","Consult the Nomad docs for the drain_on_shutdown schema of your version"],"exampleFix":"// before\nclient {\n  drain_on_shutdown {\n    deadline = \"600\"\n  }\n}\n// after\nclient {\n  drain_on_shutdown {\n    deadline = \"10m\"\n  }\n}","handlingStrategy":"validation","validationCode":"if _, err := time.ParseDuration(deadline); err != nil {\n    return fmt.Errorf(\"drain_on_shutdown deadline must be a Go duration (e.g. 15m): %w\", err)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use unit-suffixed durations ('15m', '1h') for drain_on_shutdown.deadline","Confirm the drain_on_shutdown schema for your Nomad version","Validate config with `nomad agent -verify-only` after edits"],"tags":["nomad","config-validation","drain"],"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"}