Skip to content

Commit c03956e

Browse files
committed
Merge pull request apache#848 from iwebhosting/lbprotocol
Pass LbProtocol down to the HAProxyConfiguratorThis will let us specify a new load balancer protocol (tcp-proxy) which enables HAProxy's `send-proxy` functionality. `send-proxy` / [the PROXY protocol][1] will send the real connection origin IP through to the servers behind HAProxy, without requiring any protocol specific changes (such as HTTP header rewriting). [1]: http://www.haproxy.org/download/1.5/doc/proxy-protocol.txt This is also inline with what [Amazon ELB now supports][2]. [2]: http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/enable-proxy-protocol.html * pr/848: Pass LbProtocol down to the HAProxyConfigurator Signed-off-by: Remi Bergsma <github@remi.nl>
2 parents 093cccf + cacac14 commit c03956e

5 files changed

Lines changed: 32 additions & 1 deletion

File tree

api/src/com/cloud/agent/api/to/LoadBalancerTO.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,10 @@ public String getLbProtocol() {
150150
return lbProtocol;
151151
}
152152

153+
public void setLbProtocol(String lbProtocol) {
154+
this.lbProtocol = lbProtocol;
155+
}
156+
153157
public boolean isRevoked() {
154158
return revoked;
155159
}

core/src/com/cloud/network/HAProxyConfigurator.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,6 +503,9 @@ private List<String> getRulesForPool(final LoadBalancerTO lbTO, final boolean ke
503503
.append(":")
504504
.append(dest.getDestPort())
505505
.append(" check");
506+
if(lbTO.getLbProtocol() != null && lbTO.getLbProtocol().equals("tcp-proxy")) {
507+
sb.append(" send-proxy");
508+
}
506509
dstSubRule.add(sb.toString());
507510
if (stickinessSubRule != null) {
508511
sb.append(" cookie ").append(dest.getDestIp().replace(".", "_")).append('-').append(dest.getDestPort()).toString();

core/test/com/cloud/network/HAProxyConfiguratorTest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@
2929

3030
import com.cloud.agent.api.routing.LoadBalancerConfigCommand;
3131
import com.cloud.agent.api.to.LoadBalancerTO;
32+
import com.cloud.network.lb.LoadBalancingRule.LbDestination;
33+
34+
import java.util.List;
35+
import java.util.ArrayList;
3236

3337
/**
3438
* @author dhoogland
@@ -87,6 +91,24 @@ public void testGenerateConfigurationLoadBalancerConfigCommand() {
8791
// httpmode
8892
}
8993

94+
/**
95+
* Test method for {@link com.cloud.network.HAProxyConfigurator#generateConfiguration(com.cloud.agent.api.routing.LoadBalancerConfigCommand)}.
96+
*/
97+
@Test
98+
public void testGenerateConfigurationLoadBalancerProxyProtocolConfigCommand() {
99+
final List<LbDestination> dests = new ArrayList<>();
100+
dests.add(new LbDestination(443, 8443, "10.1.10.2", false));
101+
dests.add(new LbDestination(443, 8443, "10.1.10.2", true));
102+
LoadBalancerTO lb = new LoadBalancerTO("1", "10.2.0.1", 443, "tcp", "http", false, false, false, dests);
103+
lb.setLbProtocol("tcp-proxy");
104+
LoadBalancerTO[] lba = new LoadBalancerTO[1];
105+
lba[0] = lb;
106+
HAProxyConfigurator hpg = new HAProxyConfigurator();
107+
LoadBalancerConfigCommand cmd = new LoadBalancerConfigCommand(lba, "10.0.0.1", "10.1.0.1", "10.1.1.1", null, 1L, "12", false);
108+
String result = genConfig(hpg, cmd);
109+
assertTrue("'send-proxy' should result if protocol is 'tcp-proxy'", result.contains("send-proxy"));
110+
}
111+
90112
private String genConfig(HAProxyConfigurator hpg, LoadBalancerConfigCommand cmd) {
91113
String[] sa = hpg.generateConfiguration(cmd);
92114
StringBuilder sb = new StringBuilder();

server/src/com/cloud/network/element/VirtualRouterElement.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -602,7 +602,7 @@ private static Map<Service, Map<Capability, String>> setCapabilities() {
602602
final Map<Capability, String> lbCapabilities = new HashMap<Capability, String>();
603603
lbCapabilities.put(Capability.SupportedLBAlgorithms, "roundrobin,leastconn,source");
604604
lbCapabilities.put(Capability.SupportedLBIsolation, "dedicated");
605-
lbCapabilities.put(Capability.SupportedProtocols, "tcp, udp");
605+
lbCapabilities.put(Capability.SupportedProtocols, "tcp, udp, tcp-proxy");
606606
lbCapabilities.put(Capability.SupportedStickinessMethods, getHAProxyStickinessCapability());
607607
lbCapabilities.put(Capability.LbSchemes, LoadBalancerContainer.Scheme.Public.toString());
608608

server/src/com/cloud/network/router/CommandSetupHelper.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,7 @@ public void createApplyLoadBalancingRulesCommands(final List<LoadBalancingRule>
301301
for (final LoadBalancingRule rule : rules) {
302302
final boolean revoked = rule.getState().equals(FirewallRule.State.Revoke);
303303
final String protocol = rule.getProtocol();
304+
final String lb_protocol = rule.getLbProtocol();
304305
final String algorithm = rule.getAlgorithm();
305306
final String uuid = rule.getUuid();
306307

@@ -309,6 +310,7 @@ public void createApplyLoadBalancingRulesCommands(final List<LoadBalancingRule>
309310
final List<LbDestination> destinations = rule.getDestinations();
310311
final List<LbStickinessPolicy> stickinessPolicies = rule.getStickinessPolicies();
311312
final LoadBalancerTO lb = new LoadBalancerTO(uuid, srcIp, srcPort, protocol, algorithm, revoked, false, inline, destinations, stickinessPolicies);
313+
lb.setLbProtocol(lb_protocol);
312314
lbs[i++] = lb;
313315
}
314316
String routerPublicIp = null;

0 commit comments

Comments
 (0)