Repository: stratos Updated Branches: refs/heads/4.0.0 e4cd9cf19 -> 5190c1513
Fixing STRATOS-703 - HAProxy route to same server even there are multiple clusters Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/f2e2c962 Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/f2e2c962 Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/f2e2c962 Branch: refs/heads/4.0.0 Commit: f2e2c9621e1fb9913b4d256b7d8167a42df52325 Parents: e1c15c4 Author: Dinesh Bandara <[email protected]> Authored: Thu Jul 10 08:46:58 2014 +0530 Committer: Dinesh Bandara <[email protected]> Committed: Thu Jul 10 08:46:58 2014 +0530 ---------------------------------------------------------------------- .../haproxy/extension/HAProxyConfigWriter.java | 81 +++++++++++++++----- .../src/main/templates/haproxy.cfg.template | 9 ++- 2 files changed, 68 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/f2e2c962/extensions/load-balancer/haproxy-extension/src/main/java/org/apache/stratos/haproxy/extension/HAProxyConfigWriter.java ---------------------------------------------------------------------- diff --git a/extensions/load-balancer/haproxy-extension/src/main/java/org/apache/stratos/haproxy/extension/HAProxyConfigWriter.java b/extensions/load-balancer/haproxy-extension/src/main/java/org/apache/stratos/haproxy/extension/HAProxyConfigWriter.java index 66ea32a..b767fe0 100644 --- a/extensions/load-balancer/haproxy-extension/src/main/java/org/apache/stratos/haproxy/extension/HAProxyConfigWriter.java +++ b/extensions/load-balancer/haproxy-extension/src/main/java/org/apache/stratos/haproxy/extension/HAProxyConfigWriter.java @@ -57,38 +57,74 @@ public class HAProxyConfigWriter { globalParameters.append("stats socket "); globalParameters.append(statsSocketFilePath); - // Prepare frontend-backend collection - StringBuilder frontendBackendCollection = new StringBuilder(); + // Prepare frontend http collection + StringBuilder frontEndHttp = new StringBuilder(); + // Prepare frontend https collection + StringBuilder frontEndHttps = new StringBuilder(); + // Prepare backend http collection + StringBuilder backEndHttp = new StringBuilder(); + // Prepare backend https collection + StringBuilder backEndHttps = new StringBuilder(); + + String frontEndHttpId = "http_frontend"; + String frontEndHttpsId = "https_frontend"; + boolean frontEndHttpAdded = false; + boolean frontEndHttpsAdded = false; + for (Service service : topology.getServices()) { for (Cluster cluster : service.getClusters()) { if(cluster.getServiceName().equals("haproxy")) continue; - if ((service.getPorts() == null) || (service.getPorts().size() == 0)) { throw new RuntimeException(String.format("No ports found in service: %s", service.getServiceName())); } for (Port port : service.getPorts()) { - String frontendId = cluster.getClusterId() + "-host-" + HAProxyContext.getInstance().getHAProxyPrivateIp() + "-proxy-" + port.getProxy(); - String backendId = frontendId + "-members"; - - // Frontend block - frontendBackendCollection.append("frontend ").append(frontendId).append(NEW_LINE); - frontendBackendCollection.append("\tbind ").append(HAProxyContext.getInstance().getHAProxyPrivateIp()).append(":").append(port.getProxy()).append(NEW_LINE); - frontendBackendCollection.append("\tmode ").append(port.getProtocol()).append(NEW_LINE); - frontendBackendCollection.append("\tdefault_backend ").append(backendId).append(NEW_LINE); - frontendBackendCollection.append(NEW_LINE); - - // Backend block - frontendBackendCollection.append("backend ").append(backendId).append(NEW_LINE); - frontendBackendCollection.append("\tmode ").append(port.getProtocol()).append(NEW_LINE); - for (Member member : cluster.getMembers()) { - frontendBackendCollection.append("\tserver ").append(member.getMemberId()).append(" ") - .append(member.getMemberIp()).append(":").append(port.getValue()).append(NEW_LINE); + if (port.getProtocol().equals("http")){ + if (!frontEndHttpAdded) { + frontEndHttp.append("frontend ").append(frontEndHttpId).append(NEW_LINE); + frontEndHttp.append("\tbind ").append(HAProxyContext.getInstance().getHAProxyPrivateIp()).append(":").append(port.getProxy()).append(NEW_LINE); + frontEndHttp.append("\tmode ").append(port.getProtocol()).append(NEW_LINE); + frontEndHttpAdded = true; + } + + for(String hostname : cluster.getHostNames()) { + frontEndHttp.append("\tacl ").append("is_").append(hostname).append(" hdr_beg(host) -i ").append(hostname).append(NEW_LINE); + frontEndHttp.append("\tuse_backend ").append(hostname).append("-http-members if is_").append(hostname).append(NEW_LINE); + + // Backend block + backEndHttp.append("backend ").append(hostname).append("-http-members").append(NEW_LINE); + backEndHttp.append("\tmode ").append("http").append(NEW_LINE); + for (Member member : cluster.getMembers()) { + backEndHttp.append("\tserver ").append(member.getMemberId()).append(" ") + .append(member.getMemberIp()).append(":").append(port.getValue()).append(NEW_LINE); + } + backEndHttp.append(NEW_LINE); + } + } else if (port.getProtocol().equals("https")){ + if (!frontEndHttpsAdded) { + frontEndHttp.append("frontend ").append(frontEndHttpsId).append(NEW_LINE); + frontEndHttp.append("\tbind ").append(HAProxyContext.getInstance().getHAProxyPrivateIp()).append(":").append(port.getProxy()).append(NEW_LINE); + frontEndHttp.append("\tmode ").append("http").append(NEW_LINE); + frontEndHttpsAdded = true; + } + + for(String hostname : cluster.getHostNames()) { + frontEndHttps.append("\tacl ").append("is_").append(hostname).append(" hdr_beg(host) -i ").append(hostname).append(NEW_LINE); + frontEndHttps.append("\tuse_backend ").append(hostname).append("-https-members if is_").append(hostname).append(NEW_LINE); + + // Backend block + backEndHttps.append("backend ").append(hostname).append("-http-members").append(NEW_LINE); + backEndHttps.append("\tmode ").append("https").append(NEW_LINE); + for (Member member : cluster.getMembers()) { + backEndHttps.append("\tserver ").append(member.getMemberId()).append(" ") + .append(member.getMemberIp()).append(":").append(port.getValue()).append(NEW_LINE); + } + backEndHttps.append(NEW_LINE); + } } - frontendBackendCollection.append(NEW_LINE); } } } @@ -104,7 +140,10 @@ public class HAProxyConfigWriter { // Insert strings into the template VelocityContext context = new VelocityContext(); context.put("global_parameters", globalParameters.toString()); - context.put("frontend_backend_collection", frontendBackendCollection.toString()); + context.put("frontend_http_collection", frontEndHttp.toString()); + context.put("frontend_https_collection", frontEndHttps.toString()); + context.put("backend_http_collection", backEndHttp.toString()); + context.put("backend_https_collection", backEndHttps.toString()); // Create a new string from the template StringWriter stringWriter = new StringWriter(); http://git-wip-us.apache.org/repos/asf/stratos/blob/f2e2c962/extensions/load-balancer/haproxy-extension/src/main/templates/haproxy.cfg.template ---------------------------------------------------------------------- diff --git a/extensions/load-balancer/haproxy-extension/src/main/templates/haproxy.cfg.template b/extensions/load-balancer/haproxy-extension/src/main/templates/haproxy.cfg.template index c58ce87..0c62939 100644 --- a/extensions/load-balancer/haproxy-extension/src/main/templates/haproxy.cfg.template +++ b/extensions/load-balancer/haproxy-extension/src/main/templates/haproxy.cfg.template @@ -9,4 +9,11 @@ defaults timeout client 50000ms timeout server 50000ms -$frontend_backend_collection \ No newline at end of file +$frontend_http_collection + +$frontend_https_collection + +$backend_http_collection + +$backend_https_collection +
