package org.opennaas.extensions.network.capability.ospf;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.opennaas.core.resources.ActivatorException;
import org.opennaas.core.resources.IResource;
import org.opennaas.core.resources.IResourceIdentifier;
import org.opennaas.core.resources.IResourceManager;
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.capability.ICapability;
import org.opennaas.core.resources.command.Response;
import org.opennaas.core.resources.descriptor.CapabilityDescriptor;
import org.opennaas.extensions.network.model.NetworkModel;
import org.opennaas.extensions.network.model.NetworkModelHelper;
import org.opennaas.extensions.network.model.topology.Device;
import org.opennaas.extensions.network.model.topology.NetworkElement;
import org.opennaas.extensions.router.capability.ospf.OSPFCapability;
import org.opennaas.extensions.router.model.GREService;
import org.opennaas.extensions.router.model.LogicalPort;
import org.opennaas.extensions.router.model.NetworkPort;
import org.opennaas.extensions.router.model.OSPFArea;
import org.opennaas.extensions.router.model.OSPFArea.AreaType;
import org.opennaas.extensions.router.model.OSPFAreaConfiguration;
import org.opennaas.extensions.router.model.OSPFService;
import org.opennaas.extensions.router.model.ProtocolEndpoint;
import org.opennaas.extensions.router.model.System;
import org.opennaas.extensions.router.model.utils.ModelHelper;
public class NetOSPFCapability extends AbstractCapability implements INetOSPFCapability {
public static String CAPABILITY_TYPE = "netospf";
Log log = LogFactory.getLog(NetOSPFCapability.class);
private String resourceId = "";
/**
* NetOSPFCapability constructor
*
* @param descriptor
* @param resourceId
*/
public NetOSPFCapability(CapabilityDescriptor descriptor, String resourceId) {
super(descriptor);
this.resourceId = resourceId;
log.debug("Built new netospf capability");
}
/*
* (non-Javadoc)
*
* @see org.opennaas.core.resources.capability.AbstractCapability#activate()
*/
@Override
public void activate() throws CapabilityException {
registerService(Activator.getContext(), CAPABILITY_TYPE, getResourceType(), getResourceName(), INetOSPFCapability.class.getName());
super.activate();
}
/*
* (non-Javadoc)
*
* @see org.opennaas.core.resources.capability.AbstractCapability#deactivate()
*/
@Override
public void deactivate() throws CapabilityException {
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.network.capability.ospf.INetOSPFCapability#deactivateOSPF()
*/
@Override
public void deactivateOSPF() throws CapabilityException {
log.info("Start of deactivateOSPF call");
Response response = new Response();
response.setCommandName(CAPABILITY_TYPE + " deactivateOSPF");
try {
for (IResource router : getRouterResources()) {
// get router ospf capability
OSPFCapability ospfCapability = (OSPFCapability) getCapability(router.getCapabilities(), "ospf");
OSPFService ospfService = new OSPFService();
ospfCapability.clearOSPFconfiguration(ospfService);
}
} catch (ActivatorException e) {
throw new CapabilityException(e);
}
log.info("End of deactivateOSPF call");
}
/*
* (non-Javadoc)
*
* @see org.opennaas.extensions.network.capability.ospf.INetOSPFCapability#activateOSPF()
*/
@Override
public void activateOSPF() throws CapabilityException {
log.info("Start of activateOSPF call ");
long backboneAreaId = 0l; // 0.0.0.0
Response response = new Response();
response.setCommandName(CAPABILITY_TYPE + " activateOSPF");
try {
for (IResource router : getRouterResources()) {
// get router ospf capability
OSPFCapability ospfCapability = (OSPFCapability) getCapability(router.getCapabilities(), "ospf");
// configure OSPF
OSPFService serviceConfig = new OSPFService();
ospfCapability.configureOSPF(serviceConfig);
// configure backbone area
OSPFAreaConfiguration areaConfig = new OSPFAreaConfiguration();
OSPFArea ospfArea = new OSPFArea();
ospfArea.setAreaID(backboneAreaId);
ospfArea.setAreaType(AreaType.PLAIN);
areaConfig.setOSPFArea(ospfArea);
ospfCapability.configureOSPFArea(areaConfig);
// addInterfaces to backbone area
List<LogicalPort> interfaces = (List<LogicalPort>) getAllInterfaces(router);
ospfCapability.addInterfacesInOSPFArea(interfaces, ospfArea);
// activate OSPF
ospfCapability.activateOSPF();
}
} catch (ActivatorException e) {
throw new CapabilityException(e);
}
log.info("End of activateOSPF call ");
}
/**
* @param capabilities
* @param type
* @return
* @throws CapabilityException
*/
private ICapability getCapability(List<? extends ICapability> capabilities, String type) throws CapabilityException {
for (ICapability capability : capabilities) {
if (capability.getCapabilityInformation().getType().equals(type)) {
return capability;
}
}
throw new CapabilityException("Error getting capability " + type);
}
/**
* @return
* @throws ActivatorException
*/
private List<IResource> getRouterResources() throws ActivatorException {
NetworkModel netModel = (NetworkModel) this.resource.getModel();
List<IResource> routerResources = new ArrayList<IResource>();
for (Device dev : NetworkModelHelper.getDevices(netModel)) {
try {
IResource resource = getResourceFromNetworkElement(dev);
if (resource.getResourceIdentifier().getType().equals("router")) {
routerResources.add(resource);
}
} catch (ResourceException e) {
// ignore when resource is not found.
// only resources in the resource manager will be returned
}
}
return routerResources;
}
/**
* Get the resource from resourceManager.<br/>
* To get the resource the name must have the pattern resourceType:resourceName
*
* @param networkElementName
* the notworkElement name with pattern resourceType:resourceName
* @return IResource
* @throws ResourceException
* @throws ActivatorException
*/
private IResource getResourceFromNetworkElement(NetworkElement networkElement) throws ResourceException, ActivatorException {
IResource iResource = null;
String[] aResourceName = getResourceTypeAndName(networkElement.getName());
if (aResourceName.length > 1) {
IResourceManager resourceManager = Activator.getResourceManagerService();
IResourceIdentifier iResourceIdentifier = resourceManager
.getIdentifierFromResourceName(aResourceName[0], aResourceName[1]);
iResource = resourceManager.getResource(iResourceIdentifier);
}
return iResource;
}
/**
* Get the resource type and the resource name in a string array from pattern resourceType:resourceName
*
* @param name
* with pattern resourceType:resourceName
* @return string array
*/
private String[] getResourceTypeAndName(String name) {
return name.split(":");
}
/**
* @param router
* @return
*/
private List<? extends LogicalPort> getAllInterfaces(IResource router) {
List<LogicalPort> interfaces = new ArrayList<LogicalPort>();
interfaces.addAll(ModelHelper.getInterfaces((System) router.getModel()));
interfaces.addAll(getAllGREInterfaces(router));
return interfaces;
}
/**
* @param router
* @return
*/
private List<NetworkPort> getAllGREInterfaces(IResource router) {
// TODO Auto-generated method stub
List<NetworkPort> endpointList = new ArrayList<NetworkPort>();
List<GREService> greServiceList = ((System) router.getModel()).getAllHostedServicesByType(new GREService());
if (!greServiceList.isEmpty()) {
GREService greService = greServiceList.get(0);
for (ProtocolEndpoint pE : greService.getProtocolEndpoint()) {
NetworkPort lp = new NetworkPort();
String name = pE.getName().split("\\.")[0];
String portNumber = pE.getName().split("\\.")[1];
lp.setName(name);
lp.setPortNumber(Integer.valueOf(portNumber));
endpointList.add(lp);
}
}
return endpointList;
}
}