package org.opennaas.extensions.router.capability.ip; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.opennaas.core.resources.ActivatorException; import org.opennaas.core.resources.action.IAction; import org.opennaas.core.resources.action.IActionSet; import org.opennaas.core.resources.capability.AbstractCapability; import org.opennaas.core.resources.capability.CapabilityException; import org.opennaas.core.resources.descriptor.CapabilityDescriptor; import org.opennaas.core.resources.descriptor.ResourceDescriptorConstants; import org.opennaas.extensions.queuemanager.IQueueManagerCapability; import org.opennaas.extensions.router.model.IPProtocolEndpoint; import org.opennaas.extensions.router.model.LogicalDevice; import org.opennaas.extensions.router.model.LogicalPort; import org.opennaas.extensions.router.model.NetworkPort; import org.opennaas.extensions.router.model.ProtocolEndpoint.ProtocolIFType; import org.opennaas.extensions.router.model.utils.IPUtilsHelper; import org.opennaas.extensions.router.model.wrappers.SetIpAddressRequest; public class IPCapability extends AbstractCapability implements IIPCapability { public static final String CAPABILITY_TYPE = "ip"; public final static String IP = CAPABILITY_TYPE; Log log = LogFactory.getLog(IPCapability.class); private String resourceId = ""; public IPCapability(CapabilityDescriptor descriptor, String resourceId) { super(descriptor); this.resourceId = resourceId; log.debug("Built new IP Capability"); } /* * (non-Javadoc) * * @see org.opennaas.core.resources.capability.AbstractCapability#activate() */ @Override public void activate() throws CapabilityException { registerService(Activator.getContext(), CAPABILITY_TYPE, getResourceType(), getResourceName(), IIPCapability.class.getName()); super.activate(); } /* * (non-Javadoc) * * @see org.opennaas.core.resources.capability.AbstractCapability#deactivate() */ @Override public void deactivate() throws CapabilityException { registration.unregister(); super.deactivate(); } @Override public void setIPv4(SetIpAddressRequest request) throws CapabilityException { setIPv4(request.getLogicalDevice(), request.getIpProtocolEndpoint()); } /* * (non-Javadoc) * * @see org.opennaas.extensions.router.capability.ip.IIPCapability#setIPv4(org.opennaas.extensions.router.model.LogicalPort) */ @Override public void setIPv4(LogicalDevice iface, IPProtocolEndpoint ipProtocolEndpoint) throws CapabilityException { log.info("Start of setIPv4 call"); // copy of iface NetworkPort param = new NetworkPort(); param.setName(iface.getName()); if (iface instanceof NetworkPort) { param.setPortNumber(((NetworkPort) iface).getPortNumber()); param.setLinkTechnology(((NetworkPort) iface).getLinkTechnology()); } // copy of ipProtocolEndpoint IPProtocolEndpoint ipEndpoint = new IPProtocolEndpoint(); ipEndpoint.setIPv4Address(ipProtocolEndpoint.getIPv4Address()); ipEndpoint.setSubnetMask(ipProtocolEndpoint.getSubnetMask()); ipEndpoint.setProtocolIFType(ipProtocolEndpoint.getProtocolIFType()); param.addProtocolEndpoint(ipEndpoint); IAction action = createActionAndCheckParams(IPActionSet.SET_IPv4, param); queueAction(action); log.info("End of setIPv4 call"); } @Override public void setIPv6(SetIpAddressRequest request) throws CapabilityException { setIPv6(request.getLogicalDevice(), request.getIpProtocolEndpoint()); } @Override public void setIPv6(LogicalDevice iface, IPProtocolEndpoint ipProtocolEndpoint) throws CapabilityException { log.info("Start of setIPv6 call"); NetworkPort param = new NetworkPort(); param.setName(iface.getName()); if (iface instanceof NetworkPort) { param.setPortNumber(((NetworkPort) iface).getPortNumber()); param.setLinkTechnology(((NetworkPort) iface).getLinkTechnology()); } IPProtocolEndpoint ipEndpoint = new IPProtocolEndpoint(); ipEndpoint.setIPv6Address(ipProtocolEndpoint.getIPv6Address()); ipEndpoint.setPrefixLength(ipProtocolEndpoint.getPrefixLength()); ipEndpoint.setProtocolIFType(ipProtocolEndpoint.getProtocolIFType()); param.addProtocolEndpoint(ipEndpoint); IAction action = createActionAndCheckParams(IPActionSet.SET_IPv6, param); queueAction(action); log.info("End of setIPv6 call"); } @Override public void setIP(LogicalDevice iface, String ipAddress) throws CapabilityException { log.info("Start of setIP call"); IPProtocolEndpoint ipEndpoint = new IPProtocolEndpoint(); if (IPUtilsHelper.isIPv4ValidAddress(ipAddress)) { ipEndpoint = buildIPv4ProtocolEndpoint(ipAddress); setIPv4(iface, ipEndpoint); } else if (IPUtilsHelper.isIPv6ValidAddress(ipAddress)) { ipEndpoint = buildIPv6ProtocolEndpoint(ipAddress); setIPv6(iface, ipEndpoint); } else throw new CapabilityException("Unvalid Address format."); log.info("End of setIP call"); } @Override public void setIP(SetIpAddressRequest request) throws CapabilityException { setIP(request.getLogicalDevice(), request.getIpProtocolEndpoint()); } @Override public void setIP(LogicalDevice logicalDevice, IPProtocolEndpoint ip) throws CapabilityException { log.info("Start of setIP call"); if ((ip.getIPv4Address() != null) && (ip.getSubnetMask() != null) && !(ip.getIPv4Address().isEmpty()) && !(ip.getSubnetMask().isEmpty())) setIPv4(logicalDevice, ip); else if (ip.getIPv6Address() != null && !ip.getIPv6Address().isEmpty()) setIPv6(logicalDevice, ip); else throw new CapabilityException("IP address not set."); log.info("End of setIP call"); } /* * (non-Javadoc) * * @see org.opennaas.extensions.router.capability.ip.IIPCapability#setInterfaceDescription(org.opennaas.extensions.router.model.LogicalPort) */ @Override public void setInterfaceDescription(LogicalPort iface) throws CapabilityException { log.info("Start of setInterfaceDescription call"); IAction action = createActionAndCheckParams(IPActionSet.SET_INTERFACE_DESCRIPTION, iface); queueAction(action); log.info("End of setInterfaceDescription call"); } /** * * @return QueuemanagerService this capability is associated to. * @throws CapabilityException * if desired queueManagerService could not be retrieved. */ private IQueueManagerCapability getQueueManager(String resourceId) throws CapabilityException { try { return Activator.getQueueManagerService(resourceId); } catch (ActivatorException e) { throw new CapabilityException("Failed to get QueueManagerService for resource " + resourceId, e); } } /* * (non-Javadoc) * * @see org.opennaas.core.resources.capability.AbstractCapability#getActionSet() */ @Override public IActionSet getActionSet() throws CapabilityException { String name = this.descriptor.getPropertyValue(ResourceDescriptorConstants.ACTION_NAME); String version = this.descriptor.getPropertyValue(ResourceDescriptorConstants.ACTION_VERSION); try { return Activator.getIPActionSetService(name, version); } catch (ActivatorException e) { throw new CapabilityException(e); } } /* * (non-Javadoc) * * @see org.opennaas.core.resources.capability.ICapability#getCapabilityName() */ @Override public String getCapabilityName() { return CAPABILITY_TYPE; } /* * (non-Javadoc) * * @see org.opennaas.core.resources.capability.AbstractCapability#queueAction(org.opennaas.core.resources.action.IAction) */ @Override public void queueAction(IAction action) throws CapabilityException { getQueueManager(resourceId).queueAction(action); } private IPProtocolEndpoint buildIPv6ProtocolEndpoint(String ipAddress) { IPProtocolEndpoint ipEndpoint = new IPProtocolEndpoint(); String ipv6 = IPUtilsHelper.getAddressFromIP(ipAddress); String preffixLength = IPUtilsHelper.getPrefixFromIp(ipAddress); ipEndpoint.setIPv6Address(ipv6); ipEndpoint.setPrefixLength(Short.valueOf(preffixLength)); ipEndpoint.setProtocolIFType(ProtocolIFType.IPV6); return ipEndpoint; } private IPProtocolEndpoint buildIPv4ProtocolEndpoint(String ipAddress) { IPProtocolEndpoint ipEndpoint = new IPProtocolEndpoint(); String ipv4 = IPUtilsHelper.getAddressFromIP(ipAddress); String netMask = IPUtilsHelper.getPrefixFromIp(ipAddress); ipEndpoint.setIPv4Address(ipv4); ipEndpoint.setSubnetMask(IPUtilsHelper.parseShortToLongIpv4NetMask(netMask)); ipEndpoint.setProtocolIFType(ProtocolIFType.IPV4); return ipEndpoint; } @Override public void addIPv4(SetIpAddressRequest request) throws CapabilityException { addIPv4(request.getLogicalDevice(), request.getIpProtocolEndpoint()); } @Override public void addIPv6(SetIpAddressRequest request) throws CapabilityException { addIPv6(request.getLogicalDevice(), request.getIpProtocolEndpoint()); } @Override public void addIP(SetIpAddressRequest request) throws CapabilityException { addIP(request.getLogicalDevice(), request.getIpProtocolEndpoint()); } @Override public void removeIPv4(SetIpAddressRequest request) throws CapabilityException { removeIPv4(request.getLogicalDevice(), request.getIpProtocolEndpoint()); } @Override public void removeIPv6(SetIpAddressRequest request) throws CapabilityException { removeIPv6(request.getLogicalDevice(), request.getIpProtocolEndpoint()); } @Override public void removeIP(SetIpAddressRequest request) throws CapabilityException { removeIP(request.getLogicalDevice(), request.getIpProtocolEndpoint()); } @Override public void addIPv4(LogicalDevice iface, IPProtocolEndpoint ipProtocolEndpoint) throws CapabilityException { log.info("Start of addIPv4 call"); NetworkPort param = new NetworkPort(); param.setName(iface.getName()); if (iface instanceof NetworkPort) { param.setPortNumber(((NetworkPort) iface).getPortNumber()); param.setLinkTechnology(((NetworkPort) iface).getLinkTechnology()); } IPProtocolEndpoint ipEndpoint = new IPProtocolEndpoint(); ipEndpoint.setIPv4Address(ipProtocolEndpoint.getIPv4Address()); ipEndpoint.setSubnetMask(ipProtocolEndpoint.getSubnetMask()); param.addProtocolEndpoint(ipEndpoint); IAction action = createActionAndCheckParams(IPActionSet.ADD_IPv4, param); queueAction(action); log.info("End of addIPv4 call"); } @Override public void addIPv6(LogicalDevice iface, IPProtocolEndpoint ipProtocolEndpoint) throws CapabilityException { log.info("Start of addIPv6 call"); NetworkPort param = new NetworkPort(); param.setName(iface.getName()); if (iface instanceof NetworkPort) { param.setPortNumber(((NetworkPort) iface).getPortNumber()); param.setLinkTechnology(((NetworkPort) iface).getLinkTechnology()); } IPProtocolEndpoint ipEndpoint = new IPProtocolEndpoint(); ipEndpoint.setIPv6Address(ipProtocolEndpoint.getIPv6Address()); ipEndpoint.setPrefixLength(ipProtocolEndpoint.getPrefixLength()); param.addProtocolEndpoint(ipEndpoint); IAction action = createActionAndCheckParams(IPActionSet.ADD_IPv6, param); queueAction(action); log.info("End of addIPv6 call"); } @Override public void addIP(LogicalDevice logicalDevice, IPProtocolEndpoint ip) throws CapabilityException { log.info("Start of addIP call"); if ((ip.getIPv4Address() != null) && (ip.getSubnetMask() != null) && !(ip.getIPv4Address().isEmpty()) && !(ip.getSubnetMask().isEmpty())) addIPv4(logicalDevice, ip); else if (ip.getIPv6Address() != null && !ip.getIPv6Address().isEmpty()) addIPv6(logicalDevice, ip); else throw new CapabilityException("IP address not set."); log.info("End of addIP call"); } @Override public void addIP(LogicalDevice iface, String ipAddress) throws CapabilityException { log.info("Start of addIP call"); IPProtocolEndpoint ipEndpoint = new IPProtocolEndpoint(); if (IPUtilsHelper.isIPv4ValidAddress(ipAddress)) { ipEndpoint = buildIPv4ProtocolEndpoint(ipAddress); addIPv4(iface, ipEndpoint); } else if (IPUtilsHelper.isIPv6ValidAddress(ipAddress)) { ipEndpoint = buildIPv6ProtocolEndpoint(ipAddress); addIPv6(iface, ipEndpoint); } else throw new CapabilityException("Unvalid Address format."); log.info("End of addIP call"); } @Override public void removeIPv4(LogicalDevice iface, IPProtocolEndpoint ipProtocolEndpoint) throws CapabilityException { log.info("Start of removeIPv4 call"); NetworkPort param = new NetworkPort(); param.setName(iface.getName()); if (iface instanceof NetworkPort) { param.setPortNumber(((NetworkPort) iface).getPortNumber()); param.setLinkTechnology(((NetworkPort) iface).getLinkTechnology()); } IPProtocolEndpoint ipEndpoint = new IPProtocolEndpoint(); ipEndpoint.setIPv4Address(ipProtocolEndpoint.getIPv4Address()); ipEndpoint.setSubnetMask(ipProtocolEndpoint.getSubnetMask()); ipEndpoint.setProtocolIFType(ProtocolIFType.IPV4); param.addProtocolEndpoint(ipEndpoint); IAction action = createActionAndCheckParams(IPActionSet.REMOVE_IPv4, param); queueAction(action); log.info("End of removeIPv4 call"); } @Override public void removeIPv6(LogicalDevice iface, IPProtocolEndpoint ipProtocolEndpoint) throws CapabilityException { log.info("Start of removeIPv6 call"); NetworkPort param = new NetworkPort(); param.setName(iface.getName()); if (iface instanceof NetworkPort) { param.setPortNumber(((NetworkPort) iface).getPortNumber()); param.setLinkTechnology(((NetworkPort) iface).getLinkTechnology()); } IPProtocolEndpoint ipEndpoint = new IPProtocolEndpoint(); ipEndpoint.setIPv6Address(ipProtocolEndpoint.getIPv6Address()); ipEndpoint.setPrefixLength(ipProtocolEndpoint.getPrefixLength()); ipEndpoint.setProtocolIFType(ProtocolIFType.IPV6); param.addProtocolEndpoint(ipEndpoint); IAction action = createActionAndCheckParams(IPActionSet.REMOVE_IPv6, param); queueAction(action); log.info("End of removeIPv6 call"); } @Override public void removeIP(LogicalDevice logicalDevice, IPProtocolEndpoint ip) throws CapabilityException { log.info("Start of removeIP call"); if ((ip.getIPv4Address() != null) && (ip.getSubnetMask() != null) && !(ip.getIPv4Address().isEmpty()) && !(ip.getSubnetMask().isEmpty())) addIPv4(logicalDevice, ip); else if (ip.getIPv6Address() != null && !ip.getIPv6Address().isEmpty()) addIPv6(logicalDevice, ip); else throw new CapabilityException("IP address not set."); log.info("End of removeIP call"); } @Override public void removeIP(LogicalDevice iface, String ipAddress) throws CapabilityException { log.info("Start of removeIP call"); IPProtocolEndpoint ipEndpoint = new IPProtocolEndpoint(); if (IPUtilsHelper.isIPv4ValidAddress(ipAddress)) { ipEndpoint = buildIPv4ProtocolEndpoint(ipAddress); removeIPv4(iface, ipEndpoint); } else if (IPUtilsHelper.isIPv6ValidAddress(ipAddress)) { ipEndpoint = buildIPv6ProtocolEndpoint(ipAddress); removeIPv6(iface, ipEndpoint); } else throw new CapabilityException("Unvalid Address format."); log.info("End of removeIP call"); } }