blob: 43959144525d29a2fc7b6d7bb3f59e6344e9b798 [file] [log] [blame]
Thomas Vachuska781d18b2014-10-27 10:31:25 -07001/*
Ray Milkey34c95902015-04-15 09:47:53 -07002 * Copyright 2014-2015 Open Networking Laboratory
Thomas Vachuska781d18b2014-10-27 10:31:25 -07003 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07004 * 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
Thomas Vachuska781d18b2014-10-27 10:31:25 -07007 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07008 * 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.
Thomas Vachuska781d18b2014-10-27 10:31:25 -070015 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.provider.lldp.impl;
alshabib0ed6a202014-10-19 12:42:57 -070017
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -080018import static org.easymock.EasyMock.createMock;
19import static org.easymock.EasyMock.expect;
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -080020import static org.easymock.EasyMock.replay;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080021import static org.junit.Assert.assertEquals;
22import static org.junit.Assert.assertFalse;
23import static org.junit.Assert.assertNotNull;
24import static org.junit.Assert.assertNull;
25import static org.junit.Assert.assertTrue;
alshabib0ed6a202014-10-19 12:42:57 -070026
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080027import java.nio.ByteBuffer;
28import java.util.Collections;
29import java.util.HashMap;
30import java.util.List;
31import java.util.Map;
32import java.util.Set;
Madan Jampanide003d92015-05-11 17:14:20 -070033import java.util.concurrent.CompletableFuture;
Yuta HIGUCHI376d7502014-10-19 15:57:52 -070034
alshabib0ed6a202014-10-19 12:42:57 -070035import org.junit.After;
36import org.junit.Before;
37import org.junit.Test;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080038import org.onlab.packet.ChassisId;
39import org.onlab.packet.Ethernet;
40import org.onlab.packet.ONOSLLDP;
Thomas Vachuska6519e6f2015-03-11 02:29:31 -070041import org.onosproject.cfg.ComponentConfigAdapter;
Brian O'Connorabafb502014-12-02 22:26:20 -080042import org.onosproject.cluster.NodeId;
43import org.onosproject.cluster.RoleInfo;
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -080044import org.onosproject.core.ApplicationId;
45import org.onosproject.core.CoreService;
46import org.onosproject.core.DefaultApplicationId;
Brian O'Connorabafb502014-12-02 22:26:20 -080047import org.onosproject.mastership.MastershipListener;
48import org.onosproject.mastership.MastershipService;
49import org.onosproject.net.ConnectPoint;
50import org.onosproject.net.DefaultDevice;
51import org.onosproject.net.DefaultPort;
52import org.onosproject.net.Device;
53import org.onosproject.net.DeviceId;
54import org.onosproject.net.MastershipRole;
55import org.onosproject.net.Port;
56import org.onosproject.net.PortNumber;
57import org.onosproject.net.device.DeviceEvent;
58import org.onosproject.net.device.DeviceListener;
59import org.onosproject.net.device.DeviceServiceAdapter;
Saurav Dasc313c402015-02-27 10:09:47 -080060import org.onosproject.net.flow.FlowRule;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080061import org.onosproject.net.flow.TrafficSelector;
Brian O'Connorabafb502014-12-02 22:26:20 -080062import org.onosproject.net.flow.TrafficTreatment;
63import org.onosproject.net.link.LinkDescription;
64import org.onosproject.net.link.LinkProvider;
65import org.onosproject.net.link.LinkProviderRegistry;
66import org.onosproject.net.link.LinkProviderService;
67import org.onosproject.net.packet.DefaultInboundPacket;
68import org.onosproject.net.packet.InboundPacket;
69import org.onosproject.net.packet.OutboundPacket;
70import org.onosproject.net.packet.PacketContext;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080071import org.onosproject.net.packet.PacketPriority;
Brian O'Connorabafb502014-12-02 22:26:20 -080072import org.onosproject.net.packet.PacketProcessor;
73import org.onosproject.net.packet.PacketService;
74import org.onosproject.net.provider.AbstractProviderService;
75import org.onosproject.net.provider.ProviderId;
alshabib0ed6a202014-10-19 12:42:57 -070076
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080077import com.google.common.collect.ArrayListMultimap;
78import com.google.common.collect.Lists;
79import com.google.common.collect.Maps;
alshabib0ed6a202014-10-19 12:42:57 -070080
81public class LLDPLinkProviderTest {
82
83 private static final DeviceId DID1 = DeviceId.deviceId("of:0000000000000001");
84 private static final DeviceId DID2 = DeviceId.deviceId("of:0000000000000002");
85
86 private static Port pd1;
87 private static Port pd2;
88 private static Port pd3;
89 private static Port pd4;
90
91 private final LLDPLinkProvider provider = new LLDPLinkProvider();
92 private final TestLinkRegistry linkService = new TestLinkRegistry();
93 private final TestPacketService packetService = new TestPacketService();
94 private final TestDeviceService deviceService = new TestDeviceService();
95 private final TestMasterShipService masterService = new TestMasterShipService();
96
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -080097 private CoreService coreService;
alshabib0ed6a202014-10-19 12:42:57 -070098 private TestLinkProviderService providerService;
99
100 private PacketProcessor testProcessor;
101 private DeviceListener deviceListener;
102
Thomas Vachuska02aeb032015-01-06 22:36:30 -0800103 private ApplicationId appId =
104 new DefaultApplicationId(100, "org.onosproject.provider.lldp");
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800105
alshabib0ed6a202014-10-19 12:42:57 -0700106 @Before
107 public void setUp() {
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800108 coreService = createMock(CoreService.class);
109 expect(coreService.registerApplication(appId.name()))
110 .andReturn(appId).anyTimes();
111 replay(coreService);
112
Thomas Vachuska6519e6f2015-03-11 02:29:31 -0700113 provider.cfgService = new ComponentConfigAdapter();
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800114 provider.coreService = coreService;
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800115
alshabib0ed6a202014-10-19 12:42:57 -0700116 provider.deviceService = deviceService;
Marc De Leenheer8b3e80b2015-03-06 14:27:03 -0800117 provider.packetService = packetService;
alshabib0ed6a202014-10-19 12:42:57 -0700118 provider.providerRegistry = linkService;
119 provider.masterService = masterService;
120
121
Saurav Dasc313c402015-02-27 10:09:47 -0800122 provider.activate(null);
alshabib0ed6a202014-10-19 12:42:57 -0700123 }
124
125 @Test
126 public void basics() {
127 assertNotNull("registration expected", providerService);
128 assertEquals("incorrect provider", provider, providerService.provider());
129 }
130
131 @Test
132 public void switchAdd() {
133 DeviceEvent de = deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID1);
134 deviceListener.event(de);
135
136 assertFalse("Device not added", provider.discoverers.isEmpty());
137 }
138
139 @Test
140 public void switchRemove() {
141 deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID1));
142 deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_REMOVED, DID1));
143
144 assertTrue("Discoverer is not gone", provider.discoverers.get(DID1).isStopped());
145 assertTrue("Device is not gone.", vanishedDpid(DID1));
146 }
147
148 @Test
149 public void portUp() {
150 deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID1));
151 deviceListener.event(portEvent(DeviceEvent.Type.PORT_ADDED, DID1, port(DID1, 3, true)));
152
153 assertTrue("Port not added to discoverer",
Sho SHIMIZUc14b2a22015-05-05 18:15:13 -0700154 provider.discoverers.get(DID1).containsPort(3L));
alshabib0ed6a202014-10-19 12:42:57 -0700155 }
156
157 @Test
158 public void portDown() {
159
160 deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID1));
161 deviceListener.event(portEvent(DeviceEvent.Type.PORT_ADDED, DID1, port(DID1, 1, false)));
162
163
164
165 assertFalse("Port added to discoverer",
Sho SHIMIZUc14b2a22015-05-05 18:15:13 -0700166 provider.discoverers.get(DID1).containsPort(1L));
167 assertTrue("Port is not gone.", vanishedPort(1L));
alshabib0ed6a202014-10-19 12:42:57 -0700168 }
169
170 @Test
171 public void portUnknown() {
172 deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID1));
173 deviceListener.event(portEvent(DeviceEvent.Type.PORT_ADDED, DID2, port(DID2, 1, false)));
174
175
alshabibdfc7afb2014-10-21 20:13:27 -0700176 assertNull("DeviceId exists",
alshabib0ed6a202014-10-19 12:42:57 -0700177 provider.discoverers.get(DID2));
178 }
179
180 @Test
181 public void unknownPktCtx() {
182
183 PacketContext pktCtx = new TestPacketContext(deviceService.getDevice(DID2));
184
185 testProcessor.process(pktCtx);
186 assertFalse("Context should still be free", pktCtx.isHandled());
187 }
188
189 @Test
190 public void knownPktCtx() {
191 deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID1));
192 deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID2));
193 PacketContext pktCtx = new TestPacketContext(deviceService.getDevice(DID2));
194
195
196 testProcessor.process(pktCtx);
197
198 assertTrue("Link not detected", detectedLink(DID1, DID2));
199
200 }
201
202
203 @After
204 public void tearDown() {
205 provider.deactivate();
Pavlin Radoslavovd36a74b2015-01-09 11:59:07 -0800206 provider.coreService = null;
alshabib0ed6a202014-10-19 12:42:57 -0700207 provider.providerRegistry = null;
208 provider.deviceService = null;
Marc De Leenheer8b3e80b2015-03-06 14:27:03 -0800209 provider.packetService = null;
alshabib0ed6a202014-10-19 12:42:57 -0700210 }
211
212 private DeviceEvent deviceEvent(DeviceEvent.Type type, DeviceId did) {
213 return new DeviceEvent(type, deviceService.getDevice(did));
214
215 }
216
Saurav Dasc313c402015-02-27 10:09:47 -0800217 @SuppressWarnings(value = { "unused" })
alshabib0ed6a202014-10-19 12:42:57 -0700218 private DeviceEvent portEvent(DeviceEvent.Type type, DeviceId did, PortNumber port) {
219 return new DeviceEvent(type, deviceService.getDevice(did),
220 deviceService.getPort(did, port));
221 }
222
223 private DeviceEvent portEvent(DeviceEvent.Type type, DeviceId did, Port port) {
224 return new DeviceEvent(type, deviceService.getDevice(did), port);
225 }
226
227 private Port port(DeviceId did, long port, boolean enabled) {
228 return new DefaultPort(deviceService.getDevice(did),
229 PortNumber.portNumber(port), enabled);
230 }
231
232
233 private boolean vanishedDpid(DeviceId... dids) {
234 for (int i = 0; i < dids.length; i++) {
235 if (!providerService.vanishedDpid.contains(dids[i])) {
236 return false;
237 }
238 }
239 return true;
240 }
241
242 private boolean vanishedPort(Long... ports) {
243 for (int i = 0; i < ports.length; i++) {
244 if (!providerService.vanishedPort.contains(ports[i])) {
245 return false;
246 }
247 }
248 return true;
249 }
250
251 private boolean detectedLink(DeviceId src, DeviceId dst) {
252 for (DeviceId key : providerService.discoveredLinks.keySet()) {
253 if (key.equals(src)) {
254 return providerService.discoveredLinks.get(src).equals(dst);
255 }
256 }
257 return false;
258 }
259
260
261 private class TestLinkRegistry implements LinkProviderRegistry {
262
263 @Override
264 public LinkProviderService register(LinkProvider provider) {
265 providerService = new TestLinkProviderService(provider);
266 return providerService;
267 }
268
269 @Override
270 public void unregister(LinkProvider provider) {
271 }
272
273 @Override
274 public Set<ProviderId> getProviders() {
275 return null;
276 }
277
278 }
279
280 private class TestLinkProviderService
281 extends AbstractProviderService<LinkProvider>
282 implements LinkProviderService {
283
284 List<DeviceId> vanishedDpid = Lists.newLinkedList();
285 List<Long> vanishedPort = Lists.newLinkedList();
286 Map<DeviceId, DeviceId> discoveredLinks = Maps.newHashMap();
287
288 protected TestLinkProviderService(LinkProvider provider) {
289 super(provider);
290 }
291
292 @Override
293 public void linkDetected(LinkDescription linkDescription) {
294 DeviceId sDid = linkDescription.src().deviceId();
295 DeviceId dDid = linkDescription.dst().deviceId();
296 discoveredLinks.put(sDid, dDid);
297 }
298
299 @Override
300 public void linkVanished(LinkDescription linkDescription) {
alshabib0ed6a202014-10-19 12:42:57 -0700301 }
302
303 @Override
304 public void linksVanished(ConnectPoint connectPoint) {
305 vanishedPort.add(connectPoint.port().toLong());
306
307 }
308
309 @Override
310 public void linksVanished(DeviceId deviceId) {
311 vanishedDpid.add(deviceId);
312 }
313
314
315 }
316
317
318
319 private class TestPacketContext implements PacketContext {
320
321 protected Device device;
322 protected boolean blocked = false;
323
324 public TestPacketContext(Device dev) {
325 device = dev;
326 }
327
328 @Override
329 public long time() {
330 return 0;
331 }
332
333 @Override
334 public InboundPacket inPacket() {
335 ONOSLLDP lldp = new ONOSLLDP();
336 lldp.setChassisId(device.chassisId());
337 lldp.setPortId((int) pd1.number().toLong());
338 lldp.setDevice(deviceService.getDevice(DID1).id().toString());
339
340
341 Ethernet ethPacket = new Ethernet();
342 ethPacket.setEtherType(Ethernet.TYPE_LLDP);
343 ethPacket.setDestinationMACAddress(ONOSLLDP.LLDP_NICIRA);
344 ethPacket.setPayload(lldp);
345 ethPacket.setPad(true);
346
347
348
349 ethPacket.setSourceMACAddress("DE:AD:BE:EF:BA:11");
350
351 ConnectPoint cp = new ConnectPoint(device.id(), pd3.number());
352
353 return new DefaultInboundPacket(cp, ethPacket,
354 ByteBuffer.wrap(ethPacket.serialize()));
355
356 }
357
358 @Override
359 public OutboundPacket outPacket() {
360 return null;
361 }
362
363 @Override
364 public TrafficTreatment.Builder treatmentBuilder() {
365 return null;
366 }
367
368 @Override
369 public void send() {
370
371 }
372
373 @Override
374 public boolean block() {
375 blocked = true;
376 return blocked;
377 }
378
379 @Override
380 public boolean isHandled() {
381 return blocked;
382 }
383
384 }
385
386 private class TestPacketService implements PacketService {
387
388 @Override
389 public void addProcessor(PacketProcessor processor, int priority) {
390 testProcessor = processor;
391 }
392
393 @Override
394 public void removeProcessor(PacketProcessor processor) {
395
396 }
397
398 @Override
399 public void emit(OutboundPacket packet) {
400
401 }
Jonathan Hart3cfce8e2015-01-14 16:43:27 -0800402
403 @Override
404 public void requestPackets(TrafficSelector selector,
405 PacketPriority priority, ApplicationId appId) {
406 }
Saurav Dasc313c402015-02-27 10:09:47 -0800407
408 @Override
409 public void requestPackets(TrafficSelector selector,
410 PacketPriority priority, ApplicationId appId,
411 FlowRule.Type tableType) {
412 }
alshabib0ed6a202014-10-19 12:42:57 -0700413 }
414
Yuta HIGUCHIf1f2ac02014-11-26 14:02:22 -0800415 private class TestDeviceService extends DeviceServiceAdapter {
alshabib0ed6a202014-10-19 12:42:57 -0700416
417 private Map<DeviceId, Device> devices = new HashMap<>();
418 private final ArrayListMultimap<DeviceId, Port> ports =
419 ArrayListMultimap.create();
420
421 public TestDeviceService() {
422 Device d1 = new DefaultDevice(ProviderId.NONE, DID1, Device.Type.SWITCH,
423 "TESTMF", "TESTHW", "TESTSW", "TESTSN", new ChassisId());
424 Device d2 = new DefaultDevice(ProviderId.NONE, DID2, Device.Type.SWITCH,
425 "TESTMF", "TESTHW", "TESTSW", "TESTSN", new ChassisId());
426 devices.put(DID1, d1);
427 devices.put(DID2, d2);
428
429 pd1 = new DefaultPort(d1, PortNumber.portNumber(1), true);
430 pd2 = new DefaultPort(d1, PortNumber.portNumber(2), true);
431 pd3 = new DefaultPort(d2, PortNumber.portNumber(1), true);
432 pd4 = new DefaultPort(d2, PortNumber.portNumber(2), true);
433
434 ports.putAll(DID1, Lists.newArrayList(pd1, pd2));
435 ports.putAll(DID2, Lists.newArrayList(pd3, pd4));
436
437
438 }
439
440 @Override
441 public int getDeviceCount() {
442 return devices.values().size();
443 }
444
445 @Override
446 public Iterable<Device> getDevices() {
Yuta HIGUCHIf1f2ac02014-11-26 14:02:22 -0800447 return Collections.emptyList();
alshabib0ed6a202014-10-19 12:42:57 -0700448 }
449
450 @Override
451 public Device getDevice(DeviceId deviceId) {
452 return devices.get(deviceId);
453 }
454
455 @Override
456 public MastershipRole getRole(DeviceId deviceId) {
457 return MastershipRole.MASTER;
458 }
459
460 @Override
461 public List<Port> getPorts(DeviceId deviceId) {
462 return ports.get(deviceId);
463 }
464
465 @Override
466 public Port getPort(DeviceId deviceId, PortNumber portNumber) {
467 for (Port p : ports.get(deviceId)) {
468 if (p.number().equals(portNumber)) {
469 return p;
470 }
471 }
472 return null;
473 }
474
475 @Override
476 public boolean isAvailable(DeviceId deviceId) {
477 return true;
478 }
479
480 @Override
481 public void addListener(DeviceListener listener) {
482 deviceListener = listener;
483
484 }
485
486 @Override
487 public void removeListener(DeviceListener listener) {
488
489 }
490 }
491
492 private final class TestMasterShipService implements MastershipService {
493
494 @Override
495 public MastershipRole getLocalRole(DeviceId deviceId) {
496 return MastershipRole.MASTER;
497 }
498
499 @Override
Madan Jampanide003d92015-05-11 17:14:20 -0700500 public CompletableFuture<MastershipRole> requestRoleFor(DeviceId deviceId) {
501 return CompletableFuture.completedFuture(null);
alshabib0ed6a202014-10-19 12:42:57 -0700502 }
503
504 @Override
505 public void relinquishMastership(DeviceId deviceId) {
506
507 }
508
509 @Override
510 public NodeId getMasterFor(DeviceId deviceId) {
511 return null;
512 }
513
514 @Override
515 public Set<DeviceId> getDevicesOf(NodeId nodeId) {
516 return null;
517 }
518
519 @Override
alshabib0ed6a202014-10-19 12:42:57 -0700520 public void addListener(MastershipListener listener) {
521
522 }
523
524 @Override
525 public void removeListener(MastershipListener listener) {
526
527 }
Yuta HIGUCHI376d7502014-10-19 15:57:52 -0700528
529 @Override
Ayaka Koshibeabedb092014-10-20 17:01:31 -0700530 public RoleInfo getNodesFor(DeviceId deviceId) {
531 return new RoleInfo(new NodeId("foo"), Collections.<NodeId>emptyList());
Yuta HIGUCHI376d7502014-10-19 15:57:52 -0700532 }
alshabib0ed6a202014-10-19 12:42:57 -0700533 }
534
535
536}