From ce54d9072bd637db5441a9c7b92c8d0eb0511629 Mon Sep 17 00:00:00 2001 From: xiangpengzhao Date: Sat, 10 Jun 2017 12:55:47 +0800 Subject: [PATCH] Validate if service has duplicate targetPort --- pkg/api/validation/validation.go | 16 ++++++++++++ pkg/api/validation/validation_test.go | 36 +++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/pkg/api/validation/validation.go b/pkg/api/validation/validation.go index 78e055dde9fd..cf48bca084e7 100644 --- a/pkg/api/validation/validation.go +++ b/pkg/api/validation/validation.go @@ -2865,6 +2865,22 @@ func ValidateService(service *api.Service) field.ErrorList { nodePorts[key] = true } + // Check for duplicate TargetPort + portsPath = specPath.Child("ports") + targetPorts := make(map[api.ServicePort]bool) + for i, port := range service.Spec.Ports { + if (port.TargetPort.Type == intstr.Int && port.TargetPort.IntVal == 0) || (port.TargetPort.Type == intstr.String && port.TargetPort.StrVal == "") { + continue + } + portPath := portsPath.Index(i) + key := api.ServicePort{Protocol: port.Protocol, TargetPort: port.TargetPort} + _, found := targetPorts[key] + if found { + allErrs = append(allErrs, field.Duplicate(portPath.Child("targetPort"), port.TargetPort)) + } + targetPorts[key] = true + } + // Validate SourceRange field and annotation _, ok := service.Annotations[api.AnnotationLoadBalancerSourceRangesKey] if len(service.Spec.LoadBalancerSourceRanges) > 0 || ok { diff --git a/pkg/api/validation/validation_test.go b/pkg/api/validation/validation_test.go index b56c059ea45c..426669c7e1a1 100644 --- a/pkg/api/validation/validation_test.go +++ b/pkg/api/validation/validation_test.go @@ -6033,6 +6033,42 @@ func TestValidateService(t *testing.T) { }, numErrs: 0, }, + { + name: "invalid duplicate targetports (number with same protocol)", + tweakSvc: func(s *api.Service) { + s.Spec.Type = api.ServiceTypeClusterIP + s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "q", Port: 1, Protocol: "TCP", TargetPort: intstr.FromInt(8080)}) + s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "r", Port: 2, Protocol: "TCP", TargetPort: intstr.FromInt(8080)}) + }, + numErrs: 1, + }, + { + name: "invalid duplicate targetports (name with same protocol)", + tweakSvc: func(s *api.Service) { + s.Spec.Type = api.ServiceTypeClusterIP + s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "q", Port: 1, Protocol: "TCP", TargetPort: intstr.FromString("http")}) + s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "r", Port: 2, Protocol: "TCP", TargetPort: intstr.FromString("http")}) + }, + numErrs: 1, + }, + { + name: "valid duplicate targetports (number with different protocols)", + tweakSvc: func(s *api.Service) { + s.Spec.Type = api.ServiceTypeClusterIP + s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "q", Port: 1, Protocol: "TCP", TargetPort: intstr.FromInt(8080)}) + s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "r", Port: 2, Protocol: "UDP", TargetPort: intstr.FromInt(8080)}) + }, + numErrs: 0, + }, + { + name: "valid duplicate targetports (name with different protocols)", + tweakSvc: func(s *api.Service) { + s.Spec.Type = api.ServiceTypeClusterIP + s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "q", Port: 1, Protocol: "TCP", TargetPort: intstr.FromString("http")}) + s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "r", Port: 2, Protocol: "UDP", TargetPort: intstr.FromString("http")}) + }, + numErrs: 0, + }, { name: "valid type - cluster", tweakSvc: func(s *api.Service) {