blob: fa7c6d14d12c0dea94ea6e38374e20b027eed01c [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;
10import net.onrc.onos.core.intent.PathIntent;
11import net.onrc.onos.core.intent.ShortestPathIntent;
Jonathan Hartaa380972014-04-03 10:24:46 -070012import net.onrc.onos.core.intent.runtime.IPathCalcRuntimeService;
Jonathan Hart472062d2014-04-03 10:56:48 -070013import net.onrc.onos.core.topology.LinkEvent;
14import net.onrc.onos.core.topology.Path;
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
55 if (parentIntent.getState() != IntentState.INST_ACK)
56 continue;
57 if (!(parentIntent instanceof ShortestPathIntent))
58 continue;
59 ShortestPathIntent spIntent = (ShortestPathIntent) parentIntent;
Pavlin Radoslavov42706b92014-02-28 01:22:55 -080060
Ray Milkey9c8a2132014-04-02 15:16:42 -070061 // Get the Path Intent
62 Intent intent = intentMap.getIntent(spIntent.getPathIntentId());
63 if (!(intent instanceof PathIntent))
64 continue;
65 PathIntent pathIntent = (PathIntent) intent;
Pavlin Radoslavov42706b92014-02-28 01:22:55 -080066
Ray Milkey9c8a2132014-04-02 15:16:42 -070067 // Decode the Shortest Path ID
68 String applnIntentId = parentIntent.getId();
69 String intentId = applnIntentId.split(":")[1];
Pavlin Radoslavov42706b92014-02-28 01:22:55 -080070
Ray Milkey9c8a2132014-04-02 15:16:42 -070071 // Create the Flow Path
72 FlowId flowId = new FlowId(intentId);
73 FlowPath flowPath = new FlowPath();
74 flowPath.setFlowId(flowId);
75 sortedFlowPaths.put(flowPath.flowId().value(), flowPath);
Pavlin Radoslavov42706b92014-02-28 01:22:55 -080076
Ray Milkey9c8a2132014-04-02 15:16:42 -070077 flowPath.setInstallerId(new CallerId("E"));
78 flowPath.setFlowEntryActions(null);
79 flowPath.setFlowPathType(FlowPathType.FP_TYPE_SHORTEST_PATH);
80 flowPath.setFlowPathUserState(FlowPathUserState.FP_USER_ADD);
Pavlin Radoslavov42706b92014-02-28 01:22:55 -080081
Ray Milkey9c8a2132014-04-02 15:16:42 -070082 // Setup the Source and Destination DPID and Port
83 SwitchPort srcPort = flowPath.dataPath().srcPort();
84 SwitchPort dstPort = flowPath.dataPath().dstPort();
85 srcPort.setDpid(new Dpid(spIntent.getSrcSwitchDpid()));
86 srcPort.setPort(new Port((short) spIntent.getSrcPortNumber()));
87 dstPort.setDpid(new Dpid(spIntent.getDstSwitchDpid()));
88 dstPort.setPort(new Port((short) spIntent.getDstPortNumber()));
Pavlin Radoslavov42706b92014-02-28 01:22:55 -080089
Ray Milkey9c8a2132014-04-02 15:16:42 -070090 // Extract the Flow Entries
91 Path path = pathIntent.getPath();
92 FlowEntry flowEntry;
93 ArrayList<FlowEntry> flowEntries = new ArrayList<>();
94 for (LinkEvent linkEvent : path) {
95 Dpid dpid = new Dpid(linkEvent.getSrc().getDpid());
96 flowEntry = new FlowEntry();
97 flowEntry.setDpid(dpid);
98 flowEntries.add(flowEntry);
99 }
100 // Add the final Flow Entry
101 flowEntry = new FlowEntry();
102 flowEntry.setDpid(new Dpid(spIntent.getDstSwitchDpid()));
103 flowEntries.add(flowEntry);
104 flowPath.dataPath().setFlowEntries(flowEntries);
105 }
Pavlin Radoslavov42706b92014-02-28 01:22:55 -0800106
Ray Milkey9c8a2132014-04-02 15:16:42 -0700107 // Prepare the return result
108 for (FlowPath flowPath : sortedFlowPaths.values())
109 result.add(flowPath);
Pavlin Radoslavov42706b92014-02-28 01:22:55 -0800110
Ray Milkey9c8a2132014-04-02 15:16:42 -0700111 return result;
Pavlin Radoslavov42706b92014-02-28 01:22:55 -0800112 }
113}