blob: 0c1746f574969ca48d7dc073d74b73c1d6caaeef [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 Koidebf875662014-02-24 12:19:15 -0800118 System.out.println("Path intent:" + pathIntent);
Toshio Koidec87810e2014-02-11 13:03:21 -0800119 System.out.println("Parent intent: " + pathIntent.getParentIntent().toString());
Toshio Koidec87810e2014-02-11 13:03:21 -0800120 }
121 }
122
123 @Test
Toshio Koide0c9106d2014-02-19 15:26:38 -0800124 public void createShortestPaths() throws FloodlightModuleException {
Toshio Koidec87810e2014-02-11 13:03:21 -0800125 // create shortest path intents
Toshio Koide27ffd412014-02-18 19:15:27 -0800126 IntentOperationList opList = new IntentOperationList();
127 opList.add(Operator.ADD, new ShortestPathIntent("1", 1L, 20L, 1L, 4L, 20L, 4L));
128 opList.add(Operator.ADD, new ShortestPathIntent("2", 2L, 20L, 2L, 6L, 20L, 5L));
129 opList.add(Operator.ADD, new ShortestPathIntent("3", 4L, 20L, 3L, 8L, 20L, 6L));
Toshio Koidec87810e2014-02-11 13:03:21 -0800130
Toshio Koide27ffd412014-02-18 19:15:27 -0800131 // compile high-level intent operations into low-level intent operations (calculate paths)
132 PathCalcRuntimeModule runtime1 = new PathCalcRuntimeModule();
133 runtime1.init(modContext);
134 runtime1.startUp(modContext);
135 IntentOperationList pathIntentOpList = runtime1.executeIntentOperations(opList);
136
Brian O'Connor7f8e3012014-02-15 23:59:29 -0800137 // compile low-level intents into flow entry installation plan
Brian O'Connor488e5ed2014-02-20 19:50:01 -0800138 PlanCalcRuntime runtime2 = new PlanCalcRuntime();
Brian O'Connor12861f72014-02-19 20:40:32 -0800139 List<Set<FlowEntry>> plan = runtime2.computePlan(pathIntentOpList);
Toshio Koidec87810e2014-02-11 13:03:21 -0800140
141 // show results
Toshio Koide27ffd412014-02-18 19:15:27 -0800142 showResult((PathIntentMap) runtime1.getPathIntents());
Brian O'Connor12861f72014-02-19 20:40:32 -0800143 System.out.println(plan);
Toshio Koidec87810e2014-02-11 13:03:21 -0800144 }
145
146 @Test
Toshio Koide0c9106d2014-02-19 15:26:38 -0800147 public void createConstrainedShortestPaths() throws FloodlightModuleException {
Toshio Koidec87810e2014-02-11 13:03:21 -0800148 // create constrained shortest path intents
Toshio Koide27ffd412014-02-18 19:15:27 -0800149 IntentOperationList opList = new IntentOperationList();
150 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("1", 1L, 20L, 1L, 4L, 20L, 17L, 400.0));
151 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("2", 2L, 20L, 2L, 6L, 20L, 18L, 400.0));
152 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("3", 4L, 20L, 3L, 8L, 20L, 19L, 400.0));
153 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("4", 3L, 20L, 4L, 8L, 20L, 20L, 400.0));
154 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("5", 4L, 20L, 5L, 8L, 20L, 21L, 400.0));
Toshio Koidec87810e2014-02-11 13:03:21 -0800155
Toshio Koide27ffd412014-02-18 19:15:27 -0800156 // compile high-level intent operations into low-level intent operations (calculate paths)
157 PathCalcRuntimeModule runtime1 = new PathCalcRuntimeModule();
158 runtime1.init(modContext);
159 runtime1.startUp(modContext);
160 IntentOperationList pathIntentOpList = runtime1.executeIntentOperations(opList);
Toshio Koidec87810e2014-02-11 13:03:21 -0800161
Brian O'Connor7f8e3012014-02-15 23:59:29 -0800162 // compile low-level intents into flow entry installation plan
Brian O'Connor488e5ed2014-02-20 19:50:01 -0800163 PlanCalcRuntime runtime2 = new PlanCalcRuntime();
Brian O'Connor12861f72014-02-19 20:40:32 -0800164 List<Set<FlowEntry>> plan = runtime2.computePlan(pathIntentOpList);
Brian O'Connor7f8e3012014-02-15 23:59:29 -0800165
Toshio Koidec87810e2014-02-11 13:03:21 -0800166 // show results
Toshio Koide27ffd412014-02-18 19:15:27 -0800167 showResult((PathIntentMap) runtime1.getPathIntents());
Brian O'Connor12861f72014-02-19 20:40:32 -0800168 System.out.println(plan);
Toshio Koidec87810e2014-02-11 13:03:21 -0800169 }
170
171 @Test
Toshio Koide0c9106d2014-02-19 15:26:38 -0800172 public void createMixedShortestPaths() throws FloodlightModuleException {
173 // create constrained & best effort shortest path intents
Toshio Koide27ffd412014-02-18 19:15:27 -0800174 IntentOperationList opList = new IntentOperationList();
175 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("1", 1L, 20L, 1L, 4L, 20L, 6L, 600.0));
176 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("2", 2L, 20L, 2L, 6L, 20L, 7L, 600.0));
177 opList.add(Operator.ADD, new ShortestPathIntent("3", 4L, 20L, 3L, 8L, 20L, 8L));
178 opList.add(Operator.ADD, new ShortestPathIntent("4", 4L, 20L, 4L, 8L, 20L, 9L));
179 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("5", 4L, 20L, 5L, 8L, 20L, 10L, 600.0));
Toshio Koidec87810e2014-02-11 13:03:21 -0800180
Toshio Koide27ffd412014-02-18 19:15:27 -0800181 // compile high-level intent operations into low-level intent operations (calculate paths)
182 PathCalcRuntimeModule runtime1 = new PathCalcRuntimeModule();
183 runtime1.init(modContext);
184 runtime1.startUp(modContext);
185 IntentOperationList pathIntentOpList = runtime1.executeIntentOperations(opList);
Toshio Koidec87810e2014-02-11 13:03:21 -0800186
Brian O'Connor7f8e3012014-02-15 23:59:29 -0800187 // compile low-level intents into flow entry installation plan
Brian O'Connor488e5ed2014-02-20 19:50:01 -0800188 PlanCalcRuntime runtime2 = new PlanCalcRuntime();
Brian O'Connor12861f72014-02-19 20:40:32 -0800189 List<Set<FlowEntry>> plan = runtime2.computePlan(pathIntentOpList);
Brian O'Connor7f8e3012014-02-15 23:59:29 -0800190
Toshio Koidec87810e2014-02-11 13:03:21 -0800191 // show results
Toshio Koide27ffd412014-02-18 19:15:27 -0800192 showResult((PathIntentMap) runtime1.getPathIntents());
Brian O'Connor12861f72014-02-19 20:40:32 -0800193 System.out.println(plan);
Toshio Koidec87810e2014-02-11 13:03:21 -0800194 }
Toshio Koided9fa2a82014-02-19 17:35:18 -0800195
Toshio Koide0c9106d2014-02-19 15:26:38 -0800196 @Test
197 public void rerouteShortestPaths() throws FloodlightModuleException {
Pavlin Radoslavov74986ce2014-02-20 13:17:20 -0800198 List<SwitchEvent> addedSwitchEvents = new LinkedList<>();
199 List<SwitchEvent> removedSwitchEvents = new LinkedList<>();
200 List<PortEvent> addedPortEvents = new LinkedList<>();
201 List<PortEvent> removedPortEvents = new LinkedList<>();
202 List<LinkEvent> addedLinkEvents = new LinkedList<>();
203 List<LinkEvent> removedLinkEvents = new LinkedList<>();
204 List<DeviceEvent> addedDeviceEvents = new LinkedList<>();
205 List<DeviceEvent> removedDeviceEvents = new LinkedList<>();
206
Toshio Koide0c9106d2014-02-19 15:26:38 -0800207 // create shortest path intents
208 IntentOperationList opList = new IntentOperationList();
209 opList.add(Operator.ADD, new ShortestPathIntent("1", 1L, 20L, 1L, 4L, 20L, 4L));
210 opList.add(Operator.ADD, new ShortestPathIntent("2", 2L, 20L, 2L, 6L, 20L, 5L));
211 opList.add(Operator.ADD, new ShortestPathIntent("3", 4L, 20L, 3L, 8L, 20L, 6L));
212
213 // compile high-level intent operations into low-level intent operations (calculate paths)
214 PathCalcRuntimeModule runtime1 = new PathCalcRuntimeModule();
215 runtime1.init(modContext);
216 runtime1.startUp(modContext);
217 IntentOperationList pathIntentOpList = runtime1.executeIntentOperations(opList);
218
219 // compile low-level intents into flow entry installation plan
Brian O'Connor488e5ed2014-02-20 19:50:01 -0800220 PlanCalcRuntime runtime2 = new PlanCalcRuntime();
Brian O'Connor12861f72014-02-19 20:40:32 -0800221 List<Set<FlowEntry>> plan = runtime2.computePlan(pathIntentOpList);
Toshio Koide0c9106d2014-02-19 15:26:38 -0800222
223 // show results step1
224 showResult((PathIntentMap) runtime1.getPathIntents());
Brian O'Connor12861f72014-02-19 20:40:32 -0800225 System.out.println(plan);
Toshio Koide0c9106d2014-02-19 15:26:38 -0800226
Toshio Koidea10c0372014-02-20 17:28:10 -0800227 // TODO this state changes should be triggered by notification of plan module
Toshio Koide066506e2014-02-20 19:52:09 -0800228 IntentStateList states = new IntentStateList();
Toshio Koidea10c0372014-02-20 17:28:10 -0800229 states.put("1", IntentState.INST_ACK);
230 states.put("2", IntentState.INST_ACK);
231 states.put("3", IntentState.INST_ACK);
232 runtime1.getHighLevelIntents().changeStates(states);
Toshio Koidebf875662014-02-24 12:19:15 -0800233 states.clear();
234 states.put("1___0", IntentState.INST_ACK);
235 states.put("2___0", IntentState.INST_ACK);
236 states.put("3___0", IntentState.INST_ACK);
237 runtime1.getPathIntents().changeStates(states);
Toshio Koidea10c0372014-02-20 17:28:10 -0800238
Toshio Koide0c9106d2014-02-19 15:26:38 -0800239 // link down
240 ((MockNetworkGraph)g).removeLink(1L, 2L, 9L, 1L); // This link is used by the intent "1"
Toshio Koide0c9106d2014-02-19 15:26:38 -0800241 ((MockNetworkGraph)g).removeLink(9L, 1L, 1L, 2L);
Toshio Koidea10c0372014-02-20 17:28:10 -0800242 LinkEvent linkEvent1 = new LinkEvent(1L, 2L, 9L, 1L);
243 LinkEvent linkEvent2 = new LinkEvent(9L, 1L, 1L, 2L);
Pavlin Radoslavov74986ce2014-02-20 13:17:20 -0800244 removedLinkEvents.clear();
Toshio Koidea10c0372014-02-20 17:28:10 -0800245 removedLinkEvents.add(linkEvent1);
246 removedLinkEvents.add(linkEvent2);
Toshio Koide798bc1b2014-02-20 14:02:40 -0800247 runtime1.networkGraphEvents(
248 addedSwitchEvents,
249 removedSwitchEvents,
250 addedPortEvents,
251 removedPortEvents,
252 addedLinkEvents,
253 removedLinkEvents,
254 addedDeviceEvents,
255 removedDeviceEvents);
Toshio Koide0c9106d2014-02-19 15:26:38 -0800256 System.out.println("Link goes down.");
257
258 // show results step2
259 showResult((PathIntentMap) runtime1.getPathIntents());
Brian O'Connor12861f72014-02-19 20:40:32 -0800260 // TODO: show results of plan computation
Toshio Koide0c9106d2014-02-19 15:26:38 -0800261 }
Toshio Koidec87810e2014-02-11 13:03:21 -0800262}