You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by ga...@apache.org on 2015/12/21 12:58:14 UTC

[1/3] stratos git commit: Refactor the aws lb extension

Repository: stratos
Updated Branches:
  refs/heads/stratos-4.1.x 4ead24e10 -> 42a965473


Refactor the aws lb extension


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

Branch: refs/heads/stratos-4.1.x
Commit: 52966c044e1f325f8b96c4f05a10e61ee7f9ea73
Parents: 4ead24e
Author: gayangunarathne <ga...@wso2.com>
Authored: Tue Dec 8 10:41:57 2015 +0530
Committer: gayangunarathne <ga...@wso2.com>
Committed: Mon Dec 21 10:24:28 2015 +0530

----------------------------------------------------------------------
 .../apache/stratos/aws/extension/AWSHelper.java |   9 +-
 .../stratos/aws/extension/AWSLoadBalancer.java  | 259 +++++++++----------
 .../org/apache/stratos/aws/extension/Main.java  |  24 +-
 3 files changed, 136 insertions(+), 156 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/52966c04/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSHelper.java
----------------------------------------------------------------------
diff --git a/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSHelper.java b/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSHelper.java
index 8078252..a12fc96 100644
--- a/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSHelper.java
+++ b/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSHelper.java
@@ -471,20 +471,17 @@ public class AWSHelper {
     public List<Instance> getAttachedInstances(String loadBalancerName,
                                                String region) {
         try {
-            LoadBalancerDescription lbDescription = getLoadBalancerDescription(
-                    loadBalancerName, region);
+            LoadBalancerDescription lbDescription = getLoadBalancerDescription(loadBalancerName, region);
 
             if (lbDescription == null) {
-                log.warn("Could not find description of load balancer "
-                        + loadBalancerName);
+                log.warn("Could not find description of load balancer "+ loadBalancerName);
                 return null;
             }
 
             return lbDescription.getInstances();
 
         } catch (AmazonClientException e) {
-            log.error("Could not find instances attached  load balancer "
-                    + loadBalancerName, e);
+            log.error("Could not find instances attached  load balancer "+ loadBalancerName, e);
         }
 
         return null;

http://git-wip-us.apache.org/repos/asf/stratos/blob/52966c04/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSLoadBalancer.java
----------------------------------------------------------------------
diff --git a/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSLoadBalancer.java b/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSLoadBalancer.java
index 62f9882..5cd5556 100644
--- a/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSLoadBalancer.java
+++ b/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSLoadBalancer.java
@@ -80,63 +80,13 @@ public class AWSLoadBalancer implements LoadBalancer {
                     // Get the load balancer and update it.
 
                     if (log.isDebugEnabled()) {
-                        log.debug("Load balancer for cluster " + cluster.getClusterId() + " is already present.");
+                        log.debug(String.format("Load balancer for cluster %s is already present.", cluster.getClusterId()));
                     }
 
-                    LoadBalancerInfo loadBalancerInfo = clusterIdToLoadBalancerMap.get(cluster.getClusterId());
+	                if(updateExistingLoadBalancer(cluster)){
+		                activeClusters.add(cluster.getClusterId());
+	                }
 
-                    String loadBalancerName = loadBalancerInfo.getName();
-                    String region = loadBalancerInfo.getRegion();
-
-                    // Get all the instances attached - Attach newly added instances to load balancer
-
-                    // attachedInstances list is useful in finding out what are the new instances which
-                    // should be attached to this load balancer.
-                    List<Instance> attachedInstances = awsHelper.getAttachedInstances(loadBalancerName, region);
-
-                    // clusterMembers stores all the members of a cluster.
-                    Collection<Member> clusterMembers = cluster.getMembers();
-
-                    if (clusterMembers.size() > 0) {
-                        activeClusters.add(cluster.getClusterId());
-
-                        List<Instance> instancesToAddToLoadBalancer = new ArrayList<Instance>();
-                        List<String> availabilityZones = new ArrayList<String>();
-
-                        for (Member member : clusterMembers) {
-                            // if instance id of member is not in
-                            // attachedInstances
-                            // add this to instancesToAddToLoadBalancer
-                            Instance instance = new Instance(awsHelper.getAWSInstanceName(member.getInstanceId()));
-
-                            if (attachedInstances == null || !attachedInstances.contains(instance)) {
-                                instancesToAddToLoadBalancer.add(instance);
-
-                                if (log.isDebugEnabled()) {
-                                    log.debug("Instance " + awsHelper.getAWSInstanceName(member.getInstanceId()) +
-                                            " needs to be registered to load balancer " + loadBalancerName);
-                                }
-
-                                // LB Common Member has a property 'EC2_AVAILABILITY_ZONE' points to the ec2 availability zone
-                                // for this member. Use the property value to update the LB about the relevant zone
-                                String availabilityZone = getEC2AvaialbilityZoneOfMember(member);
-                                if (availabilityZone != null) {
-                                    availabilityZones.add(availabilityZone);
-                                }
-                            }
-                        }
-
-                        if (instancesToAddToLoadBalancer.size() > 0) {
-                            awsHelper.registerInstancesToLoadBalancer(
-                                    loadBalancerName,
-                                    instancesToAddToLoadBalancer, region);
-                        }
-
-                        // update LB with the zones
-                        if (!availabilityZones.isEmpty() && !AWSExtensionContext.getInstance().isOperatingInVPC()) {
-                            awsHelper.addAvailabilityZonesForLoadBalancer(loadBalancerName, availabilityZones, region);
-                        }
-                    }
 
                 } else {
                     // Create a new load balancer for this cluster
@@ -161,8 +111,7 @@ public class AWSLoadBalancer implements LoadBalancer {
                         if (initialZones.isEmpty()) {
                             // initial availability zones not defined
                             // use the default (<region>a)
-                            initialAvailabilityZones.add(awsHelper.getAvailabilityZoneFromRegion
-                                    (region));
+                            initialAvailabilityZones.add(awsHelper.getAvailabilityZoneFromRegion(region));
                         } else {
                             // prepend the region and construct the availability zone list with
                             // full names (<region> + <zone>)
@@ -170,98 +119,29 @@ public class AWSLoadBalancer implements LoadBalancer {
                                 initialAvailabilityZones.add(region + zone);
                             }
                         }
+	                    String loadBalancerDNSName =
+			                    createAWSLoadBalancer(loadBalancerName, region, listenersForThisCluster,initialAvailabilityZones);
 
-                        // Returns DNS name of load balancer which was created.
-                        // This is used in the domain mapping of this cluster.
-                        String loadBalancerDNSName = awsHelper.createLoadBalancer(loadBalancerName, listenersForThisCluster,
-                                region, initialAvailabilityZones, AWSExtensionContext.getInstance().isOperatingInVPC());
-
-                        // enable connection draining (default) and cross zone load balancing (if specified in aws-extension.sh)
-                        awsHelper.modifyLBAttributes(loadBalancerName, region, AWSExtensionContext.getInstance().
-                                isCrossZoneLoadBalancingEnabled(), true);
-
-                        // Add the inbound rule the security group of the load balancer
-                        // For each listener, add a new rule with load balancer port as allowed protocol in the security group.
-                        // if security group id is defined, directly use that
-                        for (Listener listener : listenersForThisCluster) {
-                            int port = listener.getLoadBalancerPort();
-
-                            if (awsHelper.getLbSecurityGroupIdDefinedInConfiguration() != null && !awsHelper.
-                                    getLbSecurityGroupIdDefinedInConfiguration().isEmpty())  {
-                                for (String protocol : awsHelper.getAllowedProtocolsForLBSecurityGroup()) {
-                                    awsHelper.addInboundRuleToSecurityGroup(awsHelper.getLbSecurityGroupIdDefinedInConfiguration(),
-                                            region, protocol, port);
-                                }
-                            } else if (awsHelper.getLbSecurityGroupName() != null && !awsHelper
-                                    .getLbSecurityGroupName().isEmpty()) {
-                                for (String protocol : awsHelper.getAllowedProtocolsForLBSecurityGroup()) {
-                                    awsHelper.addInboundRuleToSecurityGroup(awsHelper.getSecurityGroupId(awsHelper
-                                            .getLbSecurityGroupName(), region), region, protocol, port);
-                                }
-                            }
-                        }
-
-                        log.info("Load balancer '" + loadBalancerDNSName + "' created for cluster '" + cluster.getClusterId());
-
-                        // Register instances in the cluster to load balancer
-                        List<Instance> instances = new ArrayList<Instance>();
-                        List<String> availabilityZones = new ArrayList<String>();
-
-                        for (Member member : clusterMembers) {
-                            String instanceId = member.getInstanceId();
-
-                            if (log.isDebugEnabled()) {
-                                log.debug("Instance " + awsHelper.getAWSInstanceName(instanceId) + " needs to be registered to load balancer "
-                                        + loadBalancerName);
-                            }
-
-                            Instance instance = new Instance();
-                            instance.setInstanceId(awsHelper.getAWSInstanceName(instanceId));
 
-                            instances.add(instance);
-                            // LB Common Member has a property 'EC2_AVAILABILITY_ZONE' which points to the ec2 availability
-                            // zone for this member. Use the property value to update the LB about the relevant zone
-                            String availabilityZone = getEC2AvaialbilityZoneOfMember(member);
-                            if (availabilityZone != null) {
-                                availabilityZones.add(availabilityZone);
-                            }
-                        }
+                        log.info(String.format("Load balancer %s  created for cluster %s " , loadBalancerDNSName, cluster.getClusterId()));
 
-                        awsHelper.registerInstancesToLoadBalancer(loadBalancerName, instances, region);
-
-                        // update LB with the zones
-                        if (!availabilityZones.isEmpty() && !AWSExtensionContext.getInstance().isOperatingInVPC()) {
-                            awsHelper.addAvailabilityZonesForLoadBalancer(loadBalancerName, availabilityZones, region);
-                        }
-
-                        // add stickiness policy
-                        if (awsHelper.getAppStickySessionCookie() != null && !awsHelper.getAppStickySessionCookie().isEmpty()) {
-                            CreateAppCookieStickinessPolicyResult result = awsHelper.createStickySessionPolicy(loadBalancerName,
-                                    awsHelper.getAppStickySessionCookie(), Constants.STICKINESS_POLICY, region);
-
-                            if (result != null) {
-                                // Take a single port mapping from a member, and apply the policy for
-                                // the LB Listener port (Proxy port of the port mapping)
-                                awsHelper.applyPolicyToLBListenerPorts(aMember.getPorts(), loadBalancerName,
-                                        Constants.STICKINESS_POLICY, region);
-                            }
-                        }
+	                    if(addClusterMembersInfo(clusterMembers, loadBalancerName, region)){
+		                    activeClusters.add(cluster.getClusterId());
+	                    }
 
                         // persist LB info
                         try {
                             persistenceManager.persist(new LBInfoDTO(loadBalancerName, cluster.getClusterId(), region));
 
                         } catch (PersistenceException e) {
-                            log.error("Unable to persist LB Information for " + loadBalancerName + ", cluster id " +
-                                    cluster.getClusterId());
+	                        log.error(String.format(
+			                        "Unable to persist LB Information for %s , cluster id %s " + loadBalancerName,
+			                        cluster.getClusterId()));
                         }
 
-                        LoadBalancerInfo loadBalancerInfo = new LoadBalancerInfo(
-                                loadBalancerName, region);
+                        LoadBalancerInfo loadBalancerInfo = new LoadBalancerInfo(loadBalancerName, region);
+                        clusterIdToLoadBalancerMap.put(cluster.getClusterId(),loadBalancerInfo);
 
-                        clusterIdToLoadBalancerMap.put(cluster.getClusterId(),
-                                loadBalancerInfo);
-                        activeClusters.add(cluster.getClusterId());
                     }
 
                     pause(3000);
@@ -311,7 +191,111 @@ public class AWSLoadBalancer implements LoadBalancer {
         return true;
     }
 
-    private String getEC2AvaialbilityZoneOfMember(Member member) {
+	private Boolean addClusterMembersInfo(Collection<Member> clusterMembers, String loadBalancerName, String region) {
+		Boolean isUpdated=false;
+		// Register instances in the cluster to load balancer
+		List<Instance> instances = new ArrayList<Instance>();
+		List<String> availabilityZones = new ArrayList<String>();
+
+		for (Member member : clusterMembers) {
+			isUpdated=true;
+		    String instanceId = member.getInstanceId();
+
+		    if (log.isDebugEnabled()) {
+		        log.debug("Instance " + awsHelper.getAWSInstanceName(instanceId) + " needs to be registered to load balancer "
+		                + loadBalancerName);
+		    }
+
+		    Instance instance = new Instance();
+		    instance.setInstanceId(awsHelper.getAWSInstanceName(instanceId));
+
+		    instances.add(instance);
+		    // LB Common Member has a property 'EC2_AVAILABILITY_ZONE' which points to the ec2 availability
+		    // zone for this member. Use the property value to update the LB about the relevant zone
+		    String availabilityZone = getEC2AvaialbilityZoneOfMember(member);
+		    if (availabilityZone != null) {
+		        availabilityZones.add(availabilityZone);
+		    }
+
+			// add stickiness policy
+			if (awsHelper.getAppStickySessionCookie() != null && !awsHelper.getAppStickySessionCookie().isEmpty()) {
+				CreateAppCookieStickinessPolicyResult result = awsHelper.createStickySessionPolicy(loadBalancerName, awsHelper.getAppStickySessionCookie(),
+				                                                                                   Constants.STICKINESS_POLICY,
+				                                                                                   region);
+
+				if (result != null) {
+					// Take a single port mapping from a member, and apply the policy for
+					// the LB Listener port (Proxy port of the port mapping)
+					awsHelper.applyPolicyToLBListenerPorts(member.getPorts(), loadBalancerName,
+					                                       Constants.STICKINESS_POLICY, region);
+				}
+			}
+
+		}
+
+		awsHelper.registerInstancesToLoadBalancer(loadBalancerName, instances, region);
+
+		// update LB with the zones
+		if (!availabilityZones.isEmpty() && !AWSExtensionContext.getInstance().isOperatingInVPC()) {
+		    awsHelper.addAvailabilityZonesForLoadBalancer(loadBalancerName, availabilityZones, region);
+		}
+		return isUpdated;
+	}
+
+	private String createAWSLoadBalancer(String loadBalancerName, String region, List<Listener> listenersForThisCluster,
+	                                     Set<String> initialAvailabilityZones) throws LoadBalancerExtensionException {
+		// Returns DNS name of load balancer which was created.
+		// This is used in the domain mapping of this cluster.
+		String loadBalancerDNSName = awsHelper.createLoadBalancer(loadBalancerName, listenersForThisCluster,
+		        region, initialAvailabilityZones, AWSExtensionContext.getInstance().isOperatingInVPC());
+
+		// enable connection draining (default) and cross zone load balancing (if specified in aws-extension.sh)
+		awsHelper.modifyLBAttributes(loadBalancerName, region, AWSExtensionContext.getInstance().
+		        isCrossZoneLoadBalancingEnabled(), true);
+		// Add the inbound rule the security group of the load balancer
+		// For each listener, add a new rule with load balancer port as allowed protocol in the security group.
+		// if security group id is defined, directly use that
+		for (Listener listener : listenersForThisCluster) {
+			int port = listener.getLoadBalancerPort();
+
+			if (awsHelper.getLbSecurityGroupIdDefinedInConfiguration() != null && !awsHelper.getLbSecurityGroupIdDefinedInConfiguration().isEmpty()) {
+				for (String protocol : awsHelper.getAllowedProtocolsForLBSecurityGroup()) {
+					awsHelper.addInboundRuleToSecurityGroup(awsHelper.getLbSecurityGroupIdDefinedInConfiguration(),
+					                                        region, protocol, port);
+				}
+			} else if (awsHelper.getLbSecurityGroupName() != null && !awsHelper
+					.getLbSecurityGroupName().isEmpty()) {
+				for (String protocol : awsHelper.getAllowedProtocolsForLBSecurityGroup()) {
+					awsHelper.addInboundRuleToSecurityGroup(awsHelper.getSecurityGroupId(awsHelper.getLbSecurityGroupName(),region), region, protocol,port);
+				}
+			}
+		}
+
+		return loadBalancerDNSName;
+	}
+
+	private Boolean updateExistingLoadBalancer(Cluster cluster) {
+		Boolean isUpdated=false;
+		LoadBalancerInfo loadBalancerInfo = clusterIdToLoadBalancerMap.get(cluster.getClusterId());
+
+		String loadBalancerName = loadBalancerInfo.getName();
+		String region = loadBalancerInfo.getRegion();
+
+		// Get all the instances attached - Attach newly added instances to load balancer
+
+		// attachedInstances list is useful in finding out what are the new instances which
+		// should be attached to this load balancer.
+		List<Instance> attachedInstances = awsHelper.getAttachedInstances(loadBalancerName, region);
+
+		// clusterMembers stores all the members of a cluster.
+		Collection<Member> clusterMembers = cluster.getMembers();
+
+		isUpdated= addClusterMembersInfo(clusterMembers, loadBalancerName, region);
+
+		return isUpdated;
+	}
+
+	private String getEC2AvaialbilityZoneOfMember(Member member) {
         if (member.getProperties() != null) {
             return member.getProperties().getProperty(Constants.EC2_AVAILABILITY_ZONE_PROPERTY);
         }
@@ -324,7 +308,6 @@ public class AWSLoadBalancer implements LoadBalancer {
      * nothing but logs the message.
      */
     public void start() throws LoadBalancerExtensionException {
-
         log.info("AWS load balancer extension started.");
     }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/52966c04/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/Main.java
----------------------------------------------------------------------
diff --git a/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/Main.java b/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/Main.java
index 73fa971..80b6481 100644
--- a/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/Main.java
+++ b/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/Main.java
@@ -25,6 +25,7 @@ import org.apache.log4j.PropertyConfigurator;
 import org.apache.stratos.common.threading.StratosThreadPool;
 import org.apache.stratos.load.balancer.common.topology.TopologyProvider;
 import org.apache.stratos.load.balancer.extension.api.LoadBalancerExtension;
+import org.apache.stratos.load.balancer.extension.api.exception.LoadBalancerExtensionException;
 
 import java.util.concurrent.ExecutorService;
 
@@ -34,6 +35,8 @@ import java.util.concurrent.ExecutorService;
 
 public class Main {
 	private static final Log log = LogFactory.getLog(Main.class);
+	public static final String AWS_EXTENSION_THREAD_POOL = "aws.extension.thread.pool";
+	public static final int THREAD_POOL_SIZE = 10;
 	private static ExecutorService executorService;
 
 	public static void main(String[] args) {
@@ -41,23 +44,20 @@ public class Main {
 		LoadBalancerExtension extension = null;
 		try {
 			// Configure log4j properties
-			PropertyConfigurator.configure(System
-					.getProperty("log4j.properties.file.path"));
+			PropertyConfigurator.configure(System.getProperty("log4j.properties.file.path"));
 
 			if (log.isInfoEnabled()) {
 				log.info("AWS extension started");
 			}
 
-			executorService = StratosThreadPool.getExecutorService(
-					"aws.extension.thread.pool", 10);
+			executorService = StratosThreadPool.getExecutorService(AWS_EXTENSION_THREAD_POOL, THREAD_POOL_SIZE);
 			// Validate runtime parameters
 			AWSExtensionContext.getInstance().validate();
 			TopologyProvider topologyProvider = new TopologyProvider();
-			AWSStatisticsReader statisticsReader = AWSExtensionContext
-					.getInstance().isCEPStatsPublisherEnabled() ? new AWSStatisticsReader(
-					topologyProvider) : null;
-			extension = new LoadBalancerExtension(new AWSLoadBalancer(),
-					statisticsReader, topologyProvider);
+			AWSStatisticsReader statisticsReader =
+					AWSExtensionContext.getInstance().isCEPStatsPublisherEnabled() ? new AWSStatisticsReader(
+							topologyProvider) : null;
+			extension = new LoadBalancerExtension(new AWSLoadBalancer(), statisticsReader, topologyProvider);
 			extension.setExecutorService(executorService);
 			extension.execute();
 
@@ -68,7 +68,7 @@ public class Main {
 				public void run() {
 					try {
 						if (finalExtension != null) {
-							log.info("Shutting aws extension...");
+							log.info("Shutting aws LB extension...");
 							finalExtension.stop();
 						}
 						mainThread.join();
@@ -77,9 +77,9 @@ public class Main {
 					}
 				}
 			});
-		} catch (Exception e) {
+		} catch (LoadBalancerExtensionException e) {
 			if (log.isErrorEnabled()) {
-				log.error(e);
+				log.error("Error occurred while running the aws lb extension");
 			}
 			if (extension != null) {
 				log.info("Shutting aws extension...");


[3/3] stratos git commit: Refactor AWS LB extension

Posted by ga...@apache.org.
Refactor AWS LB extension


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

Branch: refs/heads/stratos-4.1.x
Commit: 42a965473f03041f6142125ad3b6fb2db0e22bfd
Parents: 46a99e7
Author: gayangunarathne <ga...@wso2.com>
Authored: Mon Dec 21 17:27:43 2015 +0530
Committer: gayangunarathne <ga...@wso2.com>
Committed: Mon Dec 21 17:27:43 2015 +0530

----------------------------------------------------------------------
 .../apache/stratos/aws/extension/AWSHelper.java | 58 ++++++++------------
 .../stratos/aws/extension/AWSLoadBalancer.java  | 26 +++++++--
 .../org/apache/stratos/aws/extension/Main.java  |  6 +-
 3 files changed, 49 insertions(+), 41 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/42a96547/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSHelper.java
----------------------------------------------------------------------
diff --git a/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSHelper.java b/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSHelper.java
index ef66290..85d6811 100644
--- a/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSHelper.java
+++ b/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSHelper.java
@@ -19,24 +19,8 @@
 
 package org.apache.stratos.aws.extension;
 
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import com.amazonaws.AmazonServiceException;
-import com.amazonaws.services.ec2.model.*;
-import com.amazonaws.services.elasticloadbalancing.model.Instance;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.load.balancer.common.domain.*;
-import org.apache.stratos.load.balancer.extension.api.exception.LoadBalancerExtensionException;
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
-
 import com.amazonaws.AmazonClientException;
+import com.amazonaws.AmazonServiceException;
 import com.amazonaws.ClientConfiguration;
 import com.amazonaws.auth.BasicAWSCredentials;
 import com.amazonaws.services.cloudwatch.AmazonCloudWatchClient;
@@ -45,8 +29,24 @@ import com.amazonaws.services.cloudwatch.model.Dimension;
 import com.amazonaws.services.cloudwatch.model.GetMetricStatisticsRequest;
 import com.amazonaws.services.cloudwatch.model.GetMetricStatisticsResult;
 import com.amazonaws.services.ec2.AmazonEC2Client;
+import com.amazonaws.services.ec2.model.*;
 import com.amazonaws.services.elasticloadbalancing.AmazonElasticLoadBalancingClient;
 import com.amazonaws.services.elasticloadbalancing.model.*;
+import com.amazonaws.services.elasticloadbalancing.model.Instance;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.load.balancer.common.domain.Member;
+import org.apache.stratos.load.balancer.common.domain.Port;
+import org.apache.stratos.load.balancer.extension.api.exception.LoadBalancerExtensionException;
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
 
 public class AWSHelper {
     private String awsAccessKey;
@@ -125,11 +125,6 @@ public class AWSHelper {
                         "group id is required");
             }
 
-//            if (this.lbSecurityGroupName.isEmpty() || this.lbSecurityGroupName.length() >
-//                    Constants.SECURITY_GROUP_NAME_MAX_LENGTH) {
-//                throw new LoadBalancerExtensionException("Invalid load balancer security group name.");
-//            }
-
             // Read the SSL certificate Id. This is mandatory if only we are using HTTPS as the front end protocol.
             // http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/using-elb-listenerconfig-quickref.html
             this.sslCertificateId = properties
@@ -270,12 +265,6 @@ public class AWSHelper {
 
         createLoadBalancerRequest.setListeners(listeners);
 
-        // don't need this now since we are anyway updating zone according to the member
-//		Set<String> availabilityZones = new HashSet<String>();
-//		availabilityZones.add(getAvailabilityZoneFromRegion(region));
-//
-//		createLoadBalancerRequest.setAvailabilityZones(availabilityZones);
-        
 
         try {
             if (inVPC) {
@@ -365,10 +354,11 @@ public class AWSHelper {
             log.info(instance.getInstanceId());
         }
 
-        RegisterInstancesWithLoadBalancerRequest registerInstancesWithLoadBalancerRequest = new RegisterInstancesWithLoadBalancerRequest(
-                loadBalancerName, instances);
+	    RegisterInstancesWithLoadBalancerRequest registerInstancesWithLoadBalancerRequest =
+			    new RegisterInstancesWithLoadBalancerRequest(
+					    loadBalancerName, instances);
 
-        RegisterInstancesWithLoadBalancerResult registerInstancesWithLBRes = null;
+	    RegisterInstancesWithLoadBalancerResult registerInstancesWithLBRes = null;
 
         try {
             elbClient.setEndpoint(String.format(
@@ -969,10 +959,10 @@ public class AWSHelper {
             int instancePort = port.getValue();
             int proxyPort = port.getProxy();
             String protocol = port.getProtocol().toUpperCase();
-            String instanceProtocol = protocol;
+
 
             Listener listener = new Listener(protocol, proxyPort, instancePort);
-            listener.setInstanceProtocol(instanceProtocol);
+            listener.setInstanceProtocol(protocol);
             if ("HTTPS".equalsIgnoreCase(protocol) || "SSL".equalsIgnoreCase(protocol)) {
                 // if the SSL certificate is not configured in the aws.properties file, can't continue
                 if (getSslCertificateId() == null || getSslCertificateId().isEmpty()) {
@@ -996,7 +986,7 @@ public class AWSHelper {
     /**
      * Constructs name of the load balancer to be associated with the cluster
      *
-     * @param clusterId
+     * @param serviceName
      * @return name of the load balancer
      * @throws LoadBalancerExtensionException
      */

http://git-wip-us.apache.org/repos/asf/stratos/blob/42a96547/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSLoadBalancer.java
----------------------------------------------------------------------
diff --git a/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSLoadBalancer.java b/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSLoadBalancer.java
index b365c9b..f5210b9 100644
--- a/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSLoadBalancer.java
+++ b/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSLoadBalancer.java
@@ -127,7 +127,7 @@ public class AWSLoadBalancer implements LoadBalancer {
 
                         log.info(String.format("Load balancer %s  created for cluster %s " , loadBalancerDNSName, cluster.getClusterId()));
 
-	                    if(addClusterMembersInfo(clusterMembers, loadBalancerName, region)){
+	                    if(addClusterMembersInfo(clusterMembers, loadBalancerName, region,null)){
 		                    activeClusters.add(cluster.getClusterId());
 	                    }
 
@@ -192,7 +192,8 @@ public class AWSLoadBalancer implements LoadBalancer {
         return true;
     }
 
-	private Boolean addClusterMembersInfo(Collection<Member> clusterMembers, String loadBalancerName, String region) {
+	private Boolean addClusterMembersInfo(Collection<Member> clusterMembers, String loadBalancerName, String region,
+	                                      List<Instance> attachedInstances) {
 		Boolean isUpdated=false;
 		// Register instances in the cluster to load balancer
 		List<Instance> instances = new ArrayList<Instance>();
@@ -208,6 +209,22 @@ public class AWSLoadBalancer implements LoadBalancer {
 		    }
 
 		    Instance instance = new Instance();
+
+			if (attachedInstances == null || !attachedInstances.contains(instance)) {
+				instances.add(instance);
+
+				if (log.isDebugEnabled()) {
+					log.debug("Instance " + awsHelper.getAWSInstanceName(member.getInstanceId()) +
+					          " needs to be registered to load balancer " + loadBalancerName);
+				}
+
+				// LB Common Member has a property 'EC2_AVAILABILITY_ZONE' points to the ec2 availability zone
+				// for this member. Use the property value to update the LB about the relevant zone
+				String availabilityZone = getEC2AvaialbilityZoneOfMember(member);
+				if (availabilityZone != null) {
+					availabilityZones.add(availabilityZone);
+				}
+			}
 		    instance.setInstanceId(awsHelper.getAWSInstanceName(instanceId));
 
 		    instances.add(instance);
@@ -220,7 +237,8 @@ public class AWSLoadBalancer implements LoadBalancer {
 
 			// add stickiness policy
 			if (awsHelper.getAppStickySessionCookie() != null && !awsHelper.getAppStickySessionCookie().isEmpty()) {
-				CreateAppCookieStickinessPolicyResult result = awsHelper.createStickySessionPolicy(loadBalancerName, awsHelper.getAppStickySessionCookie(),
+				CreateAppCookieStickinessPolicyResult result = awsHelper.createStickySessionPolicy(loadBalancerName,
+				                                                                                   awsHelper.getAppStickySessionCookie(),
 				                                                                                   Constants.STICKINESS_POLICY,
 				                                                                                   region);
 
@@ -291,7 +309,7 @@ public class AWSLoadBalancer implements LoadBalancer {
 		// clusterMembers stores all the members of a cluster.
 		Collection<Member> clusterMembers = cluster.getMembers();
 
-		isUpdated= addClusterMembersInfo(clusterMembers, loadBalancerName, region);
+		isUpdated= addClusterMembersInfo(clusterMembers, loadBalancerName, region,attachedInstances);
 
 		return isUpdated;
 	}

http://git-wip-us.apache.org/repos/asf/stratos/blob/42a96547/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/Main.java
----------------------------------------------------------------------
diff --git a/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/Main.java b/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/Main.java
index 80b6481..0ea2005 100644
--- a/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/Main.java
+++ b/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/Main.java
@@ -36,7 +36,7 @@ import java.util.concurrent.ExecutorService;
 public class Main {
 	private static final Log log = LogFactory.getLog(Main.class);
 	public static final String AWS_EXTENSION_THREAD_POOL = "aws.extension.thread.pool";
-	public static final int THREAD_POOL_SIZE = 10;
+	public static final int THREAD_POOL_SIZE =2;
 	private static ExecutorService executorService;
 
 	public static void main(String[] args) {
@@ -73,13 +73,13 @@ public class Main {
 						}
 						mainThread.join();
 					} catch (Exception e) {
-						log.error(e);
+						log.error("Error occurred while shutting down the aws lb extension",e);
 					}
 				}
 			});
 		} catch (LoadBalancerExtensionException e) {
 			if (log.isErrorEnabled()) {
-				log.error("Error occurred while running the aws lb extension");
+				log.error("Error occurred while running the aws lb extension",e);
 			}
 			if (extension != null) {
 				log.info("Shutting aws extension...");


[2/3] stratos git commit: Refactor aws lb extension

Posted by ga...@apache.org.
Refactor aws lb extension


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

Branch: refs/heads/stratos-4.1.x
Commit: 46a99e78251a091c6910083311c9843ff8cfc730
Parents: 52966c0
Author: gayangunarathne <ga...@wso2.com>
Authored: Tue Dec 8 11:35:56 2015 +0530
Committer: gayangunarathne <ga...@wso2.com>
Committed: Mon Dec 21 10:24:45 2015 +0530

----------------------------------------------------------------------
 .../apache/stratos/aws/extension/AWSHelper.java |  2 +-
 .../stratos/aws/extension/AWSLoadBalancer.java  | 60 +++++++-------------
 .../aws/extension/AWSStatisticsReader.java      |  5 +-
 3 files changed, 23 insertions(+), 44 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/46a99e78/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSHelper.java
----------------------------------------------------------------------
diff --git a/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSHelper.java b/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSHelper.java
index a12fc96..ef66290 100644
--- a/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSHelper.java
+++ b/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSHelper.java
@@ -957,7 +957,7 @@ public class AWSHelper {
      * Returns the Listeners required for the service. Listeners are derived
      * from the proxy port, port and protocol values of the service.
      *
-     * @param service
+     * @param member
      * @return list of listeners required for the service
      */
     public List<Listener> getRequiredListeners(Member member) throws LoadBalancerExtensionException {

http://git-wip-us.apache.org/repos/asf/stratos/blob/46a99e78/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSLoadBalancer.java
----------------------------------------------------------------------
diff --git a/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSLoadBalancer.java b/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSLoadBalancer.java
index 5cd5556..b365c9b 100644
--- a/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSLoadBalancer.java
+++ b/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSLoadBalancer.java
@@ -43,9 +43,8 @@ public class AWSLoadBalancer implements LoadBalancer {
 
     private static final Log log = LogFactory.getLog(AWSLoadBalancer.class);
 
-    // A map <clusterId, load balancer info> to store load balancer information
-    // against the cluster id
-    private static ConcurrentHashMap<String, LoadBalancerInfo> clusterIdToLoadBalancerMap = new ConcurrentHashMap<String, LoadBalancerInfo>();
+    // A map <clusterId, load balancer info dto> to store load balancer information against the cluster id
+    private static ConcurrentHashMap<String, LBInfoDTO> clusterIdToLoadBalancerMap = new ConcurrentHashMap<String, LBInfoDTO>();
 
     // Object used to invoke methods related to AWS API
     private AWSHelper awsHelper;
@@ -93,6 +92,8 @@ public class AWSLoadBalancer implements LoadBalancer {
                     Collection<Member> clusterMembers = cluster.getMembers();
 
                     if (clusterMembers.size() > 0) {
+
+	                    //We assume all the members are in the same region.
                         Member aMember = clusterMembers.iterator().next();
 
                         // a unique load balancer name with user-defined prefix and a sequence number.
@@ -119,10 +120,11 @@ public class AWSLoadBalancer implements LoadBalancer {
                                 initialAvailabilityZones.add(region + zone);
                             }
                         }
+
+
 	                    String loadBalancerDNSName =
 			                    createAWSLoadBalancer(loadBalancerName, region, listenersForThisCluster,initialAvailabilityZones);
 
-
                         log.info(String.format("Load balancer %s  created for cluster %s " , loadBalancerDNSName, cluster.getClusterId()));
 
 	                    if(addClusterMembersInfo(clusterMembers, loadBalancerName, region)){
@@ -130,17 +132,17 @@ public class AWSLoadBalancer implements LoadBalancer {
 	                    }
 
                         // persist LB info
+
+	                    LBInfoDTO lbInfoDTO = new LBInfoDTO(loadBalancerName, cluster.getClusterId(), region);
                         try {
-                            persistenceManager.persist(new LBInfoDTO(loadBalancerName, cluster.getClusterId(), region));
+                            persistenceManager.persist(lbInfoDTO);
 
                         } catch (PersistenceException e) {
 	                        log.error(String.format(
 			                        "Unable to persist LB Information for %s , cluster id %s " + loadBalancerName,
 			                        cluster.getClusterId()));
                         }
-
-                        LoadBalancerInfo loadBalancerInfo = new LoadBalancerInfo(loadBalancerName, region);
-                        clusterIdToLoadBalancerMap.put(cluster.getClusterId(),loadBalancerInfo);
+	                    clusterIdToLoadBalancerMap.put(cluster.getClusterId(), lbInfoDTO);
 
                     }
 
@@ -160,8 +162,7 @@ public class AWSLoadBalancer implements LoadBalancer {
                     clustersToRemoveFromMap.add(clusterId);
 
                     if (log.isDebugEnabled()) {
-                        log.debug("Load balancer for cluster " + clusterId
-                                + " needs to be removed.");
+                        log.debug(String.format("Load balancer for cluster %s needs to be removed.", clusterId));
                     }
 
                 }
@@ -179,8 +180,8 @@ public class AWSLoadBalancer implements LoadBalancer {
                     persistenceManager.remove(new LBInfoDTO(loadBalancerName, clusterId, region));
 
                 } catch (PersistenceException e) {
-                    log.error("Unable to persist LB Information for " + loadBalancerName + ", cluster id " +
-                            clusterId);
+                    log.error(String.format("Unable to persist LB Information for[Load Balancer Name] %s [Cluster ID] %s"
+                                            ,loadBalancerName, clusterId));
                 }
                 clusterIdToLoadBalancerMap.remove(clusterId);
             }
@@ -276,10 +277,10 @@ public class AWSLoadBalancer implements LoadBalancer {
 
 	private Boolean updateExistingLoadBalancer(Cluster cluster) {
 		Boolean isUpdated=false;
-		LoadBalancerInfo loadBalancerInfo = clusterIdToLoadBalancerMap.get(cluster.getClusterId());
+		LBInfoDTO lbInfoDTO = clusterIdToLoadBalancerMap.get(cluster.getClusterId());
 
-		String loadBalancerName = loadBalancerInfo.getName();
-		String region = loadBalancerInfo.getRegion();
+		String loadBalancerName = lbInfoDTO.getName();
+		String region = lbInfoDTO.getRegion();
 
 		// Get all the instances attached - Attach newly added instances to load balancer
 
@@ -326,8 +327,7 @@ public class AWSLoadBalancer implements LoadBalancer {
                 LoadBalancerDescription lbDesc = awsHelper.getLoadBalancerDescription(lbInfoDTO.getName(),
                         lbInfoDTO.getRegion());
                 if (lbDesc != null) {
-                    clusterIdToLoadBalancerMap.put(lbInfoDTO.getClusterId(), new LoadBalancerInfo(lbInfoDTO.getName(),
-                            lbInfoDTO.getRegion()));
+                    clusterIdToLoadBalancerMap.put(lbInfoDTO.getClusterId(),lbInfoDTO);
                 } else {
                     // make debug
                     if (log.isInfoEnabled()) {
@@ -361,7 +361,7 @@ public class AWSLoadBalancer implements LoadBalancer {
     public void stop() throws LoadBalancerExtensionException {
         // Remove all load balancers if 'terminate.lbs.on.extension.stop' = true in aws-extension.sh
         if (AWSExtensionContext.getInstance().terminateLBsOnExtensionStop()) {
-            for (Map.Entry<String, LoadBalancerInfo> lbInfoEntry : clusterIdToLoadBalancerMap
+            for (Map.Entry<String, LBInfoDTO> lbInfoEntry : clusterIdToLoadBalancerMap
                     .entrySet()) {
                 // Remove load balancer
                 awsHelper.deleteLoadBalancer(lbInfoEntry.getValue().getName(),
@@ -392,30 +392,8 @@ public class AWSLoadBalancer implements LoadBalancer {
         }
     }
 
-    public static ConcurrentHashMap<String, LoadBalancerInfo> getClusterIdToLoadBalancerMap() {
+    public static ConcurrentHashMap<String, LBInfoDTO> getClusterIdToLoadBalancerMap() {
         return clusterIdToLoadBalancerMap;
     }
 }
 
-/**
- * Used to store load balancer name and the region in which it is created. This
- * helps in finding region while calling API methods to modify/delete a load
- * balancer.
- */
-class LoadBalancerInfo {
-    private String name;
-    private String region;
-
-    public LoadBalancerInfo(String name, String region) {
-        this.name = name;
-        this.region = region;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public String getRegion() {
-        return region;
-    }
-}

http://git-wip-us.apache.org/repos/asf/stratos/blob/46a99e78/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSStatisticsReader.java
----------------------------------------------------------------------
diff --git a/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSStatisticsReader.java b/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSStatisticsReader.java
index 55aca3d..c3ac2eb 100644
--- a/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSStatisticsReader.java
+++ b/extensions/load-balancer/modules/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSStatisticsReader.java
@@ -21,6 +21,7 @@ package org.apache.stratos.aws.extension;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.aws.extension.persistence.dto.LBInfoDTO;
 import org.apache.stratos.common.constants.StratosConstants;
 import org.apache.stratos.load.balancer.common.statistics.LoadBalancerStatisticsReader;
 import org.apache.stratos.load.balancer.common.topology.TopologyProvider;
@@ -60,14 +61,14 @@ public class AWSStatisticsReader implements LoadBalancerStatisticsReader {
 
 		int inFlightRequestCount = 0;
 
-		ConcurrentHashMap<String, LoadBalancerInfo> clusterIdToLoadBalancerMap = AWSLoadBalancer
+		ConcurrentHashMap<String, LBInfoDTO> clusterIdToLoadBalancerMap = AWSLoadBalancer
 				.getClusterIdToLoadBalancerMap();
 
 		// Check if load balancer info is available for this cluster.
 		// If yes, then find difference between total requests made to the load balancer and 
 		// total responses generated by instances attached to it.
 		if (clusterIdToLoadBalancerMap.containsKey(clusterId)) {
-			LoadBalancerInfo loadBalancerInfo = clusterIdToLoadBalancerMap
+			LBInfoDTO loadBalancerInfo = clusterIdToLoadBalancerMap
 					.get(clusterId);
 
 			String loadBalancerName = loadBalancerInfo.getName();