Updated Branches:
  refs/heads/master 24101ae18 -> 8e2cec750

Improved error handling in load balancer extension api


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

Branch: refs/heads/master
Commit: 8e2cec75065f7774cb0a08554f6776a874572239
Parents: 24101ae
Author: Imesh Gunaratne <[email protected]>
Authored: Fri Nov 15 17:07:47 2013 +0530
Committer: Imesh Gunaratne <[email protected]>
Committed: Fri Nov 15 17:07:47 2013 +0530

----------------------------------------------------------------------
 .../statistics/WSO2CEPStatsPublisher.java       |   9 +-
 .../balancer/extension/api/LoadBalancer.java    |  15 ++-
 .../extension/api/LoadBalancerExtension.java    |  56 +++++----
 .../api/LoadBalancerStatsNotifier.java          |   2 +-
 .../LoadBalancerExtensionException.java         |  41 ++++++
 .../haproxy-extension/src/main/assembly/bin.xml |   8 ++
 .../src/main/bin/haproxy-extension.sh           |  13 +-
 .../stratos/haproxy/extension/HAProxy.java      | 126 ++++++++++---------
 .../haproxy/extension/HAProxyConfigWriter.java  |   8 +-
 .../src/main/security/client-truststore.jks     | Bin 0 -> 35240 bytes
 .../src/main/templates/haproxy.cfg.template     |   1 +
 .../distribution/src/main/bin/stratos.bat       |   2 +-
 .../distribution/src/main/bin/stratos.sh        |   4 +-
 13 files changed, 186 insertions(+), 99 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/8e2cec75/components/org.apache.stratos.load.balancer.common/src/main/java/org/apache/stratos/load/balancer/common/statistics/WSO2CEPStatsPublisher.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.load.balancer.common/src/main/java/org/apache/stratos/load/balancer/common/statistics/WSO2CEPStatsPublisher.java
 
b/components/org.apache.stratos.load.balancer.common/src/main/java/org/apache/stratos/load/balancer/common/statistics/WSO2CEPStatsPublisher.java
index 2d41242..a5685a0 100644
--- 
a/components/org.apache.stratos.load.balancer.common/src/main/java/org/apache/stratos/load/balancer/common/statistics/WSO2CEPStatsPublisher.java
+++ 
b/components/org.apache.stratos.load.balancer.common/src/main/java/org/apache/stratos/load/balancer/common/statistics/WSO2CEPStatsPublisher.java
@@ -43,16 +43,13 @@ public class WSO2CEPStatsPublisher implements 
LoadBalancerStatsPublisher {
 
     public WSO2CEPStatsPublisher() {
         AgentConfiguration agentConfiguration = new AgentConfiguration();
-        // TODO get following from somewhere, without hard-coding.
-        System.setProperty("javax.net.ssl.trustStore", 
CarbonUtils.getCarbonHome()+ File.separator+"repository"+
-                
File.separator+"resources"+File.separator+"security"+File.separator+"client-truststore.jks"
    );
-        System.setProperty("javax.net.ssl.trustStorePassword", "wso2carbon");
-
         Agent agent = new Agent(agentConfiguration);
+
         //TODO read following from a config file?
         String ip = System.getProperty("thrift.receiver.ip");
         String port = System.getProperty("thrift.receiver.port");
-        //Using Asynchronous data publisher
+
+        // Using asynchronous data publisher
         asyncDataPublisher = new AsyncDataPublisher("tcp://"+ip+":"+port+"", 
"admin", "admin", agent);
         String streamDefinition = "{" +
                 " 'name':'" + CALL_CENTER_DATA_STREAM + "'," +

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/8e2cec75/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 9bd3881..b25a07e 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
@@ -19,6 +19,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;
 
 /**
@@ -28,23 +29,27 @@ public interface LoadBalancer {
 
     /**
      * Start a new load balancer instance.
+     * Throw an exception if the start operation fails.
      */
-    void start();
+    void start() throws LoadBalancerExtensionException;
 
     /**
-     * Stop the running load balancer instance.
+     * Stop running load balancer instance.
+     * Throw an exception if the stop operation fails.
      */
-    void stop();
+    void stop() throws LoadBalancerExtensionException;
 
     /**
      * Configure the load balancer using the given topology.
+     * Throw an exception is the configure operation fails.
      * @param topology
      */
-    void configure(Topology topology);
+    void configure(Topology topology) throws LoadBalancerExtensionException;
 
     /**
      * Reload load balancer configuration using the given topology without 
interrupting the incoming requests.
+     * Throw an exception if the reload operation fails.
      * @param topology
      */
-    void reload(Topology topology);
+    void reload(Topology topology) throws LoadBalancerExtensionException;
 }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/8e2cec75/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 b1118d5..63df3b7 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,20 +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.statistics.LoadBalancerStatsPublisher;
-import 
org.apache.stratos.load.balancer.common.statistics.WSO2CEPStatsPublisher;
 import org.apache.stratos.load.balancer.common.topology.TopologyReceiver;
-import org.apache.stratos.messaging.domain.topology.Cluster;
-import org.apache.stratos.messaging.domain.topology.Service;
 import org.apache.stratos.messaging.event.Event;
 import org.apache.stratos.messaging.event.topology.*;
 import 
org.apache.stratos.messaging.message.processor.topology.TopologyEventProcessorChain;
 import 
org.apache.stratos.messaging.message.receiver.topology.TopologyEventMessageDelegator;
 import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
 
-import java.util.HashMap;
-import java.util.Map;
-
 /**
  * Load balancer extension thread for executing load balancer life-cycle 
according to the topology updates
  * received from the message broker.
@@ -44,6 +37,7 @@ public class LoadBalancerExtension implements Runnable {
 
     private LoadBalancer loadBalancer;
     private LoadBalancerStatsReader statsReader;
+    private boolean loadBalancerStarted;
 
     public LoadBalancerExtension(LoadBalancer loadBalancer, 
LoadBalancerStatsReader statsReader) {
         this.loadBalancer = loadBalancer;
@@ -65,9 +59,8 @@ public class LoadBalancerExtension implements Runnable {
 
         } catch (Exception e) {
             if (log.isErrorEnabled()) {
-                log.error(e);
+                log.error("Could not start load balancer extension", e);
             }
-            loadBalancer.stop();
         }
     }
 
@@ -78,15 +71,23 @@ public class LoadBalancerExtension implements Runnable {
 
             @Override
             protected void onEvent(Event event) {
-                // Configure load balancer
-                loadBalancer.configure(TopologyManager.getTopology());
+                try {
+                    // Configure load balancer
+                    loadBalancer.configure(TopologyManager.getTopology());
 
-                // Start load balancer
-                loadBalancer.start();
+                    // Start load balancer
+                    loadBalancer.start();
+                    loadBalancerStarted = true;
 
-                // Complete topology event is only received once
-                // Remove event listener
-                messageDelegator.removeCompleteTopologyEventListener(this);
+                    // Complete topology event is only received once
+                    // Remove event listener
+                    messageDelegator.removeCompleteTopologyEventListener(this);
+                }
+                catch (Exception e) {
+                    if(log.isErrorEnabled()) {
+                        log.error("Could not start load balancer", e);
+                    }
+                }
             }
         });
         return messageDelegator;
@@ -97,33 +98,46 @@ public class LoadBalancerExtension implements Runnable {
         processorChain.addEventListener(new MemberActivatedEventListener() {
             @Override
             protected void onEvent(Event event) {
-                loadBalancer.reload(TopologyManager.getTopology());
+                reloadConfiguration();
             }
         });
         processorChain.addEventListener(new MemberSuspendedEventListener() {
             @Override
             protected void onEvent(Event event) {
-                loadBalancer.reload(TopologyManager.getTopology());
+                reloadConfiguration();
             }
         });
         processorChain.addEventListener(new MemberTerminatedEventListener() {
             @Override
             protected void onEvent(Event event) {
-                loadBalancer.reload(TopologyManager.getTopology());
+                reloadConfiguration();
             }
         });
         processorChain.addEventListener(new ClusterRemovedEventListener() {
             @Override
             protected void onEvent(Event event) {
-                loadBalancer.reload(TopologyManager.getTopology());
+                reloadConfiguration();
             }
         });
         processorChain.addEventListener(new ServiceRemovedEventListener() {
             @Override
             protected void onEvent(Event event) {
-                loadBalancer.reload(TopologyManager.getTopology());
+                reloadConfiguration();
             }
         });
         return processorChain;
     }
+
+    private void reloadConfiguration() {
+        try {
+            if(loadBalancerStarted) {
+                loadBalancer.reload(TopologyManager.getTopology());
+            }
+        }
+        catch (Exception e) {
+            if(log.isErrorEnabled()) {
+                log.error("Could not reload load balancer configuration", e);
+            }
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/8e2cec75/components/org.apache.stratos.load.balancer.extension.api/src/main/java/org/apache/stratos/load/balancer/extension/api/LoadBalancerStatsNotifier.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.load.balancer.extension.api/src/main/java/org/apache/stratos/load/balancer/extension/api/LoadBalancerStatsNotifier.java
 
b/components/org.apache.stratos.load.balancer.extension.api/src/main/java/org/apache/stratos/load/balancer/extension/api/LoadBalancerStatsNotifier.java
index 532ded3..5beaec0 100644
--- 
a/components/org.apache.stratos.load.balancer.extension.api/src/main/java/org/apache/stratos/load/balancer/extension/api/LoadBalancerStatsNotifier.java
+++ 
b/components/org.apache.stratos.load.balancer.extension.api/src/main/java/org/apache/stratos/load/balancer/extension/api/LoadBalancerStatsNotifier.java
@@ -31,7 +31,7 @@ import java.util.HashMap;
 import java.util.Map;
 
 /**
- *
+ * Load balancer statistics notifier thread for publishing statistics 
periodically to CEP.
  */
 public class LoadBalancerStatsNotifier implements Runnable {
     private static final Log log = 
LogFactory.getLog(LoadBalancerStatsNotifier.class);

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/8e2cec75/components/org.apache.stratos.load.balancer.extension.api/src/main/java/org/apache/stratos/load/balancer/extension/api/exception/LoadBalancerExtensionException.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.load.balancer.extension.api/src/main/java/org/apache/stratos/load/balancer/extension/api/exception/LoadBalancerExtensionException.java
 
b/components/org.apache.stratos.load.balancer.extension.api/src/main/java/org/apache/stratos/load/balancer/extension/api/exception/LoadBalancerExtensionException.java
new file mode 100644
index 0000000..e9e5aa4
--- /dev/null
+++ 
b/components/org.apache.stratos.load.balancer.extension.api/src/main/java/org/apache/stratos/load/balancer/extension/api/exception/LoadBalancerExtensionException.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.load.balancer.extension.api.exception;
+
+/**
+ * Load balancer extension exception.
+ */
+public class LoadBalancerExtensionException extends Exception {
+
+    public LoadBalancerExtensionException() {
+    }
+
+    public LoadBalancerExtensionException(Throwable throwable) {
+        super(throwable);
+    }
+
+    public LoadBalancerExtensionException(String message) {
+        super(message);
+    }
+
+    public LoadBalancerExtensionException(String message, Throwable throwable) 
{
+        super(message, throwable);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/8e2cec75/extensions/load-balancer/haproxy-extension/src/main/assembly/bin.xml
----------------------------------------------------------------------
diff --git 
a/extensions/load-balancer/haproxy-extension/src/main/assembly/bin.xml 
b/extensions/load-balancer/haproxy-extension/src/main/assembly/bin.xml
index 2f73769..63ab824 100644
--- a/extensions/load-balancer/haproxy-extension/src/main/assembly/bin.xml
+++ b/extensions/load-balancer/haproxy-extension/src/main/assembly/bin.xml
@@ -42,6 +42,14 @@
             </includes>
         </fileSet>
         <fileSet>
+            <directory>${project.basedir}/src/main/security</directory>
+            <outputDirectory>/security</outputDirectory>
+            <fileMode>0600</fileMode>
+            <includes>
+                <include>client-trustsore.jks</include>
+            </includes>
+        </fileSet>
+        <fileSet>
             <directory>${project.basedir}/src/main/templates</directory>
             <outputDirectory>/templates</outputDirectory>
             <fileMode>0600</fileMode>

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/8e2cec75/extensions/load-balancer/haproxy-extension/src/main/bin/haproxy-extension.sh
----------------------------------------------------------------------
diff --git 
a/extensions/load-balancer/haproxy-extension/src/main/bin/haproxy-extension.sh 
b/extensions/load-balancer/haproxy-extension/src/main/bin/haproxy-extension.sh
index d00b8b9..a5bd63f 100755
--- 
a/extensions/load-balancer/haproxy-extension/src/main/bin/haproxy-extension.sh
+++ 
b/extensions/load-balancer/haproxy-extension/src/main/bin/haproxy-extension.sh
@@ -23,6 +23,17 @@
 echo "Starting haproxy extension..."
 lib_path=./../lib/
 class_path=`echo ../lib/*.jar | tr ' ' ':'`
-properties="-Djndi.properties.dir=./../conf -Dexecutable.file.path=haproxy 
-Dtemplates.path=./../templates -Dtemplates.name=haproxy.cfg.template 
-Dconf.file.path=/tmp/haproxy.cfg"
+properties="-Djndi.properties.dir=./../conf
+            
-Dexecutable.file.path=/Users/imesh/dist/haproxy/haproxy-1.4.24/haproxy
+            -Dtemplates.path=./../templates
+            -Dtemplates.name=haproxy.cfg.template
+            -Dconf.file.path=/tmp/haproxy.cfg"
+            -Djavax.net.ssl.trustStore=./../security/client-truststore.jks
+            -Djavax.net.ssl.trustStorePassword=wso2carbon
+            -Dthrift.receiver.ip=localhost
+            -Dthrift.receiver.port=7615
+
+# Uncomment below line and add $debug next to $properties to enable remote 
debugging
+#debug="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005"
 
 java -cp "$class_path" $properties org.apache.stratos.haproxy.extension.Main 
-Dp1=sample_value $*

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/8e2cec75/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 cdb8bd3..dac52af 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,12 +24,13 @@ import java.util.Vector;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import 
org.apache.stratos.load.balancer.extension.api.exception.LoadBalancerExtensionException;
 import org.apache.stratos.messaging.domain.topology.Topology;
 import org.apache.stratos.load.balancer.extension.api.LoadBalancer;
 
 /**
  * HAProxy load balancer life-cycle implementation.
- *
+ * <p/>
  * Thanks to Vaadin for HAProxyController implementation:
  * https://vaadin.com/license
  * 
http://dev.vaadin.com/browser/svn/incubator/Arvue/ArvueMaster/src/org/vaadin/arvue/arvuemaster/HAProxyController.java
@@ -52,24 +53,6 @@ public class HAProxy implements LoadBalancer {
         this.processIdFilePath = confFilePath.replace(".cfg", ".pid");
     }
 
-    public void reload(Topology topology) {
-        configure(topology);
-        reloadConfiguration();
-    }
-
-    public void configure(Topology topology) {
-        if(log.isInfoEnabled()) {
-            log.info("Configuring haproxy instance...");
-        }
-
-        HAProxyConfigWriter writer = new HAProxyConfigWriter(templatePath, 
templateName, confFilePath);
-        writer.write(topology);
-
-        if(log.isInfoEnabled()) {
-            log.info("Configuration done");
-        }
-    }
-
     private void executeCommand(String command) throws IOException {
         String line;
         Runtime r = Runtime.getRuntime();
@@ -79,31 +62,30 @@ public class HAProxy implements LoadBalancer {
         Process p = r.exec(command);
         BufferedReader in = new BufferedReader(new 
InputStreamReader(p.getInputStream()));
         while ((line = in.readLine()) != null) {
-            if(log.isInfoEnabled()) {
+            if (log.isInfoEnabled()) {
                 log.info(line);
             }
         }
         StringBuilder sb = new StringBuilder();
         BufferedReader error = new BufferedReader(new 
InputStreamReader(p.getErrorStream()));
         while ((line = error.readLine()) != null) {
-            if(log.isInfoEnabled()) {
+            if (log.isInfoEnabled()) {
                 log.info(line);
                 sb.append(line + NEW_LINE);
             }
         }
-        if(sb.length() > 0) {
+        if (sb.length() > 0) {
             throw new RuntimeException("Command execution failed: " + NEW_LINE 
+ sb.toString());
         }
     }
 
-    private void reloadConfiguration() {
-
-        if(log.isInfoEnabled()) {
-            log.info("Reloading configuration...");
-        }
-        BufferedReader input = null;
+    private void reloadConfiguration() throws LoadBalancerExtensionException {
 
         try {
+            if (log.isInfoEnabled()) {
+                log.info("Reloading configuration...");
+            }
+
             // Read pid
             String pid = "";
             BufferedReader reader = new BufferedReader(new 
FileReader(processIdFilePath));
@@ -115,70 +97,90 @@ public class HAProxy implements LoadBalancer {
             // Execute hot configuration deployment
             String command = executableFilePath + " -f " + confFilePath + " -p 
" + processIdFilePath + " -sf " + pid;
             executeCommand(command);
-            if(log.isInfoEnabled()) {
+            if (log.isInfoEnabled()) {
                 log.info("Configuration done");
             }
         } catch (Exception e) {
-            if(log.isErrorEnabled()) {
-                log.error("Reconfiguration failed", e);
+            if (log.isErrorEnabled()) {
+                log.error("Reconfiguration failed");
             }
+            throw new LoadBalancerExtensionException(e);
         }
     }
 
-    public void start() {
+    public void reload(Topology topology) throws 
LoadBalancerExtensionException {
+        configure(topology);
+        reloadConfiguration();
+    }
+
+    public void configure(Topology topology) throws 
LoadBalancerExtensionException {
+
+        try {
+            if (log.isInfoEnabled()) {
+                log.info("Configuring haproxy instance...");
+            }
+
+            HAProxyConfigWriter writer = new HAProxyConfigWriter(templatePath, 
templateName, confFilePath);
+            writer.write(topology);
+
+            if (log.isInfoEnabled()) {
+                log.info("Configuration done");
+            }
+        } catch (Exception e) {
+            if (log.isErrorEnabled()) {
+                log.error("Could not configure haproxy");
+            }
+            throw new LoadBalancerExtensionException(e);
+        }
+    }
+
+    public void start() throws LoadBalancerExtensionException {
 
         // Check for configuration file
-        File conf;
-        conf = new File(confFilePath);
+        File conf = new File(confFilePath);
         if (!conf.exists()) {
-            throw new RuntimeException("Could not find haproxy configuration 
file");
+            throw new LoadBalancerExtensionException("Could not find haproxy 
configuration file");
         }
 
         // Start haproxy and write pid to processIdFilePath
         try {
-            String command = executableFilePath + " -f " + confFilePath +" -p 
" + processIdFilePath;
+            String command = executableFilePath + " -f " + confFilePath + " -p 
" + processIdFilePath;
             executeCommand(command);
-            if(log.isInfoEnabled()) {
+            if (log.isInfoEnabled()) {
                 log.info("haproxy started");
             }
         } catch (Exception e) {
-            if(log.isErrorEnabled()) {
-                log.error("Could not start haproxy", e);
+            if (log.isErrorEnabled()) {
+                log.error("Could not start haproxy");
             }
+            throw new LoadBalancerExtensionException(e);
         }
     }
 
-    public void stop() {
+    public void stop() throws LoadBalancerExtensionException {
 
-        // Read the PID's
-        Vector<String> pids = new Vector<String>();
         try {
+            // Read the PIDs
+            Vector<String> pids = new Vector<String>();
             BufferedReader reader = new BufferedReader(new 
FileReader(processIdFilePath));
-            String pid = null;
-            while ((pid = reader.readLine()) != null) {
-                pids.add(pid);
-            }
-        } catch (Exception e) {
-            if(log.isErrorEnabled()) {
-                log.error(e);
+            String pid_ = null;
+            while ((pid_ = reader.readLine()) != null) {
+                pids.add(pid_);
             }
-            return;
-        }
 
-        // Kill all haproxy processes
-        for (String pid : pids) {
-            try {
-                String command = "kill -s 9" + pid;
+            // Kill all haproxy processes
+            for (String pid : pids) {
+                String command = "kill -s 9 " + pid;
                 executeCommand(command);
-                if(log.isInfoEnabled()) {
-                    log.info("haproxy stopped");
-                }
-            } catch (Exception e) {
-                if(log.isErrorEnabled()) {
-                    log.error(e);
+                if (log.isInfoEnabled()) {
+                    log.info(String.format("haproxy stopped [pid] %s", pid));
                 }
-                return;
             }
+        } catch (Exception e) {
+            if(log.isErrorEnabled()) {
+                log.error("Could not stop haproxy");
+            }
+            throw new LoadBalancerExtensionException(e);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/8e2cec75/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 c6c8c56..5e6f69a 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
@@ -21,6 +21,7 @@ package org.apache.stratos.haproxy.extension;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import 
org.apache.stratos.load.balancer.extension.api.exception.LoadBalancerExtensionException;
 import org.apache.stratos.messaging.domain.topology.*;
 import org.apache.velocity.Template;
 import org.apache.velocity.VelocityContext;
@@ -60,6 +61,10 @@ public class HAProxyConfigWriter {
 
         for(Service service : topology.getServices()) {
             for(Cluster cluster : service.getClusters()) {
+                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() + "-proxy-" + 
port.getProxy();
@@ -108,8 +113,9 @@ public class HAProxyConfigWriter {
             }
         } catch (IOException e) {
             if(log.isErrorEnabled()) {
-                log.error("Could not write configuration file", e);
+                log.error(String.format("Could not write configuration file: 
%s", confFilePath));
             }
+            throw new RuntimeException(e);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/8e2cec75/extensions/load-balancer/haproxy-extension/src/main/security/client-truststore.jks
----------------------------------------------------------------------
diff --git 
a/extensions/load-balancer/haproxy-extension/src/main/security/client-truststore.jks
 
b/extensions/load-balancer/haproxy-extension/src/main/security/client-truststore.jks
new file mode 100644
index 0000000..be441f3
Binary files /dev/null and 
b/extensions/load-balancer/haproxy-extension/src/main/security/client-truststore.jks
 differ

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/8e2cec75/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 5c4e04f..240f64a 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
@@ -1,6 +1,7 @@
 global
     daemon
     maxconn 256
+    stats socket /tmp/haproxy_stats
 
 defaults
     mode http

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/8e2cec75/products/load-balancer/modules/distribution/src/main/bin/stratos.bat
----------------------------------------------------------------------
diff --git 
a/products/load-balancer/modules/distribution/src/main/bin/stratos.bat 
b/products/load-balancer/modules/distribution/src/main/bin/stratos.bat
index 7381613..aa4ae5f 100644
--- a/products/load-balancer/modules/distribution/src/main/bin/stratos.bat
+++ b/products/load-balancer/modules/distribution/src/main/bin/stratos.bat
@@ -154,7 +154,7 @@ set CARBON_CLASSPATH=.\lib;%CARBON_CLASSPATH%
 
 set 
JAVA_ENDORSED=".\lib\endorsed";"%JAVA_HOME%\jre\lib\endorsed";"%JAVA_HOME%\lib\endorsed"
 
-set CMD_LINE_ARGS=-Xbootclasspath/a:%CARBON_XBOOTCLASSPATH% -Xms1500m 
-Xmx3000m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC 
-XX:+UseParNewGC -XX:-UseGCOverheadLimit -XX:+CMSClassUnloadingEnabled 
-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=%CARBON_HOME%\repository\logs\heap-dump.hprof 
-Dcom.sun.management.jmxremote -classpath %CARBON_CLASSPATH% %JAVA_OPTS% 
-Djava.endorsed.dirs=%JAVA_ENDORSED% -Dcarbon.registry.root=/ 
-Dcarbon.home="%CARBON_HOME%" 
-Dloadbalancer.conf="file:///%CARBON_HOME%/repository/conf/loadbalancer.conf" 
-Dwso2.server.standalone=true -Djava.command="%JAVA_HOME%\bin\java" 
-Djava.opts="%JAVA_OPTS%" -Djava.io.tmpdir="%CARBON_HOME%\tmp" 
-Dcatalina.base="%CARBON_HOME%\lib\tomcat" 
-Dwso2.carbon.xml=%CARBON_HOME%\repository\conf\carbon.xml 
-Dwso2.registry.xml="%CARBON_HOME%\repository\conf\registry.xml" 
-Dwso2.user.mgt.xml="%CARBON_HOME%\repository\conf\user-mgt.xml" 
-Djava.util.logging.config.file="%CARBON_HOME%\repository\conf\log4j.properties"
 -
 Dcarbon.config.dir.path="%CARBON_HOME%\repository\conf" 
-Djndi.properties.dir="%CARBON_HOME%/repository/conf" 
-Dconf.location="%CARBON_HOME%\repository\conf" 
-Dcarbon.logs.path="%CARBON_HOME%\repository\logs" 
-Dcomponents.repo="%CARBON_HOME%\repository\components" 
-Dcom.atomikos.icatch.file="%CARBON_HOME%\lib\transactions.properties" 
-Dcom.atomikos.icatch.hide_init_file_path="true" 
-Dorg.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true 
-Dcom.sun.jndi.ldap.connect.pool.authentication=simple 
-Dcom.sun.jndi.ldap.connect.pool.timeout=3000 
-Dorg.terracotta.quartz.skipUpdateCheck=true 
-Dcarbon.classpath=%CARBON_CLASSPATH% -Dfile.encoding=UTF8 
-Dthrift.receiver.ip=localhost -Dthrift.receiver.port=7614
+set CMD_LINE_ARGS=-Xbootclasspath/a:%CARBON_XBOOTCLASSPATH% -Xms1500m 
-Xmx3000m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC 
-XX:+UseParNewGC -XX:-UseGCOverheadLimit -XX:+CMSClassUnloadingEnabled 
-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=%CARBON_HOME%\repository\logs\heap-dump.hprof 
-Dcom.sun.management.jmxremote -classpath %CARBON_CLASSPATH% %JAVA_OPTS% 
-Djava.endorsed.dirs=%JAVA_ENDORSED% -Dcarbon.registry.root=/ 
-Dcarbon.home="%CARBON_HOME%" 
-Dloadbalancer.conf="file:///%CARBON_HOME%/repository/conf/loadbalancer.conf" 
-Dwso2.server.standalone=true -Djava.command="%JAVA_HOME%\bin\java" 
-Djava.opts="%JAVA_OPTS%" -Djava.io.tmpdir="%CARBON_HOME%\tmp" 
-Dcatalina.base="%CARBON_HOME%\lib\tomcat" 
-Dwso2.carbon.xml=%CARBON_HOME%\repository\conf\carbon.xml 
-Dwso2.registry.xml="%CARBON_HOME%\repository\conf\registry.xml" 
-Dwso2.user.mgt.xml="%CARBON_HOME%\repository\conf\user-mgt.xml" 
-Djava.util.logging.config.file="%CARBON_HOME%\repository\conf\log4j.properties"
 -
 Dcarbon.config.dir.path="%CARBON_HOME%\repository\conf" 
-Djndi.properties.dir="%CARBON_HOME%/repository/conf" 
-Dconf.location="%CARBON_HOME%\repository\conf" 
-Dcarbon.logs.path="%CARBON_HOME%\repository\logs" 
-Dcomponents.repo="%CARBON_HOME%\repository\components" 
-Dcom.atomikos.icatch.file="%CARBON_HOME%\lib\transactions.properties" 
-Dcom.atomikos.icatch.hide_init_file_path="true" 
-Dorg.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true 
-Dcom.sun.jndi.ldap.connect.pool.authentication=simple 
-Dcom.sun.jndi.ldap.connect.pool.timeout=3000 
-Dorg.terracotta.quartz.skipUpdateCheck=true 
-Dcarbon.classpath=%CARBON_CLASSPATH% -Dfile.encoding=UTF8 
-Djavax.net.ssl.trustStore=$CARBON_HOME/repository/resources/security/client-truststore.jks
 -Djavax.net.ssl.trustStorePassword=wso2carbon -Dthrift.receiver.ip=localhost 
-Dthrift.receiver.port=7615
 
 :runJava
 echo JAVA_HOME environment variable is set to %JAVA_HOME%

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/8e2cec75/products/load-balancer/modules/distribution/src/main/bin/stratos.sh
----------------------------------------------------------------------
diff --git 
a/products/load-balancer/modules/distribution/src/main/bin/stratos.sh 
b/products/load-balancer/modules/distribution/src/main/bin/stratos.sh
index 85b29cd..abef45f 100644
--- a/products/load-balancer/modules/distribution/src/main/bin/stratos.sh
+++ b/products/load-balancer/modules/distribution/src/main/bin/stratos.sh
@@ -294,8 +294,10 @@ exec "$JAVACMD" \
         -Dcom.atomikos.icatch.file="$CARBON_HOME/lib/transactions.properties" \
         -Dcom.atomikos.icatch.hide_init_file_path=true \
         -Dorg.terracotta.quartz.skipUpdateCheck=true \
+        
-Djavax.net.ssl.trustStore=$CARBON_HOME/repository/resources/security/client-truststore.jks
+        -Djavax.net.ssl.trustStorePassword=wso2carbon
         -Dthrift.receiver.ip=localhost \
-        -Dthrift.receiver.port=7614 \
+        -Dthrift.receiver.port=7615 \
         org.wso2.carbon.bootstrap.Bootstrap $*
 
 

Reply via email to