Repository: stratos Updated Branches: refs/heads/master a46859352 -> e97b95ce4
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/e97b95ce Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/e97b95ce Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/e97b95ce Branch: refs/heads/master Commit: e97b95ce4c0c082060afc357746034947eb085e7 Parents: a468593 Author: Dinesh Bandara <[email protected]> Authored: Thu Jul 10 09:49:22 2014 +0530 Committer: Dinesh Bandara <[email protected]> Committed: Thu Jul 10 09:49:22 2014 +0530 ---------------------------------------------------------------------- .../haproxy/extension/HAProxyConfigWriter.java | 81 +++++++++++++++----- .../extension/HAProxyStatisticsReader.java | 39 +++++----- .../src/main/templates/haproxy.cfg.template | 9 ++- 3 files changed, 87 insertions(+), 42 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/e97b95ce/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/e97b95ce/extensions/load-balancer/haproxy-extension/src/main/java/org/apache/stratos/haproxy/extension/HAProxyStatisticsReader.java ---------------------------------------------------------------------- diff --git a/extensions/load-balancer/haproxy-extension/src/main/java/org/apache/stratos/haproxy/extension/HAProxyStatisticsReader.java b/extensions/load-balancer/haproxy-extension/src/main/java/org/apache/stratos/haproxy/extension/HAProxyStatisticsReader.java index 676f522..f564e7c 100644 --- a/extensions/load-balancer/haproxy-extension/src/main/java/org/apache/stratos/haproxy/extension/HAProxyStatisticsReader.java +++ b/extensions/load-balancer/haproxy-extension/src/main/java/org/apache/stratos/haproxy/extension/HAProxyStatisticsReader.java @@ -60,28 +60,27 @@ public class HAProxyStatisticsReader implements LoadBalancerStatisticsReader { } for (Port port : service.getPorts()) { - frontendId = cluster.getClusterId() + "-host-" + HAProxyContext.getInstance().getHAProxyPrivateIp() + "-proxy-" + port.getProxy(); - //frontendId = cluster.getClusterId() + "-proxy-" + port.getProxy(); - backendId = frontendId + "-members"; - - for (Member member : cluster.getMembers()) { - // echo "get weight <backend>/<server>" | socat stdio <stats-socket> - command = String.format("%s/get-weight.sh %s %s %s", scriptsPath, backendId, member.getMemberId(), statsSocketFilePath); - try { - output = CommandUtils.executeCommand(command); - if ((output != null) && (output.length() > 0)) { - array = output.split(" "); - if ((array != null) && (array.length > 0)) { - weight = Integer.parseInt(array[0]); - if (log.isDebugEnabled()) { - log.debug(String.format("Member weight found: [cluster] %s [member] %s [weight] %d", member.getClusterId(), member.getMemberId(), weight)); + for(String hostname : cluster.getHostNames()) { + backendId = hostname+"-http-members"; + for (Member member : cluster.getMembers()) { + // echo "get weight <backend>/<server>" | socat stdio <stats-socket> + command = String.format("%s/get-weight.sh %s %s %s", scriptsPath, backendId, member.getMemberId(), statsSocketFilePath); + try { + output = CommandUtils.executeCommand(command); + if ((output != null) && (output.length() > 0)) { + array = output.split(" "); + if ((array != null) && (array.length > 0)) { + weight = Integer.parseInt(array[0]); + if (log.isDebugEnabled()) { + log.debug(String.format("Member weight found: [cluster] %s [member] %s [weight] %d", member.getClusterId(), member.getMemberId(), weight)); + } + totalWeight += weight; } - totalWeight += weight; } - } - } catch (IOException e) { - if (log.isErrorEnabled()) { - log.error(e); + } catch (IOException e) { + if (log.isErrorEnabled()) { + log.error(e); + } } } } http://git-wip-us.apache.org/repos/asf/stratos/blob/e97b95ce/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 +
