Revert "Checkstyle enforcer"
[controller.git] / opendaylight / samples / loadbalancer / src / main / java / org / opendaylight / controller / samples / loadbalancer / policies / RandomLBPolicy.java
1 /*
2  * Copyright IBM Corporation, 2013.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.controller.samples.loadbalancer.policies;
9
10 import java.util.ArrayList;
11 import java.util.HashMap;
12 import java.util.Random;
13
14 import org.opendaylight.controller.samples.loadbalancer.ConfigManager;
15 import org.opendaylight.controller.samples.loadbalancer.entities.Client;
16 import org.opendaylight.controller.samples.loadbalancer.entities.Pool;
17 import org.opendaylight.controller.samples.loadbalancer.entities.PoolMember;
18 import org.opendaylight.controller.samples.loadbalancer.entities.VIP;
19 import org.slf4j.Logger;
20 import org.slf4j.LoggerFactory;
21
22 /**
23  * This class implements the random load balancing policy.
24  *
25  */
26 public class RandomLBPolicy implements ILoadBalancingPolicy {
27     
28     /*
29      * Instance logger
30      */
31     private static final Logger rLogger = LoggerFactory.getLogger(RandomLBPolicy.class);
32     
33     /*
34      * Reference to the configuration manager. This reference is passed from load balancer 
35      * class.
36      */
37     private ConfigManager cmgr;
38     
39     /*
40      * Mapping between the client and the pool member that serves all traffic for that client.
41      */
42     private HashMap<Client, PoolMember> clientMemberMap;
43     
44     /*
45      * Random generator
46      */
47     Random randomGenerator = null;
48     
49     @SuppressWarnings("unused")
50     private RandomLBPolicy(){}
51     
52     public RandomLBPolicy(ConfigManager cmgr){
53         this.cmgr = cmgr;
54         this.clientMemberMap = new HashMap<Client, PoolMember>();
55         randomGenerator = new Random();
56     }
57     @Override
58     public String getPoolMemberForClient(Client source, VIP dest){
59         
60         rLogger.info("Received traffic from client : {} for VIP : {} ",source, dest);
61         
62         syncWithLoadBalancerData();
63         
64         PoolMember pm= null;
65         
66         if(this.clientMemberMap.containsKey(source)){
67             pm= this.clientMemberMap.get(source);
68             rLogger.info("Client {} had sent traffic before,new traffic will be routed to the same pool member {}",source,pm);
69         }else{
70             Pool pool = null;
71             pool = this.cmgr.getPool(dest.getPoolName());
72             int memberNum = this.randomGenerator.nextInt(pool.getAllMembers().size()-1);
73             pm = pool.getAllMembers().get(memberNum);
74             this.clientMemberMap.put(source, pm );
75             rLogger.info("Network traffic from client {} will be directed to pool member {}",pm);
76         }
77         return pm.getIp();
78     }
79     
80     /*
81      * This method does the clean up. Whenever a new client packet arrives with a given VIP,
82      * this method checks the current configuration to see if any pool members have been deleted and
83      * cleans up the metadata stored by this loadbalancing algorithm.
84      */
85     private void syncWithLoadBalancerData(){
86         rLogger.debug("[Client - PoolMember] table before cleanup : {}",this.clientMemberMap.toString());
87         
88         ArrayList<Client> removeClient = new ArrayList<Client>();
89         
90         if(this.clientMemberMap.size() != 0){
91             for(Client client : this.clientMemberMap.keySet()){
92                 
93                 if(!this.cmgr.memberExists(this.clientMemberMap.get(client).getName(),
94                                                 this.clientMemberMap.get(client).getPoolName())){
95                     removeClient.add(client);
96                 }
97             }
98         }
99         
100         for(Client client : removeClient){
101             this.clientMemberMap.remove(client);
102             
103             rLogger.debug("Removed client : {} ",client);
104         }
105         rLogger.debug("[Client - PoolMember] table after cleanup : {}",this.clientMemberMap.toString());
106     }
107     
108 }