Thomas Vachuska
Committed by Gerrit Code Review

Moving LLDP provider configuration processing off the event thread.

Change-Id: Ief44d354081107c037870d9a7ede60e8a6447113
...@@ -784,44 +784,46 @@ public class LldpLinkProvider extends AbstractProvider implements LinkProvider { ...@@ -784,44 +784,46 @@ public class LldpLinkProvider extends AbstractProvider implements LinkProvider {
784 784
785 @Override 785 @Override
786 public void event(NetworkConfigEvent event) { 786 public void event(NetworkConfigEvent event) {
787 - if (event.configClass() == LinkDiscoveryFromDevice.class && 787 + executor.submit(() -> {
788 - CONFIG_CHANGED.contains(event.type())) { 788 + if (event.configClass() == LinkDiscoveryFromDevice.class &&
789 + CONFIG_CHANGED.contains(event.type())) {
789 790
790 - if (event.subject() instanceof DeviceId) { 791 + if (event.subject() instanceof DeviceId) {
791 - final DeviceId did = (DeviceId) event.subject(); 792 + final DeviceId did = (DeviceId) event.subject();
792 - Device device = deviceService.getDevice(did); 793 + Device device = deviceService.getDevice(did);
793 - updateDevice(device).ifPresent(ld -> updatePorts(ld, did)); 794 + updateDevice(device).ifPresent(ld -> updatePorts(ld, did));
794 - } 795 + }
796 +
797 + } else if (event.configClass() == LinkDiscoveryFromPort.class &&
798 + CONFIG_CHANGED.contains(event.type())) {
799 +
800 + if (event.subject() instanceof ConnectPoint) {
801 + ConnectPoint cp = (ConnectPoint) event.subject();
802 + if (cp.elementId() instanceof DeviceId) {
803 + final DeviceId did = (DeviceId) cp.elementId();
804 + Device device = deviceService.getDevice(did);
805 + Port port = deviceService.getPort(did, cp.port());
806 + updateDevice(device).ifPresent(ld -> updatePort(ld, port));
807 + }
808 + }
795 809
796 - } else if (event.configClass() == LinkDiscoveryFromPort.class && 810 + } else if (event.configClass() == FingerprintProbeFromDevice.class &&
797 - CONFIG_CHANGED.contains(event.type())) { 811 + CONFIG_CHANGED.contains(event.type())) {
798 812
799 - if (event.subject() instanceof ConnectPoint) { 813 + if (event.subject() instanceof DeviceId) {
800 - ConnectPoint cp = (ConnectPoint) event.subject(); 814 + final DeviceId did = (DeviceId) event.subject();
801 - if (cp.elementId() instanceof DeviceId) {
802 - final DeviceId did = (DeviceId) cp.elementId();
803 Device device = deviceService.getDevice(did); 815 Device device = deviceService.getDevice(did);
804 - Port port = deviceService.getPort(did, cp.port()); 816 + updateDevice(device);
805 - updateDevice(device).ifPresent(ld -> updatePort(ld, port));
806 } 817 }
807 - }
808 -
809 - } else if (event.configClass() == FingerprintProbeFromDevice.class &&
810 - CONFIG_CHANGED.contains(event.type())) {
811 818
812 - if (event.subject() instanceof DeviceId) { 819 + } else if (event.configClass().equals(SuppressionConfig.class) &&
813 - final DeviceId did = (DeviceId) event.subject(); 820 + (event.type() == NetworkConfigEvent.Type.CONFIG_ADDED ||
814 - Device device = deviceService.getDevice(did); 821 + event.type() == NetworkConfigEvent.Type.CONFIG_UPDATED)) {
815 - updateDevice(device); 822 + SuppressionConfig cfg = cfgRegistry.getConfig(appId, SuppressionConfig.class);
823 + reconfigureSuppressionRules(cfg);
824 + log.trace("Network config reconfigured");
816 } 825 }
817 - 826 + });
818 - } else if (event.configClass().equals(SuppressionConfig.class) &&
819 - (event.type() == NetworkConfigEvent.Type.CONFIG_ADDED ||
820 - event.type() == NetworkConfigEvent.Type.CONFIG_UPDATED)) {
821 - SuppressionConfig cfg = cfgRegistry.getConfig(appId, SuppressionConfig.class);
822 - reconfigureSuppressionRules(cfg);
823 - log.trace("Network config reconfigured");
824 - }
825 } 827 }
826 } 828 }
827 } 829 }
......
...@@ -93,6 +93,7 @@ import static org.junit.Assert.assertFalse; ...@@ -93,6 +93,7 @@ import static org.junit.Assert.assertFalse;
93 import static org.junit.Assert.assertNotNull; 93 import static org.junit.Assert.assertNotNull;
94 import static org.junit.Assert.assertNull; 94 import static org.junit.Assert.assertNull;
95 import static org.junit.Assert.assertTrue; 95 import static org.junit.Assert.assertTrue;
96 +import static org.onlab.junit.TestTools.assertAfter;
96 import static org.onosproject.provider.lldp.impl.LldpLinkProvider.DEFAULT_RULES; 97 import static org.onosproject.provider.lldp.impl.LldpLinkProvider.DEFAULT_RULES;
97 98
98 99
...@@ -101,6 +102,7 @@ public class LldpLinkProviderTest { ...@@ -101,6 +102,7 @@ public class LldpLinkProviderTest {
101 private static final DeviceId DID1 = DeviceId.deviceId("of:0000000000000001"); 102 private static final DeviceId DID1 = DeviceId.deviceId("of:0000000000000001");
102 private static final DeviceId DID2 = DeviceId.deviceId("of:0000000000000002"); 103 private static final DeviceId DID2 = DeviceId.deviceId("of:0000000000000002");
103 private static final DeviceId DID3 = DeviceId.deviceId("of:0000000000000003"); 104 private static final DeviceId DID3 = DeviceId.deviceId("of:0000000000000003");
105 + private static final int EVENT_MS = 500;
104 106
105 private static Port pd1; 107 private static Port pd1;
106 private static Port pd2; 108 private static Port pd2;
...@@ -138,7 +140,7 @@ public class LldpLinkProviderTest { ...@@ -138,7 +140,7 @@ public class LldpLinkProviderTest {
138 cfg = new TestSuppressionConfig(); 140 cfg = new TestSuppressionConfig();
139 coreService = createMock(CoreService.class); 141 coreService = createMock(CoreService.class);
140 expect(coreService.registerApplication(appId.name())) 142 expect(coreService.registerApplication(appId.name()))
141 - .andReturn(appId).anyTimes(); 143 + .andReturn(appId).anyTimes();
142 replay(coreService); 144 replay(coreService);
143 145
144 provider.cfgService = new ComponentConfigAdapter(); 146 provider.cfgService = new ComponentConfigAdapter();
...@@ -199,8 +201,8 @@ public class LldpLinkProviderTest { ...@@ -199,8 +201,8 @@ public class LldpLinkProviderTest {
199 201
200 // update device in stub DeviceService with suppression config 202 // update device in stub DeviceService with suppression config
201 deviceService.putDevice(device(DID3, DefaultAnnotations.builder() 203 deviceService.putDevice(device(DID3, DefaultAnnotations.builder()
202 - .set(LldpLinkProvider.NO_LLDP, "true") 204 + .set(LldpLinkProvider.NO_LLDP, "true")
203 - .build())); 205 + .build()));
204 deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_UPDATED, DID3)); 206 deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_UPDATED, DID3));
205 207
206 // discovery on device is expected to be gone or stopped 208 // discovery on device is expected to be gone or stopped
...@@ -222,12 +224,13 @@ public class LldpLinkProviderTest { ...@@ -222,12 +224,13 @@ public class LldpLinkProviderTest {
222 DID3, 224 DID3,
223 LinkDiscoveryFromDevice.class)); 225 LinkDiscoveryFromDevice.class));
224 226
225 - // discovery helper for device is expected to be gone or stopped 227 + assertAfter(EVENT_MS, () -> {
226 - LinkDiscovery linkDiscovery = provider.discoverers.get(DID3); 228 + // discovery helper for device is expected to be gone or stopped
227 - if (linkDiscovery != null) { 229 + LinkDiscovery linkDiscovery = provider.discoverers.get(DID3);
228 - assertTrue("Discovery expected to be stopped", linkDiscovery.isStopped()); 230 + if (linkDiscovery != null) {
229 - } 231 + assertTrue("Discovery expected to be stopped", linkDiscovery.isStopped());
230 - 232 + }
233 + });
231 } 234 }
232 235
233 @Test 236 @Test
...@@ -258,7 +261,7 @@ public class LldpLinkProviderTest { ...@@ -258,7 +261,7 @@ public class LldpLinkProviderTest {
258 261
259 assertTrue("Port is not gone.", vanishedPort(3L)); 262 assertTrue("Port is not gone.", vanishedPort(3L));
260 assertFalse("Port was not removed from discoverer", 263 assertFalse("Port was not removed from discoverer",
261 - provider.discoverers.get(DID1).containsPort(3L)); 264 + provider.discoverers.get(DID1).containsPort(3L));
262 } 265 }
263 266
264 /** 267 /**
...@@ -271,8 +274,8 @@ public class LldpLinkProviderTest { ...@@ -271,8 +274,8 @@ public class LldpLinkProviderTest {
271 274
272 // add device in stub DeviceService with suppression configured 275 // add device in stub DeviceService with suppression configured
273 deviceService.putDevice(device(DID3, DefaultAnnotations.builder() 276 deviceService.putDevice(device(DID3, DefaultAnnotations.builder()
274 - .set(LldpLinkProvider.NO_LLDP, "true") 277 + .set(LldpLinkProvider.NO_LLDP, "true")
275 - .build())); 278 + .build()));
276 deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID3)); 279 deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID3));
277 280
278 // non-suppressed port added to suppressed device 281 // non-suppressed port added to suppressed device
...@@ -395,9 +398,9 @@ public class LldpLinkProviderTest { ...@@ -395,9 +398,9 @@ public class LldpLinkProviderTest {
395 // suppressed port added to non-suppressed device 398 // suppressed port added to non-suppressed device
396 final long portno3 = 3L; 399 final long portno3 = 3L;
397 final Port port3 = port(DID3, portno3, true, 400 final Port port3 = port(DID3, portno3, true,
398 - DefaultAnnotations.builder() 401 + DefaultAnnotations.builder()
399 - .set(LldpLinkProvider.NO_LLDP, "true") 402 + .set(LldpLinkProvider.NO_LLDP, "true")
400 - .build()); 403 + .build());
401 deviceService.putPorts(DID3, port3); 404 deviceService.putPorts(DID3, port3);
402 deviceListener.event(portEvent(DeviceEvent.Type.PORT_ADDED, DID3, port3)); 405 deviceListener.event(portEvent(DeviceEvent.Type.PORT_ADDED, DID3, port3));
403 406
...@@ -486,27 +489,27 @@ public class LldpLinkProviderTest { ...@@ -486,27 +489,27 @@ public class LldpLinkProviderTest {
486 489
487 private DefaultDevice device(DeviceId did) { 490 private DefaultDevice device(DeviceId did) {
488 return new DefaultDevice(ProviderId.NONE, did, Device.Type.SWITCH, 491 return new DefaultDevice(ProviderId.NONE, did, Device.Type.SWITCH,
489 - "TESTMF", "TESTHW", "TESTSW", "TESTSN", new ChassisId()); 492 + "TESTMF", "TESTHW", "TESTSW", "TESTSN", new ChassisId());
490 } 493 }
491 494
492 private DefaultDevice device(DeviceId did, Device.Type type) { 495 private DefaultDevice device(DeviceId did, Device.Type type) {
493 return new DefaultDevice(ProviderId.NONE, did, type, 496 return new DefaultDevice(ProviderId.NONE, did, type,
494 - "TESTMF", "TESTHW", "TESTSW", "TESTSN", new ChassisId()); 497 + "TESTMF", "TESTHW", "TESTSW", "TESTSN", new ChassisId());
495 } 498 }
496 499
497 private DefaultDevice device(DeviceId did, Annotations annotations) { 500 private DefaultDevice device(DeviceId did, Annotations annotations) {
498 return new DefaultDevice(ProviderId.NONE, did, Device.Type.SWITCH, 501 return new DefaultDevice(ProviderId.NONE, did, Device.Type.SWITCH,
499 - "TESTMF", "TESTHW", "TESTSW", "TESTSN", new ChassisId(), annotations); 502 + "TESTMF", "TESTHW", "TESTSW", "TESTSN", new ChassisId(), annotations);
500 } 503 }
501 504
502 - @SuppressWarnings(value = { "unused" }) 505 + @SuppressWarnings(value = {"unused"})
503 private DeviceEvent portEvent(DeviceEvent.Type type, DeviceId did, PortNumber port) { 506 private DeviceEvent portEvent(DeviceEvent.Type type, DeviceId did, PortNumber port) {
504 - return new DeviceEvent(type, deviceService.getDevice(did), 507 + return new DeviceEvent(type, deviceService.getDevice(did),
505 - deviceService.getPort(did, port)); 508 + deviceService.getPort(did, port));
506 } 509 }
507 510
508 private DeviceEvent portEvent(DeviceEvent.Type type, DeviceId did, Port port) { 511 private DeviceEvent portEvent(DeviceEvent.Type type, DeviceId did, Port port) {
509 - return new DeviceEvent(type, deviceService.getDevice(did), port); 512 + return new DeviceEvent(type, deviceService.getDevice(did), port);
510 } 513 }
511 514
512 private Port port(DeviceId did, long port, boolean enabled) { 515 private Port port(DeviceId did, long port, boolean enabled) {
...@@ -578,8 +581,10 @@ public class LldpLinkProviderTest { ...@@ -578,8 +581,10 @@ public class LldpLinkProviderTest {
578 581
579 configEvent(NetworkConfigEvent.Type.CONFIG_UPDATED); 582 configEvent(NetworkConfigEvent.Type.CONFIG_UPDATED);
580 583
581 - assertTrue(provider.rules().getSuppressedDeviceType().contains(deviceType1)); 584 + assertAfter(EVENT_MS, () -> {
582 - assertTrue(provider.rules().getSuppressedDeviceType().contains(deviceType2)); 585 + assertTrue(provider.rules().getSuppressedDeviceType().contains(deviceType1));
586 + assertTrue(provider.rules().getSuppressedDeviceType().contains(deviceType2));
587 + });
583 } 588 }
584 589
585 @Test 590 @Test
...@@ -594,9 +599,11 @@ public class LldpLinkProviderTest { ...@@ -594,9 +599,11 @@ public class LldpLinkProviderTest {
594 599
595 configEvent(NetworkConfigEvent.Type.CONFIG_ADDED); 600 configEvent(NetworkConfigEvent.Type.CONFIG_ADDED);
596 601
597 - assertTrue(provider.rules().getSuppressedAnnotation().containsKey(key1)); 602 + assertAfter(EVENT_MS, () -> {
598 - assertEquals(value1, provider.rules().getSuppressedAnnotation().get(key1)); 603 + assertTrue(provider.rules().getSuppressedAnnotation().containsKey(key1));
599 - assertFalse(provider.rules().getSuppressedAnnotation().containsKey(key2)); 604 + assertEquals(value1, provider.rules().getSuppressedAnnotation().get(key1));
605 + assertFalse(provider.rules().getSuppressedAnnotation().containsKey(key2));
606 + });
600 } 607 }
601 608
602 @Test 609 @Test
...@@ -610,25 +617,29 @@ public class LldpLinkProviderTest { ...@@ -610,25 +617,29 @@ public class LldpLinkProviderTest {
610 617
611 configEvent(NetworkConfigEvent.Type.CONFIG_ADDED); 618 configEvent(NetworkConfigEvent.Type.CONFIG_ADDED);
612 619
613 - assertTrue(provider.rules().getSuppressedAnnotation().containsKey(key1)); 620 + assertAfter(EVENT_MS, () -> {
614 - assertEquals(value1, provider.rules().getSuppressedAnnotation().get(key1)); 621 + assertTrue(provider.rules().getSuppressedAnnotation().containsKey(key1));
615 - assertFalse(provider.rules().getSuppressedAnnotation().containsKey(key2)); 622 + assertEquals(value1, provider.rules().getSuppressedAnnotation().get(key1));
623 + assertFalse(provider.rules().getSuppressedAnnotation().containsKey(key2));
624 + });
616 625
617 annotation.put(key2, value2); 626 annotation.put(key2, value2);
618 cfg.annotation(annotation); 627 cfg.annotation(annotation);
619 628
620 configEvent(NetworkConfigEvent.Type.CONFIG_UPDATED); 629 configEvent(NetworkConfigEvent.Type.CONFIG_UPDATED);
621 630
622 - assertTrue(provider.rules().getSuppressedAnnotation().containsKey(key1)); 631 + assertAfter(EVENT_MS, () -> {
623 - assertEquals(value1, provider.rules().getSuppressedAnnotation().get(key1)); 632 + assertTrue(provider.rules().getSuppressedAnnotation().containsKey(key1));
624 - assertTrue(provider.rules().getSuppressedAnnotation().containsKey(key2)); 633 + assertEquals(value1, provider.rules().getSuppressedAnnotation().get(key1));
625 - assertEquals(value2, provider.rules().getSuppressedAnnotation().get(key2)); 634 + assertTrue(provider.rules().getSuppressedAnnotation().containsKey(key2));
635 + assertEquals(value2, provider.rules().getSuppressedAnnotation().get(key2));
636 + });
626 } 637 }
627 638
628 private void configEvent(NetworkConfigEvent.Type evType) { 639 private void configEvent(NetworkConfigEvent.Type evType) {
629 configListener.event(new NetworkConfigEvent(evType, 640 configListener.event(new NetworkConfigEvent(evType,
630 - appId, 641 + appId,
631 - SuppressionConfig.class)); 642 + SuppressionConfig.class));
632 } 643 }
633 644
634 private class TestPacketContext implements PacketContext { 645 private class TestPacketContext implements PacketContext {
...@@ -706,6 +717,7 @@ public class LldpLinkProviderTest { ...@@ -706,6 +717,7 @@ public class LldpLinkProviderTest {
706 private final Map<DeviceId, Device> devices = new HashMap<>(); 717 private final Map<DeviceId, Device> devices = new HashMap<>();
707 private final ArrayListMultimap<DeviceId, Port> ports = 718 private final ArrayListMultimap<DeviceId, Port> ports =
708 ArrayListMultimap.create(); 719 ArrayListMultimap.create();
720 +
709 public TestDeviceService() { 721 public TestDeviceService() {
710 Device d1 = new DefaultDevice(ProviderId.NONE, DID1, Device.Type.SWITCH, 722 Device d1 = new DefaultDevice(ProviderId.NONE, DID1, Device.Type.SWITCH,
711 "TESTMF", "TESTHW", "TESTSW", "TESTSN", new ChassisId()); 723 "TESTMF", "TESTHW", "TESTSW", "TESTSN", new ChassisId());
...@@ -727,7 +739,7 @@ public class LldpLinkProviderTest { ...@@ -727,7 +739,7 @@ public class LldpLinkProviderTest {
727 devices.put(deviceId, device); 739 devices.put(deviceId, device);
728 } 740 }
729 741
730 - private void putPorts(DeviceId did, Port...ports) { 742 + private void putPorts(DeviceId did, Port... ports) {
731 this.ports.putAll(did, Lists.newArrayList(ports)); 743 this.ports.putAll(did, Lists.newArrayList(ports));
732 } 744 }
733 745
...@@ -831,7 +843,7 @@ public class LldpLinkProviderTest { ...@@ -831,7 +843,7 @@ public class LldpLinkProviderTest {
831 } 843 }
832 844
833 private final class TestNetworkConfigRegistry 845 private final class TestNetworkConfigRegistry
834 - extends NetworkConfigRegistryAdapter { 846 + extends NetworkConfigRegistryAdapter {
835 @SuppressWarnings("unchecked") 847 @SuppressWarnings("unchecked")
836 @Override 848 @Override
837 public <S, C extends Config<S>> C getConfig(S subj, Class<C> configClass) { 849 public <S, C extends Config<S>> C getConfig(S subj, Class<C> configClass) {
...@@ -896,8 +908,8 @@ public class LldpLinkProviderTest { ...@@ -896,8 +908,8 @@ public class LldpLinkProviderTest {
896 final IpAddress addr = IpAddress.valueOf(0); 908 final IpAddress addr = IpAddress.valueOf(0);
897 final Partition p = new DefaultPartition(PartitionId.from(1), Sets.newHashSet(nid)); 909 final Partition p = new DefaultPartition(PartitionId.from(1), Sets.newHashSet(nid));
898 return new ClusterMetadata("test-cluster", 910 return new ClusterMetadata("test-cluster",
899 - Sets.newHashSet(new DefaultControllerNode(nid, addr)), 911 + Sets.newHashSet(new DefaultControllerNode(nid, addr)),
900 - Sets.newHashSet(p)); 912 + Sets.newHashSet(p));
901 } 913 }
902 914
903 @Override 915 @Override
......