/* * 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; import java.util.HashMap; import java.util.HashSet; import java.util.Set; 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 represents a configuration manager for the Load Balancer service. * This class is responsible for managing(store/update/delete) the load balancer * configuration that it receives through REST APIs or from any other applications * present in the controller. * */ public class ConfigManager implements IConfigManager{ /* * Logger instance */ private static final Logger cmLogger = LoggerFactory.getLogger(ConfigManager.class); /* * All the available VIPs */ private HashMap vips = new HashMap(); /* * All the available Pools */ private HashMap pools = new HashMap(); public ConfigManager(){ } @Override public boolean vipExists(String name) { return this.vips.containsKey(name); } @Override public boolean vipExists(VIP vip){ if(vip.getName()==null){ if(!vips.containsValue(vip)){ return false; } }else{ if(!vips.containsKey(vip.getName())){ if(!vips.containsValue(vip)){ return false; } } } return true; } @Override public boolean vipExists(String name,String ip,String protocol,short protocolPort,String poolName){ VIP vip = new VIP(name,ip,protocol,protocolPort,poolName); //Check VIP with the same name if(!vips.containsKey(name)){ //Check VIP with the same ip, protocol and protocolPort if(!vips.containsValue(vip)){ //if you reach here, means this VIP don't exist return false; } } //Yeah, i have it. return true; } @Override public Set getAllVIPs(){ return new HashSet(this.vips.values()); } public VIP getVIPWithPoolName(VIP vip){ cmLogger.trace("Search a VIP with name:{}",vip); for(VIP vipTemp: this.vips.values()){ if(vipTemp.equals(vip)){ cmLogger.trace("Found VIP with pool detail : {}",vipTemp); return vipTemp; } } cmLogger.trace("VIP with pool detail not found "); return null; } @Override public VIP createVIP(String name,String ip,String protocol,short protocolPort,String poolName){ cmLogger.trace("Create VIP with the following details :[ name : "+name +" ip : "+ip +" protocol : "+protocol +" protocol_port : "+protocolPort +" pool name : "+poolName); VIP vip = new VIP(name,ip,protocol,protocolPort,poolName); if(poolName !=null && !poolName.isEmpty()){ if(pools.containsKey(poolName)){ pools.get(poolName).addVIP(vip); } } vip.setStatus(LBConst.STATUS_ACTIVE); this.vips.put(name, vip); cmLogger.trace("New VIP created : "+vip.toString()); return vip; } @Override public String getVIPAttachedPool(String name) { return this.vips.get(name).getPoolName(); } @Override public VIP updateVIP(String name, String poolName){ cmLogger.trace("Updating VIP : "+name+" pool name to "+poolName); if(vips.containsKey(name)){ VIP vip = vips.get(name); if(vip.getPoolName() == null){ vip.setPoolName(poolName); cmLogger.error("VIP is now attached to the pool : {}",vip.toString()); return vip; } cmLogger.error("VIP is already attached to one pool : {}",vip.toString()); } cmLogger.error("VIP with name: "+name+" does not exist"); return null; } @Override public VIP deleteVIP(String name){ cmLogger.trace("Deleting VIP : "+name); VIP vip = vips.get(name); String poolName = vip.getPoolName(); if(poolName != null){ if(pools.containsKey(poolName)){ Pool pool = pools.get(poolName); pool.removeVIP(vip.getName()); } } cmLogger.trace("VIP removed : "+vip.toString()); vips.remove(vip.getName()); return vip; } @Override public boolean memberExists(String name, String poolName) { if (this.pools.containsKey(poolName)) { if (this.pools.get(poolName).getMember(name) != null) { return true; } } return false; } @Override public boolean memberExists(String name, String memberIP,String poolName) { if (!this.pools.containsKey(poolName)) { return false; } return this.pools.get(poolName).poolMemberExists(new PoolMember(name, memberIP, poolName)); } @Override public PoolMember addPoolMember(String name, String memberIP, String poolName){ PoolMember pm = new PoolMember(name,memberIP,poolName); cmLogger.trace("Adding pool member : "+pm.toString()); pools.get(poolName).addMember(pm); return pm; } @Override public PoolMember removePoolMember(String name, String poolName){ cmLogger.trace("Removing pool member : {} from pool {}",name, poolName); Pool pool = pools.get(poolName); PoolMember pm = pool.getMember(name); pool.removeMember(name); cmLogger.trace("Pool member {} removed from {} ",name,poolName); return pm; } @Override public Set getAllPools(){ return new HashSet(this.pools.values()); } @Override public boolean poolExists(String name) { return this.pools.containsKey(name); } @Override public boolean poolExists(String name, String lbMethod){ return pools.containsValue(new Pool(name,lbMethod)); } @Override public Pool createPool(String name, String lbMethod){ Pool newPool = new Pool(name,lbMethod); cmLogger.trace("New pool created : " + newPool.toString()); pools.put(name, newPool); return newPool; } @Override public Pool deletePool(String poolName){ Pool pool = pools.get(poolName); for(VIP vip:pool.getAllVip()){ vip.setPoolName(null); } cmLogger.trace("Pool removed : "+pool.toString()); pools.remove(poolName); return pool; } @Override public Pool getPool( String poolName){ if(pools.containsKey(poolName)){ return pools.get(poolName); } return null; } @Override public Set getAllPoolMembers(String poolName) { if(pools.containsKey(poolName)){ return new HashSet(pools.get(poolName).getAllMembers()); } return null; } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return "ConfigManager [vips=" + vips + ", pools=" + pools + "]"; } }