blob: 059b9ca90ca36de445fea1272a063a9b8e7eee80 [file] [log] [blame]
Charles Chand66d6712018-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;
Charles Chand66d6712018-03-29 16:03:41 -070028import org.onosproject.store.service.StorageService;
29import org.onosproject.store.service.TestConsistentMap;
pierf331a492020-01-07 15:39:39 +010030import org.onosproject.store.service.TestConsistentMultimap;
Charles Chand66d6712018-03-29 16:03:41 -070031
32import java.util.Optional;
33
34import static org.easymock.EasyMock.createMock;
35import static org.easymock.EasyMock.expect;
36import static org.easymock.EasyMock.replay;
37import static org.easymock.EasyMock.reset;
38import static org.junit.Assert.*;
39
40public class DefaultRoutingHandlerTest {
41 private SegmentRoutingManager srManager;
42 private DefaultRoutingHandler dfh;
43
44 private static final DeviceId DEV1A = DeviceId.deviceId("of:1a");
45 private static final DeviceId DEV1B = DeviceId.deviceId("of:1b");
46 private static final DeviceId DEV2 = DeviceId.deviceId("of:2");
47
48 private static final NodeId NODE1 = NodeId.nodeId("192.168.1.1");
49 private static final NodeId NODE2 = NodeId.nodeId("192.168.1.2");
50 private static final NodeId NODE3 = NodeId.nodeId("192.168.1.3");
51 private static final IpAddress IP1 = IpAddress.valueOf("192.168.1.1");
52 private static final IpAddress IP2 = IpAddress.valueOf("192.168.1.2");
53 private static final IpAddress IP3 = IpAddress.valueOf("192.168.1.3");
54
55 @Before
56 public void setUp() {
57 srManager = createMock(SegmentRoutingManager.class);
58 srManager.storageService = createMock(StorageService.class);
59 expect(srManager.storageService.consistentMapBuilder()).andReturn(new TestConsistentMap.Builder<>()).anyTimes();
pierf331a492020-01-07 15:39:39 +010060 expect(srManager.storageService.consistentMultimapBuilder()).andReturn(
61 new TestConsistentMultimap.Builder<>()).anyTimes();
Charles Chand66d6712018-03-29 16:03:41 -070062 replay(srManager.storageService);
63 srManager.routingRulePopulator = createMock(RoutingRulePopulator.class);
64 srManager.deviceService = createMock(DeviceService.class);
65 srManager.deviceConfiguration = createMock(DeviceConfiguration.class);
66 srManager.mastershipService = createMock(MastershipService.class);
67 srManager.clusterService = createMock(ClusterService.class);
68 dfh = new DefaultRoutingHandler(srManager);
69 }
70
Charles Chanfbcb8812018-04-18 18:41:05 -070071 private void clearCache() {
72 dfh.invalidateShouldProgramCache(DEV1A);
73 dfh.invalidateShouldProgramCache(DEV1B);
74 dfh.invalidateShouldProgramCache(DEV2);
75 }
76
Charles Chand66d6712018-03-29 16:03:41 -070077 // Node 1 is the master of switch 1A, 1B, and 2
78 @Test
79 public void testShouldHandleRoutingCase1() {
80 expect(srManager.mastershipService.getMasterFor(DEV1A)).andReturn(NODE1).anyTimes();
81 expect(srManager.mastershipService.getMasterFor(DEV1B)).andReturn(NODE1).anyTimes();
82 expect(srManager.mastershipService.getMasterFor(DEV2)).andReturn(NODE1).anyTimes();
83 replay(srManager.mastershipService);
84
85 expect(srManager.getPairDeviceId(DEV1A)).andReturn(Optional.of(DEV1B)).anyTimes();
86 expect(srManager.getPairDeviceId(DEV1B)).andReturn(Optional.of(DEV1A)).anyTimes();
87 expect(srManager.getPairDeviceId(DEV2)).andReturn(Optional.empty()).anyTimes();
88 replay(srManager);
89
90 // Node 1 should program every device
91 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE1, IP1)).anyTimes();
92 replay(srManager.clusterService);
93 assertTrue(dfh.shouldProgram(DEV1A));
94 assertTrue(dfh.shouldProgram(DEV1B));
95 assertTrue(dfh.shouldProgram(DEV2));
96
97 reset(srManager.clusterService);
Charles Chanfbcb8812018-04-18 18:41:05 -070098 clearCache();
Charles Chand66d6712018-03-29 16:03:41 -070099
100 // Node 2 should program no device
101 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE2, IP2)).anyTimes();
102 replay(srManager.clusterService);
103 assertFalse(dfh.shouldProgram(DEV1A));
104 assertFalse(dfh.shouldProgram(DEV1B));
105 assertFalse(dfh.shouldProgram(DEV2));
106
107 reset(srManager.clusterService);
Charles Chanfbcb8812018-04-18 18:41:05 -0700108 clearCache();
Charles Chand66d6712018-03-29 16:03:41 -0700109
110 // Node 3 should program no device
111 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE3, IP3)).anyTimes();
112 replay(srManager.clusterService);
113 assertFalse(dfh.shouldProgram(DEV1A));
114 assertFalse(dfh.shouldProgram(DEV1B));
115 assertFalse(dfh.shouldProgram(DEV2));
116 }
117
118 // Node 1 is the master of switch 1A, 1B
119 // Node 2 is the master of switch 2
120 @Test
121 public void testShouldHandleRoutingCase2() {
122 expect(srManager.mastershipService.getMasterFor(DEV1A)).andReturn(NODE1).anyTimes();
123 expect(srManager.mastershipService.getMasterFor(DEV1B)).andReturn(NODE1).anyTimes();
124 expect(srManager.mastershipService.getMasterFor(DEV2)).andReturn(NODE2).anyTimes();
125 replay(srManager.mastershipService);
126
127 expect(srManager.getPairDeviceId(DEV1A)).andReturn(Optional.of(DEV1B)).anyTimes();
128 expect(srManager.getPairDeviceId(DEV1B)).andReturn(Optional.of(DEV1A)).anyTimes();
129 expect(srManager.getPairDeviceId(DEV2)).andReturn(Optional.empty()).anyTimes();
130 replay(srManager);
131
132 // Node 1 should program 1A, 1B
133 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE1, IP1)).anyTimes();
134 replay(srManager.clusterService);
135 assertTrue(dfh.shouldProgram(DEV1A));
136 assertTrue(dfh.shouldProgram(DEV1B));
137 assertFalse(dfh.shouldProgram(DEV2));
138
139 reset(srManager.clusterService);
Charles Chanfbcb8812018-04-18 18:41:05 -0700140 clearCache();
Charles Chand66d6712018-03-29 16:03:41 -0700141
142 // Node 2 should program 2
143 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE2, IP2)).anyTimes();
144 replay(srManager.clusterService);
145 assertFalse(dfh.shouldProgram(DEV1A));
146 assertFalse(dfh.shouldProgram(DEV1B));
147 assertTrue(dfh.shouldProgram(DEV2));
148
149 reset(srManager.clusterService);
Charles Chanfbcb8812018-04-18 18:41:05 -0700150 clearCache();
Charles Chand66d6712018-03-29 16:03:41 -0700151
152 // Node 3 should program no device
153 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE3, IP3)).anyTimes();
154 replay(srManager.clusterService);
155 assertFalse(dfh.shouldProgram(DEV1A));
156 assertFalse(dfh.shouldProgram(DEV1B));
157 assertFalse(dfh.shouldProgram(DEV2));
158 }
159
160 // Node 1 is the master of switch 1A
161 // Node 2 is the master of switch 1B
162 // Node 3 is the master of switch 2
163 @Test
164 public void testShouldHandleRoutingCase3() {
165 expect(srManager.mastershipService.getMasterFor(DEV1A)).andReturn(NODE1).anyTimes();
166 expect(srManager.mastershipService.getMasterFor(DEV1B)).andReturn(NODE2).anyTimes();
167 expect(srManager.mastershipService.getMasterFor(DEV2)).andReturn(NODE3).anyTimes();
168 replay(srManager.mastershipService);
169
170 expect(srManager.getPairDeviceId(DEV1A)).andReturn(Optional.of(DEV1B)).anyTimes();
171 expect(srManager.getPairDeviceId(DEV1B)).andReturn(Optional.of(DEV1A)).anyTimes();
172 expect(srManager.getPairDeviceId(DEV2)).andReturn(Optional.empty()).anyTimes();
173 replay(srManager);
174
175 // Node 1 should program 1A, 1B
176 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE1, IP1)).anyTimes();
177 replay(srManager.clusterService);
178 assertTrue(dfh.shouldProgram(DEV1A));
179 assertTrue(dfh.shouldProgram(DEV1B));
180 assertFalse(dfh.shouldProgram(DEV2));
181
182 reset(srManager.clusterService);
Charles Chanfbcb8812018-04-18 18:41:05 -0700183 clearCache();
Charles Chand66d6712018-03-29 16:03:41 -0700184
185 // Node 2 should program no device
186 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE2, IP2)).anyTimes();
187 replay(srManager.clusterService);
188 assertFalse(dfh.shouldProgram(DEV1A));
189 assertFalse(dfh.shouldProgram(DEV1B));
190 assertFalse(dfh.shouldProgram(DEV2));
191
192 reset(srManager.clusterService);
Charles Chanfbcb8812018-04-18 18:41:05 -0700193 clearCache();
Charles Chand66d6712018-03-29 16:03:41 -0700194
195 // Node 3 should program 2
196 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE3, IP3)).anyTimes();
197 replay(srManager.clusterService);
198 assertFalse(dfh.shouldProgram(DEV1A));
199 assertFalse(dfh.shouldProgram(DEV1B));
200 assertTrue(dfh.shouldProgram(DEV2));
201 }
202
203 // Node 3 is the master of switch 1A, 1B, 2
204 // Later on, node 1 becomes the master of 1A; Node 2 becomes the master of 1B.
205 @Test
206 public void testShouldHandleRoutingCase4() {
207 expect(srManager.mastershipService.getMasterFor(DEV1A)).andReturn(NODE3).anyTimes();
208 expect(srManager.mastershipService.getMasterFor(DEV1B)).andReturn(NODE3).anyTimes();
209 expect(srManager.mastershipService.getMasterFor(DEV2)).andReturn(NODE3).anyTimes();
210 replay(srManager.mastershipService);
211
212 expect(srManager.getPairDeviceId(DEV1A)).andReturn(Optional.of(DEV1B)).anyTimes();
213 expect(srManager.getPairDeviceId(DEV1B)).andReturn(Optional.of(DEV1A)).anyTimes();
214 expect(srManager.getPairDeviceId(DEV2)).andReturn(Optional.empty()).anyTimes();
215 replay(srManager);
216
217 // Node 1 should program no device
218 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE1, IP1)).anyTimes();
219 replay(srManager.clusterService);
220 assertFalse(dfh.shouldProgram(DEV1A));
221 assertFalse(dfh.shouldProgram(DEV1B));
222 assertFalse(dfh.shouldProgram(DEV2));
223
224 reset(srManager.clusterService);
Charles Chanfbcb8812018-04-18 18:41:05 -0700225 clearCache();
Charles Chand66d6712018-03-29 16:03:41 -0700226
227 // Node 2 should program no device
228 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE2, IP2)).anyTimes();
229 replay(srManager.clusterService);
230 assertFalse(dfh.shouldProgram(DEV1A));
231 assertFalse(dfh.shouldProgram(DEV1B));
232 assertFalse(dfh.shouldProgram(DEV2));
233
234 reset(srManager.clusterService);
Charles Chanfbcb8812018-04-18 18:41:05 -0700235 clearCache();
Charles Chand66d6712018-03-29 16:03:41 -0700236
237 // Node 3 should program 1A, 1B and 2
238 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE3, IP3)).anyTimes();
239 replay(srManager.clusterService);
240 assertTrue(dfh.shouldProgram(DEV1A));
241 assertTrue(dfh.shouldProgram(DEV1B));
242 assertTrue(dfh.shouldProgram(DEV2));
243
244 // Mastership of switch 1A moves to Node 1
245 reset(srManager.mastershipService);
246 expect(srManager.mastershipService.getMasterFor(DEV1A)).andReturn(NODE1).anyTimes();
247 expect(srManager.mastershipService.getMasterFor(DEV1B)).andReturn(NODE2).anyTimes();
248 expect(srManager.mastershipService.getMasterFor(DEV2)).andReturn(NODE3).anyTimes();
249 replay(srManager.mastershipService);
250
251 reset(srManager.clusterService);
Charles Chanfbcb8812018-04-18 18:41:05 -0700252 clearCache();
Charles Chand66d6712018-03-29 16:03:41 -0700253
254 // Node 1 should program 1A, 1B
255 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE1, IP1)).anyTimes();
256 replay(srManager.clusterService);
257 assertTrue(dfh.shouldProgram(DEV1A));
258 assertTrue(dfh.shouldProgram(DEV1B));
259 assertFalse(dfh.shouldProgram(DEV2));
260
261 reset(srManager.clusterService);
Charles Chanfbcb8812018-04-18 18:41:05 -0700262 clearCache();
Charles Chand66d6712018-03-29 16:03:41 -0700263
264 // Node 2 should program no device
265 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE2, IP2)).anyTimes();
266 replay(srManager.clusterService);
267 assertFalse(dfh.shouldProgram(DEV1A));
268 assertFalse(dfh.shouldProgram(DEV1B));
269 assertFalse(dfh.shouldProgram(DEV2));
270
271 reset(srManager.clusterService);
Charles Chanfbcb8812018-04-18 18:41:05 -0700272 clearCache();
Charles Chand66d6712018-03-29 16:03:41 -0700273
274 // Node 3 should program 2
275 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE3, IP3)).anyTimes();
276 replay(srManager.clusterService);
277 assertFalse(dfh.shouldProgram(DEV1A));
278 assertFalse(dfh.shouldProgram(DEV1B));
279 assertTrue(dfh.shouldProgram(DEV2));
280 }
281
282 // Node 1 is the master of 1A. 1B has no master
283 // Node 2 becomes the master of 1B later
284 @Test
285 public void testShouldHandleRoutingCase5() {
286 expect(srManager.mastershipService.getMasterFor(DEV1A)).andReturn(NODE1).anyTimes();
287 expect(srManager.mastershipService.getMasterFor(DEV1B)).andReturn(null).anyTimes();
288 replay(srManager.mastershipService);
289
290 expect(srManager.getPairDeviceId(DEV1A)).andReturn(Optional.of(DEV1B)).anyTimes();
291 expect(srManager.getPairDeviceId(DEV1B)).andReturn(Optional.of(DEV1A)).anyTimes();
292 replay(srManager);
293
294 // Node 1 should program both 1A and 1B
295 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE1, IP1)).anyTimes();
296 replay(srManager.clusterService);
297 assertTrue(dfh.shouldProgram(DEV1A));
298 assertTrue(dfh.shouldProgram(DEV1B));
299
300 reset(srManager.clusterService);
Charles Chanfbcb8812018-04-18 18:41:05 -0700301 clearCache();
Charles Chand66d6712018-03-29 16:03:41 -0700302
303 // Node 2 should program no device
304 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE2, IP2)).anyTimes();
305 replay(srManager.clusterService);
306 assertFalse(dfh.shouldProgram(DEV1A));
307 assertFalse(dfh.shouldProgram(DEV1B));
308
309 // Mastership of switch 1B moves to Node 2
310 reset(srManager.mastershipService);
311 expect(srManager.mastershipService.getMasterFor(DEV1A)).andReturn(NODE1).anyTimes();
312 expect(srManager.mastershipService.getMasterFor(DEV1B)).andReturn(NODE2).anyTimes();
313 replay(srManager.mastershipService);
314
315 reset(srManager.clusterService);
Charles Chanfbcb8812018-04-18 18:41:05 -0700316 clearCache();
Charles Chand66d6712018-03-29 16:03:41 -0700317
318 // Node 1 should program 1A, 1B
319 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE1, IP1)).anyTimes();
320 replay(srManager.clusterService);
321 assertTrue(dfh.shouldProgram(DEV1A));
322 assertTrue(dfh.shouldProgram(DEV1B));
323
324 reset(srManager.clusterService);
Charles Chanfbcb8812018-04-18 18:41:05 -0700325 clearCache();
Charles Chand66d6712018-03-29 16:03:41 -0700326
327 // Node 2 should program no device
328 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE2, IP2)).anyTimes();
329 replay(srManager.clusterService);
330 assertFalse(dfh.shouldProgram(DEV1A));
331 assertFalse(dfh.shouldProgram(DEV1B));
332 }
333
334 // Neither 1A or 1B has master
335 @Test
336 public void testShouldHandleRoutingCase6() {
337 expect(srManager.mastershipService.getMasterFor(DEV1A)).andReturn(null).anyTimes();
338 expect(srManager.mastershipService.getMasterFor(DEV1B)).andReturn(null).anyTimes();
339 replay(srManager.mastershipService);
340
341 expect(srManager.getPairDeviceId(DEV1A)).andReturn(Optional.of(DEV1B)).anyTimes();
342 expect(srManager.getPairDeviceId(DEV1B)).andReturn(Optional.of(DEV1A)).anyTimes();
343 replay(srManager);
344
345 // Node 1 should program no device
346 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE1, IP1)).anyTimes();
347 replay(srManager.clusterService);
348 assertFalse(dfh.shouldProgram(DEV1A));
349 assertFalse(dfh.shouldProgram(DEV1B));
350
351 reset(srManager.clusterService);
Charles Chanfbcb8812018-04-18 18:41:05 -0700352 clearCache();
Charles Chand66d6712018-03-29 16:03:41 -0700353
354 // Node 2 should program no device
355 expect(srManager.clusterService.getLocalNode()).andReturn(new DefaultControllerNode(NODE2, IP2)).anyTimes();
356 replay(srManager.clusterService);
357 assertFalse(dfh.shouldProgram(DEV1A));
358 assertFalse(dfh.shouldProgram(DEV1B));
359
360 assertFalse(dfh.shouldProgram.containsKey(Sets.newHashSet(DEV1A, DEV1B)));
361 }
362}