You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by di...@apache.org on 2014/07/10 06:20:00 UTC

git commit: Fixing STRATOS-703 - HAProxy route to same server even there are multiple clusters

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 <di...@wso2.com>
Authored: Thu Jul 10 09:49:22 2014 +0530
Committer: Dinesh Bandara <di...@wso2.com>
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
+