package org.opennaas.extensions.network.model; import java.util.ArrayList; import java.util.List; import org.opennaas.extensions.network.model.domain.NetworkDomain; 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.EthernetLink; import org.opennaas.extensions.network.model.topology.ConnectionPoint; import org.opennaas.extensions.network.model.topology.CrossConnect; 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.NetworkConnection; import org.opennaas.extensions.network.model.topology.NetworkElement; import org.opennaas.extensions.network.model.topology.Path; import org.opennaas.extensions.network.model.topology.TransportNetworkElement; public class NetworkModelHelper { public static List<NetworkElement> getNetworkElementsExceptTransportElements(NetworkModel model) { return getNetworkElementsExceptTransportElements(model.getNetworkElements()); } public static List<NetworkElement> getNetworkElementsExceptTransportElements(List<NetworkElement> networkElements) { List<NetworkElement> toReturn = new ArrayList<NetworkElement>(); for (NetworkElement elem : networkElements) { if (!(elem instanceof TransportNetworkElement)) { toReturn.add(elem); } } return toReturn; } public static List<Device> getDevices(NetworkModel model) { return getDevices(model.getNetworkElements()); } public static List<Device> getDevices(List<NetworkElement> networkElements) { List<Device> toReturn = new ArrayList<Device>(); for (NetworkElement elem : networkElements) { if (elem instanceof Device) { toReturn.add((Device) elem); } } return toReturn; } public static Device getDeviceByName(NetworkModel model, String deviceName) { List<Device> networkElements = getDevices(model); for (NetworkElement elem : networkElements) { if (elem instanceof Device && elem.getName().equals(deviceName)) { return (Device) elem; } } return null; } public static List<NetworkDomain> getDomains(NetworkModel model) { return getDomains(model.getNetworkElements()); } public static List<NetworkDomain> getDomains(List<NetworkElement> networkElements) { List<NetworkDomain> toReturn = new ArrayList<NetworkDomain>(); for (NetworkElement elem : networkElements) { if (elem instanceof NetworkDomain) { toReturn.add((NetworkDomain) elem); } } return toReturn; } public static List<Link> getLinks(NetworkModel model) { return getLinks(model.getNetworkElements()); } public static List<Link> getLinks(List<NetworkElement> networkElements) { List<Link> toReturn = new ArrayList<Link>(); for (NetworkElement elem : networkElements) { if (elem instanceof Link) { toReturn.add((Link) elem); } } return toReturn; } public static List<Layer> getLayers(NetworkModel model) { return getLayers(model.getNetworkElements()); } public static List<Layer> getLayers(List<NetworkElement> networkElements) { List<Layer> toReturn = new ArrayList<Layer>(); for (NetworkElement elem : networkElements) { if (elem instanceof ConnectionPoint) { Layer layer = ((ConnectionPoint) elem).getLayer(); // TODO implement equals in Layer if (!toReturn.contains(layer)) toReturn.add(layer); } } return toReturn; } public static List<ConnectionPoint> getConnectionPoints(NetworkModel model) { return getConnectionPoints(model.getNetworkElements()); } public static List<ConnectionPoint> getConnectionPoints(List<NetworkElement> networkElements) { List<ConnectionPoint> toReturn = new ArrayList<ConnectionPoint>(); for (NetworkElement elem : networkElements) { if (elem instanceof ConnectionPoint) { toReturn.add((ConnectionPoint) elem); } } return toReturn; } public static List<Interface> getInterfaces(List<NetworkElement> networkElements) { List<Interface> toReturn = new ArrayList<Interface>(); for (NetworkElement elem : networkElements) { if (elem instanceof Interface) { toReturn.add((Interface) elem); } } return toReturn; } @Deprecated public static Interface getInterfaceByName(String interfaceName, NetworkModel model) { for (NetworkElement elem : model.getNetworkElements()) { if (elem instanceof Interface) { if (elem.getName().equals(interfaceName)) return (Interface) elem; } } return null; } /** * Get the interface from Network Model and interface name * * @param networkElements * @return Interface */ public static Interface getInterfaceByName(List<NetworkElement> networkElements, String interfaceName) { Interface toReturn = null; for (NetworkElement elem : networkElements) { if (elem instanceof Interface && elem.getName().equals(interfaceName)) { toReturn = (Interface) elem; break; } } return toReturn; } /** * * @param name * @param networkElements * @return lowest current position of networkElements containing an element named with given name. */ public static int getNetworkElementByName(String name, List<? extends NetworkElement> networkElements) { int pos = 0; for (NetworkElement networkElement : networkElements) { if (networkElement.getName() != null && networkElement.getName().equals(name)) return pos; pos++; } return -1; } /** * Return all elements in networkElements being of class clazz. * * @param clazz * @param networkElements * @return */ public static List<NetworkElement> getNetworkElementsByClassName(Class clazz, List<NetworkElement> networkElements) { List<NetworkElement> matchingElements = new ArrayList<NetworkElement>(); for (NetworkElement networkElement : networkElements) { if (networkElement.getClass().equals(clazz)) matchingElements.add(networkElement); } return matchingElements; } public static Link linkInterfaces(Interface src, Interface dst, boolean bidiLink) { Link link = new Link(); if (src instanceof EthernetInterface && dst instanceof EthernetInterface) { link = new EthernetLink(); long capacity = Math.min(((EthernetInterface) src).getBandwidth(), ((EthernetInterface) dst).getBandwidth()); ((EthernetLink) link).setBandwidth(capacity); } link.setName(src.getName() + "-" + dst.getName()); link.setSource(src); link.setSink(dst); link.setBidirectional(bidiLink); link.setLayer(src.getLayer()); src.setLinkTo(link); if (bidiLink) { dst.setLinkTo(link); } return link; } public static CrossConnect crossConnectInterfaces(Interface src, Interface dst) { CrossConnect xConnect = new CrossConnect(); xConnect.setSource(src); xConnect.setSink(dst); xConnect.setLayer(src.getLayer()); src.setSwitchedTo(xConnect); dst.setSwitchedTo(xConnect); return xConnect; } /** * Removes given NetworkElement from given networkModel (if exists). * * @param toRemove * @param networkModel * @return updated network model */ public static NetworkModel deleteNetworkElementAndReferences(NetworkElement toRemove, NetworkModel networkModel) { if (!networkModel.getNetworkElements().contains(toRemove)) { // TODO throw exception? return networkModel; } if (toRemove instanceof NetworkDomain) { while (((NetworkDomain) toRemove).getHasDevice().size() > 0) { deleteNetworkElementAndReferences(((NetworkDomain) toRemove).getHasDevice().get(0), networkModel); } while (((NetworkDomain) toRemove).getHasInterface().size() > 0) { deleteNetworkElementAndReferences(((NetworkDomain) toRemove).getHasInterface().get(0), networkModel); } networkModel.getNetworkElements().remove(toRemove); toRemove.setLocatedAt(null); toRemove.getInAdminDomains().clear(); } else if (toRemove instanceof Device) { while (((Device) toRemove).getInterfaces().size() > 0) { deleteNetworkElementAndReferences(((Device) toRemove).getInterfaces().get(0), networkModel); } networkModel.getNetworkElements().remove(toRemove); toRemove.setLocatedAt(null); toRemove.getInAdminDomains().clear(); } else if (toRemove instanceof TransportNetworkElement) { deleteTransportNetworkConnectionAndReferences((TransportNetworkElement) toRemove, networkModel); } return networkModel; } public static NetworkModel deleteTransportNetworkConnectionAndReferences(TransportNetworkElement toRemove, NetworkModel networkModel) { if (!networkModel.getNetworkElements().contains(toRemove)) { // TODO throw exception? return networkModel; } if (toRemove instanceof ConnectionPoint) { while (((ConnectionPoint) toRemove).getClientInterfaces().size() > 0) { deleteNetworkElementAndReferences(((ConnectionPoint) toRemove).getClientInterfaces().get(0), networkModel); } if (toRemove instanceof Interface) { if (((Interface) toRemove).getDevice() != null) ((Interface) toRemove).getDevice().getInterfaces().remove(toRemove); deleteNetworkElementAndReferences(((Interface) toRemove).getLinkTo(), networkModel); // TODO WHAT TO DO WITH PATHS??? // should they be removed when its source/sink is ? // should they be removed when an intermediate links/path is? deleteNetworkElementAndReferences(((Interface) toRemove).getConnectedTo(), networkModel); deleteNetworkElementAndReferences(((Interface) toRemove).getSwitchedTo(), networkModel); } if (((ConnectionPoint) toRemove).getServerInterface() != null) { ((ConnectionPoint) toRemove).getServerInterface().getClientInterfaces().remove(toRemove); ((ConnectionPoint) toRemove).setServerInterface(null); } toRemove.setLayer(null); networkModel.getNetworkElements().remove(toRemove); toRemove.setLocatedAt(null); toRemove.getInAdminDomains().clear(); } else if (toRemove instanceof NetworkConnection) { deleteNetworkConnectionAndReferences((NetworkConnection) toRemove, networkModel); } return networkModel; } public static NetworkModel deleteNetworkConnectionAndReferences(NetworkConnection toRemove, NetworkModel networkModel) { if (!networkModel.getNetworkElements().contains(toRemove)) { // TODO throw exception? return networkModel; } if (toRemove instanceof Link) { ((Link) toRemove).getSource().setLinkTo(null); ((Link) toRemove).getSink().setLinkTo(null); ((Link) toRemove).setSource(null); ((Link) toRemove).setSink(null); } else if (toRemove instanceof Path) { ((Path) toRemove).getSource().setLinkTo(null); ((Path) toRemove).getSink().setLinkTo(null); ((Path) toRemove).setSource(null); ((Path) toRemove).setSink(null); // TODO what to do with segments?? // SHOULD THEY BE REMOVED? // intermediate links and paths will still be active // don't remove them by now // just mark they are no longer part of toRemove ((Path) toRemove).getPathSegments().clear(); } else if (toRemove instanceof CrossConnect) { ((CrossConnect) toRemove).getSource().setSwitchedTo(null); ((CrossConnect) toRemove).getSink().setSwitchedTo(null); ((CrossConnect) toRemove).setSource(null); ((CrossConnect) toRemove).setSink(null); } toRemove.setLayer(null); networkModel.getNetworkElements().remove(toRemove); toRemove.setLocatedAt(null); toRemove.getInAdminDomains().clear(); return networkModel; } public static List<Link> getClientLinks(Link link) { List<Link> clientLinks = new ArrayList<Link>(); List<ConnectionPoint> clientInterfaces = link.getSource().getClientInterfaces(); for (ConnectionPoint iface : clientInterfaces) { if (iface instanceof Interface) { Link subLink = ((Interface) iface).getLinkTo(); if (subLink != null) { clientLinks.add(subLink); } } } return clientLinks; } public static List<Link> getAllLinksBetweenTwoDevices(NetworkModel networkModel, String firstDeviceId, String secondDeviceId) { List<Link> links = new ArrayList<Link>(); List<Link> modelLinks = getLinks(networkModel); for (Link link : modelLinks) if (link.getSource().getDevice().getName().equals(firstDeviceId) && (link.getSink().getDevice().getName().equals(secondDeviceId)) || (link .getSource().getDevice().getName().equals(secondDeviceId) && (link.getSink().getDevice().getName().equals(firstDeviceId)))) links.add(link); return links; } }