blob: a6278b25997540b3f4bfb7cd998d5bf00ad464bd [file] [log] [blame]
Charles Chan2ff1bac2018-03-29 16:03:41 -07001/*
2 * Copyright 2018-present Open Networking Foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.segmentrouting;
17
18import com.google.common.collect.Sets;
19import org.junit.Before;
20import org.junit.Test;
21import org.onlab.packet.IpAddress;
22import org.onosproject.cluster.ClusterService;
23import org.onosproject.cluster.DefaultControllerNode;
24import org.onosproject.cluster.NodeId;
25import org.onosproject.mastership.MastershipService;
26import org.onosproject.net.DeviceId;
27import org.onosproject.net.device.DeviceService;
28import org.onosproject.segmentrouting.config.DeviceConfiguration;
29import org.onosproject.store.service.StorageService;
30import org.onosproject.store.service.TestConsistentMap;
pier41d389a2020-01-07 15:39:39 +010031import org.onosproject.store.service.TestConsistentMultimap;
Charles Chan2ff1bac2018-03-29 16:03:41 -070032
33import java.util.Optional;
34
35import static org.easymock.EasyMock.createMock;
36import static org.easymock.EasyMock.expect;
37import static org.easymock.EasyMock.replay;
38import static org.easymock.EasyMock.reset;
39import static org.junit.Assert.*;
40
41public class DefaultRoutingHandlerTest {
42 private SegmentRoutingManager srManager;
43 private DefaultRoutingHandler dfh;
44
45 private static final DeviceId DEV1A = DeviceId.deviceId("of:1a");
46 private static final DeviceId DEV1B = DeviceId.deviceId("of:1b");
47 private static final DeviceId DEV2 = DeviceId.deviceId("of:2");
48
49 private static final NodeId NODE1 = NodeId.nodeId("192.168.1.1");
50 private static final NodeId NODE2 = NodeId.nodeId("192.168.1.2");
51 private static final NodeId NODE3 = NodeId.nodeId("192.168.1.3");
52 private static final IpAddress IP1 = IpAddress.valueOf("192.168.1.1");
53 private static final IpAddress IP2 = IpAddress.valueOf("192.168.1.2");
54 private static final IpAddress IP3 = IpAddress.valueOf("192.168.1.3");
55
56 @Before
57 public void setUp() {
58 srManager = createMock(SegmentRoutingManager.class);
59 srManager.storageService = createMock(StorageService.class);
60 expect(srManager.storageService.consistentMapBuilder()).andReturn(new TestConsistentMap.Builder<>()).anyTimes();
pier41d389a2020-01-07 15:39:39 +010061 expect(srManager.storageService.consistentMultimapBuilder()).andReturn(
62 new TestConsistentMultimap.Builder<>()).anyTimes();
Charles Chan2ff1bac2018-03-29 16:03:41 -070063 replay(srManager.storageService);
64 srManager.routingRulePopulator = createMock(RoutingRulePopulator.class);
65 srManager.deviceService = createMock(DeviceService.class);
66 srManager.deviceConfiguration = createMock(DeviceConfiguration.class);
67 srManager.mastershipService = createMock(MastershipService.class);
68 srManager.clusterService = createMock(ClusterService.class);
69 dfh = new DefaultRoutingHandler(srManager);
70 }
71
Charles Chan50bb6ef2018-04-18 18:41:05 -070072 private void clearCache() {
73 dfh.invalidateShouldProgramCache(DEV1A);
74 dfh.invalidateShouldProgramCache(DEV1B);
75 dfh.invalidateShouldProgramCache(DEV2);
76 }
77
Charles Chan2ff1bac2018-03-29 16:03:41 -070078 // Node 1 is the master of switch 1A, 1B, and 2
79 @Test
80 public void testShouldHandleRoutingCase1() {
81 expect(srManager.mastershipService.getMasterFor(DEV1A)).andReturn(NODE1).anyTimes();
82 expect(srManager.mastershipService.getMasterFor(DEV1B)).andReturn(NODE1).anyTimes();
83 expect(srManager.mastershipService.getMasterFor(DEV2)).andReturn(NODE1).anyTimes();
84 replay(srManager.mastershipService);
85
86 expect(srManager.getPairDeviceId(DEV1A)).andReturn(Optional.of(DEV1B)).anyTimes();
87 expect(srManager.getPairDeviceId(DEV1B)).andReturn(Optional.of(DEV1A)).anyTimes();
88 expect(srManager.getPairDeviceId(DEV2)).andReturn(Optional.empty()).anyTimes();
89 replay(srManager);
90
91 // Node 1 should program every device
92 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE1, IP1)).anyTimes();
93 replay(srManager.clusterService);
94 assertTrue(dfh.shouldProgram(DEV1A));
95 assertTrue(dfh.shouldProgram(DEV1B));
96 assertTrue(dfh.shouldProgram(DEV2));
97
98 reset(srManager.clusterService);
Charles Chan50bb6ef2018-04-18 18:41:05 -070099 clearCache();
Charles Chan2ff1bac2018-03-29 16:03:41 -0700100
101 // Node 2 should program no device
102 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE2, IP2)).anyTimes();
103 replay(srManager.clusterService);
104 assertFalse(dfh.shouldProgram(DEV1A));
105 assertFalse(dfh.shouldProgram(DEV1B));
106 assertFalse(dfh.shouldProgram(DEV2));
107
108 reset(srManager.clusterService);
Charles Chan50bb6ef2018-04-18 18:41:05 -0700109 clearCache();
Charles Chan2ff1bac2018-03-29 16:03:41 -0700110
111 // Node 3 should program no device
112 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE3, IP3)).anyTimes();
113 replay(srManager.clusterService);
114 assertFalse(dfh.shouldProgram(DEV1A));
115 assertFalse(dfh.shouldProgram(DEV1B));
116 assertFalse(dfh.shouldProgram(DEV2));
117 }
118
119 // Node 1 is the master of switch 1A, 1B
120 // Node 2 is the master of switch 2
121 @Test
122 public void testShouldHandleRoutingCase2() {
123 expect(srManager.mastershipService.getMasterFor(DEV1A)).andReturn(NODE1).anyTimes();
124 expect(srManager.mastershipService.getMasterFor(DEV1B)).andReturn(NODE1).anyTimes();
125 expect(srManager.mastershipService.getMasterFor(DEV2)).andReturn(NODE2).anyTimes();
126 replay(srManager.mastershipService);
127
128 expect(srManager.getPairDeviceId(DEV1A)).andReturn(Optional.of(DEV1B)).anyTimes();
129 expect(srManager.getPairDeviceId(DEV1B)).andReturn(Optional.of(DEV1A)).anyTimes();
130 expect(srManager.getPairDeviceId(DEV2)).andReturn(Optional.empty()).anyTimes();
131 replay(srManager);
132
133 // Node 1 should program 1A, 1B
134 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE1, IP1)).anyTimes();
135 replay(srManager.clusterService);
136 assertTrue(dfh.shouldProgram(DEV1A));
137 assertTrue(dfh.shouldProgram(DEV1B));
138 assertFalse(dfh.shouldProgram(DEV2));
139
140 reset(srManager.clusterService);
Charles Chan50bb6ef2018-04-18 18:41:05 -0700141 clearCache();
Charles Chan2ff1bac2018-03-29 16:03:41 -0700142
143 // Node 2 should program 2
144 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE2, IP2)).anyTimes();
145 replay(srManager.clusterService);
146 assertFalse(dfh.shouldProgram(DEV1A));
147 assertFalse(dfh.shouldProgram(DEV1B));
148 assertTrue(dfh.shouldProgram(DEV2));
149
150 reset(srManager.clusterService);
Charles Chan50bb6ef2018-04-18 18:41:05 -0700151 clearCache();
Charles Chan2ff1bac2018-03-29 16:03:41 -0700152
153 // Node 3 should program no device
154 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE3, IP3)).anyTimes();
155 replay(srManager.clusterService);
156 assertFalse(dfh.shouldProgram(DEV1A));
157 assertFalse(dfh.shouldProgram(DEV1B));
158 assertFalse(dfh.shouldProgram(DEV2));
159 }
160
161 // Node 1 is the master of switch 1A
162 // Node 2 is the master of switch 1B
163 // Node 3 is the master of switch 2
164 @Test
165 public void testShouldHandleRoutingCase3() {
166 expect(srManager.mastershipService.getMasterFor(DEV1A)).andReturn(NODE1).anyTimes();
167 expect(srManager.mastershipService.getMasterFor(DEV1B)).andReturn(NODE2).anyTimes();
168 expect(srManager.mastershipService.getMasterFor(DEV2)).andReturn(NODE3).anyTimes();
169 replay(srManager.mastershipService);
170
171 expect(srManager.getPairDeviceId(DEV1A)).andReturn(Optional.of(DEV1B)).anyTimes();
172 expect(srManager.getPairDeviceId(DEV1B)).andReturn(Optional.of(DEV1A)).anyTimes();
173 expect(srManager.getPairDeviceId(DEV2)).andReturn(Optional.empty()).anyTimes();
174 replay(srManager);
175
176 // Node 1 should program 1A, 1B
177 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE1, IP1)).anyTimes();
178 replay(srManager.clusterService);
179 assertTrue(dfh.shouldProgram(DEV1A));
180 assertTrue(dfh.shouldProgram(DEV1B));
181 assertFalse(dfh.shouldProgram(DEV2));
182
183 reset(srManager.clusterService);
Charles Chan50bb6ef2018-04-18 18:41:05 -0700184 clearCache();
Charles Chan2ff1bac2018-03-29 16:03:41 -0700185
186 // Node 2 should program no device
187 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE2, IP2)).anyTimes();
188 replay(srManager.clusterService);
189 assertFalse(dfh.shouldProgram(DEV1A));
190 assertFalse(dfh.shouldProgram(DEV1B));
191 assertFalse(dfh.shouldProgram(DEV2));
192
193 reset(srManager.clusterService);
Charles Chan50bb6ef2018-04-18 18:41:05 -0700194 clearCache();
Charles Chan2ff1bac2018-03-29 16:03:41 -0700195
196 // Node 3 should program 2
197 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE3, IP3)).anyTimes();
198 replay(srManager.clusterService);
199 assertFalse(dfh.shouldProgram(DEV1A));
200 assertFalse(dfh.shouldProgram(DEV1B));
201 assertTrue(dfh.shouldProgram(DEV2));
202 }
203
204 // Node 3 is the master of switch 1A, 1B, 2
205 // Later on, node 1 becomes the master of 1A; Node 2 becomes the master of 1B.
206 @Test
207 public void testShouldHandleRoutingCase4() {
208 expect(srManager.mastershipService.getMasterFor(DEV1A)).andReturn(NODE3).anyTimes();
209 expect(srManager.mastershipService.getMasterFor(DEV1B)).andReturn(NODE3).anyTimes();
210 expect(srManager.mastershipService.getMasterFor(DEV2)).andReturn(NODE3).anyTimes();
211 replay(srManager.mastershipService);
212
213 expect(srManager.getPairDeviceId(DEV1A)).andReturn(Optional.of(DEV1B)).anyTimes();
214 expect(srManager.getPairDeviceId(DEV1B)).andReturn(Optional.of(DEV1A)).anyTimes();
215 expect(srManager.getPairDeviceId(DEV2)).andReturn(Optional.empty()).anyTimes();
216 replay(srManager);
217
218 // Node 1 should program no device
219 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE1, IP1)).anyTimes();
220 replay(srManager.clusterService);
221 assertFalse(dfh.shouldProgram(DEV1A));
222 assertFalse(dfh.shouldProgram(DEV1B));
223 assertFalse(dfh.shouldProgram(DEV2));
224
225 reset(srManager.clusterService);
Charles Chan50bb6ef2018-04-18 18:41:05 -0700226 clearCache();
Charles Chan2ff1bac2018-03-29 16:03:41 -0700227
228 // Node 2 should program no device
229 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE2, IP2)).anyTimes();
230 replay(srManager.clusterService);
231 assertFalse(dfh.shouldProgram(DEV1A));
232 assertFalse(dfh.shouldProgram(DEV1B));
233 assertFalse(dfh.shouldProgram(DEV2));
234
235 reset(srManager.clusterService);
Charles Chan50bb6ef2018-04-18 18:41:05 -0700236 clearCache();
Charles Chan2ff1bac2018-03-29 16:03:41 -0700237
238 // Node 3 should program 1A, 1B and 2
239 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE3, IP3)).anyTimes();
240 replay(srManager.clusterService);
241 assertTrue(dfh.shouldProgram(DEV1A));
242 assertTrue(dfh.shouldProgram(DEV1B));
243 assertTrue(dfh.shouldProgram(DEV2));
244
245 // Mastership of switch 1A moves to Node 1
246 reset(srManager.mastershipService);
247 expect(srManager.mastershipService.getMasterFor(DEV1A)).andReturn(NODE1).anyTimes();
248 expect(srManager.mastershipService.getMasterFor(DEV1B)).andReturn(NODE2).anyTimes();
249 expect(srManager.mastershipService.getMasterFor(DEV2)).andReturn(NODE3).anyTimes();
250 replay(srManager.mastershipService);
251
252 reset(srManager.clusterService);
Charles Chan50bb6ef2018-04-18 18:41:05 -0700253 clearCache();
Charles Chan2ff1bac2018-03-29 16:03:41 -0700254
255 // Node 1 should program 1A, 1B
256 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE1, IP1)).anyTimes();
257 replay(srManager.clusterService);
258 assertTrue(dfh.shouldProgram(DEV1A));
259 assertTrue(dfh.shouldProgram(DEV1B));
260 assertFalse(dfh.shouldProgram(DEV2));
261
262 reset(srManager.clusterService);
Charles Chan50bb6ef2018-04-18 18:41:05 -0700263 clearCache();
Charles Chan2ff1bac2018-03-29 16:03:41 -0700264
265 // Node 2 should program no device
266 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE2, IP2)).anyTimes();
267 replay(srManager.clusterService);
268 assertFalse(dfh.shouldProgram(DEV1A));
269 assertFalse(dfh.shouldProgram(DEV1B));
270 assertFalse(dfh.shouldProgram(DEV2));
271
272 reset(srManager.clusterService);
Charles Chan50bb6ef2018-04-18 18:41:05 -0700273 clearCache();
Charles Chan2ff1bac2018-03-29 16:03:41 -0700274
275 // Node 3 should program 2
276 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE3, IP3)).anyTimes();
277 replay(srManager.clusterService);
278 assertFalse(dfh.shouldProgram(DEV1A));
279 assertFalse(dfh.shouldProgram(DEV1B));
280 assertTrue(dfh.shouldProgram(DEV2));
281 }
282
283 // Node 1 is the master of 1A. 1B has no master
284 // Node 2 becomes the master of 1B later
285 @Test
286 public void testShouldHandleRoutingCase5() {
287 expect(srManager.mastershipService.getMasterFor(DEV1A)).andReturn(NODE1).anyTimes();
288 expect(srManager.mastershipService.getMasterFor(DEV1B)).andReturn(null).anyTimes();
289 replay(srManager.mastershipService);
290
291 expect(srManager.getPairDeviceId(DEV1A)).andReturn(Optional.of(DEV1B)).anyTimes();
292 expect(srManager.getPairDeviceId(DEV1B)).andReturn(Optional.of(DEV1A)).anyTimes();
293 replay(srManager);
294
295 // Node 1 should program both 1A and 1B
296 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE1, IP1)).anyTimes();
297 replay(srManager.clusterService);
298 assertTrue(dfh.shouldProgram(DEV1A));
299 assertTrue(dfh.shouldProgram(DEV1B));
300
301 reset(srManager.clusterService);
Charles Chan50bb6ef2018-04-18 18:41:05 -0700302 clearCache();
Charles Chan2ff1bac2018-03-29 16:03:41 -0700303
304 // Node 2 should program no device
305 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE2, IP2)).anyTimes();
306 replay(srManager.clusterService);
307 assertFalse(dfh.shouldProgram(DEV1A));
308 assertFalse(dfh.shouldProgram(DEV1B));
309
310 // Mastership of switch 1B moves to Node 2
311 reset(srManager.mastershipService);
312 expect(srManager.mastershipService.getMasterFor(DEV1A)).andReturn(NODE1).anyTimes();
313 expect(srManager.mastershipService.getMasterFor(DEV1B)).andReturn(NODE2).anyTimes();
314 replay(srManager.mastershipService);
315
316 reset(srManager.clusterService);
Charles Chan50bb6ef2018-04-18 18:41:05 -0700317 clearCache();
Charles Chan2ff1bac2018-03-29 16:03:41 -0700318
319 // Node 1 should program 1A, 1B
320 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE1, IP1)).anyTimes();
321 replay(srManager.clusterService);
322 assertTrue(dfh.shouldProgram(DEV1A));
323 assertTrue(dfh.shouldProgram(DEV1B));
324
325 reset(srManager.clusterService);
Charles Chan50bb6ef2018-04-18 18:41:05 -0700326 clearCache();
Charles Chan2ff1bac2018-03-29 16:03:41 -0700327
328 // Node 2 should program no device
329 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE2, IP2)).anyTimes();
330 replay(srManager.clusterService);
331 assertFalse(dfh.shouldProgram(DEV1A));
332 assertFalse(dfh.shouldProgram(DEV1B));
333 }
334
335 // Neither 1A or 1B has master
336 @Test
337 public void testShouldHandleRoutingCase6() {
338 expect(srManager.mastershipService.getMasterFor(DEV1A)).andReturn(null).anyTimes();
339 expect(srManager.mastershipService.getMasterFor(DEV1B)).andReturn(null).anyTimes();
340 replay(srManager.mastershipService);
341
342 expect(srManager.getPairDeviceId(DEV1A)).andReturn(Optional.of(DEV1B)).anyTimes();
343 expect(srManager.getPairDeviceId(DEV1B)).andReturn(Optional.of(DEV1A)).anyTimes();
344 replay(srManager);
345
346 // Node 1 should program no device
347 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE1, IP1)).anyTimes();
348 replay(srManager.clusterService);
349 assertFalse(dfh.shouldProgram(DEV1A));
350 assertFalse(dfh.shouldProgram(DEV1B));
351
352 reset(srManager.clusterService);
Charles Chan50bb6ef2018-04-18 18:41:05 -0700353 clearCache();
Charles Chan2ff1bac2018-03-29 16:03:41 -0700354
355 // Node 2 should program no device
356 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE2, IP2)).anyTimes();
357 replay(srManager.clusterService);
358 assertFalse(dfh.shouldProgram(DEV1A));
359 assertFalse(dfh.shouldProgram(DEV1B));
360
361 assertFalse(dfh.shouldProgram.containsKey(Sets.newHashSet(DEV1A, DEV1B)));
362 }
363}