package es.tid.pce.parentPCE;
import es.tid.bgp.bgp4Peer.peer.BGPPeer;
import es.tid.pce.computingEngine.ReportDispatcher;
import es.tid.pce.computingEngine.RequestDispatcher;
import es.tid.pce.computingEngine.algorithms.ComputingAlgorithmManager;
import es.tid.pce.computingEngine.algorithms.LocalChildRequestManager;
import es.tid.pce.computingEngine.algorithms.ParentPCEComputingAlgorithmManager;
import es.tid.pce.parentPCE.MDLSPDB.MultiDomainLSPDB;
import es.tid.pce.parentPCE.management.ParentPCEManagementSever;
import es.tid.pce.pcepsession.PCEPSessionsInformation;
import es.tid.pce.server.lspdb.ReportDB_Handler;
import es.tid.tedb.*;
import java.io.IOException;
import java.net.Inet4Address;
import java.net.ServerSocket;
import java.util.Hashtable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Parent PCE Server
* @author ogondio and Andrea
*
*/
public class Orchestrator {
/**
* Main class
* @param args parameters
*/
public static void main(String[] args) {
//First, get the parameters from the configuration file
ParentPCEServerParameters params;
if (args.length >=1 ){
params=new ParentPCEServerParameters(args[0]);
}else{
params=new ParentPCEServerParameters();
}
params.initialize();
//Initiate the Loggers (general, PCEP Parsing, OSPF Parsing, GUI)
// FileHandler fh;
// FileHandler fh2,fh3;
Logger log;
Logger log2,log3;
log=LoggerFactory.getLogger("PCEServer");
log2=LoggerFactory.getLogger("PCEPParser");
log3=LoggerFactory.getLogger("OSPFParser");
PCEPSessionsInformation pcepSessionManager=new PCEPSessionsInformation();
pcepSessionManager.setLocalPcepCapability(params.getLocalPcepCapability());
try {
// fh=new FileHandler(params.getParentPCEServerLogFile());
// fh2=new FileHandler(params.getParentPCEPParserLogFile());
// fh3=new FileHandler("OSPFParser.log");
// log.addHandler(fh);
// log.setLevel(Level.ALL);
// log2.addHandler(fh2);
// log2.setLevel(Level.ALL);
// log3.addHandler(fh3);
// log3.setLevel(Level.ALL);
//
//
Logger logGUI=LoggerFactory.getLogger("GUILogger");
// logGUI.setLevel(Level.SEVERE);
} catch (Exception e1) {
e1.printStackTrace();
System.exit(-1);
}
log.info("Inizializing Orchestrator");
//Create the Elements of the Parent PCE Server
//The Traffic Engineering Database (TED)
TEDB ted;
TEDB simple_ted = null;
Hashtable<String, TEDB> intraTEDBs = null;
LocalChildRequestManager localChildRequestManager=null;
ReachabilityManager rm=new ReachabilityManager();
if(!params.isITCapable()){
if ((params.isMultiDomain())&&(!params.isKnowsWholeTopology())){
log.info("The PCE is multidomain");
ted=new MDTEDB();
((MDTEDB)ted).setReachability(rm.getReachability());
if (params.isReadMDTEDFromFile()){
ted.initializeFromFile(params.getMDnetworkDescriptionFile());
((MDTEDB)ted).initializeFullTEDFromFile(params.getNetworkDescriptionFile() );
}
}else if (params.isKnowsWholeTopology()){
if (params.isTest()){
ted=new MDTEDB();
FileTEDBUpdater.initializeReachabilityFromFile( params.getNetworkDescriptionFile(), rm );
((MDTEDB)ted).setNetworkDomainGraph( FileTEDBUpdater.readMDNetwork( params.getNetworkDescriptionFile() ) );
intraTEDBs = FileTEDBUpdater.readMultipleDomainSimpleNetworks(params.getNetworkDescriptionFile(), null, true,0, 100, false);
}
else {
log.info("The PCE knows the whole topology. Interdomain and intradomain");
ted=new MDTEDB();
FileTEDBUpdater.initializeReachabilityFromFile( params.getReachFile(), rm );
intraTEDBs = FileTEDBUpdater.readMultipleDomainSimpleNetworks(params.getReachFile(), null, true,0, 100, false);
((MDTEDB)ted).setNetworkDomainGraph( FileTEDBUpdater.readMDNetwork( params.getTotalFile() ) );
((MDTEDB)ted).setReachability(rm.getReachability());
if (params.isReadMDTEDFromFile()){
ted.initializeFromFile(params.getMDnetworkDescriptionFile());
((MDTEDB)ted).initializeFullTEDFromFile(params.getNetworkDescriptionFile() );
}
localChildRequestManager = new LocalChildRequestManager();
log.info("Adding Intradomain topologies to multidomain tedb");
log.info("Intradomain topologies added to multidomain tedb");
}
}
else{
log.info("The PCE is single domain");
ted=new SimpleTEDB();
ted.initializeFromFile(params.getNetworkDescriptionFile());
}
//Read the database from a file
MultiDomainTopologyUpdater mdt= null;
if (params.isActingAsBGP4Peer()) {
log.info("Acting as BGP peer");
BGPPeer bgpPeer = new BGPPeer();
if (params.isMultiDomain()) {
if (params.isKnowsWholeTopology())
bgpPeer.configure( params.getBGP4File(), (MultiDomainTEDB) ted, intraTEDBs );
// bgpPeer.setWriteMultiAndIntraTEDB((MultiDomainTEDB)ted, intraTEDBs);
else
bgpPeer.configure( params.getBGP4File() );
}
bgpPeer.createUpdateDispatcher();
bgpPeer.startClient();
bgpPeer.startServer();
if (bgpPeer.isSaveTopology() == true)
bgpPeer.startSaveTopology();
bgpPeer.startManagementServer();
bgpPeer.startSendTopology();
}else{
//Create the multidomain topology updater
mdt=new MultiDomainTopologyUpdater((MDTEDB)ted,params.isActingAsBGP4Peer());
mdt.initialize();
}
if (params.isMultiDomain()){
if (params.isReadMDTEDFromFile()){
FileTEDBUpdater.initializeReachabilityFromFile(params.getMDnetworkDescriptionFile(), rm);
}
}
ChildPCERequestManager childPCERequestManager = new ChildPCERequestManager();
//The Request Dispatcher. Incoming Requests are sent here
//RequestQueue pathRequestsQueue;
RequestDispatcher requestDispatcher;
log.info("Inizializing "+ params.getChildPCERequestsProcessors()+" Path Request Processor Threads");
//pathRequestsQueue=new RequestQueue(params.getChildPCERequestsProcessors());
if (params.isKnowsWholeTopology())
requestDispatcher=new RequestDispatcher(params.getChildPCERequestsProcessors(),ted,null,false, intraTEDBs);
else
requestDispatcher=new RequestDispatcher(params.getChildPCERequestsProcessors(),ted,null,false);
MultiDomainLSPDB multiDomainLSPDB = new MultiDomainLSPDB();
log.info("Inizializing "+ params.getChildPCERequestsProcessors()+" Ini Dispatcher");
MultiDomainInitiateDispatcher mdiniDispatcher = new MultiDomainInitiateDispatcher(rm, childPCERequestManager, multiDomainLSPDB);
log.info(String.valueOf(params.algorithmRuleList.size()));
for (int i=0;i<params.algorithmRuleList.size();++i){
log.info(params.algorithmRuleList.get(i).algoName);
log.info(params.algorithmRuleList.get(i).ar.toString());
try {
Class aClass = Class.forName("es.tid.pce.computingEngine.algorithms."+params.algorithmRuleList.get(i).algoName+"Manager");
log.info("Registering algorithm "+ params.algorithmRuleList.get(i).algoName+" for of = "+params.algorithmRuleList.get(i).ar.of+" and svec = "+params.algorithmRuleList.get(i).ar.svec);
if (params.algorithmRuleList.get(i).isParentPCEAlgorithm==false){
log.info("No Parent PCE Algo");
ComputingAlgorithmManager cam= ( ComputingAlgorithmManager)aClass.newInstance();
requestDispatcher.registerAlgorithm(params.algorithmRuleList.get(i).ar, cam);
}
else {
log.info("Parent PCE Algo");
ParentPCEComputingAlgorithmManager cam= ( ParentPCEComputingAlgorithmManager)aClass.newInstance();
cam.setChildPCERequestManager(childPCERequestManager);
if (params.isKnowsWholeTopology()){
log.info("Introducimos el localChildRequestManager en la cam");
cam.setLocalChildRequestManager(localChildRequestManager);
}
cam.setReachabilityManager(rm);
requestDispatcher.registerAlgorithm(params.algorithmRuleList.get(i).ar, cam);
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
ReportDispatcher stateReportDispatcher= null;
ReportDB_Handler rptdb = new ReportDB_Handler();
stateReportDispatcher = new ReportDispatcher( rptdb, 2);
if (params.getLocalPcepCapability().isStateful()){
// //
// if (pcepSessionsInformation.isStateful())
// {
// log.info("redis: "+params.getDbType() + " "+params.getDbName());
// if (params.getDbType().equals("redis") && params.getDbName().length() > 0)
// {
// log.info("redis: redis db with id: "+ params.getDbName());
// rptdb = new ReportDB_Handler(params.getDbName(),"localhost");
// rptdb.fillFromDB();
// }
// else
// {
// rptdb = new ReportDB_Handler();
// }
// params.setLspDB(rptdb);
// log.info("Creando dispatchers para el LSP DB");
// PCCReportDispatcher = new ReportDispatcher(params, rptdb, 2);
// }
}
log.info("Initializing Management Server");
ParentPCEManagementSever pms=new ParentPCEManagementSever(childPCERequestManager,requestDispatcher,(MDTEDB)ted,(SimpleTEDB)simple_ted,rm,pcepSessionManager,mdt,params.getParentPCEManagementPort(),multiDomainLSPDB);
pms.start();
//
//System.setSecurityManager(new ParentPCESessionsControler());
ServerSocket serverSocket = null;
boolean listening = true;
try {
log.info("Listening on port: "+params.getParentPCEServerPort());
serverSocket = new ServerSocket(params.getParentPCEServerPort());
//If you want to reuse the address:
//InetSocketAddress local =new InetSocketAddress(Inet4Address.getByName("10.95.162.97"),params.getParentPCEServerPort() );
//InetSocketAddress local =new InetSocketAddress((Inet4Address)null,params.getParentPCEServerPort() );
//serverSocket = new ServerSocket();
//serverSocket.setReuseAddress(true);
//serverSocket.bind(local);
} catch (IOException e) {
System.err.println("Could not listen on port: "+params.getParentPCEServerPort());
System.exit(-1);
}
try {
while (listening) {
new ParentPCESession(serverSocket.accept(),params, requestDispatcher, mdiniDispatcher, ted,mdt,childPCERequestManager,rm,pcepSessionManager).start();
}
serverSocket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
else{
log.info("The PCE is IT capable");
if (params.isMultiDomain()){
//The PCE is multidomain
log.info("The PCE is multidomain");
ted=new ITMDTEDB();
((ITMDTEDB)ted).initializeFullTEDFromFile(params.getITNetworkDescriptionFile() );
if (params.isReadMDTEDFromFile()){
((ITMDTEDB)ted).initializeFromFile(params.getITMDnetworkDescriptionFile());
}
}else {
log.info("The PCE is single domain");
ted=new SimpleITTEDB();
ted.initializeFromFile(params.getITNetworkDescriptionFile());
}
//Read the database from a file
//Create the multidomain topology updater
MultiDomainTopologyUpdater mdt=new MultiDomainTopologyUpdater((ITMDTEDB)ted);
mdt.ITinitialize();
if (params.isMultiDomain()){
if (params.isReadMDTEDFromFile()){
FileTEDBUpdater.initializeReachabilityFromFile(params.getITMDnetworkDescriptionFile(), rm);
}
}
ChildPCERequestManager childPCERequestManager = new ChildPCERequestManager();
//The Request Dispatcher. Incoming Requests are sent here
//RequestQueue pathRequestsQueue;
RequestDispatcher requestDispatcher;
log.info("Inizializing "+ params.getChildPCERequestsProcessors()+" Path Request Processor Threads");
//pathRequestsQueue=new RequestQueue(params.getChildPCERequestsProcessors());
requestDispatcher=new RequestDispatcher(params.getChildPCERequestsProcessors(),ted,null,false, intraTEDBs);
log.info("Inizializing "+ params.getChildPCERequestsProcessors()+" Ini Dispatcher");
MultiDomainLSPDB multiDomainLSPDB= new MultiDomainLSPDB();
MultiDomainInitiateDispatcher mdiniDispatcher = new MultiDomainInitiateDispatcher(rm,childPCERequestManager, multiDomainLSPDB);
for (int i=0;i<params.algorithmRuleList.size();++i){
try {
Class aClass = Class.forName("es.tid.pce.computingEngine.algorithms."+params.algorithmRuleList.get(i).algoName+"Manager");
log.info("Registering algorithm "+ params.algorithmRuleList.get(i).algoName+" for of = "+params.algorithmRuleList.get(i).ar.of+" and svec = "+params.algorithmRuleList.get(i).ar.svec);
if (params.algorithmRuleList.get(i).isParentPCEAlgorithm==false){
ComputingAlgorithmManager cam= ( ComputingAlgorithmManager)aClass.newInstance();
requestDispatcher.registerAlgorithm(params.algorithmRuleList.get(i).ar, cam);
}
else {
ParentPCEComputingAlgorithmManager cam= ( ParentPCEComputingAlgorithmManager)aClass.newInstance();
cam.setChildPCERequestManager(childPCERequestManager);
cam.setReachabilityManager(rm);
requestDispatcher.registerAlgorithm(params.algorithmRuleList.get(i).ar, cam);
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
log.info("Initializing Management Server");
ParentPCEManagementSever pms=new ParentPCEManagementSever(childPCERequestManager,requestDispatcher,(ITMDTEDB)ted,rm,pcepSessionManager,mdt,params.getParentPCEManagementPort());
pms.start();
//
//System.setSecurityManager(new ParentPCESessionsControler());
ServerSocket serverSocket = null;
boolean listening = true;
try {
log.info("Listening on port: "+params.getParentPCEServerPort());
serverSocket = new ServerSocket(params.getParentPCEServerPort());
//If you want to reuse the address:
//InetSocketAddress local =new InetSocketAddress(Inet4Address.getByName("10.95.162.97"),params.getParentPCEServerPort() );
//InetSocketAddress local =new InetSocketAddress((Inet4Address)null,params.getParentPCEServerPort() );
//serverSocket = new ServerSocket();
//serverSocket.setReuseAddress(true);
//serverSocket.bind(local);
} catch (IOException e) {
System.err.println("Could not listen on port: "+params.getParentPCEServerPort());
System.exit(-1);
}
try {
pcepSessionManager.setStateful(true);
while (listening) {
new ParentPCESession(serverSocket.accept(),params, requestDispatcher,mdiniDispatcher, (ITMDTEDB)ted,mdt,childPCERequestManager,rm,pcepSessionManager).start();
}
serverSocket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}