Skip to content

Commit

Permalink
service: remove duplicate name check during validation (#10868)
Browse files Browse the repository at this point in the history
When a task group with `service` block(s) is validated, we validate that there
are no duplicates, but this validation doesn't have access to the task environment
because it hasn't been created yet. Services and checks with interpolation can
be flagged incorrectly as conflicting. Name conflicts in services are not
actually an error in Consul and users have reported wanting to use the same
service name for task groups differentiated by tags.
  • Loading branch information
tgross authored and Mahmood Ali committed Jul 28, 2021
1 parent 0617fb1 commit 3a82acf
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 11 deletions.
3 changes: 3 additions & 0 deletions .changelog/10868.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:bug
consul: Fixed a bug where services may incorrectly fail conflicting name validation
```
13 changes: 2 additions & 11 deletions nomad/structs/structs.go
Original file line number Diff line number Diff line change
Expand Up @@ -6240,13 +6240,11 @@ func (tg *TaskGroup) validateNetworks() error {
return mErr.ErrorOrNil()
}

// validateServices runs Service.Validate() on group-level services,
// checks that group services do not conflict with task services and that
// validateServices runs Service.Validate() on group-level services, checks
// group service checks that refer to tasks only refer to tasks that exist.
func (tg *TaskGroup) validateServices() error {
var mErr multierror.Error
knownTasks := make(map[string]struct{})
knownServices := make(map[string]struct{})

// Create a map of known tasks and their services so we can compare
// vs the group-level services and checks
Expand All @@ -6256,15 +6254,11 @@ func (tg *TaskGroup) validateServices() error {
continue
}
for _, service := range task.Services {
if _, ok := knownServices[service.Name+service.PortLabel]; ok {
mErr.Errors = append(mErr.Errors, fmt.Errorf("Service %s is duplicate", service.Name))
}
for _, check := range service.Checks {
if check.TaskName != "" {
mErr.Errors = append(mErr.Errors, fmt.Errorf("Check %s is invalid: only task group service checks can be assigned tasks", check.Name))
}
}
knownServices[service.Name+service.PortLabel] = struct{}{}
}
}
for i, service := range tg.Services {
Expand All @@ -6279,10 +6273,7 @@ func (tg *TaskGroup) validateServices() error {
if service.AddressMode == AddressModeDriver {
mErr.Errors = append(mErr.Errors, fmt.Errorf("service %q cannot use address_mode=\"driver\", only services defined in a \"task\" block can use this mode", service.Name))
}
if _, ok := knownServices[service.Name+service.PortLabel]; ok {
mErr.Errors = append(mErr.Errors, fmt.Errorf("Service %s is duplicate", service.Name))
}
knownServices[service.Name+service.PortLabel] = struct{}{}

for _, check := range service.Checks {
if check.TaskName != "" {
if check.Type != ServiceCheckScript && check.Type != ServiceCheckGRPC {
Expand Down

0 comments on commit 3a82acf

Please sign in to comment.