You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by im...@apache.org on 2015/03/08 06:49:39 UTC

stratos git commit: Fixing haproxy extension frontend/backend configuration to support any transport

Repository: stratos
Updated Branches:
  refs/heads/master de00e1fa3 -> 7c7510c6d


Fixing haproxy extension frontend/backend configuration to support any transport


Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/7c7510c6
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/7c7510c6
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/7c7510c6

Branch: refs/heads/master
Commit: 7c7510c6dacba4d0e026210d664d0f406f6f7cdf
Parents: de00e1f
Author: Imesh Gunaratne <im...@apache.org>
Authored: Sun Mar 8 11:19:23 2015 +0530
Committer: Imesh Gunaratne <im...@apache.org>
Committed: Sun Mar 8 11:19:23 2015 +0530

----------------------------------------------------------------------
 ...LoadBalancerCommonTopologyEventReceiver.java |   6 +-
 .../extension/api/LoadBalancerExtension.java    |  67 +++++++-----
 .../haproxy/extension/HAProxyConfigWriter.java  | 103 ++++++-------------
 .../src/main/templates/haproxy.cfg.template     |   6 +-
 4 files changed, 85 insertions(+), 97 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/7c7510c6/components/org.apache.stratos.load.balancer.common/src/main/java/org/apache/stratos/load/balancer/common/event/receivers/LoadBalancerCommonTopologyEventReceiver.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.load.balancer.common/src/main/java/org/apache/stratos/load/balancer/common/event/receivers/LoadBalancerCommonTopologyEventReceiver.java b/components/org.apache.stratos.load.balancer.common/src/main/java/org/apache/stratos/load/balancer/common/event/receivers/LoadBalancerCommonTopologyEventReceiver.java
index 88be323..5a5c014 100644
--- a/components/org.apache.stratos.load.balancer.common/src/main/java/org/apache/stratos/load/balancer/common/event/receivers/LoadBalancerCommonTopologyEventReceiver.java
+++ b/components/org.apache.stratos.load.balancer.common/src/main/java/org/apache/stratos/load/balancer/common/event/receivers/LoadBalancerCommonTopologyEventReceiver.java
@@ -60,17 +60,21 @@ public class LoadBalancerCommonTopologyEventReceiver extends TopologyEventReceiv
         }
 
         try {
+            boolean membersFound = false;
             TopologyManager.acquireReadLock();
             for (Service service : TopologyManager.getTopology().getServices()) {
                 for (Cluster cluster : service.getClusters()) {
                     for (Member member : cluster.getMembers()) {
                         if (member.getStatus() == MemberStatus.Active) {
                             addMember(cluster.getServiceName(), member.getClusterId(), member.getMemberId());
+                            membersFound = true;
                         }
                     }
                 }
             }
-            initialized = true;
+            if(membersFound) {
+                initialized = true;
+            }
         } catch (Exception e) {
             log.error("Error processing complete topology event", e);
         } finally {

http://git-wip-us.apache.org/repos/asf/stratos/blob/7c7510c6/components/org.apache.stratos.load.balancer.extension.api/src/main/java/org/apache/stratos/load/balancer/extension/api/LoadBalancerExtension.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.load.balancer.extension.api/src/main/java/org/apache/stratos/load/balancer/extension/api/LoadBalancerExtension.java b/components/org.apache.stratos.load.balancer.extension.api/src/main/java/org/apache/stratos/load/balancer/extension/api/LoadBalancerExtension.java
index ef2dc5b..fe0c199 100644
--- a/components/org.apache.stratos.load.balancer.extension.api/src/main/java/org/apache/stratos/load/balancer/extension/api/LoadBalancerExtension.java
+++ b/components/org.apache.stratos.load.balancer.extension.api/src/main/java/org/apache/stratos/load/balancer/extension/api/LoadBalancerExtension.java
@@ -30,6 +30,7 @@ import org.apache.stratos.load.balancer.common.event.receivers.LoadBalancerCommo
 import org.apache.stratos.load.balancer.common.statistics.LoadBalancerStatisticsReader;
 import org.apache.stratos.load.balancer.common.statistics.notifier.LoadBalancerStatisticsNotifier;
 import org.apache.stratos.load.balancer.common.topology.TopologyProvider;
+import org.apache.stratos.load.balancer.extension.api.exception.LoadBalancerExtensionException;
 import org.apache.stratos.messaging.event.Event;
 import org.apache.stratos.messaging.listener.topology.*;
 import org.apache.stratos.messaging.message.filter.topology.TopologyClusterFilter;
@@ -92,8 +93,8 @@ public class LoadBalancerExtension {
 					log.warn("Load balancer statistics reader not found");
 				}
 			}
-
-		} catch (Exception e) {
+            log.info("Waiting for complete topology event...");
+        } catch (Exception e) {
 			if (log.isErrorEnabled()) {
 				log.error("Could not start load balancer extension", e);
 			}
@@ -153,18 +154,7 @@ public class LoadBalancerExtension {
             protected void onEvent(Event event) {
                 try {
                     if (!loadBalancerStarted) {
-                        // Initialize topology
-                        if(!topologyEventReceiver.isInitialized()) {
-                            topologyEventReceiver.initializeTopology();
-                        }
-
-                        // Configure load balancer
-                        Topology topology = topologyProvider.getTopology();
-                        if(topologyPopulated(topology) && loadBalancer.configure(topology)) {
-                            // Start load balancer
-                            loadBalancer.start();
-                            loadBalancerStarted = true;
-                        }
+                        configureAndStart();
                     }
                 } catch (Exception e) {
                     if (log.isErrorEnabled()) {
@@ -174,13 +164,13 @@ public class LoadBalancerExtension {
                 }
             }
         });
-		topologyEventReceiver.addEventListener(new MemberActivatedEventListener() {
+        topologyEventReceiver.addEventListener(new MemberActivatedEventListener() {
             @Override
             protected void onEvent(Event event) {
                 reloadConfiguration();
             }
         });
-		topologyEventReceiver.addEventListener(new MemberSuspendedEventListener() {
+        topologyEventReceiver.addEventListener(new MemberSuspendedEventListener() {
             @Override
             protected void onEvent(Event event) {
                 reloadConfiguration();
@@ -207,6 +197,37 @@ public class LoadBalancerExtension {
 	}
 
     /**
+     * Configure and start load balancer
+     * @throws LoadBalancerExtensionException
+     */
+    private void configureAndStart() throws LoadBalancerExtensionException {
+        // Initialize topology
+        if(!topologyEventReceiver.isInitialized()) {
+            topologyEventReceiver.initializeTopology();
+        }
+
+        // Configure load balancer
+        Topology topology = topologyProvider.getTopology();
+        if(topologyPopulated(topology) && loadBalancer.configure(topology)) {
+            // Start load balancer
+            loadBalancer.start();
+            loadBalancerStarted = true;
+        }
+    }
+
+    /**
+     * Configure and reload
+     * @throws LoadBalancerExtensionException
+     */
+    private void configureAndReload() throws LoadBalancerExtensionException {
+        // Configure load balancer
+        if(loadBalancer.configure(topologyProvider.getTopology())) {
+            // Reload the load balancer
+            loadBalancer.reload();
+        }
+    }
+
+    /**
      * Returns true if topology has populated
      * @param topology
      * @return
@@ -227,13 +248,13 @@ public class LoadBalancerExtension {
      */
     private void reloadConfiguration() {
 		try {
-			if (loadBalancerStarted) {
-                // Configure load balancer
-                if(loadBalancer.configure(topologyProvider.getTopology())) {
-                    // Reload the load balancer
-                    loadBalancer.reload();
-                }
-			}
+            if (!loadBalancerStarted) {
+                configureAndStart();
+            }
+			else {
+                configureAndReload();
+
+            }
 		} catch (Exception e) {
 			if (log.isErrorEnabled()) {
 				log.error("Could not reload load balancer configuration", e);

http://git-wip-us.apache.org/repos/asf/stratos/blob/7c7510c6/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 01d2ee3..d3ed8ef 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
@@ -45,18 +45,6 @@ public class HAProxyConfigWriter {
     private String confFilePath;
     private String statsSocketFilePath;
 
-    // Prepare frontend http collection
-    private StringBuilder frontEndHttp = new StringBuilder();
-    // Prepare frontend https collection
-    private StringBuilder frontEndHttps = new StringBuilder();
-    // Prepare backend http collection
-    private StringBuilder backEndHttp = new StringBuilder();
-    // Prepare backend https collection
-    private StringBuilder backEndHttps = new StringBuilder();
-
-    private String frontEndHttpId, frontEndHttpsId;
-    private boolean frontEndHttpAdded, frontEndHttpsAdded;
-
     public HAProxyConfigWriter(String templatePath, String templateName, String confFilePath,
                                String statsSocketFilePath) {
 
@@ -72,14 +60,12 @@ public class HAProxyConfigWriter {
         globalParameters.append("stats socket ");
         globalParameters.append(statsSocketFilePath);
 
-        frontEndHttpId = "http_frontend";
-        frontEndHttpsId = "https_frontend";
-        frontEndHttpAdded = false;
-        frontEndHttpsAdded = false;
+        StringBuilder frontendCollection = new StringBuilder();
+        StringBuilder backendCollection = new StringBuilder();
 
         for (Service service : topology.getServices()) {
             for (Cluster cluster : service.getClusters()) {
-                createConfig(service, cluster);
+                createConfig(service, cluster, frontendCollection, backendCollection);
             }
         }
 
@@ -94,10 +80,8 @@ public class HAProxyConfigWriter {
         // Insert strings into the template
         VelocityContext context = new VelocityContext();
         context.put("global_parameters", globalParameters.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());
+        context.put("frontend_collection", frontendCollection.toString());
+        context.put("backend_collection", backendCollection.toString());
 
         // Create a new string from the template
         StringWriter stringWriter = new StringWriter();
@@ -122,60 +106,41 @@ public class HAProxyConfigWriter {
         }
     }
 
-    private void createConfig(Service service, Cluster cluster) {
+    private void createConfig(Service service, Cluster cluster, StringBuilder frontendCollection,
+                              StringBuilder backendCollection) {
+
         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()) {
-            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.getHostName()).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.getHostName()).append(":").append(port.getValue()).append(NEW_LINE);
-                    }
-                    backEndHttps.append(NEW_LINE);
+            // Frontend block start
+            String protocol = port.getProtocol();
+            String frontendId = protocol + "_" + port.getValue() + "_frontend";
+
+            frontendCollection.append("frontend ").append(frontendId).append(NEW_LINE);
+            frontendCollection.append("\tbind ").append(HAProxyContext.getInstance().getHAProxyPrivateIp())
+                    .append(":").append(port.getProxy()).append(NEW_LINE);
+            frontendCollection.append("\tmode ").append(protocol).append(NEW_LINE);
+
+            for (String hostname : cluster.getHostNames()) {
+                String backendId = hostname + "_" + protocol + "_" + port.getValue() + "_backend";
+
+                frontendCollection.append("\tacl ").append("is_").append(hostname).append(" hdr_beg(host) -i ")
+                        .append(hostname).append(NEW_LINE);
+                frontendCollection.append("\tuse_backend ").append(backendId).append(" if is_")
+                        .append(hostname).append(NEW_LINE);
+                // Front end block end
+
+                // Backend block start
+                backendCollection.append("backend ").append(backendId).append(NEW_LINE);
+                backendCollection.append("\tmode ").append(protocol).append(NEW_LINE);
+                for (Member member : cluster.getMembers()) {
+                    backendCollection.append("\tserver ").append(member.getMemberId()).append(" ")
+                            .append(member.getHostName()).append(":").append(port.getValue()).append(NEW_LINE);
                 }
+                backendCollection.append(NEW_LINE);
+                // Backend block end
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/7c7510c6/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 0c62939..bee3471 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,11 +9,9 @@ defaults
     timeout client 50000ms
     timeout server 50000ms
 
-$frontend_http_collection
+$frontend_collection
 
-$frontend_https_collection
+$backend_collection
 
-$backend_http_collection
 
-$backend_https_collection