
es.tid.tedb.controllers.TEDUpdaterNOX Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of topology Show documentation
Show all versions of topology Show documentation
Traffic Engineering Database, BGP-LS peer, Topology Module
The newest version!
package es.tid.tedb.controllers;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.concurrent.locks.Lock;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import es.tid.tedb.DomainTEDB;
import es.tid.tedb.IntraDomainEdge;
import es.tid.tedb.SimpleTEDB;
import es.tid.tedb.TE_Information;
import es.tid.tedb.elements.RouterInfoPM;
public class TEDUpdaterNOX extends TEDUpdaterController
{
public static String controllerName = "NOX";
private Hashtable interDomainLinks = new Hashtable();
//Overwritten father variables and fixing the topology urls in code
private String topologyPathNodes = "/get_vtopology/";
private String topologyPathLinks = "/get_graph/";//??
public TEDUpdaterNOX(String ip, String port, String topologyPathLinks, String topologyPathNodes,DomainTEDB ted, Logger log)
{
super( ip, port, topologyPathLinks, topologyPathNodes, ted, log);
}
public TEDUpdaterNOX(String ip, String port, String topologyPathLinks, String topologyPathNodes,DomainTEDB ted, Logger log, Lock lock)
{
super( ip, port, topologyPathLinks, topologyPathNodes, ted, log, lock);
}
public TEDUpdaterNOX(ArrayList ips, ArrayListports , String topologyPathLinks, String topologyPathNodes,DomainTEDB ted, Logger log)
{
super(ips, ports , topologyPathLinks, topologyPathNodes, ted, log);
}
@Override
public void run()
{
if(interDomainFile != null)
{
interDomainLinks = TEDUpdaterController.readInterDomainFile(interDomainFile);
}
String responseLinks = "";
String responseNodes = "";
try
{
Hashtable nodes = new Hashtable();
for (int i = 0; i < ips.size(); i++)
{
responseNodes = queryForNodes(ips.get(i), ports.get(i));//query for topology
parseNodes(responseNodes, nodes, ips.get(i), ports.get(i));
log.info("responseNodes:::"+responseNodes);
}
}
catch (Exception e)
{
log.info(e.toString());
}
}
private String BristoltoFloodlight(String BristolFormat)
{
String floodFormat = new String(BristolFormat);
//Por algo se me conoce como el hacker
for (int i = 2; i < floodFormat.length(); i += 3)
{
floodFormat = floodFormat.substring(0, i) + ":" + floodFormat.substring(i, floodFormat.length());
}
log.info("BristolFormat--> " + BristolFormat + ", floodFormat-->" + floodFormat);
return floodFormat;
}
private void parseNodes(String response, Hashtable routerInfoList, String ip, String port)
{
try
{
JSONParser parser = new JSONParser();
Object obj = parser.parse(response);
JSONObject jsonaux=(JSONObject) obj;
Iterator iterkeys=jsonaux.keySet().iterator();
Hashtable nodes= new Hashtable();
while (iterkeys.hasNext()) {
String dpid = iterkeys.next();
System.out.println("Key: "+dpid.replace("-", ":"));
RouterInfoPM rInfo = new RouterInfoPM();
rInfo.setRouterID(dpid.replace("-", ":"));//Bristol to floodlight?
rInfo.setConfigurationMode("Openflow");
rInfo.setControllerType(TEDUpdaterNOX.controllerName);
rInfo.setControllerIdentifier(ip, port);
rInfo.setControllerIP(ip);
rInfo.setControllerPort(port);
routerInfoList.put(rInfo.getRouterID(),rInfo);
nodes.put(dpid.replace("-", ":"),rInfo);
((SimpleTEDB)TEDB).getNetworkGraph().addVertex(rInfo);
}
//Getting Links
Iterator nodeiter=nodes.keySet().iterator();
while (nodeiter.hasNext()){
String node= nodeiter.next();
parseLinks(node, (String)jsonaux.get(node.replace(":", "-")).toString(), nodes);
}
//parseLinks(dpid, jsonarray)
}
catch (Exception e)
{
log.info(e.toString());
}
}
private void parseLinks(String dpid,String links, Hashtable nodes)
{
try {
//log.info("Inside parseJSON");
JSONParser parser = new JSONParser();
Object obj = parser.parse(links);
JSONArray msg = (JSONArray) obj;
Iterator iterator = msg.iterator();
while (iterator.hasNext())
{
JSONObject jsonObject = (JSONObject) iterator.next();
//System.out.println(jsonObject.get("src-switch"));
IntraDomainEdge edge= new IntraDomainEdge();
String labels = (String) jsonObject.get("labels");//??
String destnode = ((String) jsonObject.get("peer_node")).replace("-", ":");
String type = (String) jsonObject.get("port_type");
RouterInfoPM source = nodes.get(dpid);
RouterInfoPM dest = nodes.get(destnode);
//((SimpleTEDB)TEDB).getNetworkGraph().addVertex(source);
//((SimpleTEDB)TEDB).getNetworkGraph().addVertex(dest);
System.out.println("Srcnode: "+dpid);
System.out.println("Dstnode: "+destnode);
System.out.println("Srcport: "+jsonObject.get("port_id"));
System.out.println("Dstport: "+jsonObject.get("peer_port"));
if ((dest!= null)&&(source!=null)){
edge.setSrc_if_id(Long.parseLong((String)jsonObject.get("port_id")));
edge.setDst_if_id(Long.parseLong((String)jsonObject.get("peer_port")));
edge.setType(type);
// This is a big problem because info is not initialized from file
// and the controller doesn't give information about how many wlans
// the are
TE_Information tE_info = new TE_Information();
System.out.println("Labels: Original ("+labels+") and Parsed ("+labels.substring(labels.indexOf(",")+1,labels.indexOf("]"))+")");
tE_info.setNumberWLANs(Integer.parseInt(labels.substring(labels.indexOf(",")+1,labels.indexOf("]"))));
tE_info.initWLANs();
if (interDomainFile != null)
{
completeTE_Information(tE_info, source.getRouterID(), dest.getRouterID());
}
edge.setTE_info(tE_info);
edge.setDirectional(true);
//Bidirectional case? See other TEDUpdaters.
((SimpleTEDB)TEDB).getNetworkGraph().addEdge(source, dest, edge);
} else {
System.out.println("Link with an unknown node. Ingnoring...");
}
//log.info("Edge added:"+edge);
//log.info(((SimpleTEDB)TEDB).getIntraDomainLinks().toString());
}
//parseRemainingLinksFromXML(nodes);
}
catch (Exception e)
{
log.info(e.toString());
}
}
// private void parseLinks(String links,Hashtable nodes)
// {
// try {
// //log.info("Inside parseJSON");
// JSONParser parser = new JSONParser();
// Object obj = parser.parse(links);
//
// JSONArray msg = (JSONArray) obj;
// Iterator iterator = msg.iterator();
// while (iterator.hasNext())
// {
// JSONObject jsonObject = (JSONObject) iterator.next();
// //System.out.println(jsonObject.get("src-switch"));
// IntraDomainEdge edge= new IntraDomainEdge();
//
// JSONObject jsonObject_src = (JSONObject) jsonObject.get("src");
// JSONObject jsonObject_dst = (JSONObject) jsonObject.get("dst");
//
// RouterInfoPM source = nodes.get(BristoltoFloodlight((String)jsonObject_src.get("dpid")));
// RouterInfoPM dest = nodes.get(BristoltoFloodlight((String)jsonObject_dst.get("dpid")));
//
// //((SimpleTEDB)TEDB).getNetworkGraph().addVertex(source);
// //((SimpleTEDB)TEDB).getNetworkGraph().addVertex(dest);
//
// log.info("Adding Vertex->"+source+" hashcode:"+source.hashCode());
// log.info("Adding Vertex->"+dest+" hashcode:"+dest.hashCode());
//
// edge.setSrc_if_id((Long)jsonObject_src.get("port_no"));
// edge.setDst_if_id((Long)jsonObject_dst.get("port_no"));
//
//
// // This is a big problem because info is not initialized from file
// // and the controller doesn't give information about how many wlans
// // the are
//
// TE_Information tE_info = new TE_Information();
// tE_info.setNumberWLANs(15);
// tE_info.initWLANs();
//
// if (interDomainFile != null)
// {
// completeTE_Information(tE_info, source.getRouterID(), dest.getRouterID());
// }
//
// edge.setTE_info(tE_info);
//
// String isBidirectional = (String)jsonObject.get("direction");
//
//
// // En Bristol los enlaces son unidirecctionales, pero asumimos que hay uno en una direccion
// // esta el otro
// isBidirectional = "bidirectional";
//
// //log.info("isBidirectional::"+isBidirectional);
//
// if ((1==1)||(isBidirectional != null) && (isBidirectional.equals("bidirectional")))
// {
// //((SimpleTEDB)TEDB).getNetworkGraph().addEdge(source, dest, edge);
//
// TE_Information tE_infoOtherWay = new TE_Information();
// tE_infoOtherWay.setNumberWLANs(15);
// tE_infoOtherWay.initWLANs();
// IntraDomainEdge edgeOtherWay= new IntraDomainEdge();
//
// edgeOtherWay.setSrc_if_id((Long)jsonObject_src.get("port_no"));
// edgeOtherWay.setDst_if_id((Long)jsonObject_dst.get("port_no"));
// edgeOtherWay.setTE_info(tE_infoOtherWay);
//
// ((SimpleTEDB)TEDB).getNetworkGraph().addEdge(source, dest, edge);
// ((SimpleTEDB)TEDB).getNetworkGraph().addEdge(dest, source, edgeOtherWay);
//
// completeTE_Information(tE_info, dest.getRouterID(), source.getRouterID());
//
// log.info("source::"+source);
// log.info("dest::"+dest);
// log.info("edgeOtherWay::"+edgeOtherWay);
// log.info("edge::"+edge);
// //log.info("Adding two!");
// }
// else
// {
// ((SimpleTEDB)TEDB).getNetworkGraph().addEdge(source, dest, edge);
// }
//
// //log.info("Edge added:"+edge);
// //log.info(((SimpleTEDB)TEDB).getIntraDomainLinks().toString());
// }
// //parseRemainingLinksFromXML(nodes);
//
//
// }
// catch (Exception e)
// {
// log.info(UtilsFunctions.exceptionToString(e));
// }
// }
private void completeTE_Information(TE_Information tE_info, String source, String dest)
{
MyEdge auxEdge = new MyEdge(source, dest);
MyEdge completEdge = interDomainLinks.get(auxEdge.hashCode());
if ((completEdge != null)&&(completEdge.vlan != null))
{
tE_info.setVlanLink(true);
tE_info.setVlan(completEdge.vlan);
//If it has been found it will be removed so the rest can be proccessed later
interDomainLinks.remove(completEdge.vlan);
}
else
{
tE_info.setVlanLink(false);
}
}
private String queryForLinks(String ip, String port)
{
String response = "";
try
{
URL topoplogyURL = new URL("http://"+ip+":"+port+topologyPathLinks);
log.info("URL::"+"http://"+ip+":"+port+topologyPathLinks);
URLConnection yc = topoplogyURL.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
{
response = response + inputLine;
}
}
catch (Exception e)
{
log.info(e.toString());
}
return response;
}
private String queryForNodes(String ip, String port)
{
String response = "";
try
{
URL topoplogyURL = new URL("http://"+ip+":"+port+topologyPathNodes);
log.info("http://+port+topologyPathNodes:::"+"http://"+ip+":"+port+topologyPathNodes);
URLConnection yc = topoplogyURL.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
{
response = response + inputLine;
}
in.close();
}
catch (Exception e)
{
log.info(e.toString());
}
return response;
}
public String getInterDomainFile()
{
return interDomainFile;
}
public void setInterDomainFile(String interDomainFile)
{
this.interDomainFile = interDomainFile;
}
private void lock()
{
if (lock != null)
{
lock.lock();
}
}
private void unlock()
{
if (lock != null)
{
lock.unlock();
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy