X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fsamples%2Floadbalancer%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsamples%2Floadbalancer%2Fpolicies%2FRandomLBPolicy.java;fp=opendaylight%2Fsamples%2Floadbalancer%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsamples%2Floadbalancer%2Fpolicies%2FRandomLBPolicy.java;h=b4b616f3a8027571ad173533b7c79a0b55bd7d82;hb=bf9ead90c2584be7c6bafff0a49aec3db62f54da;hp=0000000000000000000000000000000000000000;hpb=ee47b04caddbab0695833f13896c978c57a7d3a3;p=controller.git 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 index 0000000000..b4b616f3a8 --- /dev/null +++ b/opendaylight/samples/loadbalancer/src/main/java/org/opendaylight/controller/samples/loadbalancer/policies/RandomLBPolicy.java @@ -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 clientMemberMap; + + /* + * Random generator + */ + Random randomGenerator = null; + + @SuppressWarnings("unused") + private RandomLBPolicy(){} + + public RandomLBPolicy(ConfigManager cmgr){ + this.cmgr = cmgr; + this.clientMemberMap = new HashMap(); + 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 removeClient = new ArrayList(); + + 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()); + } + +}