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/10/09 16:35:27 UTC
[14/32] stratos git commit: Setting endpoint,
adding logging for AWS API Calls. Deleting load balancer for inactive
cluster.
Setting endpoint, adding logging for AWS API Calls. Deleting load balancer for inactive cluster.
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/31acd2a4
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/31acd2a4
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/31acd2a4
Branch: refs/heads/gsoc-projects-2015
Commit: 31acd2a4401ac9aea23e1b8d2b1f476666dd80e7
Parents: 7ea76ec
Author: swapnilpatilRajaram <sw...@students.iiit.ac.in>
Authored: Sat Jul 18 16:59:12 2015 +0000
Committer: swapnilpatilRajaram <sw...@students.iiit.ac.in>
Committed: Sat Jul 18 16:59:12 2015 +0000
----------------------------------------------------------------------
.../apache/stratos/aws/extension/AWSHelper.java | 165 ++++++++-----
.../stratos/aws/extension/AWSLoadBalancer.java | 239 +++++++++++--------
2 files changed, 244 insertions(+), 160 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/stratos/blob/31acd2a4/extensions/load-balancer/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSHelper.java
----------------------------------------------------------------------
diff --git a/extensions/load-balancer/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSHelper.java b/extensions/load-balancer/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSHelper.java
index 438289a..924d3bd 100644
--- a/extensions/load-balancer/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSHelper.java
+++ b/extensions/load-balancer/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSHelper.java
@@ -38,10 +38,6 @@ import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.elasticloadbalancing.AmazonElasticLoadBalancingClient;
import com.amazonaws.services.elasticloadbalancing.model.*;
-/**
- * @author swapnil
- *
- */
public class AWSHelper {
private String awsAccessKey;
private String awsSecretKey;
@@ -51,6 +47,8 @@ public class AWSHelper {
private BasicAWSCredentials awsCredentials;
private ClientConfiguration clientConfiguration;
+ AmazonElasticLoadBalancingClient lbClient;
+
private static final Log log = LogFactory.getLog(AWSHelper.class);
public AWSHelper() throws LoadBalancerExtensionException {
@@ -76,6 +74,15 @@ public class AWSHelper {
this.availabilityZone = properties
.getProperty(Constants.AVAILABILITY_ZONE_KEY);
this.region = properties.getProperty(Constants.REGION_KEY);
+
+ awsCredentials = new BasicAWSCredentials(awsAccessKey, awsSecretKey);
+ clientConfiguration = new ClientConfiguration();
+
+ lbClient = new AmazonElasticLoadBalancingClient(awsCredentials,
+ clientConfiguration);
+ lbClient.setEndpoint("elasticloadbalancing." + this.region
+ + ".amazonaws.com");
+
} catch (IOException e) {
log.error("Error reading aws configuration file.");
throw new LoadBalancerExtensionException(
@@ -87,9 +94,6 @@ public class AWSHelper {
log.warn("Failed to close input stream to aws configuration file.");
}
}
-
- awsCredentials = new BasicAWSCredentials(awsAccessKey, awsSecretKey);
- clientConfiguration = new ClientConfiguration();
}
/**
@@ -101,31 +105,32 @@ public class AWSHelper {
* @return DNS name of newly created load balancer
*/
public String createLoadBalancer(String name, List<Listener> listeners) {
- try {
- CreateLoadBalancerRequest createLoadBalancerRequest = new CreateLoadBalancerRequest(
- name);
- createLoadBalancerRequest.setListeners(listeners);
+ log.info("Creating load balancer " + name);
- Set<String> availabilityZones = new HashSet<String>();
- availabilityZones.add(availabilityZone);
+ CreateLoadBalancerRequest createLoadBalancerRequest = new CreateLoadBalancerRequest(
+ name);
- createLoadBalancerRequest.setAvailabilityZones(availabilityZones);
+ createLoadBalancerRequest.setListeners(listeners);
- AmazonElasticLoadBalancingClient lbClient = new AmazonElasticLoadBalancingClient(
- awsCredentials, clientConfiguration);
- lbClient.setEndpoint("elasticloadbalancing." + this.region
- + ".amazonaws.com");
+ Set<String> availabilityZones = new HashSet<String>();
+ availabilityZones.add(availabilityZone);
+
+ createLoadBalancerRequest.setAvailabilityZones(availabilityZones);
+
+ try {
CreateLoadBalancerResult clbResult = lbClient
.createLoadBalancer(createLoadBalancerRequest);
return clbResult.getDNSName();
+
} catch (Exception e) {
log.error("Could not create load balancer : " + name + ".");
e.printStackTrace();
return null;
}
+
}
/**
@@ -135,16 +140,19 @@ public class AWSHelper {
* @param loadBalancerName
*/
public void deleteLoadBalancer(String loadBalancerName) {
- try {
- DeleteLoadBalancerRequest deleteLoadBalancerRequest = new DeleteLoadBalancerRequest();
- deleteLoadBalancerRequest.setLoadBalancerName(loadBalancerName);
- AmazonElasticLoadBalancingClient lbClient = new AmazonElasticLoadBalancingClient(
- awsCredentials, clientConfiguration);
+ log.info("Deleting load balancer " + loadBalancerName);
+
+ DeleteLoadBalancerRequest deleteLoadBalancerRequest = new DeleteLoadBalancerRequest();
+ deleteLoadBalancerRequest.setLoadBalancerName(loadBalancerName);
+ try {
lbClient.deleteLoadBalancer(deleteLoadBalancerRequest);
+ return;
+
} catch (Exception e) {
log.error("Could not delete load balancer : " + loadBalancerName);
+ e.printStackTrace();
}
}
@@ -158,18 +166,23 @@ public class AWSHelper {
*/
public void registerInstancesToLoadBalancer(String loadBalancerName,
List<Instance> instances) {
- try {
- RegisterInstancesWithLoadBalancerRequest registerInstancesWithLoadBalancerRequest = new RegisterInstancesWithLoadBalancerRequest(
- loadBalancerName, instances);
- AmazonElasticLoadBalancingClient lbClient = new AmazonElasticLoadBalancingClient(
- awsCredentials, clientConfiguration);
+ log.info("Attaching instance " + instances.get(0)
+ + " to load balancer + " + loadBalancerName);
+
+ RegisterInstancesWithLoadBalancerRequest registerInstancesWithLoadBalancerRequest = new RegisterInstancesWithLoadBalancerRequest(
+ loadBalancerName, instances);
+
+ try {
RegisterInstancesWithLoadBalancerResult result = lbClient
.registerInstancesWithLoadBalancer(registerInstancesWithLoadBalancerRequest);
+ return;
+
} catch (Exception e) {
log.error("Could not register instances to load balancer "
+ loadBalancerName);
+ e.printStackTrace();
}
}
@@ -183,18 +196,22 @@ public class AWSHelper {
*/
public void deregisterInstancesFromLoadBalancer(String loadBalancerName,
List<Instance> instances) {
- try {
- DeregisterInstancesFromLoadBalancerRequest deregisterInstancesFromLoadBalancerRequest = new DeregisterInstancesFromLoadBalancerRequest(
- loadBalancerName, instances);
- AmazonElasticLoadBalancingClient lbClient = new AmazonElasticLoadBalancingClient(
- awsCredentials, clientConfiguration);
+ log.info("Detaching instance " + instances.get(0)
+ + " from load balancer + " + loadBalancerName);
+
+ DeregisterInstancesFromLoadBalancerRequest deregisterInstancesFromLoadBalancerRequest = new DeregisterInstancesFromLoadBalancerRequest(
+ loadBalancerName, instances);
+ try {
DeregisterInstancesFromLoadBalancerResult result = lbClient
.deregisterInstancesFromLoadBalancer(deregisterInstancesFromLoadBalancerRequest);
+ return;
+
} catch (Exception e) {
log.error("Could not de-register instances from load balancer "
+ loadBalancerName);
+ e.printStackTrace();
}
}
@@ -207,6 +224,7 @@ public class AWSHelper {
*/
private LoadBalancerDescription getLoadBalancerDescription(
String loadBalancerName) {
+
List<String> loadBalancers = new ArrayList<String>();
loadBalancers.add(loadBalancerName);
@@ -214,17 +232,21 @@ public class AWSHelper {
DescribeLoadBalancersRequest describeLoadBalancersRequest = new DescribeLoadBalancersRequest(
loadBalancers);
- AmazonElasticLoadBalancingClient lbClient = new AmazonElasticLoadBalancingClient(
- awsCredentials, clientConfiguration);
-
- DescribeLoadBalancersResult result = lbClient
- .describeLoadBalancers(describeLoadBalancersRequest);
+ try {
+ DescribeLoadBalancersResult result = lbClient
+ .describeLoadBalancers(describeLoadBalancersRequest);
- if (result.getLoadBalancerDescriptions() == null
- || result.getLoadBalancerDescriptions().size() == 0)
+ if (result.getLoadBalancerDescriptions() == null
+ || result.getLoadBalancerDescriptions().size() == 0)
+ return null;
+ else
+ return result.getLoadBalancerDescriptions().get(0);
+ } catch (Exception e) {
+ log.error("Could not find description of load balancer "
+ + loadBalancerName);
+ e.printStackTrace();
return null;
- else
- return result.getLoadBalancerDescriptions().get(0);
+ }
}
/**
@@ -247,8 +269,9 @@ public class AWSHelper {
return lbDescription.getInstances();
} catch (Exception e) {
- log.error("Could not find description of load balancer "
+ log.error("Could not find instances attached load balancer "
+ loadBalancerName);
+ e.printStackTrace();
return null;
}
}
@@ -266,19 +289,20 @@ public class AWSHelper {
if (listeners.size() == 0)
return;
- try {
- CreateLoadBalancerListenersRequest createLoadBalancerListenersRequest = new CreateLoadBalancerListenersRequest();
- createLoadBalancerListenersRequest.setListeners(listeners);
- createLoadBalancerListenersRequest
- .setLoadBalancerName(loadBalancerName);
+ CreateLoadBalancerListenersRequest createLoadBalancerListenersRequest = new CreateLoadBalancerListenersRequest();
+ createLoadBalancerListenersRequest.setListeners(listeners);
+ createLoadBalancerListenersRequest
+ .setLoadBalancerName(loadBalancerName);
- AmazonElasticLoadBalancingClient lbClient = new AmazonElasticLoadBalancingClient(
- awsCredentials, clientConfiguration);
+ try {
lbClient.createLoadBalancerListeners(createLoadBalancerListenersRequest);
+ return;
+
} catch (Exception e) {
log.error("Could not add listeners to load balancer "
+ loadBalancerName);
+ e.printStackTrace();
}
}
@@ -294,28 +318,28 @@ public class AWSHelper {
if (listeners.size() == 0)
return;
- try {
- DeleteLoadBalancerListenersRequest deleteLoadBalancerListenersRequest = new DeleteLoadBalancerListenersRequest();
- deleteLoadBalancerListenersRequest
- .setLoadBalancerName(loadBalancerName);
+ DeleteLoadBalancerListenersRequest deleteLoadBalancerListenersRequest = new DeleteLoadBalancerListenersRequest();
+ deleteLoadBalancerListenersRequest
+ .setLoadBalancerName(loadBalancerName);
- List<Integer> loadBalancerPorts = new ArrayList<Integer>();
+ List<Integer> loadBalancerPorts = new ArrayList<Integer>();
- for (Listener listener : listeners) {
- loadBalancerPorts.add(listener.getLoadBalancerPort());
- }
+ for (Listener listener : listeners) {
+ loadBalancerPorts.add(listener.getLoadBalancerPort());
+ }
- deleteLoadBalancerListenersRequest
- .setLoadBalancerPorts(loadBalancerPorts);
+ deleteLoadBalancerListenersRequest
+ .setLoadBalancerPorts(loadBalancerPorts);
- AmazonElasticLoadBalancingClient lbClient = new AmazonElasticLoadBalancingClient(
- awsCredentials, clientConfiguration);
+ try {
lbClient.deleteLoadBalancerListeners(deleteLoadBalancerListenersRequest);
+ return;
} catch (Exception e) {
log.error("Could not remove listeners from load balancer "
+ loadBalancerName);
+ e.printStackTrace();
}
}
@@ -368,9 +392,11 @@ public class AWSHelper {
for (Port port : service.getPorts()) {
int instancePort = port.getValue();
int proxyPort = port.getProxy();
- String protocol = port.getProtocol();
+ String protocol = port.getProtocol().toUpperCase();
+ String instanceProtocol = protocol;
Listener listener = new Listener(protocol, proxyPort, instancePort);
+ listener.setInstanceProtocol(instanceProtocol);
listeners.add(listener);
}
@@ -393,4 +419,17 @@ public class AWSHelper {
return name;
}
+
+ /**
+ * @param memberInstanceName
+ * @return
+ */
+ public String getAWSInstanceName(final String memberInstanceName) {
+ if (memberInstanceName.contains("/")) {
+ return memberInstanceName
+ .substring(memberInstanceName.indexOf("/") + 1);
+ } else {
+ return memberInstanceName;
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/stratos/blob/31acd2a4/extensions/load-balancer/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSLoadBalancer.java
----------------------------------------------------------------------
diff --git a/extensions/load-balancer/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSLoadBalancer.java b/extensions/load-balancer/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSLoadBalancer.java
index 8aafce2..99d6906 100644
--- a/extensions/load-balancer/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSLoadBalancer.java
+++ b/extensions/load-balancer/aws-extension/src/main/java/org/apache/stratos/aws/extension/AWSLoadBalancer.java
@@ -22,6 +22,7 @@ package org.apache.stratos.aws.extension;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import org.apache.commons.logging.Log;
@@ -52,149 +53,193 @@ public class AWSLoadBalancer implements LoadBalancer {
log.info("AWS load balancer extension re-configured.");
- for (Service service : topology.getServices()) {
+ try {
+ // Thread.sleep(10000);
- List<Listener> listenersForThisService = awsHelper
- .getRequiredListeners(service);
+ HashSet<String> activeClusters = new HashSet<String>();
- for (Cluster cluster : service.getClusters()) {
+ for (Service service : topology.getServices()) {
- // cluster.getHostNames()
+ List<Listener> listenersForThisService = awsHelper
+ .getRequiredListeners(service);
- // Check if a load balancer is created for this cluster
+ for (Cluster cluster : service.getClusters()) {
+ // Check if a load balancer is created for this cluster
+ if (clusterIdToLoadBalancerMap.containsKey(cluster
+ .getClusterId())) {
+ // A load balancer is already present for this cluster
+ // Get the load balancer and update it.
- if (clusterIdToLoadBalancerMap.containsKey(cluster
- .getClusterId())) {
- // A load balancer is already present for this cluster
- // Get the load balancer and update it.
+ String loadBalancerName = clusterIdToLoadBalancerMap
+ .get(cluster.getClusterId());
- String loadBalancerName = clusterIdToLoadBalancerMap
- .get(cluster.getClusterId());
+ // 1. Get all the instances attached
+ // Add/remove instances as necessary
- // 1. Get all the instances attached
- // Add/remove instances as necessary
+ List<Instance> attachedInstances = awsHelper
+ .getAttachedInstances(loadBalancerName);
- List<Instance> attachedInstances = awsHelper
- .getAttachedInstances(loadBalancerName);
+ Collection<Member> clusterInstances = cluster
+ .getMembers();
- Collection<Member> clusterInstances = cluster.getMembers();
+ if (clusterInstances.size() > 0) {
+ activeClusters.add(cluster.getClusterId());
+ } else {
+ break;
+ }
- List<Instance> instancesToAddToLoadBalancer = new ArrayList<Instance>();
+ List<Instance> instancesToAddToLoadBalancer = new ArrayList<Instance>();
- for (Member member : clusterInstances) {
- // if instance id of member is not in attachedInstances
- // add this to instancesToAddToLoadBalancer
+ for (Member member : clusterInstances) {
+ // if instance id of member is not in
+ // attachedInstances
+ // add this to instancesToAddToLoadBalancer
- System.out.println("Instance Id :");
- System.out.println(member.getInstanceId());
-
- Instance instance = new Instance(member.getInstanceId());
+ System.out.println("Instance Id : "
+ + member.getInstanceId());
+ System.out.println("New instance id : "
+ + awsHelper.getAWSInstanceName(member
+ .getInstanceId()));
- if (!attachedInstances.contains(instance)) {
- instancesToAddToLoadBalancer.add(instance);
- }
-
- }
+ Instance instance = new Instance(
+ awsHelper.getAWSInstanceName(member
+ .getInstanceId()));
- List<Instance> instancesToRemoveFromLoadBalancer = new ArrayList<Instance>();
+ if (attachedInstances == null
+ || !attachedInstances.contains(instance)) {
+ instancesToAddToLoadBalancer.add(instance);
+ }
- for (Instance instance : attachedInstances) {
- if (!clusterInstances
- .contains(instance.getInstanceId())) {
- instancesToRemoveFromLoadBalancer.add(instance);
}
- }
- if (instancesToRemoveFromLoadBalancer.size() > 0)
- awsHelper.deregisterInstancesFromLoadBalancer(
- loadBalancerName,
- instancesToRemoveFromLoadBalancer);
+ List<Instance> instancesToRemoveFromLoadBalancer = new ArrayList<Instance>();
- if (instancesToAddToLoadBalancer.size() > 0)
- awsHelper.registerInstancesToLoadBalancer(
- loadBalancerName, instancesToAddToLoadBalancer);
+ for (Instance instance : attachedInstances) {
+ if (!clusterInstances.contains(instance
+ .getInstanceId())) {
+ instancesToRemoveFromLoadBalancer.add(instance);
+ }
+ }
- // 2. Get all the listeners
- // Add/Remove listeners as necessary
+ if (instancesToRemoveFromLoadBalancer.size() > 0)
+ awsHelper.deregisterInstancesFromLoadBalancer(
+ loadBalancerName,
+ instancesToRemoveFromLoadBalancer);
- // Is it really necessary to add/remove listeners from a lb
- // to a cluster
- // Need to add only if a cluster can be used for more than
- // one service (because a service my get added later)
- // or service port mappings may change
+ if (instancesToAddToLoadBalancer.size() > 0)
+ awsHelper.registerInstancesToLoadBalancer(
+ loadBalancerName,
+ instancesToAddToLoadBalancer);
- // Need to remove only if ... same for above reason
+ // 2. Get all the listeners
+ // Add/Remove listeners as necessary
- List<Listener> attachedListeners = awsHelper
- .getAttachedListeners(loadBalancerName);
+ // Is it really necessary to add/remove listeners from a
+ // lb
+ // to a cluster
+ // Need to add only if a cluster can be used for more
+ // than
+ // one service (because a service my get added later)
+ // or service port mappings may change
- List<Listener> listenersToAddToLoadBalancer = new ArrayList<Listener>();
+ // Need to remove only if ... same for above reason
- for (Listener listener : listenersForThisService) {
- // Need to check if Listener class supports equals
- // method or not
+ List<Listener> attachedListeners = awsHelper
+ .getAttachedListeners(loadBalancerName);
- // if listener required for this service is not in
- // attachedListeners
- // add this to listenersToAddToLoadBalancer
- }
+ List<Listener> listenersToAddToLoadBalancer = new ArrayList<Listener>();
- List<Listener> listenersToRemoveFromLoadBalancer = new ArrayList<Listener>();
+ for (Listener listener : listenersForThisService) {
+ if (attachedListeners == null
+ || !attachedListeners.contains(listener)) {
+ listenersToAddToLoadBalancer.add(listener);
+ }
+ }
- for (Listener listener : attachedListeners) {
- // Need to check if Listener class supports equals
- // method or not
+ List<Listener> listenersToRemoveFromLoadBalancer = new ArrayList<Listener>();
- if (!listenersForThisService.contains(listener)) {
- listenersToRemoveFromLoadBalancer.add(listener);
+ for (Listener listener : attachedListeners) {
+ if (!listenersForThisService.contains(listener)) {
+ listenersToRemoveFromLoadBalancer.add(listener);
+ }
}
- }
- if (listenersToRemoveFromLoadBalancer.size() > 0)
- awsHelper.removeListenersFromLoadBalancer(
- loadBalancerName,
- listenersToRemoveFromLoadBalancer);
+ if (listenersToRemoveFromLoadBalancer.size() > 0)
+ awsHelper.removeListenersFromLoadBalancer(
+ loadBalancerName,
+ listenersToRemoveFromLoadBalancer);
- if (listenersToAddToLoadBalancer.size() > 0)
- awsHelper.addListenersToLoadBalancer(loadBalancerName,
- listenersToAddToLoadBalancer);
+ if (listenersToAddToLoadBalancer.size() > 0)
+ awsHelper.addListenersToLoadBalancer(
+ loadBalancerName,
+ listenersToAddToLoadBalancer);
- // Update domain mappings
+ // Update domain mappings
- } else {
- // Create a new load balancer for this cluster
+ } else {
+ // Create a new load balancer for this cluster
+ Collection<Member> clusterInstances = cluster
+ .getMembers();
- String loadBalancerName = awsHelper.getLoadBalancerName(cluster.getClusterId());
+ if (clusterInstances.size() == 0)
+ break;
- String loadBalancerDNSName = awsHelper.createLoadBalancer(
- loadBalancerName, listenersForThisService);
+ String loadBalancerName = awsHelper
+ .getLoadBalancerName(cluster.getClusterId());
- // register instances to LB
+ String loadBalancerDNSName = awsHelper
+ .createLoadBalancer(loadBalancerName,
+ listenersForThisService);
- List<Instance> instances = new ArrayList<Instance>();
+ log.info("Load balancer '" + loadBalancerDNSName
+ + "' created for cluster '"
+ + cluster.getClusterId());
- for (Member member : cluster.getMembers()) {
- String instanceId = member.getInstanceId();
+ // register instances to LB
+ List<Instance> instances = new ArrayList<Instance>();
- System.out.println("Instance id : " + instanceId);
-
- Instance instance = new Instance();
- instance.setInstanceId(instanceId);
+ for (Member member : clusterInstances) {
+ String instanceId = member.getInstanceId();
- instances.add(instance);
- }
+ System.out.println("Instance id : " + instanceId);
+ System.out.println("New instance id : "
+ + awsHelper.getAWSInstanceName(instanceId));
- awsHelper.registerInstancesToLoadBalancer(loadBalancerName,
- instances);
+ Instance instance = new Instance();
+ instance.setInstanceId(awsHelper
+ .getAWSInstanceName(instanceId));
- // Create domain mappings
+ instances.add(instance);
+ }
+
+ awsHelper.registerInstancesToLoadBalancer(
+ loadBalancerName, instances);
+
+ // Create domain mappings
+
+ clusterIdToLoadBalancerMap.put(cluster.getClusterId(),
+ loadBalancerName);
+ activeClusters.add(cluster.getClusterId());
+ }
}
+ }
+
+ // Find out clusters which were present earlier but are not now.
+ // Delete load balancers associated with those clusters.
+ for (String clusterId : clusterIdToLoadBalancerMap.keySet()) {
+ if (!activeClusters.contains(clusterId)) {
+ // Remove load balancer for that cluster.
+ awsHelper.deleteLoadBalancer(clusterIdToLoadBalancerMap
+ .get(clusterId));
+ clusterIdToLoadBalancerMap.remove(clusterId);
+ }
}
- }
- // Find out clusters which were present earlier but are not now.
- // Delete load balancers associated with those clusters.
+ activeClusters.clear();
+ } catch (Exception e) {
+ throw new LoadBalancerExtensionException(e);
+ }
return true;
}