package org.opennaas.extensions.router.model.utils; /* * #%L * OpenNaaS :: CIM Model * %% * Copyright (C) 2007 - 2014 FundaciĆ³ Privada i2CAT, Internet i InnovaciĆ³ a Catalunya * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ import java.io.IOException; import java.net.Inet4Address; import java.net.InetAddress; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; import org.opennaas.core.resources.capability.CapabilityException; import org.opennaas.extensions.router.model.AggregatedLogicalPort; import org.opennaas.extensions.router.model.BridgeDomain; import org.opennaas.extensions.router.model.ComputerSystem; import org.opennaas.extensions.router.model.GREService; import org.opennaas.extensions.router.model.IPProtocolEndpoint; import org.opennaas.extensions.router.model.LogicalDevice; import org.opennaas.extensions.router.model.ManagedElement; import org.opennaas.extensions.router.model.ManagedSystemElement; import org.opennaas.extensions.router.model.NetworkPort; import org.opennaas.extensions.router.model.ProtocolEndpoint; import org.opennaas.extensions.router.model.ProtocolEndpoint.ProtocolIFType; import org.opennaas.extensions.router.model.System; import org.opennaas.extensions.router.model.VRRPGroup; import org.opennaas.extensions.router.model.VRRPProtocolEndpoint; public class ModelHelper { public static List<NetworkPort> getInterfaces(System system) { List<NetworkPort> ports = new ArrayList<NetworkPort>(); for (LogicalDevice dev : system.getLogicalDevices()) { if (dev instanceof NetworkPort) { ports.add((NetworkPort) dev); } } return ports; } // TODO: Store physical interfaces in model as LogicalPorts // public static List<LogicalPort> getPhysicalInterfaces(System system) { // List<LogicalPort> ports = new ArrayList<LogicalPort>(); // for (LogicalDevice dev : system.getLogicalDevices()) { // if (dev.getClass().equals(LogicalPort.class)) { // ports.add((LogicalPort) dev); // } // } // return ports; // } public static List<ProtocolEndpoint> getGREProtocolEndpoints(System system) { List<ProtocolEndpoint> greEps = new ArrayList<ProtocolEndpoint>(); List<GREService> greServices = system.getAllHostedServicesByType(new GREService()); // FIXME why do we use greServices.get(0) instead of iterating over all greServices? if (!greServices.isEmpty()) { GREService greService = greServices.get(0); greEps.addAll(greService.getProtocolEndpoint()); } return greEps; } /** * Returns interface name given a NetworkPort * * @param networkPort * @return */ public static String getInterfaceName(NetworkPort networkPort) { return networkPort.getName() + "." + String.valueOf(networkPort.getPortNumber()); } /** * Returns interface name given a GRE ProtocolEndpoint * * @param networkPort * @return */ public static String getInterfaceName(ProtocolEndpoint greProtocolEndpoint) { return greProtocolEndpoint.getName(); } // TODO: Store physical interfaces in model as LogicalPorts // /** // * Returns the NetworkPort associated with given name, null if it not found // * // * @param name // * @param system // * @return // */ // public static LogicalPort getLogicalPortFromName(String name, System system) { // for (LogicalPort port : getPhysicalInterfaces(system)) { // if (port.getName().equals(name)) { // return port; // } // } // return null; // } /** * Returns the NetworkPort associated with given name, null if it not found * * @param name * @param system * @return */ public static NetworkPort getNetworkPortFromName(String name, System system) { for (NetworkPort networkPort : getInterfaces(system)) { if (getInterfaceName(networkPort).equals(name)) { return networkPort; } } return null; } /** * Returns the GRE ProtocolEndpoint associated with given name, null if it not found * * @param name * @param system * @return */ public static ProtocolEndpoint getGREProtocolEndpointFromName(String name, System system) { for (ProtocolEndpoint protocolEndpoint : getGREProtocolEndpoints(system)) { if (getInterfaceName(protocolEndpoint).equals(name)) { return protocolEndpoint; } } return null; } public static long ipv4StringToLong(String ip) throws IOException { // transform String ([0..255].[0..255].[0..255].[0..255]) into long InetAddress address = Inet4Address.getByName(ip); ByteBuffer bb = ByteBuffer.wrap(address.getAddress()); long ipLong; if (address.getAddress().length > 4) { ipLong = bb.getLong();// reads 8 bytes and creates a long } else { ipLong = bb.getInt(); // reads 4 bytes and creates an int } return ipLong; } public static String ipv4LongToString(long ip) throws IOException { // transform long into String ([0..255].[0..255].[0..255].[0..255]) ByteBuffer bb = ByteBuffer.allocate(8).putLong(ip); byte[] bytes = new byte[4]; bb.position(4); bb.get(bytes, 0, 4); // read 4 bytes starting at position 4. InetAddress address = Inet4Address.getByAddress(bytes); return address.getHostAddress(); } /** * Returns a list of Logical Routers given a Router model * * @param computerSystem * @return */ public static List<ComputerSystem> getLogicalRouters(ComputerSystem computerSystem) { List<ComputerSystem> list = new ArrayList<ComputerSystem>(); for (ManagedSystemElement systemElement : computerSystem.getManagedSystemElements()) { if (systemElement instanceof ComputerSystem) { list.add((ComputerSystem) systemElement); } } return list; } public static VRRPGroup copyVRRPConfiguration(VRRPGroup vrrpGroup) { VRRPGroup copy = copyVRRPGroup(vrrpGroup); for (ProtocolEndpoint protocolEndpoint : vrrpGroup.getProtocolEndpoint()) { // copy VRRPProtocolEndpoint VRRPProtocolEndpoint vrrpProtocolEndpoint = copyVRRPProtocolEndpoint((VRRPProtocolEndpoint) protocolEndpoint); copy.addProtocolEndpoint(vrrpProtocolEndpoint); // IPProtocolEndpoint copy IPProtocolEndpoint ipProtocolEndpoint = (IPProtocolEndpoint) protocolEndpoint.getBindedProtocolEndpoints().get(0); IPProtocolEndpoint ipCopy = copyIPProtocolEndpoint(ipProtocolEndpoint); vrrpProtocolEndpoint.bindServiceAccessPoint(ipCopy); // NetworkPort copy NetworkPort networkPort = (NetworkPort) ipProtocolEndpoint.getLogicalPorts().get(0); NetworkPort netCopy = copyNetworkPort(networkPort); netCopy.addProtocolEndpoint(ipCopy); } return copy; } public static VRRPGroup copyVRRPGroup(VRRPGroup vrrpGroup) { VRRPGroup copy = new VRRPGroup(); copy.setVrrpName(vrrpGroup.getVrrpName()); copy.setVirtualIPAddress(vrrpGroup.getVirtualIPAddress()); copy.setVirtualLinkAddress(vrrpGroup.getVirtualLinkAddress()); return copy; } public static NetworkPort copyNetworkPort(NetworkPort networkPort) { NetworkPort netCopy = new NetworkPort(); netCopy.setName(networkPort.getName()); netCopy.setPortNumber(networkPort.getPortNumber()); return netCopy; } public static IPProtocolEndpoint copyIPProtocolEndpoint(IPProtocolEndpoint ipProtocolEndpoint) { IPProtocolEndpoint copy = new IPProtocolEndpoint(); copy.setProtocolIFType(ipProtocolEndpoint.getProtocolIFType()); if (ipProtocolEndpoint.getProtocolIFType().equals(ProtocolIFType.IPV4)) { copy.setIPv4Address(ipProtocolEndpoint.getIPv4Address()); copy.setSubnetMask(ipProtocolEndpoint.getSubnetMask()); } else if (ipProtocolEndpoint.getProtocolIFType().equals(ProtocolIFType.IPV6)) { copy.setIPv6Address(ipProtocolEndpoint.getIPv6Address()); copy.setPrefixLength(ipProtocolEndpoint.getPrefixLength()); } else { copy.setIPv4Address(ipProtocolEndpoint.getIPv4Address()); copy.setSubnetMask(ipProtocolEndpoint.getSubnetMask()); copy.setIPv6Address(ipProtocolEndpoint.getIPv6Address()); copy.setPrefixLength(ipProtocolEndpoint.getPrefixLength()); } return copy; } public static VRRPProtocolEndpoint copyVRRPProtocolEndpoint(VRRPProtocolEndpoint pE) { VRRPProtocolEndpoint copy = new VRRPProtocolEndpoint(); copy.setPriority(pE.getPriority()); copy.setProtocolIFType(pE.getProtocolIFType()); return copy; } public static VRRPGroup getVRRPGroupByName(ComputerSystem model, int groupId) throws CapabilityException { List<VRRPGroup> vrrpGroupsList = model.getAllHostedServicesByType(new VRRPGroup()); for (VRRPGroup candidate : vrrpGroupsList) if (candidate.getVrrpName() == groupId) return candidate; return null; } /** * * @param bridgeDomainList * @param name * @return The {@link BridgeDomain} of the list which {@link BridgeDomain#getElementName()} matches the specified name. Null if there's no * {@link BridgeDomain) in the list which {@link BridgeDomain#getElementName()} matches the specified name. */ public static BridgeDomain getBridgeDomainByName(List<BridgeDomain> bridgeDomainList, String name) { for (BridgeDomain brDomain : bridgeDomainList) if (brDomain.getElementName().equals(name)) return brDomain; return null; } /** * Retrieves {@link BridgeDomain}'s present in the given model * * @param model * @return */ public static List<BridgeDomain> getBridgeDomains(System model) { return model.getAllHostedCollectionsByType(BridgeDomain.class); } /** * Retrieves Layer 3 {@link BridgeDomain}'s present in the given model. Retrieves only the ones with set ipAddress field. * * @param model * @return */ public static List<BridgeDomain> getL3BridgeDomains(System model) { List<BridgeDomain> l3BridgeDomains = new ArrayList<BridgeDomain>(0); for (BridgeDomain bridgeDomain : model.getAllHostedCollectionsByType(BridgeDomain.class)) { if (bridgeDomain.getIpAddress() != null && !bridgeDomain.getIpAddress().isEmpty()) { l3BridgeDomains.add(bridgeDomain); } } return l3BridgeDomains; } /** * Retrieves the list of AggregatedLogicalPort's in given System * * @param system * @return a list containing AggregatedLogicalPort's in given System. Will be empty when given systems does not contain any AggregatedLogicalPort. */ public static List<AggregatedLogicalPort> getAggregatedLogicalPorts(System system) { List<AggregatedLogicalPort> aggregators = new ArrayList<AggregatedLogicalPort>(); for (LogicalDevice dev : system.getLogicalDevices()) { if (dev instanceof AggregatedLogicalPort) { aggregators.add((AggregatedLogicalPort) dev); } } return aggregators; } /** * * @param elements * @param elementName * @return First managedElement in elements witn given elementName. null if there is no such ManagedElement. */ public static ManagedElement getManagedElementByElementName(List<? extends ManagedElement> elements, String elementName) { if (elementName == null) return null; for (ManagedElement el : elements) { if (elementName.equals(el.getElementName())) return el; } return null; } }