ONOS-3461 Disable LinkDiscovery on specific device/port.

- Configuration moved from "apps" -> "devices", "ports"
  in network configuration tree

Change-Id: I030bab489939ce5326a6ebea14f246726ca024f0
diff --git a/providers/lldp/src/test/java/org/onosproject/provider/lldp/impl/LldpLinkProviderTest.java b/providers/lldp/src/test/java/org/onosproject/provider/lldp/impl/LldpLinkProviderTest.java
index ecf60c1..758c34e 100644
--- a/providers/lldp/src/test/java/org/onosproject/provider/lldp/impl/LldpLinkProviderTest.java
+++ b/providers/lldp/src/test/java/org/onosproject/provider/lldp/impl/LldpLinkProviderTest.java
@@ -15,7 +15,6 @@
  */
 package org.onosproject.provider.lldp.impl;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -47,8 +46,8 @@
 import org.onosproject.net.Port;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.config.Config;
-import org.onosproject.net.config.ConfigApplyDelegate;
 import org.onosproject.net.config.NetworkConfigEvent;
+import org.onosproject.net.config.NetworkConfigEvent.Type;
 import org.onosproject.net.config.NetworkConfigListener;
 import org.onosproject.net.config.NetworkConfigRegistryAdapter;
 import org.onosproject.net.device.DeviceEvent;
@@ -121,8 +120,14 @@
 
     private TestSuppressionConfig cfg;
 
+    private Set<DeviceId> deviceBlacklist;
+
+    private Set<ConnectPoint> portBlacklist;
+
     @Before
     public void setUp() {
+        deviceBlacklist = new HashSet<>();
+        portBlacklist = new HashSet<>();
         cfg = new TestSuppressionConfig();
         coreService = createMock(CoreService.class);
         expect(coreService.registerApplication(appId.name()))
@@ -174,7 +179,7 @@
      * Checks that links on a reconfigured switch are properly removed.
      */
     @Test
-    public void switchSuppressed() {
+    public void switchSuppressedByAnnotation() {
 
         // add device to stub DeviceService
         deviceService.putDevice(device(DID3));
@@ -196,6 +201,26 @@
     }
 
     @Test
+    public void switchSuppressByBlacklist() {
+        // add device in stub DeviceService
+        deviceService.putDevice(device(DID3));
+        deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID3));
+
+        // add deviveId to device blacklist
+        deviceBlacklist.add(DID3);
+        configListener.event(new NetworkConfigEvent(Type.CONFIG_ADDED,
+                                                    DID3,
+                                                    LinkDiscoveryFromDevice.class));
+
+        // discovery helper for device is expected to be gone or stopped
+        LinkDiscovery linkDiscovery = provider.discoverers.get(DID3);
+        if (linkDiscovery != null) {
+            assertTrue("Discovery expected to be stopped", linkDiscovery.isStopped());
+        }
+
+    }
+
+    @Test
     public void portUp() {
         deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID1));
         deviceListener.event(portEvent(DeviceEvent.Type.PORT_ADDED, DID1, port(DID1, 3, true)));
@@ -269,7 +294,7 @@
      * Checks that discovery on reconfigured switch are properly restarted.
      */
     @Test
-    public void portSuppressedByDeviceIdConfig() {
+    public void portSuppressedByParentDeviceIdBlacklist() {
 
         /// When Device is configured without suppression:OFF,
         /// Port should be included for discovery
@@ -288,9 +313,11 @@
         assertTrue("Discoverer should contain the port there", provider.discoverers.get(DID3).containsPort(portno3));
 
         // add suppression rule for "deviceId: "of:0000000000000003""
-        provider.updateRules(new SuppressionRules(ImmutableSet.of(DID3),
-                                                  ImmutableSet.of(),
-                                                  ImmutableMap.of()));
+        deviceBlacklist.add(DID3);
+        configListener.event(new NetworkConfigEvent(Type.CONFIG_ADDED,
+                                                    DID3,
+                                                    LinkDiscoveryFromDevice.class));
+
 
         /// When Device is reconfigured with suppression:ON, Port also is same
 
@@ -300,7 +327,7 @@
         deviceService.putPorts(DID3, port(DID3, portno3, true));
         deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_UPDATED, DID3));
 
-        // discovery on device is expected to be stopped
+        // discovery helper for device is expected to be gone or stopped
         LinkDiscovery linkDiscovery = provider.discoverers.get(DID3);
         if (linkDiscovery != null) {
             assertTrue("Discovery expected to be stopped", linkDiscovery.isStopped());
@@ -371,6 +398,34 @@
     }
 
     @Test
+    public void portSuppressedByPortBlacklist() {
+
+        // add device in stub DeviceService without suppression configured
+        deviceService.putDevice(device(DID3));
+        deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID3));
+
+        final long portno3 = 3L;
+        final Port port3 = port(DID3, portno3, true);
+
+        final ConnectPoint cpDid3no3 = new ConnectPoint(DID3, PortNumber.portNumber(portno3));
+        portBlacklist.add(cpDid3no3);
+
+        // suppressed port added to non-suppressed device
+        deviceService.putPorts(DID3, port3);
+        deviceListener.event(portEvent(DeviceEvent.Type.PORT_ADDED, DID3, port3));
+
+        configListener.event(new NetworkConfigEvent(Type.CONFIG_ADDED,
+                                                    cpDid3no3,
+                                                    LinkDiscoveryFromPort.class));
+
+        // discovery helper should be there turned on
+        assertFalse("Discoverer is expected to start", provider.discoverers.get(DID3).isStopped());
+        // but port is not a discovery target
+        assertFalse("Discoverer should not contain the port there",
+                    provider.discoverers.get(DID3).containsPort(portno3));
+    }
+
+    @Test
     public void portUnknown() {
         deviceListener.event(deviceEvent(DeviceEvent.Type.DEVICE_ADDED, DID1));
         // Note: DID3 hasn't been added to TestDeviceService, but only port is added
@@ -481,42 +536,6 @@
         return false;
     }
 
-
-    @Test
-    public void addDeviceIdRule() {
-        DeviceId deviceId1 = DeviceId.deviceId("of:0000000000000001");
-        DeviceId deviceId2 = DeviceId.deviceId("of:0000000000000002");
-        Set<DeviceId> deviceIds = new HashSet<>();
-
-        deviceIds.add(deviceId1);
-        cfg.deviceIds(deviceIds);
-
-        configEvent(NetworkConfigEvent.Type.CONFIG_ADDED);
-
-        assertTrue(provider.rules().getSuppressedDevice().contains(deviceId1));
-        assertFalse(provider.rules().getSuppressedDevice().contains(deviceId2));
-    }
-
-    @Test
-    public void updateDeviceIdRule() {
-        DeviceId deviceId1 = DeviceId.deviceId("of:0000000000000001");
-        DeviceId deviceId2 = DeviceId.deviceId("of:0000000000000002");
-        Set<DeviceId> deviceIds = new HashSet<>();
-
-        deviceIds.add(deviceId1);
-        cfg.deviceIds(deviceIds);
-
-        configEvent(NetworkConfigEvent.Type.CONFIG_ADDED);
-
-        deviceIds.add(deviceId2);
-        cfg.deviceIds(deviceIds);
-
-        configEvent(NetworkConfigEvent.Type.CONFIG_UPDATED);
-
-        assertTrue(provider.rules().getSuppressedDevice().contains(deviceId1));
-        assertTrue(provider.rules().getSuppressedDevice().contains(deviceId2));
-    }
-
     @Test
     public void addDeviceTypeRule() {
         Device.Type deviceType1 = Device.Type.ROADM;
@@ -866,11 +885,28 @@
 
     private final class TestNetworkConfigRegistry
         extends NetworkConfigRegistryAdapter {
+        @SuppressWarnings("unchecked")
         @Override
-        public <S, C extends Config<S>> C getConfig(S subject, Class<C> configClass) {
-            ConfigApplyDelegate delegate = config -> { };
-            ObjectMapper mapper = new ObjectMapper();
-            return (C) cfg;
+        public <S, C extends Config<S>> C getConfig(S subj, Class<C> configClass) {
+            if (configClass == SuppressionConfig.class) {
+                return (C) cfg;
+            } else if (configClass == LinkDiscoveryFromDevice.class) {
+                return (C) new LinkDiscoveryFromDevice() {
+                    @Override
+                    public boolean enabled() {
+                        return !deviceBlacklist.contains(subj);
+                    }
+                };
+            } else if (configClass == LinkDiscoveryFromPort.class) {
+                return (C) new LinkDiscoveryFromPort() {
+                    @Override
+                    public boolean enabled() {
+                        return !portBlacklist.contains(subj);
+                    }
+                };
+            } else {
+                return null;
+            }
         }
 
         @Override
@@ -880,22 +916,10 @@
     }
 
     private final class TestSuppressionConfig extends SuppressionConfig {
-        private Set<DeviceId> deviceIds = new HashSet<>(DEFAULT_RULES.getSuppressedDevice());
         private Set<Device.Type> deviceTypes = new HashSet<>(DEFAULT_RULES.getSuppressedDeviceType());
         private Map<String, String> annotation = new HashMap<>(DEFAULT_RULES.getSuppressedAnnotation());
 
         @Override
-        public Set<DeviceId> deviceIds() {
-            return ImmutableSet.copyOf(deviceIds);
-        }
-
-        @Override
-        public SuppressionConfig deviceIds(Set<DeviceId> deviceIds) {
-            this.deviceIds = ImmutableSet.copyOf(deviceIds);
-            return this;
-        }
-
-        @Override
         public Set<Device.Type> deviceTypes() {
             return ImmutableSet.copyOf(deviceTypes);
         }