blob: 1d85984d8641293a96d69d567d6ebe284456cea9 [file] [log] [blame]
Jonathan Hartaa380972014-04-03 10:24:46 -07001package net.onrc.onos.core.intent.runtime;
Toshio Koidec87810e2014-02-11 13:03:21 -08002
Jonathan Harta88fd242014-04-03 11:24:54 -07003import static org.easymock.EasyMock.anyObject;
4import static org.easymock.EasyMock.createMock;
5import static org.easymock.EasyMock.eq;
6import static org.easymock.EasyMock.expect;
7import static org.easymock.EasyMock.expectLastCall;
8import static org.easymock.EasyMock.replay;
9import static org.easymock.EasyMock.verify;
Toshio Koide066506e2014-02-20 19:52:09 -080010
Pavlin Radoslavov74986ce2014-02-20 13:17:20 -080011import java.util.LinkedList;
Brian O'Connor12861f72014-02-19 20:40:32 -080012import java.util.List;
13import java.util.Set;
14
Toshio Koide27ffd412014-02-18 19:15:27 -080015import net.floodlightcontroller.core.module.FloodlightModuleContext;
16import net.floodlightcontroller.core.module.FloodlightModuleException;
Pavlin Radoslavov13669052014-05-13 10:33:39 -070017import net.floodlightcontroller.restserver.IRestApiService;
Jonathan Hart6df90172014-04-03 10:13:11 -070018import net.onrc.onos.core.datagrid.IDatagridService;
19import net.onrc.onos.core.datagrid.IEventChannel;
20import net.onrc.onos.core.datagrid.IEventChannelListener;
Jonathan Hartaa380972014-04-03 10:24:46 -070021import net.onrc.onos.core.intent.ConstrainedShortestPathIntent;
22import net.onrc.onos.core.intent.FlowEntry;
23import net.onrc.onos.core.intent.Intent;
Jonathan Harta88fd242014-04-03 11:24:54 -070024import net.onrc.onos.core.intent.Intent.IntentState;
25import net.onrc.onos.core.intent.IntentOperation.Operator;
Jonathan Hartaa380972014-04-03 10:24:46 -070026import net.onrc.onos.core.intent.IntentOperationList;
Jonathan Hartaa380972014-04-03 10:24:46 -070027import net.onrc.onos.core.intent.PathIntent;
28import net.onrc.onos.core.intent.PathIntentMap;
29import net.onrc.onos.core.intent.ShortestPathIntent;
Pavlin Radoslavov13669052014-05-13 10:33:39 -070030import net.onrc.onos.core.intent.runtime.web.IntentWebRoutable;
Jonathan Hartdeda0ba2014-04-03 11:14:12 -070031import net.onrc.onos.core.registry.IControllerRegistryService;
Yuta HIGUCHIbfc77f02014-07-14 22:50:25 -070032import net.onrc.onos.core.topology.HostEvent;
Jonathan Harte37e4e22014-05-13 19:12:02 -070033import net.onrc.onos.core.topology.ITopologyListener;
34import net.onrc.onos.core.topology.ITopologyService;
Jonathan Hart472062d2014-04-03 10:56:48 -070035import net.onrc.onos.core.topology.LinkEvent;
Pavlin Radoslavovcac157d2014-07-31 13:54:08 -070036import net.onrc.onos.core.topology.MastershipEvent;
TeruU5d2c9392014-06-09 20:02:02 -070037import net.onrc.onos.core.topology.MockTopology;
Jonathan Hart472062d2014-04-03 10:56:48 -070038import net.onrc.onos.core.topology.PortEvent;
39import net.onrc.onos.core.topology.SwitchEvent;
Jonathan Harte37e4e22014-05-13 19:12:02 -070040import net.onrc.onos.core.topology.Topology;
Pavlin Radoslavov4eaab992014-07-03 18:39:42 -070041import net.onrc.onos.core.topology.TopologyEvents;
Yuta HIGUCHIe2a4e172014-07-03 10:50:39 -070042import net.onrc.onos.core.util.SwitchPort;
Toshio Koidec87810e2014-02-11 13:03:21 -080043
Ray Milkey38301352014-07-28 08:51:54 -070044import net.onrc.onos.core.util.UnitTest;
Toshio Koidec87810e2014-02-11 13:03:21 -080045import org.junit.After;
46import org.junit.Before;
47import org.junit.Test;
Nick Karanatsios8abe7172014-02-19 20:31:48 -080048import org.junit.runner.RunWith;
49import org.powermock.api.easymock.PowerMock;
50import org.powermock.core.classloader.annotations.PrepareForTest;
51import org.powermock.modules.junit4.PowerMockRunner;
Yuta HIGUCHI412add62014-07-25 13:03:43 -070052import org.slf4j.Logger;
53import org.slf4j.LoggerFactory;
Toshio Koidec87810e2014-02-11 13:03:21 -080054
55/**
Toshio Koidee04a9df2014-05-01 15:49:28 -070056 * Temporary test cases for the ONS2014 demo.
57 * These test cases should be modified and be moved to appropriate classes
58 * (ex. PathCalcRuntimeModuleTest, PlanInstallModuleTest, etc.)
Toshio Koidec87810e2014-02-11 13:03:21 -080059 */
Nick Karanatsios8abe7172014-02-19 20:31:48 -080060@RunWith(PowerMockRunner.class)
61@PrepareForTest(PathCalcRuntimeModule.class)
Ray Milkey38301352014-07-28 08:51:54 -070062public class UseCaseTest extends UnitTest {
Yuta HIGUCHI412add62014-07-25 13:03:43 -070063 private static final Logger log = LoggerFactory.getLogger(UseCaseTest.class);
64
Jonathan Harte37e4e22014-05-13 19:12:02 -070065 private Topology topology;
Ray Milkey269ffb92014-04-03 14:43:30 -070066 private FloodlightModuleContext modContext;
67 private IDatagridService datagridService;
Jonathan Harte37e4e22014-05-13 19:12:02 -070068 private ITopologyService topologyService;
Ray Milkey269ffb92014-04-03 14:43:30 -070069 private IControllerRegistryService controllerRegistryService;
70 private PersistIntent persistIntent;
Pavlin Radoslavov13669052014-05-13 10:33:39 -070071 private IRestApiService restApi;
Toshio Koidee04a9df2014-05-01 15:49:28 -070072 private IEventChannel<Long, IntentOperationList> intentOperationChannel;
73 private IEventChannel<Long, IntentStateList> intentStateChannel;
Toshio Koidec87810e2014-02-11 13:03:21 -080074
Yuta HIGUCHI44a0b352014-05-14 21:32:48 -070075 private static final Long LOCAL_PORT = 0xFFFEL;
Toshio Koidefe1d5d92014-02-26 20:09:48 -080076
Ray Milkey269ffb92014-04-03 14:43:30 -070077 @SuppressWarnings("unchecked")
78 @Before
79 public void setUp() throws Exception {
Yuta HIGUCHI44a0b352014-05-14 21:32:48 -070080 MockTopology mockTopology = new MockTopology();
81 mockTopology.createSampleTopology1();
82 this.topology = mockTopology;
Toshio Koide27ffd412014-02-18 19:15:27 -080083
Ray Milkey269ffb92014-04-03 14:43:30 -070084 datagridService = createMock(IDatagridService.class);
Jonathan Harte37e4e22014-05-13 19:12:02 -070085 topologyService = createMock(ITopologyService.class);
Ray Milkey269ffb92014-04-03 14:43:30 -070086 controllerRegistryService = createMock(IControllerRegistryService.class);
87 modContext = createMock(FloodlightModuleContext.class);
Toshio Koidee04a9df2014-05-01 15:49:28 -070088 intentOperationChannel = createMock(IEventChannel.class);
89 intentStateChannel = createMock(IEventChannel.class);
Ray Milkey269ffb92014-04-03 14:43:30 -070090 persistIntent = PowerMock.createMock(PersistIntent.class);
Pavlin Radoslavov13669052014-05-13 10:33:39 -070091 restApi = createMock(IRestApiService.class);
Toshio Koide798bc1b2014-02-20 14:02:40 -080092
Ray Milkey269ffb92014-04-03 14:43:30 -070093 PowerMock.expectNew(PersistIntent.class,
Pavlin Radoslavov0294e052014-04-10 13:36:45 -070094 anyObject(IControllerRegistryService.class)).andReturn(persistIntent);
Toshio Koide27ffd412014-02-18 19:15:27 -080095
Ray Milkey269ffb92014-04-03 14:43:30 -070096 expect(modContext.getServiceImpl(IDatagridService.class))
97 .andReturn(datagridService).once();
Jonathan Harte37e4e22014-05-13 19:12:02 -070098 expect(modContext.getServiceImpl(ITopologyService.class))
99 .andReturn(topologyService).once();
Ray Milkey269ffb92014-04-03 14:43:30 -0700100 expect(modContext.getServiceImpl(IControllerRegistryService.class))
101 .andReturn(controllerRegistryService).once();
102 expect(persistIntent.getKey()).andReturn(1L).anyTimes();
103 expect(persistIntent.persistIfLeader(eq(1L),
104 anyObject(IntentOperationList.class))).andReturn(true).anyTimes();
Pavlin Radoslavov13669052014-05-13 10:33:39 -0700105 expect(modContext.getServiceImpl(IRestApiService.class))
106 .andReturn(restApi).once();
Toshio Koide0c9106d2014-02-19 15:26:38 -0800107
Yuta HIGUCHI44a0b352014-05-14 21:32:48 -0700108 expect(topologyService.getTopology()).andReturn(mockTopology).anyTimes();
Jonathan Harte37e4e22014-05-13 19:12:02 -0700109 topologyService.registerTopologyListener(anyObject(ITopologyListener.class));
Ray Milkey269ffb92014-04-03 14:43:30 -0700110 expectLastCall();
Toshio Koide0c9106d2014-02-19 15:26:38 -0800111
Ray Milkey269ffb92014-04-03 14:43:30 -0700112 expect(datagridService.createChannel("onos.pathintent", Long.class, IntentOperationList.class))
Toshio Koidee04a9df2014-05-01 15:49:28 -0700113 .andReturn(intentOperationChannel).once();
Toshio Koide27ffd412014-02-18 19:15:27 -0800114
Ray Milkey269ffb92014-04-03 14:43:30 -0700115 expect(datagridService.addListener(
116 eq("onos.pathintent_state"),
117 anyObject(IEventChannelListener.class),
118 eq(Long.class),
119 eq(IntentStateList.class)))
Toshio Koidee04a9df2014-05-01 15:49:28 -0700120 .andReturn(intentStateChannel).once();
Pavlin Radoslavov13669052014-05-13 10:33:39 -0700121 restApi.addRestletRoutable(anyObject(IntentWebRoutable.class));
Toshio Koide066506e2014-02-20 19:52:09 -0800122
Ray Milkey269ffb92014-04-03 14:43:30 -0700123 replay(datagridService);
Jonathan Harte37e4e22014-05-13 19:12:02 -0700124 replay(topologyService);
Ray Milkey269ffb92014-04-03 14:43:30 -0700125 replay(modContext);
126 replay(controllerRegistryService);
127 PowerMock.replay(persistIntent, PersistIntent.class);
Pavlin Radoslavov13669052014-05-13 10:33:39 -0700128 replay(restApi);
Ray Milkey269ffb92014-04-03 14:43:30 -0700129 }
Toshio Koidec87810e2014-02-11 13:03:21 -0800130
Ray Milkey269ffb92014-04-03 14:43:30 -0700131 @After
132 public void tearDown() {
133 verify(datagridService);
Jonathan Harte37e4e22014-05-13 19:12:02 -0700134 verify(topologyService);
Ray Milkey269ffb92014-04-03 14:43:30 -0700135 verify(modContext);
136 verify(controllerRegistryService);
137 PowerMock.verify(persistIntent, PersistIntent.class);
Pavlin Radoslavov13669052014-05-13 10:33:39 -0700138 verify(restApi);
Ray Milkey269ffb92014-04-03 14:43:30 -0700139 }
Toshio Koidec87810e2014-02-11 13:03:21 -0800140
Ray Milkey269ffb92014-04-03 14:43:30 -0700141 private void showResult(PathIntentMap intents) {
142 for (Intent intent : intents.getAllIntents()) {
143 PathIntent pathIntent = (PathIntent) intent;
Yuta HIGUCHI412add62014-07-25 13:03:43 -0700144 log.debug("Path intent:" + pathIntent);
145 log.debug("Parent intent: " + pathIntent.getParentIntent().toString());
Ray Milkey269ffb92014-04-03 14:43:30 -0700146 }
147 }
Toshio Koidec87810e2014-02-11 13:03:21 -0800148
Ray Milkey269ffb92014-04-03 14:43:30 -0700149 @Test
150 public void createShortestPaths() throws FloodlightModuleException {
151 // create shortest path intents
152 IntentOperationList opList = new IntentOperationList();
153 opList.add(Operator.ADD, new ShortestPathIntent("1", 1L, 12L, LOCAL_PORT, 2L, 21L, LOCAL_PORT));
154 opList.add(Operator.ADD, new ShortestPathIntent("2", 1L, 14L, LOCAL_PORT, 4L, 41L, LOCAL_PORT));
155 opList.add(Operator.ADD, new ShortestPathIntent("3", 2L, 23L, LOCAL_PORT, 3L, 32L, LOCAL_PORT));
Toshio Koidec87810e2014-02-11 13:03:21 -0800156
Ray Milkey269ffb92014-04-03 14:43:30 -0700157 // compile high-level intent operations into low-level intent operations (calculate paths)
158 PathCalcRuntimeModule runtime1 = new PathCalcRuntimeModule();
159 runtime1.init(modContext);
160 runtime1.startUp(modContext);
161 IntentOperationList pathIntentOpList = runtime1.executeIntentOperations(opList);
Toshio Koide27ffd412014-02-18 19:15:27 -0800162
Ray Milkey269ffb92014-04-03 14:43:30 -0700163 // compile low-level intents into flow entry installation plan
164 PlanCalcRuntime runtime2 = new PlanCalcRuntime();
165 List<Set<FlowEntry>> plan = runtime2.computePlan(pathIntentOpList);
Toshio Koidec87810e2014-02-11 13:03:21 -0800166
Ray Milkey269ffb92014-04-03 14:43:30 -0700167 // show results
168 showResult((PathIntentMap) runtime1.getPathIntents());
Yuta HIGUCHI412add62014-07-25 13:03:43 -0700169 log.debug("{}", plan);
Ray Milkey269ffb92014-04-03 14:43:30 -0700170 }
Toshio Koidec87810e2014-02-11 13:03:21 -0800171
Ray Milkey269ffb92014-04-03 14:43:30 -0700172 @Test
173 public void createConstrainedShortestPaths() throws FloodlightModuleException {
174 // create constrained shortest path intents
175 IntentOperationList opList = new IntentOperationList();
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700176 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("1", 1L, 12L,
177 LOCAL_PORT, 2L, 21L, LOCAL_PORT, 400.0));
178 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("2", 1L, 14L,
179 LOCAL_PORT, 4L, 41L, LOCAL_PORT, 400.0));
180 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("3", 2L, 24L,
181 LOCAL_PORT, 4L, 42L, LOCAL_PORT, 400.0));
182 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("4", 2L, 23L,
183 LOCAL_PORT, 3L, 32L, LOCAL_PORT, 400.0));
184 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("5", 3L, 34L,
185 LOCAL_PORT, 4L, 43L, LOCAL_PORT, 400.0));
Toshio Koidec87810e2014-02-11 13:03:21 -0800186
Ray Milkey269ffb92014-04-03 14:43:30 -0700187 // compile high-level intent operations into low-level intent operations (calculate paths)
188 PathCalcRuntimeModule runtime1 = new PathCalcRuntimeModule();
189 runtime1.init(modContext);
190 runtime1.startUp(modContext);
191 IntentOperationList pathIntentOpList = runtime1.executeIntentOperations(opList);
Toshio Koidec87810e2014-02-11 13:03:21 -0800192
Ray Milkey269ffb92014-04-03 14:43:30 -0700193 // compile low-level intents into flow entry installation plan
194 PlanCalcRuntime runtime2 = new PlanCalcRuntime();
195 List<Set<FlowEntry>> plan = runtime2.computePlan(pathIntentOpList);
Brian O'Connor7f8e3012014-02-15 23:59:29 -0800196
Ray Milkey269ffb92014-04-03 14:43:30 -0700197 // show results
198 showResult((PathIntentMap) runtime1.getPathIntents());
Yuta HIGUCHI412add62014-07-25 13:03:43 -0700199 log.debug("{}", plan);
Ray Milkey269ffb92014-04-03 14:43:30 -0700200 }
Toshio Koidec87810e2014-02-11 13:03:21 -0800201
Ray Milkey269ffb92014-04-03 14:43:30 -0700202 @Test
203 public void createMixedShortestPaths() throws FloodlightModuleException {
204 // create constrained & best effort shortest path intents
205 IntentOperationList opList = new IntentOperationList();
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700206 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("1", 1L, 12L,
207 LOCAL_PORT, 2L, 21L, LOCAL_PORT, 400.0));
208 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("2", 1L, 14L,
209 LOCAL_PORT, 4L, 41L, LOCAL_PORT, 400.0));
210 opList.add(Operator.ADD, new ShortestPathIntent("3", 2L, 24L, LOCAL_PORT, 4L,
211 42L, LOCAL_PORT));
212 opList.add(Operator.ADD, new ShortestPathIntent("4", 2L, 23L, LOCAL_PORT, 3L,
213 32L, LOCAL_PORT));
214 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("5", 3L, 34L,
215 LOCAL_PORT, 4L, 43L, LOCAL_PORT, 400.0));
Toshio Koidec87810e2014-02-11 13:03:21 -0800216
Ray Milkey269ffb92014-04-03 14:43:30 -0700217 // compile high-level intent operations into low-level intent operations (calculate paths)
218 PathCalcRuntimeModule runtime1 = new PathCalcRuntimeModule();
219 runtime1.init(modContext);
220 runtime1.startUp(modContext);
221 IntentOperationList pathIntentOpList = runtime1.executeIntentOperations(opList);
Toshio Koidec87810e2014-02-11 13:03:21 -0800222
Ray Milkey269ffb92014-04-03 14:43:30 -0700223 // compile low-level intents into flow entry installation plan
224 PlanCalcRuntime runtime2 = new PlanCalcRuntime();
225 List<Set<FlowEntry>> plan = runtime2.computePlan(pathIntentOpList);
Brian O'Connor7f8e3012014-02-15 23:59:29 -0800226
Ray Milkey269ffb92014-04-03 14:43:30 -0700227 // show results
228 showResult((PathIntentMap) runtime1.getPathIntents());
Yuta HIGUCHI412add62014-07-25 13:03:43 -0700229 log.debug("{}", plan);
Ray Milkey269ffb92014-04-03 14:43:30 -0700230 }
Toshio Koided9fa2a82014-02-19 17:35:18 -0800231
Ray Milkey269ffb92014-04-03 14:43:30 -0700232 @Test
233 public void rerouteShortestPaths() throws FloodlightModuleException {
Pavlin Radoslavovcac157d2014-07-31 13:54:08 -0700234 List<MastershipEvent> addedMastershipEvents = new LinkedList<>();
235 List<MastershipEvent> removedMastershipEvents = new LinkedList<>();
Ray Milkey269ffb92014-04-03 14:43:30 -0700236 List<SwitchEvent> addedSwitchEvents = new LinkedList<>();
237 List<SwitchEvent> removedSwitchEvents = new LinkedList<>();
238 List<PortEvent> addedPortEvents = new LinkedList<>();
239 List<PortEvent> removedPortEvents = new LinkedList<>();
240 List<LinkEvent> addedLinkEvents = new LinkedList<>();
241 List<LinkEvent> removedLinkEvents = new LinkedList<>();
Yuta HIGUCHIbfc77f02014-07-14 22:50:25 -0700242 List<HostEvent> addedHostEvents = new LinkedList<>();
243 List<HostEvent> removedHostEvents = new LinkedList<>();
Pavlin Radoslavov4eaab992014-07-03 18:39:42 -0700244 TopologyEvents topologyEvents;
Pavlin Radoslavov74986ce2014-02-20 13:17:20 -0800245
Ray Milkey269ffb92014-04-03 14:43:30 -0700246 // create shortest path intents
247 IntentOperationList opList = new IntentOperationList();
248 opList.add(Operator.ADD, new ShortestPathIntent("1", 1L, 12L, LOCAL_PORT, 2L, 21L, LOCAL_PORT));
249 opList.add(Operator.ADD, new ShortestPathIntent("2", 1L, 14L, LOCAL_PORT, 4L, 41L, LOCAL_PORT));
250 opList.add(Operator.ADD, new ShortestPathIntent("3", 2L, 23L, LOCAL_PORT, 3L, 32L, LOCAL_PORT));
Toshio Koide0c9106d2014-02-19 15:26:38 -0800251
Ray Milkey269ffb92014-04-03 14:43:30 -0700252 // compile high-level intent operations into low-level intent operations (calculate paths)
253 PathCalcRuntimeModule runtime1 = new PathCalcRuntimeModule();
254 runtime1.init(modContext);
255 runtime1.startUp(modContext);
256 IntentOperationList pathIntentOpList = runtime1.executeIntentOperations(opList);
Toshio Koide0c9106d2014-02-19 15:26:38 -0800257
Ray Milkey269ffb92014-04-03 14:43:30 -0700258 // compile low-level intents into flow entry installation plan
259 PlanCalcRuntime runtime2 = new PlanCalcRuntime();
260 List<Set<FlowEntry>> plan = runtime2.computePlan(pathIntentOpList);
Toshio Koide0c9106d2014-02-19 15:26:38 -0800261
Ray Milkey269ffb92014-04-03 14:43:30 -0700262 // show results step1
263 showResult((PathIntentMap) runtime1.getPathIntents());
Yuta HIGUCHI412add62014-07-25 13:03:43 -0700264 log.debug("{}", plan);
Toshio Koide0c9106d2014-02-19 15:26:38 -0800265
Ray Milkey269ffb92014-04-03 14:43:30 -0700266 // TODO this state changes should be triggered by notification of plan module
267 IntentStateList states = new IntentStateList();
268 states.put("1", IntentState.INST_ACK);
269 states.put("2", IntentState.INST_ACK);
270 states.put("3", IntentState.INST_ACK);
271 runtime1.getHighLevelIntents().changeStates(states);
272 states.clear();
273 states.put("1___0", IntentState.INST_ACK);
274 states.put("2___0", IntentState.INST_ACK);
275 states.put("3___0", IntentState.INST_ACK);
276 runtime1.getPathIntents().changeStates(states);
Toshio Koidea10c0372014-02-20 17:28:10 -0800277
Ray Milkey269ffb92014-04-03 14:43:30 -0700278 // link down
Jonathan Harte37e4e22014-05-13 19:12:02 -0700279 ((MockTopology) topology).removeLink(1L, 12L, 2L, 21L); // This link is used by the intent "1"
280 ((MockTopology) topology).removeLink(2L, 21L, 1L, 12L);
Yuta HIGUCHIe2a4e172014-07-03 10:50:39 -0700281 LinkEvent linkEvent1 = new LinkEvent(new SwitchPort(1L, 12L), new SwitchPort(2L, 21L));
282 LinkEvent linkEvent2 = new LinkEvent(new SwitchPort(2L, 21L), new SwitchPort(1L, 12L));
Ray Milkey269ffb92014-04-03 14:43:30 -0700283 removedLinkEvents.clear();
284 removedLinkEvents.add(linkEvent1);
285 removedLinkEvents.add(linkEvent2);
Pavlin Radoslavov4eaab992014-07-03 18:39:42 -0700286
Pavlin Radoslavovcac157d2014-07-31 13:54:08 -0700287 topologyEvents = new TopologyEvents(addedMastershipEvents,
288 removedMastershipEvents,
289 addedSwitchEvents,
Pavlin Radoslavov4eaab992014-07-03 18:39:42 -0700290 removedSwitchEvents,
291 addedPortEvents,
292 removedPortEvents,
293 addedLinkEvents,
294 removedLinkEvents,
Yuta HIGUCHIbfc77f02014-07-14 22:50:25 -0700295 addedHostEvents,
296 removedHostEvents);
Pavlin Radoslavov4eaab992014-07-03 18:39:42 -0700297
298 runtime1.topologyEvents(topologyEvents);
Yuta HIGUCHI412add62014-07-25 13:03:43 -0700299 log.debug("*** Link goes down. ***");
Toshio Koide7d3cee02014-06-05 18:56:19 -0700300
301 // send notification
302 IntentStateList isl = new IntentStateList();
303 isl.put("1___0", IntentState.DEL_ACK);
304 isl.put("1___1", IntentState.INST_ACK);
305 isl.domainSwitchDpids.add(1L);
306 isl.domainSwitchDpids.add(2L);
307 isl.domainSwitchDpids.add(4L);
308 runtime1.entryUpdated(isl);
Toshio Koide0c9106d2014-02-19 15:26:38 -0800309
Ray Milkey269ffb92014-04-03 14:43:30 -0700310 // show results step2
311 showResult((PathIntentMap) runtime1.getPathIntents());
Toshio Koide7d3cee02014-06-05 18:56:19 -0700312
313 // link up
314 ((MockTopology) topology).addBidirectionalLinks(1L, 12L, 2L, 21L);
Yuta HIGUCHIe2a4e172014-07-03 10:50:39 -0700315 linkEvent1 = new LinkEvent(new SwitchPort(1L, 12L), new SwitchPort(2L, 21L));
316 linkEvent2 = new LinkEvent(new SwitchPort(2L, 21L), new SwitchPort(1L, 12L));
Toshio Koide7d3cee02014-06-05 18:56:19 -0700317 removedLinkEvents.clear();
318 addedLinkEvents.clear();
319 addedLinkEvents.add(linkEvent1);
320 addedLinkEvents.add(linkEvent2);
Pavlin Radoslavov4eaab992014-07-03 18:39:42 -0700321
Pavlin Radoslavovcac157d2014-07-31 13:54:08 -0700322 topologyEvents = new TopologyEvents(addedMastershipEvents,
323 removedMastershipEvents,
324 addedSwitchEvents,
Pavlin Radoslavov4eaab992014-07-03 18:39:42 -0700325 removedSwitchEvents,
326 addedPortEvents,
327 removedPortEvents,
328 addedLinkEvents,
329 removedLinkEvents,
Yuta HIGUCHIbfc77f02014-07-14 22:50:25 -0700330 addedHostEvents,
331 removedHostEvents);
Pavlin Radoslavov4eaab992014-07-03 18:39:42 -0700332
333 runtime1.topologyEvents(topologyEvents);
Yuta HIGUCHI412add62014-07-25 13:03:43 -0700334 log.debug("*** Link goes up. ***");
Toshio Koide7d3cee02014-06-05 18:56:19 -0700335
336 // send notification
337 isl = new IntentStateList();
338 isl.put("1___1", IntentState.DEL_ACK);
339 isl.put("1___2", IntentState.INST_ACK);
340 isl.domainSwitchDpids.add(1L);
341 isl.domainSwitchDpids.add(2L);
342 isl.domainSwitchDpids.add(4L);
343 runtime1.entryUpdated(isl);
344
345 // show results step3
346 showResult((PathIntentMap) runtime1.getPathIntents());
347
Ray Milkey269ffb92014-04-03 14:43:30 -0700348 // TODO: show results of plan computation
349 }
Toshio Koidefa735a12014-03-28 10:49:07 -0700350
351
Ray Milkey269ffb92014-04-03 14:43:30 -0700352 @Test
353 public void createAndRemoveShortestPaths() throws FloodlightModuleException {
354 // create shortest path intents
355 IntentOperationList opList = new IntentOperationList();
356 opList.add(Operator.ADD, new ShortestPathIntent("1", 1L, 12L, LOCAL_PORT, 2L, 21L, LOCAL_PORT));
357 opList.add(Operator.ADD, new ShortestPathIntent("2", 1L, 14L, LOCAL_PORT, 4L, 41L, LOCAL_PORT));
358 opList.add(Operator.ADD, new ShortestPathIntent("3", 2L, 23L, LOCAL_PORT, 3L, 32L, LOCAL_PORT));
Toshio Koidefa735a12014-03-28 10:49:07 -0700359
Ray Milkey269ffb92014-04-03 14:43:30 -0700360 // compile high-level intent operations into low-level intent operations (calculate paths)
361 PathCalcRuntimeModule runtime1 = new PathCalcRuntimeModule();
362 runtime1.init(modContext);
363 runtime1.startUp(modContext);
364 IntentOperationList pathIntentOpList = runtime1.executeIntentOperations(opList);
Toshio Koidefa735a12014-03-28 10:49:07 -0700365
Ray Milkey269ffb92014-04-03 14:43:30 -0700366 // compile low-level intents into flow entry installation plan
367 PlanCalcRuntime runtime2 = new PlanCalcRuntime();
368 List<Set<FlowEntry>> plan = runtime2.computePlan(pathIntentOpList);
Toshio Koidefa735a12014-03-28 10:49:07 -0700369
Ray Milkey269ffb92014-04-03 14:43:30 -0700370 // show results
371 showResult((PathIntentMap) runtime1.getPathIntents());
Yuta HIGUCHI412add62014-07-25 13:03:43 -0700372 log.debug("{}", plan);
Toshio Koidefa735a12014-03-28 10:49:07 -0700373
Ray Milkey269ffb92014-04-03 14:43:30 -0700374 // create remove operations
375 opList.clear();
376 opList.add(Operator.REMOVE, new Intent("1"));
377 opList.add(Operator.REMOVE, new Intent("2"));
Toshio Koidefa735a12014-03-28 10:49:07 -0700378
Ray Milkey269ffb92014-04-03 14:43:30 -0700379 // compile
380 runtime1.executeIntentOperations(opList);
Toshio Koidefa735a12014-03-28 10:49:07 -0700381
Ray Milkey269ffb92014-04-03 14:43:30 -0700382 // show results
383 showResult((PathIntentMap) runtime1.getPathIntents());
Yuta HIGUCHI412add62014-07-25 13:03:43 -0700384 log.debug("{}", plan);
Ray Milkey269ffb92014-04-03 14:43:30 -0700385 }
Toshio Koidefa735a12014-03-28 10:49:07 -0700386
Toshio Koidec87810e2014-02-11 13:03:21 -0800387}