Add INT watchlist config

- add "watchSubnets" to the netcfg of INT app

Change-Id: I271d9c27692c8969999ece32f8aa08b4392216e0
(cherry picked from commit 906febe058507758b67f7074bb1139e3c6170b52)
diff --git a/apps/inbandtelemetry/impl/src/test/java/org/onosproject/inbandtelemetry/impl/SimpleIntManagerTest.java b/apps/inbandtelemetry/impl/src/test/java/org/onosproject/inbandtelemetry/impl/SimpleIntManagerTest.java
index 566ed2b..8519ed5 100644
--- a/apps/inbandtelemetry/impl/src/test/java/org/onosproject/inbandtelemetry/impl/SimpleIntManagerTest.java
+++ b/apps/inbandtelemetry/impl/src/test/java/org/onosproject/inbandtelemetry/impl/SimpleIntManagerTest.java
@@ -27,6 +27,7 @@
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
+import org.onlab.junit.TestUtils;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
 import org.onlab.packet.TpPort;
@@ -35,6 +36,7 @@
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.inbandtelemetry.api.IntIntent;
+import org.onosproject.inbandtelemetry.api.IntIntentId;
 import org.onosproject.mastership.MastershipService;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DefaultDevice;
@@ -58,6 +60,7 @@
 import org.onosproject.net.flow.DefaultTrafficSelector;
 import org.onosproject.net.flow.TrafficSelector;
 import org.onosproject.net.host.HostService;
+import org.onosproject.store.service.ConsistentMap;
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.TestStorageService;
 
@@ -65,6 +68,7 @@
 import java.io.InputStream;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import static org.easymock.EasyMock.anyObject;
 import static org.easymock.EasyMock.createNiceMock;
@@ -90,12 +94,14 @@
     private static final int MIN_FLOW_HOP_LATENCY_CHANGE_NS = 32;
     private static final String INT_REPORT_CONFIG_KEY = "report";
     private static final DeviceId DEVICE_ID = DeviceId.deviceId("device:leaf1");
+    private static final String WATCHED_SUBNET_1 = "192.168.10.0/24";
+    private static final String WATCHED_SUBNET_2 = "192.168.20.0/24";
     private static final TrafficSelector FLOW_SELECTOR1 = DefaultTrafficSelector.builder()
-            .matchIPDst(IpPrefix.valueOf("192.168.10.0/24"))
+            .matchIPDst(IpPrefix.valueOf(WATCHED_SUBNET_1))
             .matchVlanId(VlanId.vlanId((short) 10))
             .build();
     private static final TrafficSelector FLOW_SELECTOR2 = DefaultTrafficSelector.builder()
-            .matchIPDst(IpPrefix.valueOf("192.168.20.0/24"))
+            .matchIPDst(IpPrefix.valueOf(WATCHED_SUBNET_2))
             .matchVlanId(VlanId.vlanId((short) 20))
             .build();
     private static final Device DEFAULT_DEVICE =
@@ -182,6 +188,49 @@
         IntDeviceConfig expectedConfig = createIntDeviceConfig();
         IntDeviceConfig actualConfig = manager.getConfig();
         assertEquals(expectedConfig, actualConfig);
+
+        // Install watch subnets via netcfg
+        // In the report-config.json, there are 3 subnets we want to watch
+        // For subnet 0.0.0.0/0, the IntManager will create only one IntIntent with an empty selector.
+        Set<IntIntent> expectedIntIntents = Sets.newHashSet();
+        ConsistentMap<IntIntentId, IntIntent> intentMap = TestUtils.getField(manager, "intentMap");
+        IntIntent.Builder baseIntentBuilder = IntIntent.builder()
+                .withReportType(IntIntent.IntReportType.TRACKED_FLOW)
+                .withReportType(IntIntent.IntReportType.DROPPED_PACKET)
+                .withReportType(IntIntent.IntReportType.CONGESTED_QUEUE)
+                .withTelemetryMode(IntIntent.TelemetryMode.POSTCARD);
+
+        // Watch IP Src == subnet 1
+        TrafficSelector expectedSelector = DefaultTrafficSelector.builder()
+                .matchIPSrc(IpPrefix.valueOf(WATCHED_SUBNET_1))
+                .build();
+        expectedIntIntents.add(baseIntentBuilder.withSelector(expectedSelector).build());
+        // Watch IP Dst == subnet 1
+        expectedSelector = DefaultTrafficSelector.builder()
+                .matchIPDst(IpPrefix.valueOf(WATCHED_SUBNET_1))
+                .build();
+        expectedIntIntents.add(baseIntentBuilder.withSelector(expectedSelector).build());
+        // Watch IP Src == subnet 2
+        expectedSelector = DefaultTrafficSelector.builder()
+                .matchIPSrc(IpPrefix.valueOf(WATCHED_SUBNET_2))
+                .build();
+        expectedIntIntents.add(baseIntentBuilder.withSelector(expectedSelector).build());
+        // Watch IP Dst == subnet 2
+        expectedSelector = DefaultTrafficSelector.builder()
+                .matchIPDst(IpPrefix.valueOf(WATCHED_SUBNET_2))
+                .build();
+        expectedIntIntents.add(baseIntentBuilder.withSelector(expectedSelector).build());
+        // Any packets
+        expectedSelector = DefaultTrafficSelector.emptySelector();
+        expectedIntIntents.add(baseIntentBuilder.withSelector(expectedSelector).build());
+
+        // The INT intent installation order can be random, so we need to collect
+        // all expected INT intents and check if actual intent exists.
+        assertEquals(5, intentMap.size());
+        intentMap.entrySet().forEach(entry -> {
+            IntIntent actualIntIntent = entry.getValue().value();
+            assertTrue(expectedIntIntents.contains(actualIntIntent));
+        });
     }
 
     @Test