blob: 18e962fbd71d4e3f4d88458ba8748845902670fc [file] [log] [blame]
Brian O'Connor7f8e3012014-02-15 23:59:29 -08001package net.onrc.onos.intent.runtime;
2
3import java.util.ArrayList;
4import java.util.Collection;
5import java.util.Collections;
6import java.util.HashMap;
7import java.util.HashSet;
8import java.util.List;
9import java.util.Map;
10import java.util.Set;
11
12import net.floodlightcontroller.util.MACAddress;
13import net.onrc.onos.intent.FlowEntry;
14import net.onrc.onos.intent.Intent;
Toshio Koide103ccb22014-02-18 21:51:25 -080015import net.onrc.onos.intent.IntentOperationList;
Brian O'Connor7f8e3012014-02-15 23:59:29 -080016import net.onrc.onos.intent.PathIntent;
Toshio Koide4f308732014-02-18 15:19:48 -080017import net.onrc.onos.intent.PathIntentMap;
Brian O'Connor7f8e3012014-02-15 23:59:29 -080018import net.onrc.onos.intent.ShortestPathIntent;
19import net.onrc.onos.ofcontroller.networkgraph.Link;
Toshio Koided9fa2a82014-02-19 17:35:18 -080020import net.onrc.onos.ofcontroller.networkgraph.LinkEvent;
Brian O'Connor7f8e3012014-02-15 23:59:29 -080021import net.onrc.onos.ofcontroller.networkgraph.NetworkGraph;
22import net.onrc.onos.ofcontroller.networkgraph.Port;
23import net.onrc.onos.ofcontroller.networkgraph.Switch;
24
25/**
Toshio Koided9fa2a82014-02-19 17:35:18 -080026 *
Brian O'Connor7f8e3012014-02-15 23:59:29 -080027 * @author Brian O'Connor <bocon@onlab.us>
28 *
29 */
30
31public class PlanCalcRuntime {
32 NetworkGraph graph;
Toshio Koide4f308732014-02-18 15:19:48 -080033 protected PathIntentMap intents;
Brian O'Connor7f8e3012014-02-15 23:59:29 -080034 protected Set<Collection<FlowEntry>> flowEntries;
35 protected List<Set<FlowEntry>> plan;
Toshio Koided9fa2a82014-02-19 17:35:18 -080036
Brian O'Connor7f8e3012014-02-15 23:59:29 -080037 public PlanCalcRuntime(NetworkGraph graph) {
38 this.graph = graph;
39 this.flowEntries = new HashSet<>();
40 this.plan = new ArrayList<>();
Toshio Koide0c9106d2014-02-19 15:26:38 -080041 this.intents = new PathIntentMap();
Brian O'Connor7f8e3012014-02-15 23:59:29 -080042 }
Toshio Koided9fa2a82014-02-19 17:35:18 -080043
Toshio Koide103ccb22014-02-18 21:51:25 -080044 public void addIntents(IntentOperationList intentOpList) {
45 intents.executeOperations(intentOpList);
Brian O'Connor7f8e3012014-02-15 23:59:29 -080046 computeFlowEntries();
47 constructPlan();
48 }
Toshio Koided9fa2a82014-02-19 17:35:18 -080049
Brian O'Connor7f8e3012014-02-15 23:59:29 -080050 public List<Set<FlowEntry>> getPlan() {
51 return plan;
52 }
53
54 public void computeFlowEntries() {
Toshio Koide4f308732014-02-18 15:19:48 -080055 for(Intent i : intents.getAllIntents()) {
56 PathIntent intent = (PathIntent)i;
Brian O'Connor7f8e3012014-02-15 23:59:29 -080057 Intent parent = intent.getParentIntent();
58 Port srcPort, dstPort, lastDstPort = null;
59 MACAddress srcMac, dstMac;
60 if(parent instanceof ShortestPathIntent) {
61 ShortestPathIntent pathIntent = (ShortestPathIntent) parent;
62 Switch srcSwitch = graph.getSwitch(pathIntent.getSrcSwitchDpid());
63 srcPort = srcSwitch.getPort(pathIntent.getSrcPortNumber());
64 srcMac = MACAddress.valueOf(pathIntent.getSrcMac());
65 dstMac = MACAddress.valueOf(pathIntent.getDstMac());
66 Switch dstSwitch = graph.getSwitch(pathIntent.getDstSwitchDpid());
67 lastDstPort = dstSwitch.getPort(pathIntent.getDstPortNumber());
68 }
69 else {
70 // TODO: log this error
71 continue;
72 }
73 List<FlowEntry> entries = new ArrayList<>();
Toshio Koided9fa2a82014-02-19 17:35:18 -080074 for(LinkEvent linkEvent : intent.getPath()) {
Pavlin Radoslavov7c8f69a2014-02-19 19:01:45 -080075 Link link = graph.getLink(linkEvent.getSrc().getDpid(),
76 linkEvent.getSrc().getNumber(),
77 linkEvent.getDst().getDpid(),
78 linkEvent.getDst().getNumber());
79 Switch sw = link.getSrcSwitch();
80 dstPort = link.getSrcPort();
Brian O'Connor7f8e3012014-02-15 23:59:29 -080081 FlowEntry fe = new FlowEntry(sw, srcPort, dstPort, srcMac, dstMac);
82 entries.add(fe);
Pavlin Radoslavov7c8f69a2014-02-19 19:01:45 -080083 srcPort = link.getDstPort();
Brian O'Connor7f8e3012014-02-15 23:59:29 -080084 }
85 if(lastDstPort != null) {
86 Switch sw = lastDstPort.getSwitch();
87 dstPort = lastDstPort;
88 FlowEntry fe = new FlowEntry(sw, srcPort, dstPort, srcMac, dstMac);
89 entries.add(fe);
90 }
91 // install flow entries in reverse order
92 Collections.reverse(entries);
93 flowEntries.add(entries);
94 }
95 }
Toshio Koided9fa2a82014-02-19 17:35:18 -080096
Brian O'Connor7f8e3012014-02-15 23:59:29 -080097 public void constructPlan() {
98 Map<FlowEntry, Integer> map = new HashMap<>();
99 for(Collection<FlowEntry> c : flowEntries) {
100 for(FlowEntry e: c) {
101 Integer i = map.get(e);
102 if(i == null) {
103 map.put(e, 1);
104 }
105 else {
106 i += 1;
107 }
Toshio Koided9fa2a82014-02-19 17:35:18 -0800108
Brian O'Connor7f8e3012014-02-15 23:59:29 -0800109 }
110 }
Toshio Koided9fa2a82014-02-19 17:35:18 -0800111
Brian O'Connor7f8e3012014-02-15 23:59:29 -0800112 // really simple first iteration of plan
113 //TODO: optimize the map in phases
114 plan.add(map.keySet());
115 }
116}