Merge pull request #915 from hashicorp/f-valid-service-names
Require RFC-1123 and RFC-2782 valid service names
This commit is contained in:
commit
b3ab4ff5b9
|
@ -1510,10 +1510,13 @@ func (s *Service) InitFields(job string, taskGroup string, task string) {
|
||||||
func (s *Service) Validate() error {
|
func (s *Service) Validate() error {
|
||||||
var mErr multierror.Error
|
var mErr multierror.Error
|
||||||
|
|
||||||
// Ensure the name does not have a period in it.
|
// Ensure the service name is valid per RFC-952 §1
|
||||||
// RFC-2782: https://tools.ietf.org/html/rfc2782
|
// (https://tools.ietf.org/html/rfc952), RFC-1123 §2.1
|
||||||
if strings.Contains(s.Name, ".") {
|
// (https://tools.ietf.org/html/rfc1123), and RFC-2782
|
||||||
mErr.Errors = append(mErr.Errors, fmt.Errorf("service name can't contain periods: %q", s.Name))
|
// (https://tools.ietf.org/html/rfc2782).
|
||||||
|
re := regexp.MustCompile(`^(?i:[a-z0-9]|[a-z0-9][a-z0-9\-]{0,61}[a-z0-9])$`)
|
||||||
|
if !re.MatchString(s.Name) {
|
||||||
|
mErr.Errors = append(mErr.Errors, fmt.Errorf("service name must be valid per RFC 1123 and can contain only alphanumeric characters or dashes and must be less than 63 characters long: %q", s.Name))
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, c := range s.Checks {
|
for _, c := range s.Checks {
|
||||||
|
|
|
@ -519,7 +519,7 @@ func TestInvalidServiceCheck(t *testing.T) {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
if err := s.Validate(); err == nil {
|
if err := s.Validate(); err == nil {
|
||||||
t.Fatalf("Service should be invalid")
|
t.Fatalf("Service should be invalid (invalid type)")
|
||||||
}
|
}
|
||||||
|
|
||||||
s = Service{
|
s = Service{
|
||||||
|
@ -527,7 +527,23 @@ func TestInvalidServiceCheck(t *testing.T) {
|
||||||
PortLabel: "bar",
|
PortLabel: "bar",
|
||||||
}
|
}
|
||||||
if err := s.Validate(); err == nil {
|
if err := s.Validate(); err == nil {
|
||||||
t.Fatalf("Service should be invalid: %v", err)
|
t.Fatalf("Service should be invalid (contains a dot): %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
s = Service{
|
||||||
|
Name: "-my-service",
|
||||||
|
PortLabel: "bar",
|
||||||
|
}
|
||||||
|
if err := s.Validate(); err == nil {
|
||||||
|
t.Fatalf("Service should be invalid (begins with a hyphen): %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
s = Service{
|
||||||
|
Name: "abcdef0123456789-abcdef0123456789-abcdef0123456789-abcdef0123456",
|
||||||
|
PortLabel: "bar",
|
||||||
|
}
|
||||||
|
if err := s.Validate(); err == nil {
|
||||||
|
t.Fatalf("Service should be invalid (too long): %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -76,13 +76,17 @@ group "database" {
|
||||||
```
|
```
|
||||||
|
|
||||||
* `name`: Nomad automatically determines the name of a Task. By default the
|
* `name`: Nomad automatically determines the name of a Task. By default the
|
||||||
name of a service is $(job-name)-$(task-group)-$(task-name). Users can
|
name of a service is `$(job-name)-$(task-group)-$(task-name)`. Users can
|
||||||
explicitly name the service by specifying this option. If multiple services
|
explicitly name the service by specifying this option. If multiple services
|
||||||
are defined for a Task then only one task can have the default name, all the
|
are defined for a Task then only one task can have the default name, all
|
||||||
services have to be explicitly named. Users can add the following to the
|
the services have to be explicitly named. Users can add the following to
|
||||||
service names: ```${JOB}```, ```${TASKGROUP}```, ```${TASK}```, ```${BASE}```.
|
the service names: `${JOB}`, `${TASKGROUP}`, `${TASK}`, `${BASE}`. Nomad
|
||||||
Nomad will replace them with the appropriate value of the Job, Task Group and
|
will replace them with the appropriate value of the Job, Task Group, and
|
||||||
Task names while registering the Job. ```${BASE}``` expands to ${JOB}-${TASKGROUP}-${TASK}
|
Task names while registering the Job. `${BASE}` expands to
|
||||||
|
`${JOB}-${TASKGROUP}-${TASK}`. Names must be adhere to
|
||||||
|
[RFC-1123 §2.1](https://tools.ietf.org/html/rfc1123#section-2) and are
|
||||||
|
limited to alphanumeric and hyphen characters (i.e. `[a-z0-9\-]`), and be
|
||||||
|
less than 64 characters in length.
|
||||||
|
|
||||||
* `tags`: A list of tags associated with this Service.
|
* `tags`: A list of tags associated with this Service.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue