package org.opennaas.extensions.vcpe.capability.ip; import static com.google.common.collect.Iterables.filter; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.opennaas.core.resources.IResource; import org.opennaas.core.resources.ResourceException; 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.protocol.ProtocolException; import org.opennaas.extensions.router.capability.ip.IIPCapability; import org.opennaas.extensions.router.model.IPProtocolEndpoint; import org.opennaas.extensions.router.model.LogicalPort; import org.opennaas.extensions.vcpe.Activator; import org.opennaas.extensions.vcpe.capability.VCPEToRouterModelTranslator; import org.opennaas.extensions.vcpe.capability.builder.builders.helpers.GenericHelper; import org.opennaas.extensions.vcpe.manager.templates.sp.SPTemplateConstants; import org.opennaas.extensions.vcpe.model.Interface; import org.opennaas.extensions.vcpe.model.Router; import org.opennaas.extensions.vcpe.model.VCPENetworkModel; import org.opennaas.extensions.vcpe.model.helper.VCPENetworkModelHelper; public class VCPEIPCapability extends AbstractCapability implements IVCPEIPCapability { public static final String CAPABILITY_TYPE = "vcpenet_ip"; private Log log = LogFactory.getLog(VCPEIPCapability.class); private String resourceId; /** * @param descriptor * @param resourceId */ public VCPEIPCapability(CapabilityDescriptor descriptor, String resourceId) { super(descriptor); this.resourceId = resourceId; } /* * (non-Javadoc) * * @see org.opennaas.core.resources.capability.AbstractCapability#activate() */ @Override public void activate() throws CapabilityException { registerService(Activator.getContext(), CAPABILITY_TYPE, getResourceType(), getResourceName(), IVCPEIPCapability.class.getName()); setState(State.ACTIVE); } /* * (non-Javadoc) * * @see org.opennaas.core.resources.capability.AbstractCapability#deactivate() */ @Override public void deactivate() throws CapabilityException { setState(State.INACTIVE); registration.unregister(); super.deactivate(); } /* * (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 { throw new UnsupportedOperationException(); } /* * (non-Javadoc) * * @see org.opennaas.core.resources.capability.AbstractCapability#getActionSet() */ @Override public IActionSet getActionSet() throws CapabilityException { throw new UnsupportedOperationException(); } /* * (non-Javadoc) * * @see org.opennaas.extensions.vcpe.capability.ip.IVCPEIPCapability#updateIps(org.opennaas.extensions.vcpe.model.VCPENetworkModel) */ @Override public void updateIps(VCPENetworkModel updatedModel) throws CapabilityException { log.info("Update the Ip's"); if (!((VCPENetworkModel) resource.getModel()).isCreated()) throw new CapabilityException("VCPE has not been created"); VCPENetworkModel currentModel = (VCPENetworkModel) resource.getModel(); // launch commands try { for (Router router : filter(updatedModel.getElements(), Router.class)) { if (router.getTemplateName().equals(SPTemplateConstants.VCPE1_ROUTER) || router.getTemplateName().equals(SPTemplateConstants.VCPE2_ROUTER)) { for (Interface iface : router.getInterfaces()) { Interface outDatedIface = (Interface) VCPENetworkModelHelper.getElementByTemplateName(currentModel, iface.getTemplateName()); if (!outDatedIface.getIpAddress().equals(iface.getIpAddress())) { setIP(router, outDatedIface, iface.getIpAddress(), currentModel); } } } } } catch (ResourceException e) { throw new CapabilityException(e); } // execute queues try { executeLogicalRouters(currentModel); executePhysicalRouters(currentModel); } catch (Exception e) { throw new CapabilityException(e); } // update IP addresses in model for (Router router : filter(updatedModel.getElements(), Router.class)) { for (Interface iface : router.getInterfaces()) { if (router.getTemplateName().equals(SPTemplateConstants.VCPE1_ROUTER) || router.getTemplateName().equals(SPTemplateConstants.VCPE2_ROUTER)) { Interface outDatedIface = (Interface) VCPENetworkModelHelper.getElementByTemplateName(currentModel, iface.getTemplateName()); if (!outDatedIface.getIpAddress().equals(iface.getIpAddress())) { outDatedIface.setIpAddress(iface.getIpAddress()); } } } } } /** * @param model * @throws ResourceException * @throws ProtocolException */ private void executePhysicalRouters(VCPENetworkModel model) throws ResourceException, ProtocolException { Router phy1 = (Router) VCPENetworkModelHelper.getElementByTemplateName(model, SPTemplateConstants.CPE1_PHY_ROUTER); Router phy2 = (Router) VCPENetworkModelHelper.getElementByTemplateName(model, SPTemplateConstants.CPE2_PHY_ROUTER); IResource phyResource1 = GenericHelper.getResourceManager().getResource( GenericHelper.getResourceManager().getIdentifierFromResourceName("router", phy1.getName())); IResource phyResource2 = GenericHelper.getResourceManager().getResource( GenericHelper.getResourceManager().getIdentifierFromResourceName("router", phy2.getName())); GenericHelper.executeQueue(phyResource1); GenericHelper.executeQueue(phyResource2); } /** * @param model * @throws ResourceException * @throws ProtocolException */ private void executeLogicalRouters(VCPENetworkModel model) throws ResourceException, ProtocolException { Router lr1 = (Router) VCPENetworkModelHelper.getElementByTemplateName(model, SPTemplateConstants.VCPE1_ROUTER); Router lr2 = (Router) VCPENetworkModelHelper.getElementByTemplateName(model, SPTemplateConstants.VCPE2_ROUTER); IResource lrResource1 = GenericHelper.getResourceManager().getResource( GenericHelper.getResourceManager().getIdentifierFromResourceName("router", lr1.getName())); IResource lrResource2 = GenericHelper.getResourceManager().getResource( GenericHelper.getResourceManager().getIdentifierFromResourceName("router", lr2.getName())); GenericHelper.executeQueue(lrResource1); GenericHelper.executeQueue(lrResource2); } /** * @param router * @param iface * @param ipAddress * @param model * @throws ResourceException */ private void setIP(Router router, Interface iface, String ipAddress, VCPENetworkModel model) throws ResourceException { IResource routerResource = GenericHelper.getResourceManager().getResource( GenericHelper.getResourceManager().getIdentifierFromResourceName("router", router.getName())); IIPCapability capability = (IIPCapability) routerResource.getCapabilityByInterface(IIPCapability.class); LogicalPort port = VCPEToRouterModelTranslator.vCPEInterfaceToLogicalPort(iface, model); IPProtocolEndpoint ipPEP = VCPEToRouterModelTranslator.ipAddressToProtocolEndpoint(ipAddress); capability.setIPv4(port, ipPEP); } }