package org.opennaas.extensions.ofertie.ncl.provisioner.components.mockup; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.opennaas.core.resources.SerializationException; import org.opennaas.extensions.ofertie.ncl.provisioner.api.model.FlowRequest; import org.opennaas.extensions.ofertie.ncl.provisioner.components.IPathFinder; import org.opennaas.extensions.sdnnetwork.model.NetworkConnection; import org.opennaas.extensions.sdnnetwork.model.Port; import org.opennaas.extensions.sdnnetwork.model.Route; public class PathFinderMockup implements IPathFinder { private final static String PATHS_FILE_URL = "etc/org.opennaas.extensions.ofertie.ncl.paths.xml"; private static final String DEFAULT_ROUTE = "0"; /** * Key: RouteId, Value: Route to apply */ private static Map<String, Route> routes; public PathFinderMockup() throws IOException, SerializationException { String xmlRoutes = PathLoader.readXMLFile(PATHS_FILE_URL); routes = PathLoader.getRoutesFromXml(xmlRoutes); } @Override public Route findPathForRequest(FlowRequest flowRequest, String networkId) throws Exception { return selectRouteFromRequestId(flowRequest.getRequestId()); } /** * Selects a route having RouteId equals to given requestId * * @param requestId * @return */ private Route selectRouteFromRequestId(String requestId) { Route route; route = routes.get(String.valueOf(requestId)); if (route == null) route = routes.get(DEFAULT_ROUTE); return route; } /** * Initialize routes according to testbed topology * * @return */ private static Map<String, Route> initRoutes() { Map<String, Port> ports = generateTopologyPorts(); Map<String, NetworkConnection> links = generateTopologyLinks(ports); Map<String, NetworkConnection> xconnects = generateXConnects(ports); Map<String, Route> routes = new HashMap<String, Route>(); // medium one Route route0 = new Route(); route0.setId("0"); List<NetworkConnection> route0Path = new ArrayList<NetworkConnection>(5); route0Path.add(links.get("h1-0->s3-1")); route0Path.add(xconnects.get("s3-1->s3-2")); route0Path.add(links.get("s3-2->s4-1")); route0Path.add(xconnects.get("s4-1->s4-2")); route0Path.add(links.get("s4-2->h2-0")); route0.setNetworkConnections(route0Path); routes.put(route0.getId(), route0); // shortest one Route route1 = new Route(); route1.setId("1"); List<NetworkConnection> route1Path = new ArrayList<NetworkConnection>(3); route1Path.add(links.get("h1-1->s5-1")); route1Path.add(xconnects.get("s5-1->s5-2")); route1Path.add(links.get("s5-2->h2-1")); route1.setNetworkConnections(route1Path); routes.put(route1.getId(), route1); // largest one Route route2 = new Route(); route2.setId("2"); List<NetworkConnection> route2Path = new ArrayList<NetworkConnection>(7); route2Path.add(links.get("h1-2->s6-1")); route2Path.add(xconnects.get("s6-1->s6-2")); route2Path.add(links.get("s6-2->s7-1")); route2Path.add(xconnects.get("s7-1->s7-2")); route2Path.add(links.get("s7-2->s8-1")); route2Path.add(xconnects.get("s8-1->s8-2")); route2Path.add(links.get("s8-2->h2-2")); route2.setNetworkConnections(route2Path); routes.put(route2.getId(), route2); // inverse routes // medium one Route route0c = new Route(); route0c.setId("10"); List<NetworkConnection> route0cPath = new ArrayList<NetworkConnection>(5); route0cPath.add(links.get("h2-0->s4-2")); route0cPath.add(xconnects.get("s4-2->s4-1")); route0cPath.add(links.get("s4-1->s3-2")); route0cPath.add(xconnects.get("s3-2->s3-1")); route0cPath.add(links.get("s3-1->h1-0")); route0c.setNetworkConnections(route0cPath); routes.put(route0c.getId(), route0c); // shortest one Route route1c = new Route(); route1c.setId("11"); List<NetworkConnection> route1cPath = new ArrayList<NetworkConnection>(3); route1cPath.add(links.get("h2-1->s5-2")); route1cPath.add(xconnects.get("s5-2->s5-1")); route1cPath.add(links.get("s5-1->h1-1")); route1c.setNetworkConnections(route1cPath); routes.put(route1c.getId(), route1c); // largest one Route route2c = new Route(); route2c.setId("12"); List<NetworkConnection> route2cPath = new ArrayList<NetworkConnection>(7); route2cPath.add(links.get("h2-2->s8-2")); route2cPath.add(xconnects.get("s8-2->s8-1")); route2cPath.add(links.get("s8-1->s7-2")); route2cPath.add(xconnects.get("s7-2->s7-1")); route2cPath.add(links.get("s7-1->s6-2")); route2cPath.add(xconnects.get("s6-2->s6-1")); route2cPath.add(links.get("s6-1->h1-2")); route2c.setNetworkConnections(route2cPath); routes.put(route2c.getId(), route2c); return routes; } private static Map<String, NetworkConnection> generateXConnects(Map<String, Port> ports) { NetworkConnection xconnect; Map<String, NetworkConnection> xconnects = new HashMap<String, NetworkConnection>(); for (Port srcPort : ports.values()) { for (Port dstPort : ports.values()) { if (!srcPort.equals(dstPort)) { if (srcPort.getDeviceId().equals(dstPort.getDeviceId())) { if (srcPort.getDeviceId().startsWith("s")) { // device is a switch xconnect = new NetworkConnection(); xconnect.setSource(srcPort); xconnect.setDestination(dstPort); xconnect.setName(xconnect.getSource().getId() + "->" + xconnect.getDestination().getId()); xconnects.put(xconnect.getName(), xconnect); } } } } } return xconnects; } private static Map<String, NetworkConnection> generateTopologyLinks(Map<String, Port> ports) { NetworkConnection link; Map<String, NetworkConnection> links = new HashMap<String, NetworkConnection>(); // longest route link = new NetworkConnection(); link.setSource(ports.get("h2-2")); link.setDestination(ports.get("s8-2")); link.setName(link.getSource().getId() + "->" + link.getDestination().getId()); links.put(link.getName(), link); link = new NetworkConnection(); link.setSource(ports.get("s8-1")); link.setDestination(ports.get("s7-2")); link.setName(link.getSource().getId() + "->" + link.getDestination().getId()); links.put(link.getName(), link); link = new NetworkConnection(); link.setSource(ports.get("s6-2")); link.setDestination(ports.get("s7-1")); link.setName(link.getSource().getId() + "->" + link.getDestination().getId()); links.put(link.getName(), link); link = new NetworkConnection(); link.setSource(ports.get("h1-2")); link.setDestination(ports.get("s6-1")); link.setName(link.getSource().getId() + "->" + link.getDestination().getId()); links.put(link.getName(), link); // shortest route link = new NetworkConnection(); link.setSource(ports.get("s5-2")); link.setDestination(ports.get("h2-1")); link.setName(link.getSource().getId() + "->" + link.getDestination().getId()); links.put(link.getName(), link); link = new NetworkConnection(); link.setSource(ports.get("h1-1")); link.setDestination(ports.get("s5-1")); link.setName(link.getSource().getId() + "->" + link.getDestination().getId()); links.put(link.getName(), link); // medium route link = new NetworkConnection(); link.setSource(ports.get("s4-2")); link.setDestination(ports.get("h2-0")); link.setName(link.getSource().getId() + "->" + link.getDestination().getId()); links.put(link.getName(), link); link = new NetworkConnection(); link.setSource(ports.get("s3-2")); link.setDestination(ports.get("s4-1")); link.setName(link.getSource().getId() + "->" + link.getDestination().getId()); links.put(link.getName(), link); link = new NetworkConnection(); link.setSource(ports.get("h1-0")); link.setDestination(ports.get("s3-1")); link.setName(link.getSource().getId() + "->" + link.getDestination().getId()); links.put(link.getName(), link); // calculate inverse links Map<String, NetworkConnection> inverseLinks = new HashMap<String, NetworkConnection>(); for (NetworkConnection nc : links.values()) { link = new NetworkConnection(); link.setSource(nc.getDestination()); link.setDestination(nc.getSource()); link.setName(link.getSource().getId() + "->" + link.getDestination().getId()); inverseLinks.put(link.getName(), link); } links.putAll(inverseLinks); return links; } private static Map<String, Port> generateTopologyPorts() { Port port; Map<String, Port> ports = new HashMap<String, Port>(); // h1 ports port = new Port(); port.setDeviceId("h1"); port.setPortNumber("0"); ports.put(port.getDeviceId() + "-" + port.getPortNumber(), port); port = new Port(); port.setDeviceId("h1"); port.setPortNumber("1"); ports.put(port.getDeviceId() + "-" + port.getPortNumber(), port); port = new Port(); port.setDeviceId("h1"); port.setPortNumber("2"); ports.put(port.getDeviceId() + "-" + port.getPortNumber(), port); // h2 ports port = new Port(); port.setDeviceId("h2"); port.setPortNumber("0"); ports.put(port.getDeviceId() + "-" + port.getPortNumber(), port); port = new Port(); port.setDeviceId("h2"); port.setPortNumber("1"); ports.put(port.getDeviceId() + "-" + port.getPortNumber(), port); port = new Port(); port.setDeviceId("h2"); port.setPortNumber("2"); ports.put(port.getDeviceId() + "-" + port.getPortNumber(), port); // s3 ports port = new Port(); port.setDeviceId("s3"); port.setPortNumber("1"); ports.put(port.getDeviceId() + "-" + port.getPortNumber(), port); port = new Port(); port.setDeviceId("s3"); port.setPortNumber("2"); ports.put(port.getDeviceId() + "-" + port.getPortNumber(), port); // s4 ports port = new Port(); port.setDeviceId("s4"); port.setPortNumber("1"); ports.put(port.getDeviceId() + "-" + port.getPortNumber(), port); port = new Port(); port.setDeviceId("s4"); port.setPortNumber("2"); ports.put(port.getDeviceId() + "-" + port.getPortNumber(), port); // s5 ports port = new Port(); port.setDeviceId("s5"); port.setPortNumber("1"); ports.put(port.getDeviceId() + "-" + port.getPortNumber(), port); port = new Port(); port.setDeviceId("s5"); port.setPortNumber("2"); ports.put(port.getDeviceId() + "-" + port.getPortNumber(), port); // s6 ports port = new Port(); port.setDeviceId("s6"); port.setPortNumber("1"); ports.put(port.getDeviceId() + "-" + port.getPortNumber(), port); port = new Port(); port.setDeviceId("s6"); port.setPortNumber("2"); ports.put(port.getDeviceId() + "-" + port.getPortNumber(), port); // s7 ports port = new Port(); port.setDeviceId("s7"); port.setPortNumber("1"); ports.put(port.getDeviceId() + "-" + port.getPortNumber(), port); port = new Port(); port.setDeviceId("s7"); port.setPortNumber("2"); ports.put(port.getDeviceId() + "-" + port.getPortNumber(), port); // s8 ports port = new Port(); port.setDeviceId("s8"); port.setPortNumber("1"); ports.put(port.getDeviceId() + "-" + port.getPortNumber(), port); port = new Port(); port.setDeviceId("s8"); port.setPortNumber("2"); ports.put(port.getDeviceId() + "-" + port.getPortNumber(), port); return ports; } }