Committed by
Gerrit Code Review
ONOS-3206 refactoring LLDP link provider.
- refactoring to unify LinkDiscovery helper instantiation - Support suppression rule update at runtime Change-Id: I2a6db6e82fcb90ee5635f0ac09564efd55276ebf
Showing
3 changed files
with
144 additions
and
12 deletions
This diff is collapsed. Click to expand it.
... | @@ -61,7 +61,7 @@ class LinkDiscovery implements TimerTask { | ... | @@ -61,7 +61,7 @@ class LinkDiscovery implements TimerTask { |
61 | 61 | ||
62 | private final ONOSLLDP lldpPacket; | 62 | private final ONOSLLDP lldpPacket; |
63 | private final Ethernet ethPacket; | 63 | private final Ethernet ethPacket; |
64 | - private Ethernet bddpEth; | 64 | + private final Ethernet bddpEth; |
65 | 65 | ||
66 | private Timeout timeout; | 66 | private Timeout timeout; |
67 | private volatile boolean isStopped; | 67 | private volatile boolean isStopped; |
... | @@ -126,7 +126,7 @@ class LinkDiscovery implements TimerTask { | ... | @@ -126,7 +126,7 @@ class LinkDiscovery implements TimerTask { |
126 | } | 126 | } |
127 | 127 | ||
128 | /** | 128 | /** |
129 | - * Add physical port port to discovery process. | 129 | + * Add physical port to discovery process. |
130 | * Send out initial LLDP and label it as slow port. | 130 | * Send out initial LLDP and label it as slow port. |
131 | * | 131 | * |
132 | * @param port the port | 132 | * @param port the port |
... | @@ -141,6 +141,14 @@ class LinkDiscovery implements TimerTask { | ... | @@ -141,6 +141,14 @@ class LinkDiscovery implements TimerTask { |
141 | } | 141 | } |
142 | 142 | ||
143 | /** | 143 | /** |
144 | + * removed physical port from discovery process. | ||
145 | + * @param port the port number | ||
146 | + */ | ||
147 | + void removePort(PortNumber port) { | ||
148 | + ports.remove(port.toLong()); | ||
149 | + } | ||
150 | + | ||
151 | + /** | ||
144 | * Handles an incoming LLDP packet. Creates link in topology and adds the | 152 | * Handles an incoming LLDP packet. Creates link in topology and adds the |
145 | * link for staleness tracking. | 153 | * link for staleness tracking. |
146 | * | 154 | * | ... | ... |
... | @@ -16,6 +16,7 @@ | ... | @@ -16,6 +16,7 @@ |
16 | package org.onosproject.provider.lldp.impl; | 16 | package org.onosproject.provider.lldp.impl; |
17 | 17 | ||
18 | import com.google.common.collect.ArrayListMultimap; | 18 | import com.google.common.collect.ArrayListMultimap; |
19 | +import com.google.common.collect.ImmutableList; | ||
19 | import com.google.common.collect.Lists; | 20 | import com.google.common.collect.Lists; |
20 | import com.google.common.collect.Maps; | 21 | import com.google.common.collect.Maps; |
21 | import org.junit.After; | 22 | import org.junit.After; |
... | @@ -32,7 +33,9 @@ import org.onosproject.core.CoreService; | ... | @@ -32,7 +33,9 @@ import org.onosproject.core.CoreService; |
32 | import org.onosproject.core.DefaultApplicationId; | 33 | import org.onosproject.core.DefaultApplicationId; |
33 | import org.onosproject.mastership.MastershipListener; | 34 | import org.onosproject.mastership.MastershipListener; |
34 | import org.onosproject.mastership.MastershipService; | 35 | import org.onosproject.mastership.MastershipService; |
36 | +import org.onosproject.net.Annotations; | ||
35 | import org.onosproject.net.ConnectPoint; | 37 | import org.onosproject.net.ConnectPoint; |
38 | +import org.onosproject.net.DefaultAnnotations; | ||
36 | import org.onosproject.net.DefaultDevice; | 39 | import org.onosproject.net.DefaultDevice; |
37 | import org.onosproject.net.DefaultPort; | 40 | import org.onosproject.net.DefaultPort; |
38 | import org.onosproject.net.Device; | 41 | import org.onosproject.net.Device; |
... | @@ -73,6 +76,7 @@ public class LLDPLinkProviderTest { | ... | @@ -73,6 +76,7 @@ public class LLDPLinkProviderTest { |
73 | 76 | ||
74 | private static final DeviceId DID1 = DeviceId.deviceId("of:0000000000000001"); | 77 | private static final DeviceId DID1 = DeviceId.deviceId("of:0000000000000001"); |
75 | private static final DeviceId DID2 = DeviceId.deviceId("of:0000000000000002"); | 78 | private static final DeviceId DID2 = DeviceId.deviceId("of:0000000000000002"); |
79 | + private static final DeviceId DID3 = DeviceId.deviceId("of:0000000000000003"); | ||
76 | 80 | ||
77 | private static Port pd1; | 81 | private static Port pd1; |
78 | private static Port pd2; | 82 | private static Port pd2; |
... | @@ -133,10 +137,35 @@ public class LLDPLinkProviderTest { | ... | @@ -133,10 +137,35 @@ public class LLDPLinkProviderTest { |
133 | deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID1)); | 137 | deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID1)); |
134 | deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_REMOVED, DID1)); | 138 | deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_REMOVED, DID1)); |
135 | 139 | ||
136 | - assertTrue("Discoverer is not gone", provider.discoverers.get(DID1).isStopped()); | 140 | + final LinkDiscovery linkDiscovery = provider.discoverers.get(DID1); |
141 | + if (linkDiscovery != null) { | ||
142 | + // If LinkDiscovery helper is there after DEVICE_REMOVED, | ||
143 | + // it should be stopped | ||
144 | + assertTrue("Discoverer is not stopped", linkDiscovery.isStopped()); | ||
145 | + } | ||
137 | assertTrue("Device is not gone.", vanishedDpid(DID1)); | 146 | assertTrue("Device is not gone.", vanishedDpid(DID1)); |
138 | } | 147 | } |
139 | 148 | ||
149 | + /** | ||
150 | + * Checks that links on a reconfigured switch are properly removed. | ||
151 | + */ | ||
152 | + @Test | ||
153 | + public void switchSuppressed() { | ||
154 | + // add device to stub DeviceService | ||
155 | + deviceService.putDevice(device(DID3)); | ||
156 | + deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID3)); | ||
157 | + | ||
158 | + assertFalse("Device not added", provider.discoverers.isEmpty()); | ||
159 | + | ||
160 | + // update device in stub DeviceService with suppression config | ||
161 | + deviceService.putDevice(device(DID3, DefaultAnnotations.builder() | ||
162 | + .set(LLDPLinkProvider.NO_LLDP, "true") | ||
163 | + .build())); | ||
164 | + deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_UPDATED, DID3)); | ||
165 | + | ||
166 | + assertTrue("Links on suppressed Device was expected to vanish.", vanishedDpid(DID3)); | ||
167 | + } | ||
168 | + | ||
140 | @Test | 169 | @Test |
141 | public void portUp() { | 170 | public void portUp() { |
142 | deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID1)); | 171 | deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID1)); |
... | @@ -152,27 +181,101 @@ public class LLDPLinkProviderTest { | ... | @@ -152,27 +181,101 @@ public class LLDPLinkProviderTest { |
152 | deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID1)); | 181 | deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID1)); |
153 | deviceListener.event(portEvent(DeviceEvent.Type.PORT_ADDED, DID1, port(DID1, 1, false))); | 182 | deviceListener.event(portEvent(DeviceEvent.Type.PORT_ADDED, DID1, port(DID1, 1, false))); |
154 | 183 | ||
155 | - | ||
156 | - | ||
157 | assertFalse("Port added to discoverer", | 184 | assertFalse("Port added to discoverer", |
158 | provider.discoverers.get(DID1).containsPort(1L)); | 185 | provider.discoverers.get(DID1).containsPort(1L)); |
159 | assertTrue("Port is not gone.", vanishedPort(1L)); | 186 | assertTrue("Port is not gone.", vanishedPort(1L)); |
160 | } | 187 | } |
161 | 188 | ||
162 | @Test | 189 | @Test |
190 | + public void portRemoved() { | ||
191 | + deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID1)); | ||
192 | + deviceListener.event(portEvent(DeviceEvent.Type.PORT_ADDED, DID1, port(DID1, 3, true))); | ||
193 | + deviceListener.event(portEvent(DeviceEvent.Type.PORT_REMOVED, DID1, port(DID1, 3, true))); | ||
194 | + | ||
195 | + assertTrue("Port is not gone.", vanishedPort(3L)); | ||
196 | + assertFalse("Port was not removed from discoverer", | ||
197 | + provider.discoverers.get(DID1).containsPort(3L)); | ||
198 | + } | ||
199 | + | ||
200 | + /** | ||
201 | + * Checks that discovery on reconfigured switch are properly restarted. | ||
202 | + */ | ||
203 | + @Test | ||
204 | + public void portSuppressedByDeviceConfig() { | ||
205 | + | ||
206 | + /// When Device is configured with suppression:ON, Port also is same | ||
207 | + | ||
208 | + // add device in stub DeviceService with suppression configured | ||
209 | + deviceService.putDevice(device(DID3, DefaultAnnotations.builder() | ||
210 | + .set(LLDPLinkProvider.NO_LLDP, "true") | ||
211 | + .build())); | ||
212 | + deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID3)); | ||
213 | + | ||
214 | + // non-suppressed port added to suppressed device | ||
215 | + final long portno3 = 3L; | ||
216 | + deviceService.putPorts(DID3, port(DID3, portno3, true)); | ||
217 | + deviceListener.event(portEvent(DeviceEvent.Type.PORT_ADDED, DID3, port(DID3, portno3, true))); | ||
218 | + | ||
219 | + // discovery on device is expected to be stopped | ||
220 | + LinkDiscovery linkDiscovery = provider.discoverers.get(DID3); | ||
221 | + if (linkDiscovery != null) { | ||
222 | + assertTrue("Discovery expected to be stopped", linkDiscovery.isStopped()); | ||
223 | + } | ||
224 | + | ||
225 | + /// When Device is reconfigured without suppression:OFF, | ||
226 | + /// Port should be included for discovery | ||
227 | + | ||
228 | + // update device in stub DeviceService without suppression configured | ||
229 | + deviceService.putDevice(device(DID3)); | ||
230 | + // update the Port in stub DeviceService. (Port has reference to Device) | ||
231 | + deviceService.putPorts(DID3, port(DID3, portno3, true)); | ||
232 | + deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_UPDATED, DID3)); | ||
233 | + | ||
234 | + // discovery should come back on | ||
235 | + assertFalse("Discoverer is expected to start", provider.discoverers.get(DID3).isStopped()); | ||
236 | + assertTrue("Discoverer should contain the port there", provider.discoverers.get(DID3).containsPort(portno3)); | ||
237 | + } | ||
238 | + | ||
239 | + /** | ||
240 | + * Checks that discovery on reconfigured port are properly restarted. | ||
241 | + */ | ||
242 | + @Test | ||
243 | + public void portSuppressedByPortConfig() { | ||
244 | + // add device in stub DeviceService without suppression configured | ||
245 | + deviceService.putDevice(device(DID3)); | ||
246 | + deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID3)); | ||
247 | + | ||
248 | + // suppressed port added to non-suppressed device | ||
249 | + final long portno3 = 3L; | ||
250 | + final Port port3 = port(DID3, portno3, true, | ||
251 | + DefaultAnnotations.builder() | ||
252 | + .set(LLDPLinkProvider.NO_LLDP, "true") | ||
253 | + .build()); | ||
254 | + deviceService.putPorts(DID3, port3); | ||
255 | + deviceListener.event(portEvent(DeviceEvent.Type.PORT_ADDED, DID3, port3)); | ||
256 | + | ||
257 | + // discovery helper should be there turned on | ||
258 | + assertFalse("Discoverer is expected to start", provider.discoverers.get(DID3).isStopped()); | ||
259 | + assertFalse("Discoverer should not contain the port there", | ||
260 | + provider.discoverers.get(DID3).containsPort(portno3)); | ||
261 | + } | ||
262 | + | ||
263 | + @Test | ||
163 | public void portUnknown() { | 264 | public void portUnknown() { |
164 | deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID1)); | 265 | deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID1)); |
165 | - deviceListener.event(portEvent(DeviceEvent.Type.PORT_ADDED, DID2, port(DID2, 1, false))); | 266 | + // Note: DID3 hasn't been added to TestDeviceService, but only port is added |
267 | + deviceListener.event(portEvent(DeviceEvent.Type.PORT_ADDED, DID3, port(DID3, 1, false))); | ||
166 | 268 | ||
167 | 269 | ||
168 | assertNull("DeviceId exists", | 270 | assertNull("DeviceId exists", |
169 | - provider.discoverers.get(DID2)); | 271 | + provider.discoverers.get(DID3)); |
170 | } | 272 | } |
171 | 273 | ||
172 | @Test | 274 | @Test |
173 | public void unknownPktCtx() { | 275 | public void unknownPktCtx() { |
174 | 276 | ||
175 | - PacketContext pktCtx = new TestPacketContext(deviceService.getDevice(DID2)); | 277 | + // Note: DID3 hasn't been added to TestDeviceService |
278 | + PacketContext pktCtx = new TestPacketContext(device(DID3)); | ||
176 | 279 | ||
177 | testProcessor.process(pktCtx); | 280 | testProcessor.process(pktCtx); |
178 | assertFalse("Context should still be free", pktCtx.isHandled()); | 281 | assertFalse("Context should still be free", pktCtx.isHandled()); |
... | @@ -206,6 +309,16 @@ public class LLDPLinkProviderTest { | ... | @@ -206,6 +309,16 @@ public class LLDPLinkProviderTest { |
206 | 309 | ||
207 | } | 310 | } |
208 | 311 | ||
312 | + private DefaultDevice device(DeviceId did) { | ||
313 | + return new DefaultDevice(ProviderId.NONE, did, Device.Type.SWITCH, | ||
314 | + "TESTMF", "TESTHW", "TESTSW", "TESTSN", new ChassisId()); | ||
315 | + } | ||
316 | + | ||
317 | + private DefaultDevice device(DeviceId did, Annotations annotations) { | ||
318 | + return new DefaultDevice(ProviderId.NONE, did, Device.Type.SWITCH, | ||
319 | + "TESTMF", "TESTHW", "TESTSW", "TESTSN", new ChassisId(), annotations); | ||
320 | + } | ||
321 | + | ||
209 | @SuppressWarnings(value = { "unused" }) | 322 | @SuppressWarnings(value = { "unused" }) |
210 | private DeviceEvent portEvent(DeviceEvent.Type type, DeviceId did, PortNumber port) { | 323 | private DeviceEvent portEvent(DeviceEvent.Type type, DeviceId did, PortNumber port) { |
211 | return new DeviceEvent(type, deviceService.getDevice(did), | 324 | return new DeviceEvent(type, deviceService.getDevice(did), |
... | @@ -221,6 +334,10 @@ public class LLDPLinkProviderTest { | ... | @@ -221,6 +334,10 @@ public class LLDPLinkProviderTest { |
221 | PortNumber.portNumber(port), enabled); | 334 | PortNumber.portNumber(port), enabled); |
222 | } | 335 | } |
223 | 336 | ||
337 | + private Port port(DeviceId did, long port, boolean enabled, Annotations annotations) { | ||
338 | + return new DefaultPort(deviceService.getDevice(did), | ||
339 | + PortNumber.portNumber(port), enabled, annotations); | ||
340 | + } | ||
224 | 341 | ||
225 | private boolean vanishedDpid(DeviceId... dids) { | 342 | private boolean vanishedDpid(DeviceId... dids) { |
226 | for (int i = 0; i < dids.length; i++) { | 343 | for (int i = 0; i < dids.length; i++) { |
... | @@ -384,10 +501,9 @@ public class LLDPLinkProviderTest { | ... | @@ -384,10 +501,9 @@ public class LLDPLinkProviderTest { |
384 | 501 | ||
385 | private class TestDeviceService extends DeviceServiceAdapter { | 502 | private class TestDeviceService extends DeviceServiceAdapter { |
386 | 503 | ||
387 | - private Map<DeviceId, Device> devices = new HashMap<>(); | 504 | + private final Map<DeviceId, Device> devices = new HashMap<>(); |
388 | private final ArrayListMultimap<DeviceId, Port> ports = | 505 | private final ArrayListMultimap<DeviceId, Port> ports = |
389 | ArrayListMultimap.create(); | 506 | ArrayListMultimap.create(); |
390 | - | ||
391 | public TestDeviceService() { | 507 | public TestDeviceService() { |
392 | Device d1 = new DefaultDevice(ProviderId.NONE, DID1, Device.Type.SWITCH, | 508 | Device d1 = new DefaultDevice(ProviderId.NONE, DID1, Device.Type.SWITCH, |
393 | "TESTMF", "TESTHW", "TESTSW", "TESTSN", new ChassisId()); | 509 | "TESTMF", "TESTHW", "TESTSW", "TESTSN", new ChassisId()); |
... | @@ -395,7 +511,6 @@ public class LLDPLinkProviderTest { | ... | @@ -395,7 +511,6 @@ public class LLDPLinkProviderTest { |
395 | "TESTMF", "TESTHW", "TESTSW", "TESTSN", new ChassisId()); | 511 | "TESTMF", "TESTHW", "TESTSW", "TESTSN", new ChassisId()); |
396 | devices.put(DID1, d1); | 512 | devices.put(DID1, d1); |
397 | devices.put(DID2, d2); | 513 | devices.put(DID2, d2); |
398 | - | ||
399 | pd1 = new DefaultPort(d1, PortNumber.portNumber(1), true); | 514 | pd1 = new DefaultPort(d1, PortNumber.portNumber(1), true); |
400 | pd2 = new DefaultPort(d1, PortNumber.portNumber(2), true); | 515 | pd2 = new DefaultPort(d1, PortNumber.portNumber(2), true); |
401 | pd3 = new DefaultPort(d2, PortNumber.portNumber(1), true); | 516 | pd3 = new DefaultPort(d2, PortNumber.portNumber(1), true); |
... | @@ -405,6 +520,15 @@ public class LLDPLinkProviderTest { | ... | @@ -405,6 +520,15 @@ public class LLDPLinkProviderTest { |
405 | ports.putAll(DID2, Lists.newArrayList(pd3, pd4)); | 520 | ports.putAll(DID2, Lists.newArrayList(pd3, pd4)); |
406 | } | 521 | } |
407 | 522 | ||
523 | + private void putDevice(Device device) { | ||
524 | + DeviceId deviceId = device.id(); | ||
525 | + devices.put(deviceId, device); | ||
526 | + } | ||
527 | + | ||
528 | + private void putPorts(DeviceId did, Port...ports) { | ||
529 | + this.ports.putAll(did, Lists.newArrayList(ports)); | ||
530 | + } | ||
531 | + | ||
408 | @Override | 532 | @Override |
409 | public int getDeviceCount() { | 533 | public int getDeviceCount() { |
410 | return devices.values().size(); | 534 | return devices.values().size(); |
... | @@ -412,7 +536,7 @@ public class LLDPLinkProviderTest { | ... | @@ -412,7 +536,7 @@ public class LLDPLinkProviderTest { |
412 | 536 | ||
413 | @Override | 537 | @Override |
414 | public Iterable<Device> getDevices() { | 538 | public Iterable<Device> getDevices() { |
415 | - return Collections.emptyList(); | 539 | + return ImmutableList.copyOf(devices.values()); |
416 | } | 540 | } |
417 | 541 | ||
418 | @Override | 542 | @Override | ... | ... |
-
Please register or login to post a comment