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 <[email protected]> Authored: Sun Mar 8 11:19:23 2015 +0530 Committer: Imesh Gunaratne <[email protected]> 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
