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/05 10:23:23 UTC
[3/3] stratos git commit: Updating load balancer extension according
to the new topology provider model
Updating load balancer extension according to the new topology provider model
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/d8d7ca44
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/d8d7ca44
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/d8d7ca44
Branch: refs/heads/master
Commit: d8d7ca445b8bcde9ef631f359d1106adf2df7d13
Parents: d6fa101
Author: Imesh Gunaratne <im...@apache.org>
Authored: Thu Mar 5 14:52:20 2015 +0530
Committer: Imesh Gunaratne <im...@apache.org>
Committed: Thu Mar 5 14:52:54 2015 +0530
----------------------------------------------------------------------
.../load/balancer/common/domain/Service.java | 36 +++++++-
...LoadBalancerCommonTopologyEventReceiver.java | 26 +++++-
.../common/topology/TopologyProvider.java | 92 ++++++++++++++------
.../balancer/extension/api/LoadBalancer.java | 7 +-
.../extension/api/LoadBalancerExtension.java | 18 ++--
.../conf/LoadBalancerConfiguration.java | 13 ++-
.../stratos/haproxy/extension/HAProxy.java | 86 +++++++++---------
.../haproxy/extension/HAProxyConfigWriter.java | 74 +++++-----------
8 files changed, 213 insertions(+), 139 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/d8d7ca44/components/org.apache.stratos.load.balancer.common/src/main/java/org/apache/stratos/load/balancer/common/domain/Service.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.load.balancer.common/src/main/java/org/apache/stratos/load/balancer/common/domain/Service.java b/components/org.apache.stratos.load.balancer.common/src/main/java/org/apache/stratos/load/balancer/common/domain/Service.java
index 579035b..116078e 100644
--- a/components/org.apache.stratos.load.balancer.common/src/main/java/org/apache/stratos/load/balancer/common/domain/Service.java
+++ b/components/org.apache.stratos.load.balancer.common/src/main/java/org/apache/stratos/load/balancer/common/domain/Service.java
@@ -20,6 +20,7 @@
package org.apache.stratos.load.balancer.common.domain;
import java.util.Collection;
+import java.util.Collections;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -28,15 +29,15 @@ import java.util.concurrent.ConcurrentHashMap;
*/
public class Service {
private final String serviceName;
- private final boolean isMultiTenant;
// Key: Cluster.clusterId
private Map<String, Cluster> clusterIdClusterMap;
+ private Map<Integer, Port> portMap;
private boolean multiTenant;
- public Service(String serviceName, boolean isMultiTenant) {
+ public Service(String serviceName) {
this.serviceName = serviceName;
this.clusterIdClusterMap = new ConcurrentHashMap<String, Cluster>();
- this.isMultiTenant = isMultiTenant;
+ this.portMap = new ConcurrentHashMap<Integer, Port>();
}
public String getServiceName() {
@@ -70,4 +71,33 @@ public class Service {
public void setMultiTenant(boolean multiTenant) {
this.multiTenant = multiTenant;
}
+
+ public Collection<Port> getPorts() {
+ return Collections.unmodifiableCollection(portMap.values());
+ }
+
+ public Port getPort(int proxy) {
+ if(portMap.containsKey(proxy)) {
+ return portMap.get(proxy);
+ }
+ return null;
+ }
+
+ public void addPort(Port port) {
+ this.portMap.put(port.getProxy(), port);
+ }
+
+ public void addPorts(Collection<Port> ports) {
+ for(Port port : ports) {
+ addPort(port);
+ }
+ }
+
+ public void removePort(Port port) {
+ this.portMap.remove(port.getProxy());
+ }
+
+ public boolean portExists(Port port) {
+ return this.portMap.containsKey(port.getProxy());
+ }
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/d8d7ca44/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 326deee..1a4a4b7 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
@@ -22,10 +22,7 @@ package org.apache.stratos.load.balancer.common.event.receivers;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.stratos.load.balancer.common.topology.TopologyProvider;
-import org.apache.stratos.messaging.domain.topology.Cluster;
-import org.apache.stratos.messaging.domain.topology.Member;
-import org.apache.stratos.messaging.domain.topology.MemberStatus;
-import org.apache.stratos.messaging.domain.topology.Service;
+import org.apache.stratos.messaging.domain.topology.*;
import org.apache.stratos.messaging.event.Event;
import org.apache.stratos.messaging.event.topology.*;
import org.apache.stratos.messaging.listener.topology.*;
@@ -263,6 +260,11 @@ public class LoadBalancerCommonTopologyEventReceiver extends TopologyEventReceiv
}
validateHostNames(cluster);
+ // Add service if not exists
+ if(!topologyProvider.serviceExists(serviceName)) {
+ topologyProvider.addService(transformService(service));
+ }
+
// Add cluster if not exists
if(!topologyProvider.clusterExistsByClusterId(cluster.getClusterId())) {
topologyProvider.addCluster(transformCluster(cluster));
@@ -328,6 +330,22 @@ public class LoadBalancerCommonTopologyEventReceiver extends TopologyEventReceiv
}
}
+ private org.apache.stratos.load.balancer.common.domain.Service transformService(Service messagingService) {
+ org.apache.stratos.load.balancer.common.domain.Service service =
+ new org.apache.stratos.load.balancer.common.domain.Service(messagingService.getServiceName());
+ for(Port port : messagingService.getPorts()) {
+ service.addPort(transformPort(port));
+ }
+ return service;
+ }
+
+ private org.apache.stratos.load.balancer.common.domain.Port transformPort(Port messagingPort) {
+ org.apache.stratos.load.balancer.common.domain.Port port =
+ new org.apache.stratos.load.balancer.common.domain.Port(messagingPort.getProtocol(),
+ messagingPort.getValue(), messagingPort.getProxy());
+ return port;
+ }
+
private org.apache.stratos.load.balancer.common.domain.Cluster transformCluster(Cluster messagingCluster) {
org.apache.stratos.load.balancer.common.domain.Cluster cluster =
new org.apache.stratos.load.balancer.common.domain.Cluster(messagingCluster.getServiceName(),
http://git-wip-us.apache.org/repos/asf/stratos/blob/d8d7ca44/components/org.apache.stratos.load.balancer.common/src/main/java/org/apache/stratos/load/balancer/common/topology/TopologyProvider.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.load.balancer.common/src/main/java/org/apache/stratos/load/balancer/common/topology/TopologyProvider.java b/components/org.apache.stratos.load.balancer.common/src/main/java/org/apache/stratos/load/balancer/common/topology/TopologyProvider.java
index 91e6bce..d3e1daf 100644
--- a/components/org.apache.stratos.load.balancer.common/src/main/java/org/apache/stratos/load/balancer/common/topology/TopologyProvider.java
+++ b/components/org.apache.stratos.load.balancer.common/src/main/java/org/apache/stratos/load/balancer/common/topology/TopologyProvider.java
@@ -24,6 +24,8 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.stratos.load.balancer.common.domain.Cluster;
import org.apache.stratos.load.balancer.common.domain.Member;
+import org.apache.stratos.load.balancer.common.domain.Service;
+import org.apache.stratos.load.balancer.common.domain.Topology;
import java.util.Collection;
import java.util.Map;
@@ -36,24 +38,54 @@ public class TopologyProvider {
private static final Log log = LogFactory.getLog(TopologyProvider.class);
+ private Topology topology;
private Map<String, Cluster> clusterIdToClusterMap;
private Map<String, Cluster> hostNameToClusterMap;
private Map<String, Map<Integer, Cluster>> hostNameToTenantIdToClusterMap;
private Map<String, String> memberHostNameToClusterHostNameMap;
public TopologyProvider() {
+ this.topology = new Topology();
this.clusterIdToClusterMap = new ConcurrentHashMap<String, Cluster>();
this.hostNameToClusterMap = new ConcurrentHashMap<String, Cluster>();
this.hostNameToTenantIdToClusterMap = new ConcurrentHashMap<String, Map<Integer, Cluster>>();
this.memberHostNameToClusterHostNameMap = new ConcurrentHashMap<String, String>();
}
+ public boolean serviceExists(String serviceName) {
+ return topology.getService(serviceName) != null;
+ }
+
+ /**
+ * Add service to the topology.
+ * @param service
+ */
+ public void addService(Service service) {
+ if(service != null) {
+ topology.addService(service);
+ log.info(String.format("Service added: [service] %s", service.getServiceName()));
+
+ Collection<Cluster> clusters = service.getClusters();
+ if ((clusters != null) && (clusters.size() > 0)) {
+ for (Cluster cluster : clusters) {
+ addCluster(cluster);
+ }
+ }
+ }
+ }
+
/**
* Add cluster to the topology.
* @param cluster
*/
public void addCluster(Cluster cluster) {
if(cluster != null) {
+ Service service = topology.getService(cluster.getServiceName());
+ if(service == null) {
+ throw new RuntimeException(String.format("Could not add cluster, service not found: [service] %s",
+ cluster.getServiceName()));
+ }
+ service.addCluster(cluster);
clusterIdToClusterMap.put(cluster.getClusterId(), cluster);
for(String hostName : cluster.getHostNames()) {
@@ -75,7 +107,33 @@ public class TopologyProvider {
}
/**
- * Remove cluster.
+ * Add a member to its cluster.
+ * @param member
+ */
+ public void addMember(Member member) {
+ Cluster cluster = getClusterByClusterId(member.getClusterId());
+ if(cluster == null) {
+ log.warn(String.format("Could not add member, cluster not found: [cluster] %s",
+ member.getClusterId()));
+ return;
+ }
+ if(StringUtils.isBlank(member.getHostName())) {
+ log.warn(String.format("Could not add member, member hostname not found: [cluster] %s [member] %s",
+ member.getClusterId(), member.getMemberId()));
+ return;
+ }
+
+ cluster.addMember(member);
+ if((cluster.getHostNames() != null) && (cluster.getHostNames().size() > 0)) {
+ memberHostNameToClusterHostNameMap.put(member.getHostName(), cluster.getHostNames().iterator().next());
+ }
+
+ log.info(String.format("Member added to cluster: [cluster] %s [member] %s",
+ member.getClusterId(), member.getHostName()));
+ }
+
+ /**
+ * Remove cluster from the topology.
* @param clusterId
*/
public void removeCluster(String clusterId) {
@@ -115,7 +173,7 @@ public class TopologyProvider {
}
/**
- * Returns cluster by cluster id.
+ * Get cluster by cluster id.
* @param clusterId
* @return
*/
@@ -196,32 +254,6 @@ public class TopologyProvider {
}
/**
- * Add a member to its cluster.
- * @param member
- */
- public void addMember(Member member) {
- Cluster cluster = getClusterByClusterId(member.getClusterId());
- if(cluster == null) {
- log.warn(String.format("Could not add member, cluster not found: [cluster] %s",
- member.getClusterId()));
- return;
- }
- if(StringUtils.isBlank(member.getHostName())) {
- log.warn(String.format("Could not add member, member hostname not found: [cluster] %s [member] %s",
- member.getClusterId(), member.getMemberId()));
- return;
- }
-
- cluster.addMember(member);
- if((cluster.getHostNames() != null) && (cluster.getHostNames().size() > 0)) {
- memberHostNameToClusterHostNameMap.put(member.getHostName(), cluster.getHostNames().iterator().next());
- }
-
- log.info(String.format("Member added to cluster: [cluster] %s [member] %s",
- member.getClusterId(), member.getHostName()));
- }
-
- /**
* Remove a member from its cluster.
* @param clusterId
* @param memberId
@@ -259,4 +291,8 @@ public class TopologyProvider {
public String getClusterHostname(String memberHostName) {
return memberHostNameToClusterHostNameMap.get(memberHostName);
}
+
+ public Topology getTopology() {
+ return topology;
+ }
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/d8d7ca44/components/org.apache.stratos.load.balancer.extension.api/src/main/java/org/apache/stratos/load/balancer/extension/api/LoadBalancer.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.load.balancer.extension.api/src/main/java/org/apache/stratos/load/balancer/extension/api/LoadBalancer.java b/components/org.apache.stratos.load.balancer.extension.api/src/main/java/org/apache/stratos/load/balancer/extension/api/LoadBalancer.java
index b25a07e..c8dc562 100644
--- a/components/org.apache.stratos.load.balancer.extension.api/src/main/java/org/apache/stratos/load/balancer/extension/api/LoadBalancer.java
+++ b/components/org.apache.stratos.load.balancer.extension.api/src/main/java/org/apache/stratos/load/balancer/extension/api/LoadBalancer.java
@@ -20,7 +20,7 @@
package org.apache.stratos.load.balancer.extension.api;
import org.apache.stratos.load.balancer.extension.api.exception.LoadBalancerExtensionException;
-import org.apache.stratos.messaging.domain.topology.Topology;
+import org.apache.stratos.load.balancer.common.domain.Topology;
/**
* A generic load balancer life-cycle definition.
@@ -47,9 +47,8 @@ public interface LoadBalancer {
void configure(Topology topology) throws LoadBalancerExtensionException;
/**
- * Reload load balancer configuration using the given topology without interrupting the incoming requests.
+ * Reload load balancer configuration using the configuration written in configure() method.
* Throw an exception if the reload operation fails.
- * @param topology
*/
- void reload(Topology topology) throws LoadBalancerExtensionException;
+ void reload() throws LoadBalancerExtensionException;
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/d8d7ca44/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 08903bc..9d82fdb 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
@@ -21,12 +21,13 @@ package org.apache.stratos.load.balancer.extension.api;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.load.balancer.common.event.receivers.LoadBalancerCommonTopologyEventReceiver;
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.messaging.event.Event;
import org.apache.stratos.messaging.listener.topology.*;
import org.apache.stratos.messaging.message.receiver.topology.TopologyEventReceiver;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
import java.util.concurrent.ExecutorService;
@@ -40,9 +41,9 @@ public class LoadBalancerExtension {
private LoadBalancer loadBalancer;
private LoadBalancerStatisticsReader statsReader;
private boolean loadBalancerStarted;
+ private TopologyProvider topologyProvider;
private TopologyEventReceiver topologyEventReceiver;
private LoadBalancerStatisticsNotifier statisticsNotifier;
- private boolean terminated;
private ExecutorService executorService;
/**
@@ -54,6 +55,7 @@ public class LoadBalancerExtension {
public LoadBalancerExtension(LoadBalancer loadBalancer, LoadBalancerStatisticsReader statsReader) {
this.loadBalancer = loadBalancer;
this.statsReader = statsReader;
+ this.topologyProvider = new TopologyProvider();
}
@@ -64,7 +66,7 @@ public class LoadBalancerExtension {
}
// Start topology receiver thread
- topologyEventReceiver = new TopologyEventReceiver();
+ topologyEventReceiver = new LoadBalancerCommonTopologyEventReceiver(topologyProvider);
addEventListeners();
topologyEventReceiver.setExecutorService(executorService);
topologyEventReceiver.execute();
@@ -93,10 +95,9 @@ public class LoadBalancerExtension {
@Override
protected void onEvent(Event event) {
try {
-
if (!loadBalancerStarted) {
// Configure load balancer
- loadBalancer.configure(TopologyManager.getTopology());
+ loadBalancer.configure(topologyProvider.getTopology());
// Start load balancer
loadBalancer.start();
@@ -145,7 +146,11 @@ public class LoadBalancerExtension {
private void reloadConfiguration() {
try {
if (loadBalancerStarted) {
- loadBalancer.reload(TopologyManager.getTopology());
+ // Configure load balancer
+ loadBalancer.configure(topologyProvider.getTopology());
+
+ // Reload the load balancer
+ loadBalancer.reload();
}
} catch (Exception e) {
if (log.isErrorEnabled()) {
@@ -161,7 +166,6 @@ public class LoadBalancerExtension {
if (statisticsNotifier != null) {
statisticsNotifier.terminate();
}
- terminated = true;
}
public ExecutorService getExecutorService() {
http://git-wip-us.apache.org/repos/asf/stratos/blob/d8d7ca44/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/conf/LoadBalancerConfiguration.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/conf/LoadBalancerConfiguration.java b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/conf/LoadBalancerConfiguration.java
index 658ce54..9ea21e9 100644
--- a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/conf/LoadBalancerConfiguration.java
+++ b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/conf/LoadBalancerConfiguration.java
@@ -26,6 +26,7 @@ import org.apache.stratos.common.constants.StratosConstants;
import org.apache.stratos.load.balancer.common.domain.Cluster;
import org.apache.stratos.load.balancer.common.domain.Member;
import org.apache.stratos.load.balancer.common.domain.Port;
+import org.apache.stratos.load.balancer.common.domain.Service;
import org.apache.stratos.load.balancer.common.topology.TopologyProvider;
import org.apache.stratos.load.balancer.conf.domain.Algorithm;
import org.apache.stratos.load.balancer.conf.domain.MemberIpType;
@@ -464,7 +465,10 @@ public class LoadBalancerConfiguration {
String serviceName = serviceNode.getName();
Node clustersNode = serviceNode.findChildNodeByName(Constants.CONF_ELEMENT_CLUSTERS);
+ Service service = new Service(serviceName);
+ service.setMultiTenant(isMultiTenant);
+ // Process clusters
for (Node clusterNode : clustersNode.getChildNodes()) {
String clusterId = clusterNode.getName();
Cluster cluster = new Cluster(serviceName, clusterId);
@@ -494,6 +498,7 @@ public class LoadBalancerConfiguration {
Node membersNode = clusterNode.findChildNodeByName(Constants.CONF_ELEMENT_MEMBERS);
validateRequiredNode(membersNode, Constants.CONF_ELEMENT_MEMBERS, String.format("cluster %s", clusterId));
+ // Process members
for (Node memberNode : membersNode.getChildNodes()) {
String memberId = memberNode.getName();
// we are making it as 1 because we are not using this for static loadbalancer configuration
@@ -515,11 +520,17 @@ public class LoadBalancerConfiguration {
Port port = new Port(portNode.getName(), Integer.valueOf(value), Integer.valueOf(proxy));
member.addPort(port);
}
+
+ // Add member to the cluster
cluster.addMember(member);
}
+
// Add cluster to service
- topologyProvider.addCluster(cluster);
+ service.addCluster(cluster);
}
+
+ // Add service to the topology provider
+ topologyProvider.addService(service);
}
configuration.setTopologyProvider(topologyProvider);
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/d8d7ca44/extensions/load-balancer/haproxy-extension/src/main/java/org/apache/stratos/haproxy/extension/HAProxy.java
----------------------------------------------------------------------
diff --git a/extensions/load-balancer/haproxy-extension/src/main/java/org/apache/stratos/haproxy/extension/HAProxy.java b/extensions/load-balancer/haproxy-extension/src/main/java/org/apache/stratos/haproxy/extension/HAProxy.java
index c71eba1..4ba79ff 100644
--- a/extensions/load-balancer/haproxy-extension/src/main/java/org/apache/stratos/haproxy/extension/HAProxy.java
+++ b/extensions/load-balancer/haproxy-extension/src/main/java/org/apache/stratos/haproxy/extension/HAProxy.java
@@ -24,7 +24,7 @@ import org.apache.commons.logging.LogFactory;
import org.apache.stratos.common.util.CommandUtils;
import org.apache.stratos.load.balancer.extension.api.LoadBalancer;
import org.apache.stratos.load.balancer.extension.api.exception.LoadBalancerExtensionException;
-import org.apache.stratos.messaging.domain.topology.Topology;
+import org.apache.stratos.load.balancer.common.domain.Topology;
import java.io.BufferedReader;
import java.io.File;
@@ -35,8 +35,8 @@ import java.util.Vector;
* HAProxy load balancer life-cycle implementation.
*/
public class HAProxy implements LoadBalancer {
+
private static final Log log = LogFactory.getLog(HAProxy.class);
- private static final String NEW_LINE = System.getProperty("line.separator");
private String executableFilePath;
private String processIdFilePath;
@@ -54,43 +54,11 @@ public class HAProxy implements LoadBalancer {
this.statsSocketFilePath = HAProxyContext.getInstance().getStatsSocketFilePath();
}
- private void reloadConfiguration() throws LoadBalancerExtensionException {
-
- try {
- if (log.isInfoEnabled()) {
- log.info("Reloading configuration...");
- }
-
- // Read pid
- String pid = "";
- BufferedReader reader = new BufferedReader(new FileReader(processIdFilePath));
- String line;
- while ((line = reader.readLine()) != null) {
- pid += line + " ";
- }
-
- // Execute hot configuration deployment
- String command = executableFilePath + " -f " + confFilePath + " -p " + processIdFilePath + " -sf " + pid;
- CommandUtils.executeCommand(command);
- if (log.isInfoEnabled()) {
- log.info("Configuration done");
- }
- } catch (Exception e) {
- if (log.isErrorEnabled()) {
- log.error("Reconfiguration failed");
- }
- throw new LoadBalancerExtensionException(e);
- }
- }
-
- public void reload(Topology topology) throws LoadBalancerExtensionException {
- if(log.isDebugEnabled()) {
- log.info("Reconfigure and Reload the Load Balancer ");
- }
- configure(topology);
- reloadConfiguration();
- }
-
+ /**
+ * Configure haproxy instance according to topology given
+ * @param topology
+ * @throws LoadBalancerExtensionException
+ */
public void configure(Topology topology) throws LoadBalancerExtensionException {
try {
@@ -112,6 +80,10 @@ public class HAProxy implements LoadBalancer {
}
}
+ /**
+ * Start haproxy instance
+ * @throws LoadBalancerExtensionException
+ */
public void start() throws LoadBalancerExtensionException {
// Check for configuration file
@@ -135,6 +107,42 @@ public class HAProxy implements LoadBalancer {
}
}
+ /**
+ * Reload haproxy instance according to the configuration written in configure() method.
+ * @throws LoadBalancerExtensionException
+ */
+ public void reload() throws LoadBalancerExtensionException {
+ try {
+ if (log.isInfoEnabled()) {
+ log.info("Reloading configuration...");
+ }
+
+ // Read pid
+ String pid = "";
+ BufferedReader reader = new BufferedReader(new FileReader(processIdFilePath));
+ String line;
+ while ((line = reader.readLine()) != null) {
+ pid += line + " ";
+ }
+
+ // Execute hot configuration deployment
+ String command = executableFilePath + " -f " + confFilePath + " -p " + processIdFilePath + " -sf " + pid;
+ CommandUtils.executeCommand(command);
+ if (log.isInfoEnabled()) {
+ log.info("Configuration done");
+ }
+ } catch (Exception e) {
+ if (log.isErrorEnabled()) {
+ log.error("Reconfiguration failed");
+ }
+ throw new LoadBalancerExtensionException(e);
+ }
+ }
+
+ /**
+ * Stop haproxy instance
+ * @throws LoadBalancerExtensionException
+ */
public void stop() throws LoadBalancerExtensionException {
try {
http://git-wip-us.apache.org/repos/asf/stratos/blob/d8d7ca44/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 45feb6a..a9f7796 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
@@ -19,10 +19,9 @@
package org.apache.stratos.haproxy.extension;
-import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.messaging.domain.topology.*;
+import org.apache.stratos.load.balancer.common.domain.*;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
@@ -37,6 +36,7 @@ import java.io.StringWriter;
* HAProxy load balancer configuration writer.
*/
public class HAProxyConfigWriter {
+
private static final Log log = LogFactory.getLog(Main.class);
private static final String NEW_LINE = System.getProperty("line.separator");
@@ -57,10 +57,9 @@ public class HAProxyConfigWriter {
private String frontEndHttpId, frontEndHttpsId;
private boolean frontEndHttpAdded, frontEndHttpsAdded;
- private String loadBalancerType; // Load Balancer type (default, service aware, static)
- private String loadBalancedServiceType; // Service type if load balancer is a service aware
+ public HAProxyConfigWriter(String templatePath, String templateName, String confFilePath,
+ String statsSocketFilePath) {
- public HAProxyConfigWriter(String templatePath, String templateName, String confFilePath, String statsSocketFilePath) {
this.templatePath = templatePath;
this.templateName = templateName;
this.confFilePath = confFilePath;
@@ -79,41 +78,8 @@ public class HAProxyConfigWriter {
frontEndHttpsAdded = false;
for (Service service : topology.getServices()) {
- if (service.getServiceName().equals(HAProxyContext.getInstance().getServiceName())) {
- for (Cluster cluster : service.getClusters()) {
- if (cluster.getClusterId().equals(HAProxyContext.getInstance().getClusterId())) {
- if ((cluster.getProperties().getProperty(Constants.LOAD_BALANCER) != null) && (cluster.getProperties().getProperty(Constants.LOAD_BALANCER_REF) != null)) {
- loadBalancerType = cluster.getProperties().getProperty(Constants.LOAD_BALANCER_REF);
- if (cluster.getProperties().getProperty(Constants.LB_SERVICE_TYPE) != null)
- loadBalancedServiceType = cluster.getProperties().getProperty(Constants.LB_SERVICE_TYPE);
- break;
- } else {
- loadBalancerType = Constants.STATIC_LOAD_BALANCER;
- log.debug("Static load balancer");
- break;
- }
- }
- }
- }
- }
-
- for (Service service : topology.getServices()) {
for (Cluster cluster : service.getClusters()) {
- if (cluster.getProperties().getProperty(Constants.LOAD_BALANCER) == null) {
- if ((cluster.getProperties().getProperty(Constants.LOAD_BALANCER_REF) != null)) {
- if ((cluster.getProperties().getProperty(Constants.LOAD_BALANCER_REF).equals(Constants.NO_LOAD_BALANCER)) &&
- Constants.STATIC_LOAD_BALANCER.equals(loadBalancerType) && cluster.getServiceName().equals(HAProxyContext.getInstance().getLbserviceType())) {
- createConfig(service, cluster);
- } else if ((cluster.getProperties().getProperty(Constants.LOAD_BALANCER_REF).equals(Constants.DEFAULT_LOAD_BALANCER)) &&
- Constants.DEFAULT_LOAD_BALANCER.equals(loadBalancerType)) {
- createConfig(service, cluster);
- } else if ((cluster.getProperties().getProperty(Constants.LOAD_BALANCER_REF).equals(Constants.SERVICE_LOAD_BALANCER)) &&
- Constants.SERVICE_LOAD_BALANCER.equals(loadBalancerType) &&
- cluster.getServiceName().equals(loadBalancedServiceType)) {
- createConfig(service, cluster);
- }
- }
- }
+ createConfig(service, cluster);
}
}
@@ -164,46 +130,48 @@ public class HAProxyConfigWriter {
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("\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);
+ 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()) {
- if (member.getNetworkPartitionId().equals(HAProxyContext.getInstance().getNetworkPartitionId())) {
- backEndHttp.append("\tserver ").append(member.getMemberId()).append(" ")
- .append(member.getDefaultPrivateIP()).append(":").append(port.getValue()).append(NEW_LINE);
- }
+ 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("\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);
+ 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()) {
- if (member.getNetworkPartitionId().equals(HAProxyContext.getInstance().getNetworkPartitionId())) {
- backEndHttps.append("\tserver ").append(member.getMemberId()).append(" ")
- .append(member.getDefaultPrivateIP()).append(":").append(port.getValue()).append(NEW_LINE);
- }
+ backEndHttps.append("\tserver ").append(member.getMemberId()).append(" ")
+ .append(member.getHostName()).append(":").append(port.getValue()).append(NEW_LINE);
}
backEndHttps.append(NEW_LINE);
}