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 <[email protected]> Authored: Mon Dec 21 17:27:43 2015 +0530 Committer: gayangunarathne <[email protected]> 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...");
