package org.opennaas.extensions.vcpe.capability.vrrp; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.opennaas.core.resources.IResource; 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.extensions.router.capability.vrrp.IVRRPCapability; import org.opennaas.extensions.router.model.ComputerSystem; import org.opennaas.extensions.router.model.IPProtocolEndpoint; import org.opennaas.extensions.router.model.NetworkPort; import org.opennaas.extensions.router.model.ProtocolEndpoint; import org.opennaas.extensions.router.model.Service; import org.opennaas.extensions.router.model.VRRPGroup; import org.opennaas.extensions.router.model.VRRPProtocolEndpoint; import org.opennaas.extensions.vcpe.Activator; 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.Router; import org.opennaas.extensions.vcpe.model.VCPENetworkModel; import org.opennaas.extensions.vcpe.model.helper.VCPENetworkModelHelper; public class VCPEVRRPCapability extends AbstractCapability implements IVCPEVRRPCapability { public static final String CAPABILITY_TYPE = "vcpenet_vrrp"; private Log log = LogFactory.getLog(VCPEVRRPCapability.class); private String resourceId; /** * @param descriptor * @param resourceId */ public VCPEVRRPCapability(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(), IVCPEVRRPCapability.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.vrrp.IVCPEVRRPCapability#updateVRRPIp(org.opennaas.extensions.vcpe.model.VCPENetworkModel) */ @Override public void updateVRRPIp(VCPENetworkModel vcpeModel) throws CapabilityException { log.info("Updating VRRP ip"); try { Router lr1 = (Router) VCPENetworkModelHelper.getElementByTemplateName(vcpeModel, SPTemplateConstants.VCPE1_ROUTER); Router lr2 = (Router) VCPENetworkModelHelper.getElementByTemplateName(vcpeModel, SPTemplateConstants.VCPE2_ROUTER); IResource router1 = GenericHelper.getResourceManager().getResource( GenericHelper.getResourceManager().getIdentifierFromResourceName("router", lr1.getName())); IResource router2 = GenericHelper.getResourceManager().getResource( GenericHelper.getResourceManager().getIdentifierFromResourceName("router", lr2.getName())); IVRRPCapability capability1 = (IVRRPCapability) router1.getCapabilityByInterface(IVRRPCapability.class); IVRRPCapability capability2 = (IVRRPCapability) router2.getCapabilityByInterface(IVRRPCapability.class); VRRPProtocolEndpoint endpointRouter1 = getVRRPProtocolEndpointDeepCopy((ComputerSystem) router1.getModel()); ((VRRPGroup) endpointRouter1.getService()).setVirtualIPAddress(vcpeModel.getVrrp().getVirtualIPAddress()); VRRPProtocolEndpoint endpointRouter2 = getVRRPProtocolEndpointDeepCopy((ComputerSystem) router2.getModel()); ((VRRPGroup) endpointRouter2.getService()).setVirtualIPAddress(vcpeModel.getVrrp().getVirtualIPAddress()); capability1.updateVRRPVirtualIPAddress(endpointRouter1); capability2.updateVRRPVirtualIPAddress(endpointRouter2); GenericHelper.executeQueue(router1); GenericHelper.executeQueue(router2); // Update the IP address in the model IResource vcpeResource = GenericHelper.getResourceManager().getResourceById(resourceId); VCPENetworkModel vcpeNetworkModel = (VCPENetworkModel) vcpeResource.getModel(); if (vcpeNetworkModel != null) { if (vcpeNetworkModel.getVrrp() != null) { vcpeNetworkModel.getVrrp().setVirtualIPAddress(vcpeModel.getVrrp().getVirtualIPAddress()); } } } catch (Exception e) { throw new CapabilityException(e); } } /* * (non-Javadoc) * * @see org.opennaas.extensions.vcpe.capability.vrrp.IVCPEVRRPCapability#changeVRRPPriority(org.opennaas.extensions.vcpe.model.VCPENetworkModel ) */ @Override public VCPENetworkModel changeVRRPPriority(VCPENetworkModel model) throws CapabilityException { log.debug("Change the priority VRRP"); try { Router lr1 = (Router) VCPENetworkModelHelper.getElementByTemplateName(model, SPTemplateConstants.VCPE1_ROUTER); Router lr2 = (Router) VCPENetworkModelHelper.getElementByTemplateName(model, SPTemplateConstants.VCPE2_ROUTER); IResource router1 = GenericHelper.getResourceManager().getResource( GenericHelper.getResourceManager().getIdentifierFromResourceName("router", lr1.getName())); IResource router2 = GenericHelper.getResourceManager().getResource( GenericHelper.getResourceManager().getIdentifierFromResourceName("router", lr2.getName())); // get VRRPProtocolEndpoint deep copies VRRPProtocolEndpoint vrrpProtocolEndpoint1 = getVRRPProtocolEndpointDeepCopy((ComputerSystem) router1.getModel()); VRRPProtocolEndpoint vrrpProtocolEndpoint2 = getVRRPProtocolEndpointDeepCopy((ComputerSystem) router2.getModel()); // swap priorities int priority1 = vrrpProtocolEndpoint1.getPriority(); int priority2 = vrrpProtocolEndpoint2.getPriority(); vrrpProtocolEndpoint1.setPriority(priority2); vrrpProtocolEndpoint2.setPriority(priority1); // call capabilities IVRRPCapability capability1 = (IVRRPCapability) router1.getCapabilityByInterface(IVRRPCapability.class); capability1.updateVRRPPriority(vrrpProtocolEndpoint1); IVRRPCapability capability2 = (IVRRPCapability) router2.getCapabilityByInterface(IVRRPCapability.class); capability2.updateVRRPPriority(vrrpProtocolEndpoint2); // execute queues GenericHelper.executeQueue(router1); GenericHelper.executeQueue(router2); // Update the priority in the model and return the model IResource vcpeResource = GenericHelper.getResourceManager().getResourceById(resourceId); VCPENetworkModel vcpeNetworkModel = (VCPENetworkModel) vcpeResource.getModel(); if (vcpeNetworkModel != null) { vcpeNetworkModel.getVrrp().setPriorityMaster(vrrpProtocolEndpoint1.getPriority()); vcpeNetworkModel.getVrrp().setPriorityBackup(vrrpProtocolEndpoint2.getPriority()); } return (VCPENetworkModel) (vcpeResource != null ? vcpeResource.getModel() : null); } catch (Exception e) { throw new CapabilityException(e); } } /** * Get a deep copy of VRRPProtocolEndpoint with all necessary elements * * @param originalRouter * original ComputerSystem where the VRRProtocolEndpoint is * @return * @throws Exception */ private VRRPProtocolEndpoint getVRRPProtocolEndpointDeepCopy(ComputerSystem originalRouter) throws Exception { VRRPGroup vrrpGroup = null; // ComputerSystem copy ComputerSystem newRouter = new ComputerSystem(); VRRPGroup newVRRPGroup = null; List<Service> services = originalRouter.getHostedService(); for (Service service : services) { if (service instanceof VRRPGroup) { vrrpGroup = (VRRPGroup) service; // VRRPGroup copy newVRRPGroup = new VRRPGroup(); // copy attributes (name & virtual IP address) newVRRPGroup.setVrrpName(vrrpGroup.getVrrpName()); newVRRPGroup.setVirtualIPAddress(vrrpGroup.getVirtualIPAddress()); // add Service to ComputerSystem newRouter.addHostedService(newVRRPGroup); break; } } VRRPProtocolEndpoint vrrpProtocolEndpoint = null; VRRPProtocolEndpoint newVRRPProtocolEndpoint = null; if (vrrpGroup != null) { List<ProtocolEndpoint> protocolEndpoints = vrrpGroup.getProtocolEndpoint(); for (ProtocolEndpoint protocolEndpoint : protocolEndpoints) { if (((VRRPGroup) ((VRRPProtocolEndpoint) protocolEndpoint).getService()).getVrrpName() == vrrpGroup.getVrrpName()) { vrrpProtocolEndpoint = (VRRPProtocolEndpoint) protocolEndpoint; // VRRPProtocolEndpoint copy newVRRPProtocolEndpoint = new VRRPProtocolEndpoint(); // copy attributes (priority) newVRRPProtocolEndpoint.setPriority(vrrpProtocolEndpoint.getPriority()); // set VRRPGroup as Service of VRRPProtocolEndpoint newVRRPProtocolEndpoint.setService(newVRRPGroup); // IPProtocolEndpoint copy IPProtocolEndpoint ipProtocolEndpoint = (IPProtocolEndpoint) vrrpProtocolEndpoint.getBindedProtocolEndpoints().get(0); IPProtocolEndpoint newIPProtocolEndpoint = new IPProtocolEndpoint(); // set attributes (IPv4 address & subnet mask) newIPProtocolEndpoint.setIPv4Address(ipProtocolEndpoint.getIPv4Address()); newIPProtocolEndpoint.setSubnetMask(ipProtocolEndpoint.getSubnetMask()); // bind ServiceAccesPoint (IPProtocolEndpoint) to VRRPProtocolEndpoint newVRRPProtocolEndpoint.bindServiceAccessPoint(newIPProtocolEndpoint); // NetworkPort copy NetworkPort networkPort = (NetworkPort) ipProtocolEndpoint.getLogicalPorts().get(0); NetworkPort newNetworkPort = new NetworkPort(); // set attributes (name & port) newNetworkPort.setName(networkPort.getName()); newNetworkPort.setPortNumber(networkPort.getPortNumber()); // add ProtocolEndpoint (IPProtocolEndpoint) to NetworkPort newNetworkPort.addProtocolEndpoint(newIPProtocolEndpoint); // add LogicalDevice (NetworkPort) to ComputerSystem newRouter.addLogicalDevice(newNetworkPort); } } if (vrrpProtocolEndpoint == null) { throw new Exception("VRRPProtocolEndpoint not found"); } } else { throw new Exception("VRRPGroup not found"); } return newVRRPProtocolEndpoint; } }