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();