package org.opennaas.extensions.ofertie.ncl.controller;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.opennaas.core.resources.ActivatorException;
import org.opennaas.core.resources.IResource;
import org.opennaas.core.resources.IResourceManager;
import org.opennaas.core.resources.ResourceException;
import org.opennaas.extensions.ofertie.ncl.Activator;
import org.opennaas.extensions.ofertie.ncl.controller.api.INCLController;
import org.opennaas.extensions.ofertie.ncl.helpers.FlowRequestParser;
import org.opennaas.extensions.ofertie.ncl.provisioner.api.exceptions.FlowAllocationException;
import org.opennaas.extensions.ofertie.ncl.provisioner.api.model.Flow;
import org.opennaas.extensions.ofertie.ncl.provisioner.api.model.FlowRequest;
import org.opennaas.extensions.sdnnetwork.capability.ofprovision.IOFProvisioningNetworkCapability;
import org.opennaas.extensions.sdnnetwork.model.Route;
import org.opennaas.extensions.sdnnetwork.model.SDNNetworkOFFlow;
/**
*
* @author Isart Canyameres Gimenez (i2cat)
* @author Adrian Rosello Rey (i2CAT)
*
*/
public class NCLController implements INCLController {
public static final String DEFAULT_FLOW_PRIORITY = "32000";
private Map<String, Flow> allocatedFlows;
public NCLController() {
allocatedFlows = new HashMap<String, Flow>();
}
@Override
public String allocateFlow(FlowRequest flowRequest, Route route,
String networkId) throws FlowAllocationException {
try {
SDNNetworkOFFlow flowWithRoute = FlowRequestParser.parseFlowRequestIntoSDNFlow(flowRequest, route);
flowWithRoute.setActive(true);
flowWithRoute.setPriority(DEFAULT_FLOW_PRIORITY);
// FIXME requesting a flow that won't filter by IP, by now
flowWithRoute.getMatch().setSrcIp(null);
flowWithRoute.getMatch().setDstIp(null);
// FIXME requesting a flow that won't filter by ToS, by now
flowWithRoute.getMatch().setTosBits(null);
IResource networkResource = getResource(networkId);
IOFProvisioningNetworkCapability provisionCapab = (IOFProvisioningNetworkCapability) networkResource
.getCapabilityByInterface(IOFProvisioningNetworkCapability.class);
String flowId = provisionCapab.allocateOFFlow(flowWithRoute);
Flow flow = new Flow();
flow.setFlowRequest(flowRequest);
flow.setId(flowId);
allocatedFlows.put(flowId, flow);
return flowId;
} catch (ActivatorException e) {
throw new FlowAllocationException(e);
} catch (ResourceException e) {
throw new FlowAllocationException(e);
}
}
@Override
public String deallocateFlow(String flowId, String networkId) throws FlowAllocationException {
try {
IResource networkResource = getResource(networkId);
IOFProvisioningNetworkCapability provisionCapab = (IOFProvisioningNetworkCapability) networkResource
.getCapabilityByInterface(IOFProvisioningNetworkCapability.class);
provisionCapab.deallocateOFFlow(flowId);
allocatedFlows.remove(flowId);
return flowId;
} catch (ActivatorException e) {
throw new FlowAllocationException(e);
} catch (ResourceException e) {
throw new FlowAllocationException(e);
}
}
@Override
public Collection<Flow> getFlows() {
return allocatedFlows.values();
}
private IResource getResource(String networkId) throws ActivatorException, ResourceException {
IResourceManager resourceManager = Activator.getResourceManagerService();
IResource resource = resourceManager.getResourceById(networkId);
return resource;
}
}