@@ -10,10 +10,11 @@ import (
1010
1111// LoadBalancerPortMapping is associated with HostComputeLoadBalancer
1212type LoadBalancerPortMapping struct {
13- Protocol uint32 `json:",omitempty"` // EX: TCP = 6, UDP = 17
14- InternalPort uint16 `json:",omitempty"`
15- ExternalPort uint16 `json:",omitempty"`
16- Flags LoadBalancerPortMappingFlags `json:",omitempty"`
13+ Protocol uint32 `json:",omitempty"` // EX: TCP = 6, UDP = 17
14+ InternalPort uint16 `json:",omitempty"`
15+ ExternalPort uint16 `json:",omitempty"`
16+ DistributionType LoadBalancerDistribution `json:",omitempty"` // EX: Distribute per connection = 0, distribute traffic of the same protocol per client IP = 1, distribute per client IP = 2
17+ Flags LoadBalancerPortMappingFlags `json:",omitempty"`
1718}
1819
1920// HostComputeLoadBalancer represents software load balancer.
5354 LoadBalancerPortMappingFlagsPreserveDIP LoadBalancerPortMappingFlags = 8
5455)
5556
57+ // LoadBalancerDistribution specifies how the loadbalancer distributes traffic.
58+ type LoadBalancerDistribution uint32
59+
60+ var (
61+ // LoadBalancerDistributionNone is the default and loadbalances each connection to the same pod.
62+ LoadBalancerDistributionNone LoadBalancerDistribution
63+ // LoadBalancerDistributionSourceIPProtocol loadbalances all traffic of the same protocol from a client IP to the same pod.
64+ LoadBalancerDistributionSourceIPProtocol LoadBalancerDistribution = 1
65+ // LoadBalancerDistributionSourceIP loadbalances all traffic from a client IP to the same pod.
66+ LoadBalancerDistributionSourceIP LoadBalancerDistribution = 2
67+ )
68+
69+ func (distributionType LoadBalancerDistribution ) String () string {
70+ return [... ]string {"None" , "SourceIPProtocol" , "SourceIP" }[distributionType ]
71+ }
72+
5673func getLoadBalancer (loadBalancerGuid guid.GUID , query string ) (* HostComputeLoadBalancer , error ) {
5774 // Open loadBalancer.
5875 var (
@@ -312,17 +329,18 @@ func (loadBalancer *HostComputeLoadBalancer) RemoveEndpoint(endpoint *HostComput
312329}
313330
314331// AddLoadBalancer for the specified endpoints
315- func AddLoadBalancer (endpoints []HostComputeEndpoint , flags LoadBalancerFlags , portMappingFlags LoadBalancerPortMappingFlags , sourceVIP string , frontendVIPs []string , protocol uint16 , internalPort uint16 , externalPort uint16 ) (* HostComputeLoadBalancer , error ) {
316- logrus .Debugf ("hcn::HostComputeLoadBalancer::AddLoadBalancer endpointId=%v, LoadBalancerFlags=%v, LoadBalancerPortMappingFlags=%v, sourceVIP=%s, frontendVIPs=%v, protocol=%v, internalPort=%v, externalPort=%v" , endpoints , flags , portMappingFlags , sourceVIP , frontendVIPs , protocol , internalPort , externalPort )
332+ func AddLoadBalancer (endpoints []HostComputeEndpoint , flags LoadBalancerFlags , portMappingFlags LoadBalancerPortMappingFlags , sourceVIP string , frontendVIPs []string , protocol uint16 , internalPort uint16 , externalPort uint16 , additionalParams ... string ) (* HostComputeLoadBalancer , error ) {
333+ logrus .Debugf ("hcn::HostComputeLoadBalancer::AddLoadBalancer endpointId=%v, LoadBalancerFlags=%v, LoadBalancerPortMappingFlags=%v, sourceVIP=%s, frontendVIPs=%v, protocol=%v, internalPort=%v, externalPort=%v, additionalParams=%v " , endpoints , flags , portMappingFlags , sourceVIP , frontendVIPs , protocol , internalPort , externalPort , additionalParams )
317334
318335 loadBalancer := & HostComputeLoadBalancer {
319336 SourceVIP : sourceVIP ,
320337 PortMappings : []LoadBalancerPortMapping {
321338 {
322- Protocol : uint32 (protocol ),
323- InternalPort : internalPort ,
324- ExternalPort : externalPort ,
325- Flags : portMappingFlags ,
339+ Protocol : uint32 (protocol ),
340+ InternalPort : internalPort ,
341+ ExternalPort : externalPort ,
342+ DistributionType : LoadBalancerDistributionNone ,
343+ Flags : portMappingFlags ,
326344 },
327345 },
328346 FrontendVIPs : frontendVIPs ,
@@ -333,6 +351,15 @@ func AddLoadBalancer(endpoints []HostComputeEndpoint, flags LoadBalancerFlags, p
333351 Flags : flags ,
334352 }
335353
354+ if additionalParams != nil {
355+ switch additionalParams [0 ] {
356+ case "SourceIPProtocol" :
357+ loadBalancer .PortMappings [0 ].DistributionType = LoadBalancerDistributionSourceIPProtocol
358+ case "SourceIP" :
359+ loadBalancer .PortMappings [0 ].DistributionType = LoadBalancerDistributionSourceIP
360+ }
361+ }
362+
336363 for _ , endpoint := range endpoints {
337364 loadBalancer .HostComputeEndpoints = append (loadBalancer .HostComputeEndpoints , endpoint .Id )
338365 }
0 commit comments