[ONOS-3662] Add CLI for control plane manager

- Implement CLI for enumerating control plane metrics stats
- Implement ControlResourceTypeCompleter
- Implement DiskResourceNameCompleter
- Implement NetworkResourceNameCompleter
- Implement ControlMessageDeviceIdCompleter
- Extract the control resource type and metrics in a separated
  class for the sake of simplicity.

Change-Id: Ic505191a74bd463091b0e5c75e11f1824bafb816
diff --git a/apps/cpman/app/src/test/java/org/onosproject/cpman/impl/ControlPlaneMonitorTest.java b/apps/cpman/app/src/test/java/org/onosproject/cpman/impl/ControlPlaneMonitorTest.java
index 7c1afef..1ec963d 100644
--- a/apps/cpman/app/src/test/java/org/onosproject/cpman/impl/ControlPlaneMonitorTest.java
+++ b/apps/cpman/app/src/test/java/org/onosproject/cpman/impl/ControlPlaneMonitorTest.java
@@ -28,6 +28,7 @@
 import org.onosproject.net.DeviceId;
 
 import java.util.Optional;
+import java.util.Set;
 
 import static org.easymock.EasyMock.anyObject;
 import static org.easymock.EasyMock.createMock;
@@ -35,27 +36,8 @@
 import static org.easymock.EasyMock.replay;
 import static org.hamcrest.Matchers.is;
 import static org.junit.Assert.assertThat;
-import static org.onosproject.cpman.ControlMetricType.CPU_IDLE_TIME;
-import static org.onosproject.cpman.ControlMetricType.CPU_LOAD;
-import static org.onosproject.cpman.ControlMetricType.DISK_READ_BYTES;
-import static org.onosproject.cpman.ControlMetricType.DISK_WRITE_BYTES;
-import static org.onosproject.cpman.ControlMetricType.FLOW_MOD_PACKET;
-import static org.onosproject.cpman.ControlMetricType.FLOW_REMOVED_PACKET;
-import static org.onosproject.cpman.ControlMetricType.INBOUND_PACKET;
-import static org.onosproject.cpman.ControlMetricType.MEMORY_FREE;
-import static org.onosproject.cpman.ControlMetricType.MEMORY_FREE_RATIO;
-import static org.onosproject.cpman.ControlMetricType.MEMORY_USED;
-import static org.onosproject.cpman.ControlMetricType.MEMORY_USED_RATIO;
-import static org.onosproject.cpman.ControlMetricType.NW_INCOMING_BYTES;
-import static org.onosproject.cpman.ControlMetricType.NW_INCOMING_PACKETS;
-import static org.onosproject.cpman.ControlMetricType.NW_OUTGOING_BYTES;
-import static org.onosproject.cpman.ControlMetricType.NW_OUTGOING_PACKETS;
-import static org.onosproject.cpman.ControlMetricType.OUTBOUND_PACKET;
-import static org.onosproject.cpman.ControlMetricType.REPLY_PACKET;
-import static org.onosproject.cpman.ControlMetricType.REQUEST_PACKET;
-import static org.onosproject.cpman.ControlMetricType.SYS_CPU_TIME;
-import static org.onosproject.cpman.ControlMetricType.TOTAL_CPU_TIME;
-import static org.onosproject.cpman.ControlMetricType.USER_CPU_TIME;
+
+import static org.onosproject.cpman.ControlResource.*;
 
 /**
  * Unit test of control plane monitoring service.
@@ -67,23 +49,12 @@
     private ClusterService mockClusterService;
     private ControllerNode mockControllerNode;
     private NodeId nodeId;
-    private static final ImmutableSet<ControlMetricType> CPU_METRICS =
-            ImmutableSet.of(CPU_IDLE_TIME, CPU_LOAD, SYS_CPU_TIME,
-                    USER_CPU_TIME, TOTAL_CPU_TIME);
-    private static final ImmutableSet<ControlMetricType> MEMORY_METRICS =
-            ImmutableSet.of(MEMORY_FREE, MEMORY_FREE_RATIO, MEMORY_USED,
-                    MEMORY_USED_RATIO);
-    private static final ImmutableSet<ControlMetricType> DISK_METRICS =
-            ImmutableSet.of(DISK_READ_BYTES, DISK_WRITE_BYTES);
-    private static final ImmutableSet<ControlMetricType> NETWORK_METRICS =
-            ImmutableSet.of(NW_INCOMING_BYTES, NW_OUTGOING_BYTES,
-                    NW_INCOMING_PACKETS, NW_OUTGOING_PACKETS);
-    private static final ImmutableSet<ControlMetricType> CTRL_MSGS =
-            ImmutableSet.of(INBOUND_PACKET, OUTBOUND_PACKET, FLOW_MOD_PACKET,
-                    FLOW_REMOVED_PACKET, REQUEST_PACKET, REPLY_PACKET);
 
+    /**
+     * Sets up the services required by control plane monitor.
+     */
     @Before
-    public void setup() throws Exception {
+    public void setup() {
         monitor = new ControlPlaneMonitor();
         monitor.activate();
 
@@ -134,13 +105,13 @@
         assertThat(monitor.getLoad(nodeId, cmt, Optional.ofNullable(null)).latest(), is(mv.getLoad()));
     }
 
-    private void testUpdateMetricWithResource(ControlMetricType cmt, MetricValue mv, String resoureName) {
+    private void testUpdateMetricWithResource(ControlMetricType cmt, MetricValue mv, String resourceName) {
         ControlMetric cm = new ControlMetric(cmt, mv);
-        monitor.updateMetric(cm, UPDATE_INTERVAL, resoureName);
+        monitor.updateMetric(cm, UPDATE_INTERVAL, resourceName);
     }
 
-    private void testLoadMetricWithResource(ControlMetricType cmt, MetricValue mv, String resoureName) {
-        assertThat(monitor.getLoad(nodeId, cmt, resoureName).latest(), is(mv.getLoad()));
+    private void testLoadMetricWithResource(ControlMetricType cmt, MetricValue mv, String resourceName) {
+        assertThat(monitor.getLoad(nodeId, cmt, resourceName).latest(), is(mv.getLoad()));
     }
 
     private void testUpdateMetricWithId(ControlMetricType cmt, MetricValue mv, DeviceId did) {
@@ -152,6 +123,9 @@
         assertThat(monitor.getLoad(nodeId, cmt, Optional.of(did)).latest(), is(mv.getLoad()));
     }
 
+    /**
+     * Tests cpu metric update and load function.
+     */
     @Test
     public void testCpuMetric() {
         MetricValue mv = new MetricValue.Builder().load(30).add();
@@ -160,6 +134,9 @@
         CPU_METRICS.forEach(cmt -> testLoadMetricWithoutId(cmt, mv));
     }
 
+    /**
+     * Tests memory metric update and load function.
+     */
     @Test
     public void testMemoryMetric() {
         MetricValue mv = new MetricValue.Builder().load(40).add();
@@ -168,11 +145,14 @@
         MEMORY_METRICS.forEach(cmt -> testLoadMetricWithoutId(cmt, mv));
     }
 
+    /**
+     * Tests disk metric update and load function.
+     */
     @Test
     public void testDiskMetric() {
         MetricValue mv = new MetricValue.Builder().load(50).add();
 
-        ImmutableSet<String> set = ImmutableSet.of("disk1", "disk2");
+        Set<String> set = ImmutableSet.of("disk1", "disk2");
 
         set.forEach(disk -> DISK_METRICS.forEach(cmt ->
                 testUpdateMetricWithResource(cmt, mv, disk)));
@@ -181,11 +161,14 @@
                 testLoadMetricWithResource(cmt, mv, disk)));
     }
 
+    /**
+     * Tests network metric update and load function.
+     */
     @Test
     public void testNetworkMetric() {
         MetricValue mv = new MetricValue.Builder().load(10).add();
 
-        ImmutableSet<String> set = ImmutableSet.of("eth0", "eth1");
+        Set<String> set = ImmutableSet.of("eth0", "eth1");
 
         set.forEach(network -> NETWORK_METRICS.forEach(cmt ->
                 testUpdateMetricWithResource(cmt, mv, network)));
@@ -194,17 +177,40 @@
                 testLoadMetricWithResource(cmt, mv, network)));
     }
 
+    /**
+     * Tests control message update and load function.
+     */
     @Test
-    public void testUpdateControlMessage() {
+    public void testControlMessage() {
         MetricValue mv = new MetricValue.Builder().load(10).add();
+        Set<DeviceId> set = ImmutableSet.of(DeviceId.deviceId("of:0000000000000001"),
+                                            DeviceId.deviceId("of:0000000000000002"));
 
-        ImmutableSet<String> set = ImmutableSet.of("of:0000000000000001",
-                                                   "of:0000000000000002");
+        set.forEach(devId -> CONTROL_MESSAGE_METRICS.forEach(cmt ->
+                testUpdateMetricWithId(cmt, mv, devId)));
 
-        set.forEach(ctrlMsg -> CTRL_MSGS.forEach(cmt ->
-                testUpdateMetricWithId(cmt, mv, DeviceId.deviceId(ctrlMsg))));
+        set.forEach(devId -> CONTROL_MESSAGE_METRICS.forEach(cmt ->
+                testLoadMetricWithId(cmt, mv, devId)));
+    }
 
-        set.forEach(ctrlMsg -> CTRL_MSGS.forEach(cmt ->
-                testLoadMetricWithId(cmt, mv, DeviceId.deviceId(ctrlMsg))));
+    /**
+     * Tests available resource update and load function.
+     */
+    @Test
+    public void testAvailableResources() {
+        MetricValue mv = new MetricValue.Builder().load(50).add();
+
+        Set<String> diskSet = ImmutableSet.of("disk1", "disk2");
+
+        diskSet.forEach(disk -> DISK_METRICS.forEach(cmt ->
+                testUpdateMetricWithResource(cmt, mv, disk)));
+
+        Set<String> networkSet = ImmutableSet.of("eth0", "eth1");
+
+        networkSet.forEach(network -> NETWORK_METRICS.forEach(cmt ->
+                testUpdateMetricWithResource(cmt, mv, network)));
+
+        assertThat(monitor.availableResources(Type.DISK), is(diskSet));
+        assertThat(monitor.availableResources(Type.NETWORK), is(networkSet));
     }
 }