Fixed inappropriate uses of log level INFO
[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.trace("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.trace("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.trace("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 }