blob: 2fc78f0922ae711ca879cff90e908705a8d11eb2 [file] [log] [blame]
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package net.onrc.onos.datagrid.web;
import java.io.IOException;
import java.util.Collection;
import java.util.Iterator;
import net.onrc.onos.datagrid.IDatagridService;
import net.onrc.onos.intent.ConstrainedShortestPathIntent;
import net.onrc.onos.intent.ShortestPathIntent;
import net.onrc.onos.intent.IntentOperation;
import net.onrc.onos.intent.IntentMap;
import net.onrc.onos.intent.Intent;
import net.onrc.onos.intent.runtime.IPathCalcRuntimeService;
import net.onrc.onos.intent.IntentOperationList;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.JsonMappingException;
import org.restlet.resource.Post;
import org.restlet.resource.ServerResource;
import org.codehaus.jackson.map.ObjectMapper;
import net.floodlightcontroller.util.MACAddress;
import java.util.HashMap;
import java.util.Map;
import org.codehaus.jackson.node.ArrayNode;
import org.codehaus.jackson.node.ObjectNode;
import org.restlet.resource.Get;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author nickkaranatsios
*/
public class IntentResource extends ServerResource {
private final static Logger log = LoggerFactory.getLogger(IntentResource.class);
// TODO need to assign proper application id.
private final String APPLN_ID = "1";
private class IntentStatus {
String intentId;
String status;
public IntentStatus() {}
public IntentStatus(String intentId, String status) {
this.intentId = intentId;
this.status = status;
}
public String getIntentId() {
return intentId;
}
public void setIntentId(String intentId) {
this.intentId = intentId;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}
@Post("json")
public String store(String jsonIntent) throws IOException {
IDatagridService datagridService = (IDatagridService) getContext()
.getAttributes().get(IDatagridService.class.getCanonicalName());
if (datagridService == null) {
log.debug("FlowIntentResource ONOS Datagrid Service not found");
return "";
}
IPathCalcRuntimeService pathRuntime = (IPathCalcRuntimeService)getContext()
.getAttributes().get(IPathCalcRuntimeService.class.getCanonicalName());
if (pathRuntime == null) {
log.warn("Failed to get path calc runtime");
return "";
}
String reply = "";
ObjectMapper mapper = new ObjectMapper();
JsonNode jNode = null;
try {
jNode = mapper.readValue(jsonIntent, JsonNode.class);
} catch (JsonGenerationException ex) {
log.error("JsonGeneration exception ", ex);
} catch (JsonMappingException ex) {
log.error("JsonMappingException occurred", ex);
} catch (IOException ex) {
log.error("IOException occurred", ex);
}
if (jNode != null) {
reply = parseJsonNode(jNode.getElements(), pathRuntime);
}
return reply;
}
@Get("json")
public String retrieve() throws IOException {
IPathCalcRuntimeService pathRuntime = (IPathCalcRuntimeService)getContext().
getAttributes().get(IPathCalcRuntimeService.class.getCanonicalName());
ObjectMapper mapper = new ObjectMapper();
String restStr = "";
String intentId = (String) getRequestAttributes().get("intent_id");
ArrayNode arrayNode = mapper.createArrayNode();
IntentMap intentMap = pathRuntime.getHighLevelIntents();
Collection<Intent> intents = intentMap.getAllIntents();
if (!intents.isEmpty()) {
if ((intentId != null )) {
String applnIntentId = APPLN_ID + ":" + intentId;
Intent intent = intentMap.getIntent(applnIntentId);
if (intent != null) {
ObjectNode node = mapper.createObjectNode();
node.put("intent_id", intentId);
node.put("status", intent.getState().toString());
arrayNode.add(node);
}
} else {
for (Intent intent : intents) {
ObjectNode node = mapper.createObjectNode();
String applnIntentId = intent.getId();
intentId = applnIntentId.split(":")[1];
node.put("intent_id", intentId);
node.put("status", intent.getState().toString());
arrayNode.add(node);
}
}
restStr = mapper.writeValueAsString(arrayNode);
}
return restStr;
}
private String parseJsonNode(Iterator<JsonNode> nodes,
IPathCalcRuntimeService pathRuntime) throws IOException {
IntentOperationList operations = new IntentOperationList();
ObjectMapper mapper = new ObjectMapper();
ArrayNode arrayNode = mapper.createArrayNode();
while (nodes.hasNext()) {
JsonNode node = nodes.next();
if (node.isObject()) {
JsonNode data;
Iterator<String> fieldNames = node.getFieldNames();
Map<String, Object> fields = new HashMap<>();
while (fieldNames.hasNext()) {
String fieldName = fieldNames.next();
data = node.get(fieldName);
parseFields(data, fieldName, fields);
}
String status = processIntent(fields, operations);
appendIntentStatus(status, (String)fields.get("intent_id"), mapper, arrayNode);
}
}
pathRuntime.executeIntentOperations(operations);
return mapper.writeValueAsString(arrayNode);
}
private void appendIntentStatus(String status, final String intentId,
ObjectMapper mapper, ArrayNode arrayNode) throws IOException {
ObjectNode node = mapper.createObjectNode();
node.put("intent_id", intentId);
node.put("status", status);
arrayNode.add(node);
}
private String processIntent(Map<String, Object> fields, IntentOperationList operations) {
String intentType = (String)fields.get("intent_type");
String intentOp = (String)fields.get("intent_op");
String status = null;
String applnIntentId = APPLN_ID + ":" + (String)fields.get("intent_id");
IntentOperation.Operator operation = IntentOperation.Operator.ADD;
if ((intentOp.equals("remove"))) {
operation = IntentOperation.Operator.REMOVE;
}
if (intentType.equals("shortest_intent_type")) {
ShortestPathIntent spi = new ShortestPathIntent(applnIntentId,
Long.decode((String) fields.get("srcSwitch")),
(long) fields.get("srcPort"),
MACAddress.valueOf((String) fields.get("srcMac")).toLong(),
Long.decode((String) fields.get("dstSwitch")),
(long) fields.get("dstPort"),
MACAddress.valueOf((String) fields.get("dstMac")).toLong());
operations.add(new IntentOperation(operation, spi));
status = (spi.getState()).toString();
} else {
ConstrainedShortestPathIntent cspi = new ConstrainedShortestPathIntent(applnIntentId,
Long.decode((String) fields.get("srcSwitch")),
(long) fields.get("srcPort"),
MACAddress.valueOf((String) fields.get("srcMac")).toLong(),
Long.decode((String) fields.get("dstSwitch")),
(long) fields.get("dstPort"),
MACAddress.valueOf((String) fields.get("dstMac")).toLong(),
(double) fields.get("bandwidth"));
operations.add(new IntentOperation(operation, cspi));
status = (cspi.getState()).toString();
}
return status;
}
private void parseFields(JsonNode node, String fieldName, Map<String, Object> fields) {
if ((node.isTextual())) {
fields.put(fieldName, node.getTextValue());
} else if ((node.isInt())) {
fields.put(fieldName, (long)node.getIntValue());
} else if (node.isDouble()) {
fields.put(fieldName, node.getDoubleValue());
} else if ((node.isLong())) {
fields.put(fieldName, node.getLongValue());
}
}
}