package es.tid.topologyModuleBase.plugins.reader; import java.io.File; import java.net.Inet4Address; import java.util.ArrayList; import java.util.Iterator; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.locks.Lock; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.CharacterData; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import es.tid.ospf.ospfv2.lsa.tlv.subtlv.MaximumBandwidth; import es.tid.ospf.ospfv2.lsa.tlv.subtlv.complexFields.BitmapLabelSet; import es.tid.tedb.DomainTEDB; import es.tid.tedb.IntraDomainEdge; import es.tid.tedb.SimpleTEDB; import es.tid.tedb.TEDB; import es.tid.tedb.TE_Information; import es.tid.topologyModuleBase.TopologyModuleParams; import es.tid.topologyModuleBase.COPServiceTopology.client.ApiClient; import es.tid.topologyModuleBase.COPServiceTopology.client.ApiException; import es.tid.topologyModuleBase.COPServiceTopology.client.Configuration; import es.tid.topologyModuleBase.COPServiceTopology.client.api.DefaultApi; import es.tid.topologyModuleBase.COPServiceTopology.model.EdgeEnd; import es.tid.topologyModuleBase.COPServiceTopology.model.TopologiesSchema; import es.tid.topologyModuleBase.COPServiceTopology.model.Edge.EdgeTypeEnum; import es.tid.topologyModuleBase.COPServiceTopology.model.*; import es.tid.topologyModuleBase.database.TopologiesDataBase; import es.tid.topologyModuleBase.plugins.reader.TopologyReader; public class TopologyReaderCOP extends TopologyReader { private boolean isRunning=false; public TopologyReaderCOP(TopologiesDataBase ted,TopologyModuleParams params, Lock lock) { super(ted,params,lock); } @Override public void readTopology() { //Initialize Traffic Engineering Database /*ApiClient apiClient = new ApiClient(); apiClient.setBasePath("http://"+params.getRemoteCOPhost()+":"+params.getRemoteCOPPort()+"/restconf"); readNetwork(new DefaultApi(apiClient)); */ ApiClient defaultClient = new ApiClient(); defaultClient.setBasePath("http://"+params.getRemoteCOPhost()+":"+params.getRemoteCOPPort()+"/restconf"); log.info("New COPTopologyReader trying to read topology from: "+defaultClient.getBasePath()); //Timer timer = new Timer(); //timer.schedule(new ReadTopologyTask(ted,lock,new DefaultApi(defaultClient)), 0, 20000); (new ReadTopologyTask(ted,lock,new DefaultApi(defaultClient))).run(); } @Override public void run(){ readTopology(); } private class ReadTopologyTask extends TimerTask { private TopologiesDataBase ted; private Lock lock; private DefaultApi api; public ReadTopologyTask(TopologiesDataBase ted, Lock lock, DefaultApi api) { super(); this.ted = ted; this.lock = lock; this.api = api; } @Override public void run() { // TODO Auto-generated method stub lock.lock(); isRunning=true; try { TopologiesSchema retrieveTopologies = api.retrieveTopologies(); //EdgeEnd retrieveLocalIf = api.retrieveTopologiesTopologyEdgesLocalIfidLocalIfidById("1", "ADVA_2_CTTC_2"); //log.info(retrieveTopologies.toString()); //System.out.println("DESPUES retrieveTopologies: "+retrieveTopologies.toString()); //Topology top = api.retrieveTopologiesTopologyTopologyById("0.0.0.1"); for(Topology top : retrieveTopologies.getTopology()){ DomainTEDB db = (DomainTEDB)this.ted.getDB(top.getTopologyId()); System.out.println("COP reader, reading db with domainID: "+top.getTopologyId()+ " bd->"+db); if(db != null){ ted.getTeds().remove(top.getTopologyId()); } db = new SimpleTEDB(); ((SimpleTEDB)db).createGraph(); for(Node n : top.getNodes()){ es.tid.tedb.elements.Node node = TranslateModel.translate2Node(n); ((SimpleTEDB)db).getNetworkGraph().addVertex(node); } for(Edge e: top.getEdges()){ es.tid.tedb.elements.Link link = TranslateModel.translate2Link(e); fromLinkToIntradomainlink((SimpleTEDB)db, link, e); } this.ted.addTEDB(top.getTopologyId(), db); } } catch (ApiException e) { // TODO Auto-generated catch block log.info("APIException in COPtopologyReader from: " + api.getApiClient().getBasePath()); e.printStackTrace(); }catch (Exception e){ log.info("GeneralException in COPtopologyReader from: " + api.getApiClient().getBasePath()); e.printStackTrace(); }finally{ isRunning=false; lock.unlock(); } } private void fromLinkToIntradomainlink(SimpleTEDB db, es.tid.tedb.elements.Link link, Edge e){ boolean finished=false; System.out.println("From link To Intradomianlink, link: "+link.toString()); Iterator<Object> vertices=db.getNetworkGraph().vertexSet().iterator(); es.tid.tedb.elements.Node src=null; es.tid.tedb.elements.Node dst=null; while (vertices.hasNext() && !finished){ es.tid.tedb.elements.Node node=(es.tid.tedb.elements.Node) vertices.next(); System.out.println("Nodes in graph: "+node.getNodeID()); if (link.getDest().getNode().equals(node.getNodeID())) dst=node; else if (link.getSource().getNode().equals(node.getNodeID())) src=node; } IntraDomainEdge edge= new IntraDomainEdge(); edge.setBw(link.getBandwidth()); edge.setDirectional(link.isDirectional()); edge.setLinkID(link.getLinkID()); edge.setType(link.getType()); edge.setDst_Numif_id(link.getDest()); edge.setSrc_Numif_id(link.getSource()); if (src==null){ log.info("SRC NULL"); } if (dst==null){ log.info("DST NULL"); } if(link.getType().equals(EdgeTypeEnum.dwdm_edge.toString())){ DwdmEdge dEdge = (DwdmEdge)e; TE_Information tE_info= new TE_Information(); //tE_info.createBitmapLabelSet(numLabels, grid, cs, n); byte[] bitmap=new byte[(dEdge.getBitmap().getNumChannels()/8)+1]; for(int i=0;i<dEdge.getBitmap().getNumChannels();i++){ if(dEdge.getBitmap().getArrayBits().get(i)==1){ bitmap[i/8]|=(128 >>(i%8)); } } ((BitmapLabelSet)edge.getTE_info().getAvailableLabels().getLabelSet()).setNumLabels(dEdge.getBitmap().getNumChannels()); ((BitmapLabelSet)edge.getTE_info().getAvailableLabels().getLabelSet()).setBytesBitmap(bitmap); edge.setTE_info(tE_info); } db.getNetworkGraph().addEdge(src, dst, edge); db.getIntraDomainEdges().add(edge); } /*public static String getCharacterDataFromElement(Element e) { org.w3c.dom.Node child = e.getFirstChild(); if (child instanceof CharacterData) { CharacterData cd = (CharacterData) child; return cd.getData(); } else { return "?"; } }*/ } @Override public boolean isRunning() { // TODO Auto-generated method stub return isRunning; } @Override public String getPluginName() { // TODO Auto-generated method stub return "COP client-importer"; } @Override public String displayInfo() { // TODO Auto-generated method stub String str=getPluginName()+"\n"; str+="Status: "; if(isRunning())str+="running"; else str+="stop"; str+="\nBase path:"+"http://"+params.getRemoteCOPhost()+":"+params.getRemoteCOPPort()+"/restconf"; return str; } }