package org.opennaas.extensions.network.capability.basic.mappers; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.opennaas.core.resources.IModel; import org.opennaas.extensions.network.model.NetworkModel; import org.opennaas.extensions.network.model.NetworkModelHelper; import org.opennaas.extensions.network.model.layer.Layer; import org.opennaas.extensions.network.model.technology.ethernet.EthernetInterface; import org.opennaas.extensions.network.model.technology.ethernet.EthernetLayer; import org.opennaas.extensions.network.model.technology.ethernet.TaggedEthernetLayer; import org.opennaas.extensions.network.model.technology.ip.IPLayer; import org.opennaas.extensions.network.model.topology.Device; import org.opennaas.extensions.network.model.topology.Interface; import org.opennaas.extensions.network.model.topology.Link; import org.opennaas.extensions.network.model.topology.NetworkElement; import org.opennaas.extensions.router.model.EthernetPort; import org.opennaas.extensions.router.model.IPProtocolEndpoint; import org.opennaas.extensions.router.model.LogicalTunnelPort; import org.opennaas.extensions.router.model.NetworkPort; import org.opennaas.extensions.router.model.ProtocolEndpoint; import org.opennaas.extensions.router.model.System; import org.opennaas.extensions.router.model.VLANEndpoint; import org.opennaas.extensions.router.model.utils.ModelHelper; public class Cim2NdlMapper { private static Log log = LogFactory.getLog(Cim2NdlMapper.class); /** * Transforms given model to a NDL representation and adds it to networkModel. * * @param model * @param networkModel * @param name * name for the model to add * @return NetworkElements created to represent given model in networkModel. */ public static List<NetworkElement> addModelToNetworkModel(IModel model, NetworkModel networkModel, String name) { if (model instanceof System) { return addManagedElementToNetworkModel((System) model, networkModel, name); } return new ArrayList<NetworkElement>(); } /** * Transforms given managedElement to a NDL representation and adds it to networkModel. * * @param managedElement * @param networkModel * @param name * name for the System to add * @return NetworkElements created to represent given managedElement in networkModel. */ private static List<NetworkElement> addManagedElementToNetworkModel(System managedElement, NetworkModel networkModel, String name) { List<NetworkElement> createdElements = new ArrayList<NetworkElement>(); // create device Device dev = addDeviceToNetworkModel(managedElement, networkModel, name); // create interfaces List<Interface> interfaces = addInterfacesToNetworkModel(managedElement, dev, networkModel); // create links List<Link> links = addLTLinksToNetworkModel(managedElement, interfaces, networkModel, dev); createdElements.add(dev); createdElements.addAll(interfaces); createdElements.addAll(links); return createdElements; } /** * Creates a Device representing given ManagedElement and adds it to networkModel. Notice that a single Device is not a complete representation of * a ManagedElement. * * @param managedElement * @param networkModel * @param name * Name of the device * @return Created Device. */ private static Device addDeviceToNetworkModel(System managedElement, NetworkModel networkModel, String name) { Device dev = new Device(); if (name != null) { dev.setName(name); } else { dev.setName(managedElement.getName()); } networkModel.getNetworkElements().add(dev); log.debug("Added device " + dev.getName()); return dev; } /* method to add devices */ private static String addResourceName(Device device, String name) { return device.getName() + ":" + name; } /** * Creates interfaces representing given managedElement endpoints, and adds them to networkModel. Add physical ethernet, pure ethernet, tagged * ethernet and ip interfaces * * @param managedElement * @param dev * @param networkModel * @return Created interfaces. */ private static List<Interface> addInterfacesToNetworkModel(System managedElement, Device dev, NetworkModel networkModel) { List<Interface> interfaces = new ArrayList<Interface>(); // Add the pure ethernet interfaces interfaces.addAll(addPureEthernetInterfaces(managedElement, dev, networkModel)); // Add the tagged ethernet interfaces interfaces.addAll(addTaggedEthernetInterfaces(managedElement, dev, networkModel)); // Add the ip interfaces interfaces.addAll(addIPInterfaces(managedElement, dev, networkModel)); return interfaces; } /** * Add the pure ethernet interfaces in the model -> Haven't VLAN enpoints * * @param managedElement * @param dev * @param networkModel * @return list of interfaces */ private static Collection<? extends Interface> addPureEthernetInterfaces(System managedElement, Device dev, NetworkModel networkModel) { List<Interface> listInterface = new ArrayList<Interface>(); List<NetworkPort> listNetworkPort = ModelHelper.getInterfaces(managedElement); for (NetworkPort port : listNetworkPort) { if (port instanceof EthernetPort || port instanceof LogicalTunnelPort) { Layer ethLayer = obtainEthernetLayer(networkModel); EthernetInterface iface = new EthernetInterface(); iface.setName(addResourceName(dev, port.getName() + "." + port.getPortNumber())); iface.setLayer(ethLayer); iface.setDevice(dev); iface.setBandwidth(port.getSpeed()); dev.getInterfaces().add(iface); networkModel.getNetworkElements().add(iface); listInterface.add(iface); log.debug("Added iface " + iface.getName() + " in layer " + ethLayer.getName()); } } return listInterface; } /** * @param managedElement * @param dev * @param networkModel * @return list of interfaces */ private static Collection<? extends Interface> addTaggedEthernetInterfaces(System managedElement, Device dev, NetworkModel networkModel) { List<Interface> listInterface = new ArrayList<Interface>(); List<NetworkPort> listNetworkPort = ModelHelper.getInterfaces(managedElement); for (NetworkPort port : listNetworkPort) { if (port.getProtocolEndpoint() != null) { for (ProtocolEndpoint endpoint : port.getProtocolEndpoint()) { if (endpoint instanceof VLANEndpoint) { Layer ifaceLayer = obtainTaggedEthernetLayer(networkModel); Interface iface = new EthernetInterface(); iface.setName(addResourceName(dev, port.getName() + "." + port.getPortNumber())); iface.setLayer(ifaceLayer); iface.setDevice(dev); Interface topIFace = getTopInterface(networkModel.getNetworkElements(), addResourceName(dev, port.getName() + "." + port.getPortNumber())); if (topIFace != null) { iface.setServerInterface(topIFace); topIFace.getClientInterfaces().add(iface); } dev.getInterfaces().add(iface); networkModel.getNetworkElements().add(iface); listInterface.add(iface); log.debug("Added iface " + iface.getName() + " in layer " + ifaceLayer.getName()); } } } } return listInterface; } /** * @param managedElement * @param dev * @param networkModel * @return list of interfaces */ private static Collection<? extends Interface> addIPInterfaces(System managedElement, Device dev, NetworkModel networkModel) { List<Interface> listInterface = new ArrayList<Interface>(); List<NetworkPort> listNetworkPort = ModelHelper.getInterfaces(managedElement); for (NetworkPort port : listNetworkPort) { if (port.getProtocolEndpoint() != null) { for (ProtocolEndpoint endpoint : port.getProtocolEndpoint()) { if (endpoint instanceof IPProtocolEndpoint) { Layer ifaceLayer = obtainIPLayer(networkModel); Interface iface = new Interface(); iface.setName(addResourceName(dev, ((IPProtocolEndpoint) endpoint).getIPv4Address())); iface.setLayer(ifaceLayer); // Can have 2 interfaces with same name. if have 2 interface we put the tagged, otherwise the pure ethernet Interface topIFace = getTopInterface(networkModel.getNetworkElements(), addResourceName(dev, port.getName() + "." + port.getPortNumber())); if (topIFace != null) { iface.setServerInterface(topIFace); topIFace.getClientInterfaces().add(iface); } iface.setDevice(dev); dev.getInterfaces().add(iface); networkModel.getNetworkElements().add(iface); listInterface.add(iface); log.debug("Added iface " + iface.getName() + " in layer " + ifaceLayer.getName()); } } } } return listInterface; } /** * Get the top interface from a list of interfaces and the name. <br> * Can have 2 interfaces with same name. <br> * if have 2 interface we put the tagged, otherwise the pure ethernet * * @param networkElements * @param addResourceName * @return the top interface */ private static Interface getTopInterface(List<NetworkElement> networkElements, String name) { Interface iface = null; List<Interface> listInterfaces = getInterfacesByName(networkElements, name); if (listInterfaces.size() == 1) { iface = listInterfaces.get(0); } else { iface = listInterfaces.get(0); if (!(iface.getLayer() instanceof TaggedEthernetLayer)) { iface = listInterfaces.get(1); } } return iface; } /** * Get the interfaces by name, if not exists return empty array list * * @param list * @param addResourceName * @return the list of interfaces with name = name */ private static List<Interface> getInterfacesByName(List<NetworkElement> list, String name) { List<Interface> listInterfaces = new ArrayList<Interface>(); for (NetworkElement networkElement : list) { if (networkElement instanceof Interface) { if (networkElement.getName() != null && networkElement.getName().equals(name)) { listInterfaces.add((Interface) networkElement); } } } return listInterfaces; } /** * Creates links representing LT connections in managedElement, and adds them to networkModel. * * @param managedElement * @param interfaces * @param networkModel * @return Created links. */ private static List<Link> addLTLinksToNetworkModel(System managedElement, List<Interface> interfaces, NetworkModel networkModel, Device dev) { List<LogicalTunnelPort> linkedPorts = new ArrayList<LogicalTunnelPort>(); List<Link> links = new ArrayList<Link>(); for (NetworkPort port : ModelHelper.getInterfaces((managedElement))) { if (port instanceof LogicalTunnelPort) { // avoid duplicating links if (!linkedPorts.contains(port)) { // get lt endpoints LogicalTunnelPort srcPort = (LogicalTunnelPort) port; LogicalTunnelPort dstPort = null; long dstPortUnit = srcPort.getPeer_unit(); for (NetworkPort otherPort : ModelHelper.getInterfaces(managedElement)) { if (otherPort instanceof LogicalTunnelPort) { if (otherPort.getPortNumber() == (int) dstPortUnit) { dstPort = (LogicalTunnelPort) otherPort; break; } } } if (dstPort != null) { // get interfaces matching lt endpoints Interface srcIface = null; Interface dstIface = null; for (Interface anIface : interfaces) { if (anIface.getName().equals(addResourceName(dev, srcPort.getName() + "." + srcPort.getPortNumber()))) { srcIface = anIface; // get interface connected to srcIface for (Interface otherIface : interfaces) { if (otherIface.getName().equals(addResourceName(dev, dstPort.getName() + "." + dstPort.getPortNumber()))) { if (otherIface.getLayer().equals(srcIface.getLayer())) { dstIface = otherIface; break; } } } if (dstIface != null) { Link link = NetworkModelHelper.linkInterfaces(srcIface, dstIface, true); networkModel.getNetworkElements().add(link); links.add(link); // avoid duplicating links linkedPorts.add(srcPort); linkedPorts.add(dstPort); } } } } } } } return links; } /** * @param networkModel * @return */ private static Layer obtainEthernetLayer(NetworkModel networkModel) { for (Layer layer : NetworkModelHelper.getLayers(networkModel)) { if (layer instanceof EthernetLayer) { return layer; } } return new EthernetLayer(); } /** * @param networkModel * @return */ private static Layer obtainIPLayer(NetworkModel networkModel) { for (Layer layer : NetworkModelHelper.getLayers(networkModel)) { if (layer instanceof IPLayer) { return layer; } } return new IPLayer(); } /** * @param networkModel * @return */ private static Layer obtainTaggedEthernetLayer(NetworkModel networkModel) { for (Layer layer : NetworkModelHelper.getLayers(networkModel)) { if (layer instanceof TaggedEthernetLayer) { return layer; } } return new TaggedEthernetLayer(); } }