{"record":{"id":"bfcb198fa725529b","repo":"hashicorp/nomad","slug":"v-q","errorCode":null,"errorMessage":"%v: %q","messagePattern":"%v: %q","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"nomad/structs/services.go","lineNumber":771,"sourceCode":"\t\t\tmErr = multierror.Append(mErr, err)\n\t\t}\n\t}\n\n\treturn mErr.ErrorOrNil()\n}\n\n// Validate checks if the Service definition is valid\nfunc (s *Service) Validate() error {\n\tvar mErr multierror.Error\n\n\t// Ensure the service name is valid per the below RFCs but make an exception\n\t// for our interpolation syntax by first stripping any environment variables from the name\n\n\tserviceNameStripped := args.ReplaceEnvWithPlaceHolder(s.Name, \"ENV-VAR\")\n\n\tif err := s.ValidateName(serviceNameStripped); err != nil {\n\t\t// Log actual service name, not the stripped version.\n\t\tmErr.Errors = append(mErr.Errors, fmt.Errorf(\"%v: %q\", err, s.Name))\n\t}\n\n\tswitch s.AddressMode {\n\tcase \"\", AddressModeAuto:\n\tcase AddressModeHost, AddressModeDriver, AddressModeAlloc, AddressModeAllocIPv6:\n\t\tif s.Address != \"\" {\n\t\t\tmErr.Errors = append(mErr.Errors, fmt.Errorf(\"Service address_mode must be %q if address is set\", AddressModeAuto))\n\t\t}\n\tdefault:\n\t\tmErr.Errors = append(mErr.Errors, fmt.Errorf(\"Service address_mode must be %q, %q, or %q; not %q\", AddressModeAuto, AddressModeHost, AddressModeDriver, s.AddressMode))\n\t}\n\n\tswitch s.OnUpdate {\n\tcase \"\", OnUpdateIgnore, OnUpdateRequireHealthy, OnUpdateIgnoreWarn:\n\t\t// OK\n\tdefault:\n\t\tmErr.Errors = append(mErr.Errors, fmt.Errorf(\"Service on_update must be %q, %q, or %q; not %q\", OnUpdateRequireHealthy, OnUpdateIgnoreWarn, OnUpdateIgnore, s.OnUpdate))\n\t}","sourceCodeStart":753,"sourceCodeEnd":789,"githubUrl":"https://github.com/hashicorp/nomad/blob/482b49bf1aec006f089bcfc7e632d8f6ac303e5e/nomad/structs/services.go#L753-L789","documentation":"The service name failed ValidateName (likely invalid characters or format after env-var placeholders were stripped); the error is wrapped so the real, un-stripped service name is reported as %q for debugging.","triggerScenarios":"A service Name that is invalid (e.g. empty, or failing regex rules) after environment-variable interpolation placeholders are replaced, detected during Service.Validate and appended to the multi-error.","commonSituations":"Names with invalid characters; name composed solely of ${ENV_VAR} that resolves empty; names containing characters Nomad disallows.","solutions":["Give the service a valid name (alphanumerics, dashes, underscores per Nomad name rules)","Ensure any ${VAR} used in the name interpolates to a non-empty valid value at runtime","Check the quoted name in the error for hidden/invalid characters"],"exampleFix":"// before\nname = \"${SERVICE}-${INVALID CHAR}\"\n// after\nname = \"${SERVICE}-web\"","handlingStrategy":"try-catch","validationCode":"if err := s.ValidateName(strings.ReplaceAll(s.Name, \"${ENV-VAR}\", \"x\")); err != nil {\n    return err\n}","typeGuard":"func isValidServiceName(name string) bool {\n    return regexp.MustCompile(`^[a-zA-Z0-9-_.]+$`).MatchString(name)\n}","tryCatchPattern":"var mErr multierror.Error\nif err := svc.Validate(); err != nil {\n    var me *multierror.Error\n    if errors.As(err, &me) {\n        for _, e := range me.Errors {\n            log.Printf(\"service %q invalid: %v\", svc.Name, e)\n        }\n    }\n}","preventionTips":["Avoid special characters in service names","Ensure interpolated env vars in names resolve to valid values"],"tags":["nomad","service-name","validation"],"backgroundTag":"invalid-service-name","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"}