mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-03 19:58:17 +00:00 
			
		
		
		
	Move validation of load balancers only supporting TCP ports to validation.go.
This commit is contained in:
		@@ -927,6 +927,14 @@ func ValidateService(service *api.Service) errs.ValidationErrorList {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if service.Spec.CreateExternalLoadBalancer {
 | 
			
		||||
		for i := range service.Spec.Ports {
 | 
			
		||||
			if service.Spec.Ports[i].Protocol != api.ProtocolTCP {
 | 
			
		||||
				allErrs = append(allErrs, errs.NewFieldInvalid("spec.ports", service.Spec.Ports[i], "cannot create an external load balancer with non-TCP ports"))
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return allErrs
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1583,6 +1583,22 @@ func TestValidateService(t *testing.T) {
 | 
			
		||||
			},
 | 
			
		||||
			numErrs: 1,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "invalid load balancer protocol 1",
 | 
			
		||||
			tweakSvc: func(s *api.Service) {
 | 
			
		||||
				s.Spec.CreateExternalLoadBalancer = true
 | 
			
		||||
				s.Spec.Ports[0].Protocol = "UDP"
 | 
			
		||||
			},
 | 
			
		||||
			numErrs: 1,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "invalid load balancer protocol 2",
 | 
			
		||||
			tweakSvc: func(s *api.Service) {
 | 
			
		||||
				s.Spec.CreateExternalLoadBalancer = true
 | 
			
		||||
				s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "p", Port: 12345, Protocol: "UDP"})
 | 
			
		||||
			},
 | 
			
		||||
			numErrs: 1,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "valid 1",
 | 
			
		||||
			tweakSvc: func(s *api.Service) {
 | 
			
		||||
@@ -1620,6 +1636,21 @@ func TestValidateService(t *testing.T) {
 | 
			
		||||
			},
 | 
			
		||||
			numErrs: 0,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "valid external load balancer",
 | 
			
		||||
			tweakSvc: func(s *api.Service) {
 | 
			
		||||
				s.Spec.CreateExternalLoadBalancer = true
 | 
			
		||||
			},
 | 
			
		||||
			numErrs: 0,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "valid external load balancer 2 ports",
 | 
			
		||||
			tweakSvc: func(s *api.Service) {
 | 
			
		||||
				s.Spec.CreateExternalLoadBalancer = true
 | 
			
		||||
				s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "p", Port: 12345, Protocol: "TCP"})
 | 
			
		||||
			},
 | 
			
		||||
			numErrs: 0,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, tc := range testCases {
 | 
			
		||||
 
 | 
			
		||||
@@ -385,7 +385,6 @@ func (s *ServiceController) loadBalancerName(service *api.Service) string {
 | 
			
		||||
	return s.cloud.GetLoadBalancerName(s.clusterName, service.Namespace, service.Name)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TODO: Deduplicate this with the copy in pkg/registry/service/rest.go.
 | 
			
		||||
func getTCPPorts(service *api.Service) ([]int, error) {
 | 
			
		||||
	ports := []int{}
 | 
			
		||||
	for i := range service.Spec.Ports {
 | 
			
		||||
 
 | 
			
		||||
@@ -94,14 +94,6 @@ func (rs *REST) Create(ctx api.Context, obj runtime.Object) (runtime.Object, err
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Make sure that we'll be able to create a load balancer for the service,
 | 
			
		||||
	// even though it'll be created by the ServiceController.
 | 
			
		||||
	if service.Spec.CreateExternalLoadBalancer {
 | 
			
		||||
		if _, err := getTCPPorts(service); err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	releaseServiceIP := false
 | 
			
		||||
	defer func() {
 | 
			
		||||
		if releaseServiceIP {
 | 
			
		||||
@@ -251,17 +243,3 @@ func (rs *REST) ResourceLocation(ctx api.Context, id string) (*url.URL, http.Rou
 | 
			
		||||
	}
 | 
			
		||||
	return nil, nil, fmt.Errorf("no endpoints available for %q", id)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TODO: Deduplicate with the copy of this in pkg/registry/service/rest.go
 | 
			
		||||
func getTCPPorts(service *api.Service) ([]int, error) {
 | 
			
		||||
	ports := []int{}
 | 
			
		||||
	for i := range service.Spec.Ports {
 | 
			
		||||
		sp := &service.Spec.Ports[i]
 | 
			
		||||
		if sp.Protocol != api.ProtocolTCP {
 | 
			
		||||
			// TODO: Support UDP here too.
 | 
			
		||||
			return nil, fmt.Errorf("external load balancers for non TCP services are not currently supported.")
 | 
			
		||||
		}
 | 
			
		||||
		ports = append(ports, sp.Port)
 | 
			
		||||
	}
 | 
			
		||||
	return ports, nil
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user