{"record":{"id":"a6275ae0f4f9f84c","repo":"hashicorp/nomad","slug":"consul-connect-service-name-q-in-group-q-must-no","errorCode":null,"errorMessage":"Consul Connect service name %q in group %q must not contain uppercase characters","messagePattern":"Consul Connect service name %q in group %q must not contain uppercase characters","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"nomad/job_endpoint_hook_connect.go","lineNumber":664,"sourceCode":"\tallowed := `\"bridge\" or \"cni/*\"`\n\tif allowHost {\n\t\tallowed = `\"bridge\", \"host\", or \"cni/*\"`\n\t}\n\treturn fmt.Errorf(\"%s: %w: group %q uses network mode %q; must be %s\",\n\t\terrorPrefix, ErrConnectInvalidNetworkMode, g.Name, mode, allowed)\n}\n\nfunc groupConnectSidecarValidate(g *structs.TaskGroup, s *structs.Service) error {\n\tif err := groupConnectNetworkModeValidate(g, \"connect sidecar\", false); err != nil {\n\t\treturn err\n\t}\n\n\t// We must enforce lowercase characters on group and service names for connect\n\t// sidecar proxies, because Consul assumes this invariant without validating it.\n\t// https://github.com/hashicorp/consul/blob/v1.9.5/command/connect/proxy/proxy.go#L235\n\n\tif s.Name != strings.ToLower(s.Name) {\n\t\treturn fmt.Errorf(\"Consul Connect service name %q in group %q must not contain uppercase characters\", s.Name, g.Name)\n\t}\n\n\tif g.Name != strings.ToLower(g.Name) {\n\t\treturn fmt.Errorf(\"Consul Connect group %q with service %q must not contain uppercase characters\", g.Name, s.Name)\n\t}\n\n\treturn nil\n}\n\nfunc groupConnectNativeValidate(g *structs.TaskGroup, s *structs.Service) error {\n\t// note that network mode is not enforced for connect native services\n\n\tif _, err := getNamedTaskForNativeService(g, s.Name, s.TaskName); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n","sourceCodeStart":646,"sourceCodeEnd":682,"githubUrl":"https://github.com/hashicorp/nomad/blob/482b49bf1aec006f089bcfc7e632d8f6ac303e5e/nomad/job_endpoint_hook_connect.go#L646-L682","documentation":"Consul assumes Connect service names are lowercase and does not validate this itself, so Nomad pre-validates on job submission: a connect sidecar service whose `name` contains uppercase characters is rejected. The check compares the service name against its lowercased form in groupConnectSidecarValidate.","triggerScenarios":"Submitting a job with a connect sidecar service where `service { name = \"MyAPI\" }` (or any name with A-Z) triggers `s.Name != strings.ToLower(s.Name)`.","commonSituations":"PascalCase or camelCase service names copied from application conventions; names auto-generated from uppercase Docker image or repo names; users unaware Consul requires lowercase DNS-compatible names.","solutions":["Lowercase the connect service `name` in the job file (e.g. \"myapi\").","If display casing matters, keep the connect service name lowercase and use tags/metadata for the original casing.","If the service is not a connect sidecar, remove the connect block so this validation does not apply."],"exampleFix":"// before\nservice {\n  name = \"PaymentService\"\n  connect { sidecar_service {} }\n}\n// after\nservice {\n  name = \"paymentservice\"\n  connect { sidecar_service {} }\n}","handlingStrategy":"validation","validationCode":"function validateConnectServiceName(group, service) {\n  if (service.connect && service.name !== service.name.toLowerCase()) {\n    throw new Error(`connect service name \"${service.name}\" must be lowercase`);\n  }\n}","typeGuard":"function isLowercase(s) { return typeof s === 'string' && s === s.toLowerCase(); }","tryCatchPattern":null,"preventionTips":["Adopt lowercase-only naming conventions for connect service names.","Normalize names from templates/variables with a lowercase transform before submit.","Run `nomad job validate` in CI to catch casing early."],"tags":["nomad","consul-connect","naming","job-validation"],"backgroundTag":"connect-name-uppercase","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"}