blob: 24f61f3598e51ad6ec269d9df696ddf4eef56972 [file] [log] [blame]
Toshio Koidec87810e2014-02-11 13:03:21 -08001package net.onrc.onos.intent.runtime;
2
Toshio Koide066506e2014-02-20 19:52:09 -08003import static org.easymock.EasyMock.*;
4
Pavlin Radoslavov74986ce2014-02-20 13:17:20 -08005import java.util.LinkedList;
Brian O'Connor12861f72014-02-19 20:40:32 -08006import java.util.List;
7import java.util.Set;
8
Toshio Koide27ffd412014-02-18 19:15:27 -08009import net.floodlightcontroller.core.module.FloodlightModuleContext;
10import net.floodlightcontroller.core.module.FloodlightModuleException;
11import net.onrc.onos.datagrid.IDatagridService;
12import net.onrc.onos.datagrid.IEventChannel;
Toshio Koide066506e2014-02-20 19:52:09 -080013import net.onrc.onos.datagrid.IEventChannelListener;
Toshio Koidec87810e2014-02-11 13:03:21 -080014import net.onrc.onos.intent.ConstrainedShortestPathIntent;
Brian O'Connor12861f72014-02-19 20:40:32 -080015import net.onrc.onos.intent.FlowEntry;
Toshio Koidec87810e2014-02-11 13:03:21 -080016import net.onrc.onos.intent.Intent;
Toshio Koidea10c0372014-02-20 17:28:10 -080017import net.onrc.onos.intent.Intent.IntentState;
Toshio Koide27ffd412014-02-18 19:15:27 -080018import net.onrc.onos.intent.IntentOperation.Operator;
19import net.onrc.onos.intent.IntentOperationList;
Toshio Koideebdbb622014-02-12 20:28:38 -080020import net.onrc.onos.intent.MockNetworkGraph;
Toshio Koidec87810e2014-02-11 13:03:21 -080021import net.onrc.onos.intent.PathIntent;
Toshio Koide4f308732014-02-18 15:19:48 -080022import net.onrc.onos.intent.PathIntentMap;
Toshio Koidec87810e2014-02-11 13:03:21 -080023import net.onrc.onos.intent.ShortestPathIntent;
Nick Karanatsios8abe7172014-02-19 20:31:48 -080024import net.onrc.onos.intent.persist.PersistIntent;
Toshio Koide798bc1b2014-02-20 14:02:40 -080025import net.onrc.onos.ofcontroller.networkgraph.DeviceEvent;
Toshio Koide0c9106d2014-02-19 15:26:38 -080026import net.onrc.onos.ofcontroller.networkgraph.INetworkGraphListener;
Toshio Koide27ffd412014-02-18 19:15:27 -080027import net.onrc.onos.ofcontroller.networkgraph.INetworkGraphService;
Toshio Koide0c9106d2014-02-19 15:26:38 -080028import net.onrc.onos.ofcontroller.networkgraph.LinkEvent;
Toshio Koide798bc1b2014-02-20 14:02:40 -080029import net.onrc.onos.ofcontroller.networkgraph.NetworkGraph;
Pavlin Radoslavov74986ce2014-02-20 13:17:20 -080030import net.onrc.onos.ofcontroller.networkgraph.PortEvent;
31import net.onrc.onos.ofcontroller.networkgraph.SwitchEvent;
Nick Karanatsios8abe7172014-02-19 20:31:48 -080032import net.onrc.onos.registry.controller.IControllerRegistryService;
Toshio Koidec87810e2014-02-11 13:03:21 -080033
34import org.junit.After;
35import org.junit.Before;
36import org.junit.Test;
Nick Karanatsios8abe7172014-02-19 20:31:48 -080037import org.junit.runner.RunWith;
38import org.powermock.api.easymock.PowerMock;
39import org.powermock.core.classloader.annotations.PrepareForTest;
40import org.powermock.modules.junit4.PowerMockRunner;
Toshio Koidec87810e2014-02-11 13:03:21 -080041
42/**
43 * @author Toshio Koide (t-koide@onlab.us)
44 */
Nick Karanatsios8abe7172014-02-19 20:31:48 -080045@RunWith(PowerMockRunner.class)
46@PrepareForTest(PathCalcRuntimeModule.class)
Toshio Koidec87810e2014-02-11 13:03:21 -080047public class UseCaseTest {
Toshio Koide27ffd412014-02-18 19:15:27 -080048 private NetworkGraph g;
49 private FloodlightModuleContext modContext;
50 private IDatagridService datagridService;
51 private INetworkGraphService networkGraphService;
Toshio Koide798bc1b2014-02-20 14:02:40 -080052 private IControllerRegistryService controllerRegistryService;
53 private PersistIntent persistIntent;
Toshio Koide27ffd412014-02-18 19:15:27 -080054 @SuppressWarnings("rawtypes")
55 private IEventChannel eventChannel;
Toshio Koidec87810e2014-02-11 13:03:21 -080056
Toshio Koide27ffd412014-02-18 19:15:27 -080057 @SuppressWarnings("unchecked")
Toshio Koidec87810e2014-02-11 13:03:21 -080058 @Before
Nick Karanatsios8abe7172014-02-19 20:31:48 -080059 public void setUp() throws Exception {
Toshio Koideebdbb622014-02-12 20:28:38 -080060 MockNetworkGraph graph = new MockNetworkGraph();
61 graph.createSampleTopology();
62 g = graph;
Toshio Koide27ffd412014-02-18 19:15:27 -080063
Toshio Koide066506e2014-02-20 19:52:09 -080064 datagridService = createMock(IDatagridService.class);
65 networkGraphService = createMock(INetworkGraphService.class);
66 controllerRegistryService = createMock(IControllerRegistryService.class);
67 modContext = createMock(FloodlightModuleContext.class);
68 eventChannel = createMock(IEventChannel.class);
Toshio Koide798bc1b2014-02-20 14:02:40 -080069 persistIntent = PowerMock.createMock(PersistIntent.class);
70
71 PowerMock.expectNew(PersistIntent.class,
Toshio Koide066506e2014-02-20 19:52:09 -080072 anyObject(IControllerRegistryService.class),
73 anyObject(INetworkGraphService.class)).andReturn(persistIntent);
Toshio Koide27ffd412014-02-18 19:15:27 -080074
Toshio Koide066506e2014-02-20 19:52:09 -080075 expect(modContext.getServiceImpl(IDatagridService.class))
Toshio Koide27ffd412014-02-18 19:15:27 -080076 .andReturn(datagridService).once();
Toshio Koide066506e2014-02-20 19:52:09 -080077 expect(modContext.getServiceImpl(INetworkGraphService.class))
Toshio Koide27ffd412014-02-18 19:15:27 -080078 .andReturn(networkGraphService).once();
Toshio Koide066506e2014-02-20 19:52:09 -080079 expect(modContext.getServiceImpl(IControllerRegistryService.class))
Toshio Koide798bc1b2014-02-20 14:02:40 -080080 .andReturn(controllerRegistryService).once();
Toshio Koide066506e2014-02-20 19:52:09 -080081 expect(persistIntent.getKey()).andReturn(1L).anyTimes();
82 expect(persistIntent.persistIfLeader(eq(1L),
83 anyObject(IntentOperationList.class))).andReturn(true).anyTimes();
Toshio Koide0c9106d2014-02-19 15:26:38 -080084
Toshio Koide066506e2014-02-20 19:52:09 -080085 expect(networkGraphService.getNetworkGraph()).andReturn(g).anyTimes();
86 networkGraphService.registerNetworkGraphListener(anyObject(INetworkGraphListener.class));
87 expectLastCall();
Toshio Koide0c9106d2014-02-19 15:26:38 -080088
Toshio Koide066506e2014-02-20 19:52:09 -080089 expect(datagridService.createChannel("onos.pathintent", Long.class, IntentOperationList.class))
Toshio Koide27ffd412014-02-18 19:15:27 -080090 .andReturn(eventChannel).once();
91
Toshio Koide066506e2014-02-20 19:52:09 -080092 expect(datagridService.addListener(
93 eq("onos.pathintent_state"),
94 anyObject(IEventChannelListener.class),
95 eq(Long.class),
96 eq(IntentStateList.class)))
97 .andReturn(eventChannel).once();
98
99 replay(datagridService);
100 replay(networkGraphService);
101 replay(modContext);
102 replay(controllerRegistryService);
Toshio Koide798bc1b2014-02-20 14:02:40 -0800103 PowerMock.replay(persistIntent, PersistIntent.class);
Toshio Koidec87810e2014-02-11 13:03:21 -0800104 }
105
106 @After
107 public void tearDown() {
Toshio Koide066506e2014-02-20 19:52:09 -0800108 verify(datagridService);
109 verify(networkGraphService);
110 verify(modContext);
111 verify(controllerRegistryService);
Toshio Koide798bc1b2014-02-20 14:02:40 -0800112 PowerMock.verify(persistIntent, PersistIntent.class);
Toshio Koidec87810e2014-02-11 13:03:21 -0800113 }
114
Toshio Koide4f308732014-02-18 15:19:48 -0800115 private void showResult(PathIntentMap intents) {
116 for (Intent intent: intents.getAllIntents()) {
117 PathIntent pathIntent = (PathIntent)intent;
Toshio Koidec87810e2014-02-11 13:03:21 -0800118 System.out.println("Parent intent: " + pathIntent.getParentIntent().toString());
119 System.out.println("Path:");
Toshio Koided9fa2a82014-02-19 17:35:18 -0800120 for (LinkEvent linkEvent: pathIntent.getPath()) {
Toshio Koide0c9106d2014-02-19 15:26:38 -0800121 System.out.println(linkEvent);
Toshio Koidec87810e2014-02-11 13:03:21 -0800122 }
123 }
124 }
125
126 @Test
Toshio Koide0c9106d2014-02-19 15:26:38 -0800127 public void createShortestPaths() throws FloodlightModuleException {
Toshio Koidec87810e2014-02-11 13:03:21 -0800128 // create shortest path intents
Toshio Koide27ffd412014-02-18 19:15:27 -0800129 IntentOperationList opList = new IntentOperationList();
130 opList.add(Operator.ADD, new ShortestPathIntent("1", 1L, 20L, 1L, 4L, 20L, 4L));
131 opList.add(Operator.ADD, new ShortestPathIntent("2", 2L, 20L, 2L, 6L, 20L, 5L));
132 opList.add(Operator.ADD, new ShortestPathIntent("3", 4L, 20L, 3L, 8L, 20L, 6L));
Toshio Koidec87810e2014-02-11 13:03:21 -0800133
Toshio Koide27ffd412014-02-18 19:15:27 -0800134 // compile high-level intent operations into low-level intent operations (calculate paths)
135 PathCalcRuntimeModule runtime1 = new PathCalcRuntimeModule();
136 runtime1.init(modContext);
137 runtime1.startUp(modContext);
138 IntentOperationList pathIntentOpList = runtime1.executeIntentOperations(opList);
139
Brian O'Connor7f8e3012014-02-15 23:59:29 -0800140 // compile low-level intents into flow entry installation plan
Brian O'Connor488e5ed2014-02-20 19:50:01 -0800141 PlanCalcRuntime runtime2 = new PlanCalcRuntime();
Brian O'Connor12861f72014-02-19 20:40:32 -0800142 List<Set<FlowEntry>> plan = runtime2.computePlan(pathIntentOpList);
Toshio Koidec87810e2014-02-11 13:03:21 -0800143
144 // show results
Toshio Koide27ffd412014-02-18 19:15:27 -0800145 showResult((PathIntentMap) runtime1.getPathIntents());
Brian O'Connor12861f72014-02-19 20:40:32 -0800146 System.out.println(plan);
Toshio Koidec87810e2014-02-11 13:03:21 -0800147 }
148
149 @Test
Toshio Koide0c9106d2014-02-19 15:26:38 -0800150 public void createConstrainedShortestPaths() throws FloodlightModuleException {
Toshio Koidec87810e2014-02-11 13:03:21 -0800151 // create constrained shortest path intents
Toshio Koide27ffd412014-02-18 19:15:27 -0800152 IntentOperationList opList = new IntentOperationList();
153 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("1", 1L, 20L, 1L, 4L, 20L, 17L, 400.0));
154 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("2", 2L, 20L, 2L, 6L, 20L, 18L, 400.0));
155 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("3", 4L, 20L, 3L, 8L, 20L, 19L, 400.0));
156 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("4", 3L, 20L, 4L, 8L, 20L, 20L, 400.0));
157 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("5", 4L, 20L, 5L, 8L, 20L, 21L, 400.0));
Toshio Koidec87810e2014-02-11 13:03:21 -0800158
Toshio Koide27ffd412014-02-18 19:15:27 -0800159 // compile high-level intent operations into low-level intent operations (calculate paths)
160 PathCalcRuntimeModule runtime1 = new PathCalcRuntimeModule();
161 runtime1.init(modContext);
162 runtime1.startUp(modContext);
163 IntentOperationList pathIntentOpList = runtime1.executeIntentOperations(opList);
Toshio Koidec87810e2014-02-11 13:03:21 -0800164
Brian O'Connor7f8e3012014-02-15 23:59:29 -0800165 // compile low-level intents into flow entry installation plan
Brian O'Connor488e5ed2014-02-20 19:50:01 -0800166 PlanCalcRuntime runtime2 = new PlanCalcRuntime();
Brian O'Connor12861f72014-02-19 20:40:32 -0800167 List<Set<FlowEntry>> plan = runtime2.computePlan(pathIntentOpList);
Brian O'Connor7f8e3012014-02-15 23:59:29 -0800168
Toshio Koidec87810e2014-02-11 13:03:21 -0800169 // show results
Toshio Koide27ffd412014-02-18 19:15:27 -0800170 showResult((PathIntentMap) runtime1.getPathIntents());
Brian O'Connor12861f72014-02-19 20:40:32 -0800171 System.out.println(plan);
Toshio Koidec87810e2014-02-11 13:03:21 -0800172 }
173
174 @Test
Toshio Koide0c9106d2014-02-19 15:26:38 -0800175 public void createMixedShortestPaths() throws FloodlightModuleException {
176 // create constrained & best effort shortest path intents
Toshio Koide27ffd412014-02-18 19:15:27 -0800177 IntentOperationList opList = new IntentOperationList();
178 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("1", 1L, 20L, 1L, 4L, 20L, 6L, 600.0));
179 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("2", 2L, 20L, 2L, 6L, 20L, 7L, 600.0));
180 opList.add(Operator.ADD, new ShortestPathIntent("3", 4L, 20L, 3L, 8L, 20L, 8L));
181 opList.add(Operator.ADD, new ShortestPathIntent("4", 4L, 20L, 4L, 8L, 20L, 9L));
182 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("5", 4L, 20L, 5L, 8L, 20L, 10L, 600.0));
Toshio Koidec87810e2014-02-11 13:03:21 -0800183
Toshio Koide27ffd412014-02-18 19:15:27 -0800184 // compile high-level intent operations into low-level intent operations (calculate paths)
185 PathCalcRuntimeModule runtime1 = new PathCalcRuntimeModule();
186 runtime1.init(modContext);
187 runtime1.startUp(modContext);
188 IntentOperationList pathIntentOpList = runtime1.executeIntentOperations(opList);
Toshio Koidec87810e2014-02-11 13:03:21 -0800189
Brian O'Connor7f8e3012014-02-15 23:59:29 -0800190 // compile low-level intents into flow entry installation plan
Brian O'Connor488e5ed2014-02-20 19:50:01 -0800191 PlanCalcRuntime runtime2 = new PlanCalcRuntime();
Brian O'Connor12861f72014-02-19 20:40:32 -0800192 List<Set<FlowEntry>> plan = runtime2.computePlan(pathIntentOpList);
Brian O'Connor7f8e3012014-02-15 23:59:29 -0800193
Toshio Koidec87810e2014-02-11 13:03:21 -0800194 // show results
Toshio Koide27ffd412014-02-18 19:15:27 -0800195 showResult((PathIntentMap) runtime1.getPathIntents());
Brian O'Connor12861f72014-02-19 20:40:32 -0800196 System.out.println(plan);
Toshio Koidec87810e2014-02-11 13:03:21 -0800197 }
Toshio Koided9fa2a82014-02-19 17:35:18 -0800198
Toshio Koide0c9106d2014-02-19 15:26:38 -0800199 @Test
200 public void rerouteShortestPaths() throws FloodlightModuleException {
Pavlin Radoslavov74986ce2014-02-20 13:17:20 -0800201 List<SwitchEvent> addedSwitchEvents = new LinkedList<>();
202 List<SwitchEvent> removedSwitchEvents = new LinkedList<>();
203 List<PortEvent> addedPortEvents = new LinkedList<>();
204 List<PortEvent> removedPortEvents = new LinkedList<>();
205 List<LinkEvent> addedLinkEvents = new LinkedList<>();
206 List<LinkEvent> removedLinkEvents = new LinkedList<>();
207 List<DeviceEvent> addedDeviceEvents = new LinkedList<>();
208 List<DeviceEvent> removedDeviceEvents = new LinkedList<>();
209
Toshio Koide0c9106d2014-02-19 15:26:38 -0800210 // create shortest path intents
211 IntentOperationList opList = new IntentOperationList();
212 opList.add(Operator.ADD, new ShortestPathIntent("1", 1L, 20L, 1L, 4L, 20L, 4L));
213 opList.add(Operator.ADD, new ShortestPathIntent("2", 2L, 20L, 2L, 6L, 20L, 5L));
214 opList.add(Operator.ADD, new ShortestPathIntent("3", 4L, 20L, 3L, 8L, 20L, 6L));
215
216 // compile high-level intent operations into low-level intent operations (calculate paths)
217 PathCalcRuntimeModule runtime1 = new PathCalcRuntimeModule();
218 runtime1.init(modContext);
219 runtime1.startUp(modContext);
220 IntentOperationList pathIntentOpList = runtime1.executeIntentOperations(opList);
221
222 // compile low-level intents into flow entry installation plan
Brian O'Connor488e5ed2014-02-20 19:50:01 -0800223 PlanCalcRuntime runtime2 = new PlanCalcRuntime();
Brian O'Connor12861f72014-02-19 20:40:32 -0800224 List<Set<FlowEntry>> plan = runtime2.computePlan(pathIntentOpList);
Toshio Koide0c9106d2014-02-19 15:26:38 -0800225
226 // show results step1
227 showResult((PathIntentMap) runtime1.getPathIntents());
Brian O'Connor12861f72014-02-19 20:40:32 -0800228 System.out.println(plan);
Toshio Koide0c9106d2014-02-19 15:26:38 -0800229
Toshio Koidea10c0372014-02-20 17:28:10 -0800230 // TODO this state changes should be triggered by notification of plan module
Toshio Koide066506e2014-02-20 19:52:09 -0800231 IntentStateList states = new IntentStateList();
Toshio Koidea10c0372014-02-20 17:28:10 -0800232 states.put("1", IntentState.INST_ACK);
233 states.put("2", IntentState.INST_ACK);
234 states.put("3", IntentState.INST_ACK);
235 runtime1.getHighLevelIntents().changeStates(states);
236
Toshio Koide0c9106d2014-02-19 15:26:38 -0800237 // link down
238 ((MockNetworkGraph)g).removeLink(1L, 2L, 9L, 1L); // This link is used by the intent "1"
Toshio Koide0c9106d2014-02-19 15:26:38 -0800239 ((MockNetworkGraph)g).removeLink(9L, 1L, 1L, 2L);
Toshio Koidea10c0372014-02-20 17:28:10 -0800240 LinkEvent linkEvent1 = new LinkEvent(1L, 2L, 9L, 1L);
241 LinkEvent linkEvent2 = new LinkEvent(9L, 1L, 1L, 2L);
Pavlin Radoslavov74986ce2014-02-20 13:17:20 -0800242 removedLinkEvents.clear();
Toshio Koidea10c0372014-02-20 17:28:10 -0800243 removedLinkEvents.add(linkEvent1);
244 removedLinkEvents.add(linkEvent2);
Toshio Koide798bc1b2014-02-20 14:02:40 -0800245 runtime1.networkGraphEvents(
246 addedSwitchEvents,
247 removedSwitchEvents,
248 addedPortEvents,
249 removedPortEvents,
250 addedLinkEvents,
251 removedLinkEvents,
252 addedDeviceEvents,
253 removedDeviceEvents);
Toshio Koide0c9106d2014-02-19 15:26:38 -0800254 System.out.println("Link goes down.");
255
256 // show results step2
257 showResult((PathIntentMap) runtime1.getPathIntents());
Brian O'Connor12861f72014-02-19 20:40:32 -0800258 // TODO: show results of plan computation
Toshio Koide0c9106d2014-02-19 15:26:38 -0800259 }
Toshio Koidec87810e2014-02-11 13:03:21 -0800260}