blob: 291f82d279f637eb37ec94b8b1eb3b17f76a9d9e [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
Pavlin Radoslavov29a2a882014-04-08 17:40:54 -070083 Dpid srcDpid = new Dpid(spIntent.getSrcSwitchDpid());
84 Port srcPort = new Port((short) spIntent.getSrcPortNumber());
85 Dpid dstDpid = new Dpid(spIntent.getDstSwitchDpid());
86 Port dstPort = new Port((short) spIntent.getDstPortNumber());
87 SwitchPort srcSwitchPort = new SwitchPort(srcDpid, srcPort);
88 SwitchPort dstSwitchPort = new SwitchPort(dstDpid, dstPort);
89 flowPath.dataPath().setSrcPort(srcSwitchPort);
90 flowPath.dataPath().setDstPort(dstSwitchPort);
Pavlin Radoslavov42706b92014-02-28 01:22:55 -080091
Ray Milkey9c8a2132014-04-02 15:16:42 -070092 // Extract the Flow Entries
93 Path path = pathIntent.getPath();
94 FlowEntry flowEntry;
95 ArrayList<FlowEntry> flowEntries = new ArrayList<>();
96 for (LinkEvent linkEvent : path) {
97 Dpid dpid = new Dpid(linkEvent.getSrc().getDpid());
98 flowEntry = new FlowEntry();
99 flowEntry.setDpid(dpid);
100 flowEntries.add(flowEntry);
101 }
102 // Add the final Flow Entry
103 flowEntry = new FlowEntry();
104 flowEntry.setDpid(new Dpid(spIntent.getDstSwitchDpid()));
105 flowEntries.add(flowEntry);
106 flowPath.dataPath().setFlowEntries(flowEntries);
107 }
Pavlin Radoslavov42706b92014-02-28 01:22:55 -0800108
Ray Milkey9c8a2132014-04-02 15:16:42 -0700109 // Prepare the return result
110 for (FlowPath flowPath : sortedFlowPaths.values())
111 result.add(flowPath);
Pavlin Radoslavov42706b92014-02-28 01:22:55 -0800112
Ray Milkey9c8a2132014-04-02 15:16:42 -0700113 return result;
Pavlin Radoslavov42706b92014-02-28 01:22:55 -0800114 }
115}