Simple Load Balancer Application - Recommitting the source codewith the whole source...
[controller.git] / opendaylight / samples / loadbalancer / src / main / java / org / opendaylight / controller / samples / loadbalancer / policies / RandomLBPolicy.java
diff --git a/opendaylight/samples/loadbalancer/src/main/java/org/opendaylight/controller/samples/loadbalancer/policies/RandomLBPolicy.java b/opendaylight/samples/loadbalancer/src/main/java/org/opendaylight/controller/samples/loadbalancer/policies/RandomLBPolicy.java
new file mode 100644 (file)
index 0000000..b4b616f
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * Copyright IBM Corporation, 2013.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.samples.loadbalancer.policies;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Random;
+
+import org.opendaylight.controller.samples.loadbalancer.ConfigManager;
+import org.opendaylight.controller.samples.loadbalancer.entities.Client;
+import org.opendaylight.controller.samples.loadbalancer.entities.Pool;
+import org.opendaylight.controller.samples.loadbalancer.entities.PoolMember;
+import org.opendaylight.controller.samples.loadbalancer.entities.VIP;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This class implements the random load balancing policy.
+ *
+ */
+public class RandomLBPolicy implements ILoadBalancingPolicy {
+    
+    /*
+     * Instance logger
+     */
+    private static final Logger rLogger = LoggerFactory.getLogger(RandomLBPolicy.class);
+    
+    /*
+     * Reference to the configuration manager. This reference is passed from load balancer 
+     * class.
+     */
+    private ConfigManager cmgr;
+    
+    /*
+     * Mapping between the client and the pool member that serves all traffic for that client.
+     */
+    private HashMap<Client, PoolMember> clientMemberMap;
+    
+    /*
+     * Random generator
+     */
+    Random randomGenerator = null;
+    
+    @SuppressWarnings("unused")
+    private RandomLBPolicy(){}
+    
+    public RandomLBPolicy(ConfigManager cmgr){
+        this.cmgr = cmgr;
+        this.clientMemberMap = new HashMap<Client, PoolMember>();
+        randomGenerator = new Random();
+    }
+    @Override
+    public String getPoolMemberForClient(Client source, VIP dest){
+        
+        rLogger.info("Received traffic from client : {} for VIP : {} ",source, dest);
+        
+        syncWithLoadBalancerData();
+        
+        PoolMember pm= null;
+        
+        if(this.clientMemberMap.containsKey(source)){
+            pm= this.clientMemberMap.get(source);
+            rLogger.info("Client {} had sent traffic before,new traffic will be routed to the same pool member {}",source,pm);
+        }else{
+            Pool pool = null;
+            pool = this.cmgr.getPool(dest.getPoolName());
+            int memberNum = this.randomGenerator.nextInt(pool.getAllMembers().size()-1);
+            pm = pool.getAllMembers().get(memberNum);
+            this.clientMemberMap.put(source, pm );
+            rLogger.info("Network traffic from client {} will be directed to pool member {}",pm);
+        }
+        return pm.getIp();
+    }
+    
+    /*
+     * This method does the clean up. Whenever a new client packet arrives with a given VIP,
+     * this method checks the current configuration to see if any pool members have been deleted and
+     * cleans up the metadata stored by this loadbalancing algorithm.
+     */
+    private void syncWithLoadBalancerData(){
+        rLogger.debug("[Client - PoolMember] table before cleanup : {}",this.clientMemberMap.toString());
+        
+        ArrayList<Client> removeClient = new ArrayList<Client>();
+        
+        if(this.clientMemberMap.size() != 0){
+            for(Client client : this.clientMemberMap.keySet()){
+                
+                if(!this.cmgr.memberExists(this.clientMemberMap.get(client).getName(),
+                                                this.clientMemberMap.get(client).getPoolName())){
+                    removeClient.add(client);
+                }
+            }
+        }
+        
+        for(Client client : removeClient){
+            this.clientMemberMap.remove(client);
+            
+            rLogger.debug("Removed client : {} ",client);
+        }
+        rLogger.debug("[Client - PoolMember] table after cleanup : {}",this.clientMemberMap.toString());
+    }
+    
+}