diff --git a/api/src/com/cloud/agent/api/to/LoadBalancerTO.java b/api/src/com/cloud/agent/api/to/LoadBalancerTO.java index dffbc9e3d0e..4d5a2c05db0 100644 --- a/api/src/com/cloud/agent/api/to/LoadBalancerTO.java +++ b/api/src/com/cloud/agent/api/to/LoadBalancerTO.java @@ -150,6 +150,10 @@ public class LoadBalancerTO { return lbProtocol; } + public void setLbProtocol(String lbProtocol) { + this.lbProtocol = lbProtocol; + } + public boolean isRevoked() { return revoked; } diff --git a/core/src/com/cloud/network/HAProxyConfigurator.java b/core/src/com/cloud/network/HAProxyConfigurator.java index bc428c5d779..d3db0db6132 100644 --- a/core/src/com/cloud/network/HAProxyConfigurator.java +++ b/core/src/com/cloud/network/HAProxyConfigurator.java @@ -503,6 +503,9 @@ public class HAProxyConfigurator implements LoadBalancerConfigurator { .append(":") .append(dest.getDestPort()) .append(" check"); + if(lbTO.getLbProtocol() != null && lbTO.getLbProtocol().equals("tcp-proxy")) { + sb.append(" send-proxy"); + } dstSubRule.add(sb.toString()); if (stickinessSubRule != null) { sb.append(" cookie ").append(dest.getDestIp().replace(".", "_")).append('-').append(dest.getDestPort()).toString(); diff --git a/core/test/com/cloud/network/HAProxyConfiguratorTest.java b/core/test/com/cloud/network/HAProxyConfiguratorTest.java index 67321a4abb8..d899d4db4ae 100644 --- a/core/test/com/cloud/network/HAProxyConfiguratorTest.java +++ b/core/test/com/cloud/network/HAProxyConfiguratorTest.java @@ -29,6 +29,10 @@ import org.junit.Test; import com.cloud.agent.api.routing.LoadBalancerConfigCommand; import com.cloud.agent.api.to.LoadBalancerTO; +import com.cloud.network.lb.LoadBalancingRule.LbDestination; + +import java.util.List; +import java.util.ArrayList; /** * @author dhoogland @@ -87,6 +91,24 @@ public class HAProxyConfiguratorTest { // httpmode } + /** + * Test method for {@link com.cloud.network.HAProxyConfigurator#generateConfiguration(com.cloud.agent.api.routing.LoadBalancerConfigCommand)}. + */ + @Test + public void testGenerateConfigurationLoadBalancerProxyProtocolConfigCommand() { + final List dests = new ArrayList<>(); + dests.add(new LbDestination(443, 8443, "10.1.10.2", false)); + dests.add(new LbDestination(443, 8443, "10.1.10.2", true)); + LoadBalancerTO lb = new LoadBalancerTO("1", "10.2.0.1", 443, "tcp", "http", false, false, false, dests); + lb.setLbProtocol("tcp-proxy"); + LoadBalancerTO[] lba = new LoadBalancerTO[1]; + lba[0] = lb; + HAProxyConfigurator hpg = new HAProxyConfigurator(); + LoadBalancerConfigCommand cmd = new LoadBalancerConfigCommand(lba, "10.0.0.1", "10.1.0.1", "10.1.1.1", null, 1L, "12", false); + String result = genConfig(hpg, cmd); + assertTrue("'send-proxy' should result if protocol is 'tcp-proxy'", result.contains("send-proxy")); + } + private String genConfig(HAProxyConfigurator hpg, LoadBalancerConfigCommand cmd) { String[] sa = hpg.generateConfiguration(cmd); StringBuilder sb = new StringBuilder(); diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java index 1a340fab407..2a1dd403977 100644 --- a/server/src/com/cloud/network/element/VirtualRouterElement.java +++ b/server/src/com/cloud/network/element/VirtualRouterElement.java @@ -602,7 +602,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor { final Map lbCapabilities = new HashMap(); lbCapabilities.put(Capability.SupportedLBAlgorithms, "roundrobin,leastconn,source"); lbCapabilities.put(Capability.SupportedLBIsolation, "dedicated"); - lbCapabilities.put(Capability.SupportedProtocols, "tcp, udp"); + lbCapabilities.put(Capability.SupportedProtocols, "tcp, udp, tcp-proxy"); lbCapabilities.put(Capability.SupportedStickinessMethods, getHAProxyStickinessCapability()); lbCapabilities.put(Capability.LbSchemes, LoadBalancerContainer.Scheme.Public.toString()); diff --git a/server/src/com/cloud/network/router/CommandSetupHelper.java b/server/src/com/cloud/network/router/CommandSetupHelper.java index f701218f2ac..1818dbd0650 100644 --- a/server/src/com/cloud/network/router/CommandSetupHelper.java +++ b/server/src/com/cloud/network/router/CommandSetupHelper.java @@ -301,6 +301,7 @@ public class CommandSetupHelper { for (final LoadBalancingRule rule : rules) { final boolean revoked = rule.getState().equals(FirewallRule.State.Revoke); final String protocol = rule.getProtocol(); + final String lb_protocol = rule.getLbProtocol(); final String algorithm = rule.getAlgorithm(); final String uuid = rule.getUuid(); @@ -309,6 +310,7 @@ public class CommandSetupHelper { final List destinations = rule.getDestinations(); final List stickinessPolicies = rule.getStickinessPolicies(); final LoadBalancerTO lb = new LoadBalancerTO(uuid, srcIp, srcPort, protocol, algorithm, revoked, false, inline, destinations, stickinessPolicies); + lb.setLbProtocol(lb_protocol); lbs[i++] = lb; } String routerPublicIp = null;