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