package org.opennaas.extensions.vrf.selector.capability;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ws.rs.core.Response;
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.IResourceManager;
import org.opennaas.core.resources.ResourceException;
import org.opennaas.extensions.sdnnetwork.capability.ofprovision.IOFProvisioningNetworkCapability;
import org.opennaas.extensions.vrf.dijkstraroute.capability.DijkstraRoutingCapability;
import org.opennaas.extensions.vrf.staticroute.capability.IStaticRoutingCapability;
/**
*
* @author Josep Batallé (josep.batalle@i2cat.net)
*
*/
public class RoutingCapability implements IRoutingCapability {
Log log = LogFactory.getLog(RoutingCapability.class);
private final IStaticRoutingCapability service;
private String mode = "static";
private Boolean proactive = true;
public RoutingCapability(List<IStaticRoutingCapability> listStaticRoutingCapability) {
super();
// this.service = staticRoutingCapability;
// log.error("List: "+listStaticRoutingCapability.size());
this.service = listStaticRoutingCapability.get(0);
}
public String getMode() {
return mode;
}
public void setMode(String mode) {
this.mode = mode;
}
public Boolean isProactive() {
return proactive;
}
public void setProactive(Boolean proactive) {
this.proactive = proactive;
}
@Override
public Response getRoute(String ipSource, String ipDest, String switchDPID, int inputPort) {
log.error("SELECTOR: GET ROUTE");
log.error(ipSource + " " + ipDest + " " + switchDPID + " " + inputPort);
Response response = null;
if (mode.equals("static")) {
response = service.getRoute(ipSource, ipDest, switchDPID, inputPort, proactive);
} else if (mode.equals("dijkstra")) {
DijkstraRoutingCapability dynamicRoute = new DijkstraRoutingCapability();
response = dynamicRoute.getDynamicRoute(ipSource, ipDest, switchDPID, inputPort);
}
return response;
}
@Override
public Response setSelectorMode(String mode) {
if (mode.equals("static")) {
this.mode = "static";
} else if (mode.equals("dijkstra")) {
this.mode = "dijkstra";
} else {
return Response.serverError().entity("Incorrect mode. Possible modes: static, dijkstra. Remain active mode: " + mode).build();
}
return Response.ok().build();
}
@Override
public Response getSelectorMode() {
return Response.ok(mode).build();
}
@Override
public Response switchMapping() {
IResourceManager resourceManager;
try {
resourceManager = org.opennaas.extensions.sdnnetwork.Activator.getResourceManagerService();
try {
log.info("ResourceManager " + resourceManager.getIdentifierFromResourceName("sdnnetwork", "sdn1").getId());
} catch (ResourceException ex) {
Logger.getLogger(RoutingCapability.class.getName()).log(Level.SEVERE, null, ex);
}
IResource sdnNetResource = resourceManager.listResourcesByType("sdnnetwork").get(0);
try {
IOFProvisioningNetworkCapability sdnCapab = (IOFProvisioningNetworkCapability) sdnNetResource.getCapabilityByInterface(IOFProvisioningNetworkCapability.class);
/* String resourceSdnNetworkId = sdnCapab.getMapDeviceResource(resourceName);
if (resourceSdnNetworkId == null) {
log.error("This Switch ID is not mapped to any ofswitch resource.");
return null;
}
*/
List<IResource> listResources = resourceManager.listResourcesByType("openflowswitch");
for (IResource r : listResources) {
String name = r.getResourceDescriptor().getInformation().getName();
//PSNC
String DPID;
if(name.equals("s1")){
DPID = "00:00:64:87:88:58:f6:57";
}else if(name.equals("s2")){
DPID = "00:00:64:87:88:58:f8:57";
}else{
DPID = "00:00:00:00:00:00:00:0" + name.substring(name.length() - 1);
}
log.error(DPID);
String resourceId = r.getResourceIdentifier().getId();
log.error(resourceId);
sdnCapab.mapDeviceResource(DPID, resourceId);
/* if (r.getResourceDescriptor().getId().equals(resourceSdnNetworkId)) {
resourceName = r.getResourceDescriptor().getInformation().getName();
log.debug("Switch name is: " + resourceName);
}
*/ }
} catch (ResourceException ex) {
Logger.getLogger(RoutingCapability.class.getName()).log(Level.SEVERE, null, ex);
}
} catch (ActivatorException ex) {
Logger.getLogger(RoutingCapability.class.getName()).log(Level.SEVERE, null, ex);
}
return Response.ok().build();
}
}