Adding logic for registering and de-registering instances to Load balanacer.


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

Branch: refs/heads/gsoc-projects-2015
Commit: 617e04d541e92234353b98ace949d99136172fa9
Parents: bcf2c8e
Author: swapnilpatilRajaram <[email protected]>
Authored: Sun May 31 19:10:19 2015 +0000
Committer: swapnilpatilRajaram <[email protected]>
Committed: Sun May 31 19:10:19 2015 +0000

----------------------------------------------------------------------
 .../apache/stratos/aws/extension/AWSHelper.java |  77 +++++++++++-
 .../stratos/aws/extension/AWSLoadBalancer.java  | 120 +++++++++++++++++--
 2 files changed, 188 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/617e04d5/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 4bca6f8..7a0d4db 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
@@ -33,13 +33,20 @@ import com.amazonaws.auth.BasicAWSCredentials;
 import 
com.amazonaws.services.elasticloadbalancing.AmazonElasticLoadBalancingClient;
 import 
com.amazonaws.services.elasticloadbalancing.model.CreateLoadBalancerRequest;
 import 
com.amazonaws.services.elasticloadbalancing.model.CreateLoadBalancerResult;
+import 
com.amazonaws.services.elasticloadbalancing.model.DeregisterInstancesFromLoadBalancerRequest;
+import 
com.amazonaws.services.elasticloadbalancing.model.DeregisterInstancesFromLoadBalancerResult;
+import com.amazonaws.services.elasticloadbalancing.model.Instance;
 import com.amazonaws.services.elasticloadbalancing.model.Listener;
+import 
com.amazonaws.services.elasticloadbalancing.model.RegisterInstancesWithLoadBalancerRequest;
+import 
com.amazonaws.services.elasticloadbalancing.model.RegisterInstancesWithLoadBalancerResult;
+import com.amazonaws.services.opsworks.model.AttachElasticLoadBalancerRequest;
 
 
 public class AWSHelper 
 {
        private String awsAccessKey;
        private String awsSecretKey;
+       private String httpProxy;
        private String availabilityZone;
 
        private BasicAWSCredentials awsCredentials;
@@ -49,7 +56,7 @@ public class AWSHelper
        
        public AWSHelper()
        {
-               // Read values for awsAccessKey and awsSecretKey from config 
file
+               // Read values for awsAccessKey, awsSecretKey etc. from config 
file
                // Throw a proper exception / log warning if cant read 
credentials ?
                
                awsCredentials = new BasicAWSCredentials(awsAccessKey, 
awsSecretKey);
@@ -80,11 +87,77 @@ public class AWSHelper
                }
                catch(Exception e)
                {
-                       log.error("Could not create load balancer " + name + 
".", e);
+                       log.error("Could not create load balancer " + name + 
".");
                        return null;
                }
        }
        
+       public void registerInstancesToLoadBalancer(String loadBalancerName, 
List<Instance> instances)
+       {
+               try
+               {
+                       RegisterInstancesWithLoadBalancerRequest 
registerInstancesWithLoadBalancerRequest = new 
RegisterInstancesWithLoadBalancerRequest(loadBalancerName, instances);
+               
+                       AmazonElasticLoadBalancingClient lbClient = new 
AmazonElasticLoadBalancingClient(awsCredentials, clientConfiguration);
+                       
+                       RegisterInstancesWithLoadBalancerResult result = 
lbClient.registerInstancesWithLoadBalancer(registerInstancesWithLoadBalancerRequest);
+               }
+               catch(Exception e)
+               {
+                       log.error("Could not register instances to load 
balancer " + loadBalancerName);
+               }
+       }
+       
+       public void deregisterInstancesFromLoadBalancer(String 
loadBalancerName, List<Instance> instances)
+       {
+               try
+               {
+                       DeregisterInstancesFromLoadBalancerRequest 
deregisterInstancesFromLoadBalancerRequest = new 
DeregisterInstancesFromLoadBalancerRequest(loadBalancerName, instances);
+               
+                       AmazonElasticLoadBalancingClient lbClient = new 
AmazonElasticLoadBalancingClient(awsCredentials, clientConfiguration);
+                       
+                       DeregisterInstancesFromLoadBalancerResult result = 
lbClient.deregisterInstancesFromLoadBalancer(deregisterInstancesFromLoadBalancerRequest);
+               }
+               catch(Exception e)
+               {
+                       log.error("Could not de-register instances from load 
balancer " + loadBalancerName);
+               }
+       }
+       
+       public List<Instance> getAttachedInstances(String loadBalancerName)
+       {
+               return new ArrayList<Instance>();
+       }
+       
+       public void addListenersToLoadBalancer(String loadBalancerName, 
List<Listener> listeners)
+       {
+               try
+               {
+                       
+               }
+               catch(Exception e)
+               {
+                       log.error("Could not add listeners to load balancer " + 
loadBalancerName);
+               }
+       }
+       
+       public void removeListenersFromLoadBalancer(String loadBalancerName, 
List<Listener> listeners)
+       {
+               try
+               {
+                       
+               }
+               catch(Exception e)
+               {
+                       log.error("Could not remove listeners from load 
balancer " + loadBalancerName);
+               }
+       }
+       
+       public List<Listener> getAttachedListeners(String loadBalancerName)
+       {
+               return new ArrayList<Listener>();
+       }
+       
        public List<Listener> getRequiredListeners(Service service)
        {
                List<Listener> listeners = new ArrayList<Listener>();

http://git-wip-us.apache.org/repos/asf/stratos/blob/617e04d5/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 5e1f7b2..2e45a09 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
@@ -19,8 +19,13 @@
 
 package org.apache.stratos.aws.extension;
 
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Set;
+
+import javax.management.InstanceAlreadyExistsException;
 
 import org.apache.stratos.load.balancer.common.domain.*;
 import 
org.apache.stratos.load.balancer.extension.api.exception.LoadBalancerExtensionException;
@@ -29,6 +34,7 @@ import 
org.apache.stratos.load.balancer.extension.api.LoadBalancer;
 import com.amazonaws.auth.AWSCredentials;
 import com.amazonaws.auth.BasicAWSCredentials;
 import com.amazonaws.ClientConfiguration;
+import com.amazonaws.services.elasticloadbalancing.model.Instance;
 import com.amazonaws.services.elasticloadbalancing.model.Listener;
 
 
@@ -36,13 +42,13 @@ import 
com.amazonaws.services.elasticloadbalancing.model.Listener;
 public class AWSLoadBalancer implements LoadBalancer {
        
        // A map <clusterId, load balancer id>
-       private HashMap<String, String> clusterToLoadBalancer;
+       private HashMap<String, String> clusterIdToLoadBalancerMap;
 
        private AWSHelper awsHelper;
        
        public AWSLoadBalancer()
        {
-               clusterToLoadBalancer = new HashMap<String, String>();
+               clusterIdToLoadBalancerMap = new HashMap<String, String>();
                awsHelper = new AWSHelper();
        }
        
@@ -56,19 +62,110 @@ public class AWSLoadBalancer implements LoadBalancer {
                 
                // Check if a load balancer is created for this cluster
                
-               if(clusterToLoadBalancer.containsKey(cluster.getClusterId()))
+               
if(clusterIdToLoadBalancerMap.containsKey(cluster.getClusterId()))
                        {
-                       // Get the load balancer
-                       // Update it 
+                       // A load balancer is already present for this cluster
+                       
+                       // Get the load balancer and update it.
+                       
+                       String loadBalancerName = 
clusterIdToLoadBalancerMap.get(cluster.getClusterId());
+                       
+                       // 1. Get all the instances attached
+                       //    Add/remove instances as necessary
+                       
+                       List<Instance> attachedInstances = 
awsHelper.getAttachedInstances(loadBalancerName);
+                       
+                       Collection<Member> clusterInstances = 
cluster.getMembers();
+                       
+                       List<Instance> instancesToAddToLoadBalancer = new 
ArrayList<Instance>();
+                       
+                       for(Member member : clusterInstances)
+                       {
+                               // if instance id of member is not in 
attachedInstances
+                               //              add this to 
instancesToAddToLoadBalancer
+                       }
+                       
+                       List<Instance> instancesToRemoveFromLoadBalancer = new 
ArrayList<Instance>();
+                       
+                       for(Instance instance : attachedInstances)
+                       {
+                               
if(!clusterInstances.contains(instance.getInstanceId()))
+                               {
+                                       
instancesToRemoveFromLoadBalancer.add(instance);
+                               }
+                       }
+                       
+                       if(instancesToRemoveFromLoadBalancer.size() > 0)
+                               
awsHelper.deregisterInstancesFromLoadBalancer(loadBalancerName, 
instancesToRemoveFromLoadBalancer);
+                       
+                       if(instancesToAddToLoadBalancer.size() > 0)
+                               
awsHelper.registerInstancesToLoadBalancer(loadBalancerName, 
instancesToAddToLoadBalancer);
+
+                       
+                       // 2. Get all the listeners
+                       //    Add/Remove listeners as necessary
+                       
+                       // 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
+     
+                       // Need to remove only if ... same for above reason
+                       
+                       List<Listener> attachedListeners = 
awsHelper.getAttachedListeners(loadBalancerName);
+                       
+                       List<Listener> listenersToAddToLoadBalancer = new 
ArrayList<Listener>();
+                       
+                       for(Listener listener : listenersForThisService)
+                       {
+                               // Need to check if Listener class supports 
equals method or not
+                               
+                               // if listener required for this service is not 
in attachedListeners
+                               //              add this to 
listenersToAddToLoadBalancer
+                       }
+                       
+                       List<Listener> listenersToRemoveFromLoadBalancer = new 
ArrayList<Listener>();
+                       
+                       for(Listener listener : attachedListeners)
+                       {
+                               // Need to check if Listener class supports 
equals method or not
+                               
+                               if(!listenersForThisService.contains(listener))
+                               {
+                                       
listenersToRemoveFromLoadBalancer.add(listener);
+                               }
+                       }
+                       
+                       if(listenersToRemoveFromLoadBalancer.size() > 0)
+                               
awsHelper.removeListenersFromLoadBalancer(loadBalancerName, 
listenersToRemoveFromLoadBalancer);
+                       
+                       if(listenersToAddToLoadBalancer.size() > 0)
+                               
awsHelper.addListenersToLoadBalancer(loadBalancerName, 
listenersToAddToLoadBalancer);
+
                        }
                else
                {
-                       String loadBalancerName 
=service.getServiceName()+"-"+cluster.getClusterId();
+                       // Create a new load balancer for this cluster
+                       
+                       String loadBalancerName = service.getServiceName() + 
"-" + cluster.getClusterId();
                        
                        String loadBalancerDNSName = 
awsHelper.createLoadBalancer(loadBalancerName, listenersForThisService);
                        
                        // register instances to LB
                        
+                       List<Instance> instances = new ArrayList<Instance>();
+                       
+                       for(Member m : cluster.getMembers())
+                       {
+                               String instanceId = ""; // of member // after 
making changes suggested in mail
+                               
+                               Instance instance = new Instance();
+                               instance.setInstanceId(instanceId);
+                               
+                               instances.add(instance);
+                       }
+                       
+                       
awsHelper.registerInstancesToLoadBalancer(loadBalancerName, instances);
+                       
                        // Create domain mappings
                }
                
@@ -86,7 +183,16 @@ public class AWSLoadBalancer implements LoadBalancer {
                
        }
             
-       public void stop() throws LoadBalancerExtensionException {
+       public void stop() throws LoadBalancerExtensionException 
+       {
+               // Remove all load balancers
+               
+               for(String loadBalancerName : 
clusterIdToLoadBalancerMap.values())
+               {
+                       // remove load balancer
+                       // Check what all needs to be done
+               }
                
+               // Remove domain mappings
        }       
 }

Reply via email to