Skip to content

Commit

Permalink
Service port names are required for multi-port
Browse files Browse the repository at this point in the history
There is no provision for the first port to be unnamed.  I think I
initially allowed that, but then the Subset struct became a sorted
struct, so the first-ness of the port got lost.  If you have a Service
with one named and one unnamed port, what happens is that the
EndpointController fails to create Endpoints (validation error).
  • Loading branch information
thockin committed May 10, 2015
1 parent 738f403 commit 3aa39d5
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 10 deletions.
19 changes: 9 additions & 10 deletions pkg/api/validation/validation.go
Original file line number Diff line number Diff line change
Expand Up @@ -980,7 +980,7 @@ func ValidateService(service *api.Service) errs.ValidationErrorList {
}
allPortNames := util.StringSet{}
for i := range service.Spec.Ports {
allErrs = append(allErrs, validateServicePort(&service.Spec.Ports[i], i, &allPortNames).PrefixIndex(i).Prefix("spec.ports")...)
allErrs = append(allErrs, validateServicePort(&service.Spec.Ports[i], len(service.Spec.Ports) > 1, &allPortNames).PrefixIndex(i).Prefix("spec.ports")...)
}

if service.Spec.Selector != nil {
Expand Down Expand Up @@ -1018,18 +1018,17 @@ func ValidateService(service *api.Service) errs.ValidationErrorList {
return allErrs
}

func validateServicePort(sp *api.ServicePort, index int, allNames *util.StringSet) errs.ValidationErrorList {
func validateServicePort(sp *api.ServicePort, requireName bool, allNames *util.StringSet) errs.ValidationErrorList {
allErrs := errs.ValidationErrorList{}

if len(sp.Name) == 0 {
// Allow empty names if they are the first port (mostly for compat).
if index != 0 {
allErrs = append(allErrs, errs.NewFieldRequired("name"))
if requireName && sp.Name == "" {
allErrs = append(allErrs, errs.NewFieldRequired("name"))
} else if sp.Name != "" {
if !util.IsDNS1123Label(sp.Name) {
allErrs = append(allErrs, errs.NewFieldInvalid("name", sp.Name, dns1123LabelErrorMsg))
} else if allNames.Has(sp.Name) {
allErrs = append(allErrs, errs.NewFieldDuplicate("name", sp.Name))
}
} else if !util.IsDNS1123Label(sp.Name) {
allErrs = append(allErrs, errs.NewFieldInvalid("name", sp.Name, dns1123LabelErrorMsg))
} else if allNames.Has(sp.Name) {
allErrs = append(allErrs, errs.NewFieldDuplicate("name", sp.Name))
}

if !util.IsValidPortNum(sp.Port) {
Expand Down
8 changes: 8 additions & 0 deletions pkg/api/validation/validation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1600,6 +1600,14 @@ func TestValidateService(t *testing.T) {
},
numErrs: 1,
},
{
name: "empty multi-port port[0] name",
tweakSvc: func(s *api.Service) {
s.Spec.Ports[0].Name = ""
s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "p", Protocol: "TCP", Port: 12345})
},
numErrs: 1,
},
{
name: "invalid port name",
tweakSvc: func(s *api.Service) {
Expand Down

0 comments on commit 3aa39d5

Please sign in to comment.