blob: e487f86dae3a8827400ee33b60e3c1ebedfee8dc [file] [log] [blame]
Jonathan Hart6df90172014-04-03 10:13:11 -07001package net.onrc.onos.core.datagrid.web;
Pavlin Radoslavov42706b92014-02-28 01:22:55 -08002
3import java.util.ArrayList;
Pavlin Radoslavov42706b92014-02-28 01:22:55 -08004import java.util.SortedMap;
5import java.util.TreeMap;
6
Jonathan Hartaa380972014-04-03 10:24:46 -07007import net.onrc.onos.core.intent.Intent;
Jonathan Harta99ec672014-04-03 11:30:34 -07008import net.onrc.onos.core.intent.Intent.IntentState;
Jonathan Hartaa380972014-04-03 10:24:46 -07009import net.onrc.onos.core.intent.IntentMap;
Yuta HIGUCHI1fc395e2014-05-13 14:06:28 -070010import net.onrc.onos.core.intent.Path;
Jonathan Hartaa380972014-04-03 10:24:46 -070011import net.onrc.onos.core.intent.PathIntent;
12import net.onrc.onos.core.intent.ShortestPathIntent;
Jonathan Hartaa380972014-04-03 10:24:46 -070013import net.onrc.onos.core.intent.runtime.IPathCalcRuntimeService;
Jonathan Hart472062d2014-04-03 10:56:48 -070014import net.onrc.onos.core.topology.LinkEvent;
Jonathan Hart23701d12014-04-03 10:45:48 -070015import net.onrc.onos.core.util.CallerId;
16import net.onrc.onos.core.util.Dpid;
17import net.onrc.onos.core.util.FlowEntry;
18import net.onrc.onos.core.util.FlowId;
19import net.onrc.onos.core.util.FlowPath;
20import net.onrc.onos.core.util.FlowPathType;
21import net.onrc.onos.core.util.FlowPathUserState;
22import net.onrc.onos.core.util.Port;
23import net.onrc.onos.core.util.SwitchPort;
Pavlin Radoslavov42706b92014-02-28 01:22:55 -080024
25import org.restlet.resource.Get;
26import org.restlet.resource.ServerResource;
27import org.slf4j.Logger;
28import org.slf4j.LoggerFactory;
29
30/**
31 * REST API call to get a summary of Flow Paths.
Ray Milkey269ffb92014-04-03 14:43:30 -070032 * <p/>
Pavlin Radoslavov42706b92014-02-28 01:22:55 -080033 * NOTE: This REST API call is needed for the ONOS GUI.
Ray Milkey269ffb92014-04-03 14:43:30 -070034 * <p/>
Ray Milkey9c8a2132014-04-02 15:16:42 -070035 * GET /wm/onos/datagrid/get/ng-flows/summary/json
Pavlin Radoslavov42706b92014-02-28 01:22:55 -080036 */
37public class GetNGFlowsSummaryResource extends ServerResource {
38 public static final Logger log = LoggerFactory.getLogger(GetNGFlowsSummaryResource.class);
Ray Milkey9c8a2132014-04-02 15:16:42 -070039
Pavlin Radoslavov42706b92014-02-28 01:22:55 -080040 @Get("json")
41 public ArrayList<FlowPath> retrieve() {
Ray Milkey9c8a2132014-04-02 15:16:42 -070042 ArrayList<FlowPath> result = new ArrayList<>();
43 SortedMap<Long, FlowPath> sortedFlowPaths = new TreeMap<>();
Pavlin Radoslavov42706b92014-02-28 01:22:55 -080044
45 IPathCalcRuntimeService pathRuntime =
Ray Milkey9c8a2132014-04-02 15:16:42 -070046 (IPathCalcRuntimeService) getContext().
47 getAttributes().get(IPathCalcRuntimeService.class.getCanonicalName());
48 log.debug("Get NG Flows Summary");
Pavlin Radoslavov42706b92014-02-28 01:22:55 -080049
50
Ray Milkey9c8a2132014-04-02 15:16:42 -070051 IntentMap parentIntentMap = pathRuntime.getHighLevelIntents();
52 IntentMap intentMap = pathRuntime.getPathIntents();
53 for (Intent parentIntent : parentIntentMap.getAllIntents()) {
54 // Get only installed Shortest Paths
Ray Milkeyb29e6262014-04-09 16:02:14 -070055 if (parentIntent.getState() != IntentState.INST_ACK) {
Ray Milkey9c8a2132014-04-02 15:16:42 -070056 continue;
Ray Milkeyb29e6262014-04-09 16:02:14 -070057 }
58 if (!(parentIntent instanceof ShortestPathIntent)) {
Ray Milkey9c8a2132014-04-02 15:16:42 -070059 continue;
Ray Milkeyb29e6262014-04-09 16:02:14 -070060 }
Ray Milkey9c8a2132014-04-02 15:16:42 -070061 ShortestPathIntent spIntent = (ShortestPathIntent) parentIntent;
Pavlin Radoslavov42706b92014-02-28 01:22:55 -080062
Ray Milkey9c8a2132014-04-02 15:16:42 -070063 // Get the Path Intent
64 Intent intent = intentMap.getIntent(spIntent.getPathIntentId());
Ray Milkeyb29e6262014-04-09 16:02:14 -070065 if (!(intent instanceof PathIntent)) {
Ray Milkey9c8a2132014-04-02 15:16:42 -070066 continue;
Ray Milkeyb29e6262014-04-09 16:02:14 -070067 }
Ray Milkey9c8a2132014-04-02 15:16:42 -070068 PathIntent pathIntent = (PathIntent) intent;
Pavlin Radoslavov42706b92014-02-28 01:22:55 -080069
Ray Milkey9c8a2132014-04-02 15:16:42 -070070 // Decode the Shortest Path ID
71 String applnIntentId = parentIntent.getId();
72 String intentId = applnIntentId.split(":")[1];
Pavlin Radoslavov42706b92014-02-28 01:22:55 -080073
Ray Milkey9c8a2132014-04-02 15:16:42 -070074 // Create the Flow Path
75 FlowId flowId = new FlowId(intentId);
76 FlowPath flowPath = new FlowPath();
77 flowPath.setFlowId(flowId);
78 sortedFlowPaths.put(flowPath.flowId().value(), flowPath);
Pavlin Radoslavov42706b92014-02-28 01:22:55 -080079
Ray Milkey9c8a2132014-04-02 15:16:42 -070080 flowPath.setInstallerId(new CallerId("E"));
81 flowPath.setFlowEntryActions(null);
82 flowPath.setFlowPathType(FlowPathType.FP_TYPE_SHORTEST_PATH);
83 flowPath.setFlowPathUserState(FlowPathUserState.FP_USER_ADD);
Pavlin Radoslavov42706b92014-02-28 01:22:55 -080084
Ray Milkey9c8a2132014-04-02 15:16:42 -070085 // Setup the Source and Destination DPID and Port
Pavlin Radoslavov29a2a882014-04-08 17:40:54 -070086 Dpid srcDpid = new Dpid(spIntent.getSrcSwitchDpid());
87 Port srcPort = new Port((short) spIntent.getSrcPortNumber());
88 Dpid dstDpid = new Dpid(spIntent.getDstSwitchDpid());
89 Port dstPort = new Port((short) spIntent.getDstPortNumber());
90 SwitchPort srcSwitchPort = new SwitchPort(srcDpid, srcPort);
91 SwitchPort dstSwitchPort = new SwitchPort(dstDpid, dstPort);
92 flowPath.dataPath().setSrcPort(srcSwitchPort);
93 flowPath.dataPath().setDstPort(dstSwitchPort);
Pavlin Radoslavov42706b92014-02-28 01:22:55 -080094
Ray Milkey9c8a2132014-04-02 15:16:42 -070095 // Extract the Flow Entries
96 Path path = pathIntent.getPath();
97 FlowEntry flowEntry;
98 ArrayList<FlowEntry> flowEntries = new ArrayList<>();
99 for (LinkEvent linkEvent : path) {
100 Dpid dpid = new Dpid(linkEvent.getSrc().getDpid());
101 flowEntry = new FlowEntry();
102 flowEntry.setDpid(dpid);
103 flowEntries.add(flowEntry);
104 }
105 // Add the final Flow Entry
106 flowEntry = new FlowEntry();
107 flowEntry.setDpid(new Dpid(spIntent.getDstSwitchDpid()));
108 flowEntries.add(flowEntry);
109 flowPath.dataPath().setFlowEntries(flowEntries);
110 }
Pavlin Radoslavov42706b92014-02-28 01:22:55 -0800111
Ray Milkey9c8a2132014-04-02 15:16:42 -0700112 // Prepare the return result
Ray Milkeyb29e6262014-04-09 16:02:14 -0700113 for (FlowPath flowPath : sortedFlowPaths.values()) {
Ray Milkey9c8a2132014-04-02 15:16:42 -0700114 result.add(flowPath);
Ray Milkeyb29e6262014-04-09 16:02:14 -0700115 }
Pavlin Radoslavov42706b92014-02-28 01:22:55 -0800116
Ray Milkey9c8a2132014-04-02 15:16:42 -0700117 return result;
Pavlin Radoslavov42706b92014-02-28 01:22:55 -0800118 }
119}