package org.opennaas.extensions.ofertie.ncl.provisioner;
import java.util.Collection;
import org.opennaas.extensions.ofertie.ncl.controller.api.INCLController;
import org.opennaas.extensions.ofertie.ncl.provisioner.api.INCLProvisioner;
import org.opennaas.extensions.ofertie.ncl.provisioner.api.exceptions.FlowAllocationException;
import org.opennaas.extensions.ofertie.ncl.provisioner.api.exceptions.FlowAllocationRejectedException;
import org.opennaas.extensions.ofertie.ncl.provisioner.api.exceptions.FlowNotFoundException;
import org.opennaas.extensions.ofertie.ncl.provisioner.api.exceptions.ProvisionerException;
import org.opennaas.extensions.ofertie.ncl.provisioner.api.model.Flow;
import org.opennaas.extensions.ofertie.ncl.provisioner.api.model.FlowRequest;
import org.opennaas.extensions.ofertie.ncl.provisioner.components.INetworkSelector;
import org.opennaas.extensions.ofertie.ncl.provisioner.components.IPathFinder;
import org.opennaas.extensions.ofertie.ncl.provisioner.components.IQoSPDP;
import org.opennaas.extensions.sdnnetwork.model.Route;
/**
*
* @author Isart Canyameres Gimenez (i2cat)
*
*/
public class NCLProvisioner implements INCLProvisioner {
private IQoSPDP qoSPDP;
private INetworkSelector networkSelector;
private IPathFinder pathFinder;
private INCLController nclController;
/**
* @return the qoSPDP
*/
public IQoSPDP getQoSPDP() {
return qoSPDP;
}
/**
* @param qoSPDP
* the qoSPDP to set
*/
public void setQoSPDP(IQoSPDP qoSPDP) {
this.qoSPDP = qoSPDP;
}
/**
* @return the networkSelector
*/
public INetworkSelector getNetworkSelector() {
return networkSelector;
}
/**
* @param networkSelector
* the networkSelector to set
*/
public void setNetworkSelector(INetworkSelector networkSelector) {
this.networkSelector = networkSelector;
}
/**
* @return the pathFinder
*/
public IPathFinder getPathFinder() {
return pathFinder;
}
/**
* @param pathFinder
* the pathFinder to set
*/
public void setPathFinder(IPathFinder pathFinder) {
this.pathFinder = pathFinder;
}
public INCLController getNclController() {
return nclController;
}
public void setNclController(INCLController nclController) {
this.nclController = nclController;
}
// ///////////////////////////
// INCLProvisioner Methods //
// ///////////////////////////
@Override
public String allocateFlow(FlowRequest flowRequest)
throws FlowAllocationException, ProvisionerException {
try {
String userId = "alice";
if (!getQoSPDP().shouldAcceptRequest(userId, flowRequest)) {
throw new FlowAllocationRejectedException("Rejected by policy");
}
String netId = getNetworkSelector().findNetworkForRequest(flowRequest);
Route route = getPathFinder().findPathForRequest(flowRequest, netId);
String flowId = getNclController().allocateFlow(flowRequest, route, netId);
return flowId;
} catch (FlowAllocationException fae) {
throw fae;
} catch (Exception e) {
throw new ProvisionerException(e);
}
}
@Override
public String updateFlow(String flowId, FlowRequest updatedFlowRequest)
throws FlowAllocationException, FlowNotFoundException,
ProvisionerException {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Not implemented");
}
@Override
public void deallocateFlow(String flowId) throws FlowNotFoundException,
ProvisionerException {
try {
String netId = getNetworkSelector().findNetworkForFlowId(flowId);
getNclController().deallocateFlow(flowId, netId);
} catch (Exception e) {
throw new ProvisionerException(e);
}
}
@Override
public Collection<Flow> readAllocatedFlows()
throws ProvisionerException {
return getNclController().getFlows();
}
}