[ONOS-3538] Implement control metrics distribution logic

- Revise getLoad method to getLocalLoad
- Add new getRemoteLoad methods
- Add the capability to query remote control load

CLI and REST will be implemented in a separated patch

Change-Id: I62d4f4ab891d6d3e95cedd5af9e4ab71949c05ec
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 1ec963d..189ca0b 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
@@ -26,6 +26,8 @@
 import org.onosproject.cpman.ControlMetricType;
 import org.onosproject.cpman.MetricValue;
 import org.onosproject.net.DeviceId;
+import org.onosproject.store.cluster.messaging.ClusterCommunicationService;
+import org.onosproject.store.cluster.messaging.ClusterCommunicationServiceAdapter;
 
 import java.util.Optional;
 import java.util.Set;
@@ -36,8 +38,12 @@
 import static org.easymock.EasyMock.replay;
 import static org.hamcrest.Matchers.is;
 import static org.junit.Assert.assertThat;
-
-import static org.onosproject.cpman.ControlResource.*;
+import static org.onosproject.cpman.ControlResource.CONTROL_MESSAGE_METRICS;
+import static org.onosproject.cpman.ControlResource.CPU_METRICS;
+import static org.onosproject.cpman.ControlResource.DISK_METRICS;
+import static org.onosproject.cpman.ControlResource.MEMORY_METRICS;
+import static org.onosproject.cpman.ControlResource.NETWORK_METRICS;
+import static org.onosproject.cpman.ControlResource.Type;
 
 /**
  * Unit test of control plane monitoring service.
@@ -48,6 +54,7 @@
     private static final Integer UPDATE_INTERVAL = 1;
     private ClusterService mockClusterService;
     private ControllerNode mockControllerNode;
+    private ClusterCommunicationService mockCommunicationService;
     private NodeId nodeId;
 
     /**
@@ -56,7 +63,9 @@
     @Before
     public void setup() {
         monitor = new ControlPlaneMonitor();
-        monitor.activate();
+
+        mockCommunicationService = new ClusterCommunicationServiceAdapter();
+        monitor.communicationService = mockCommunicationService;
 
         nodeId = new NodeId("1");
         mockControllerNode = new MockControllerNode(nodeId);
@@ -68,6 +77,8 @@
         expect(mockClusterService.getLocalNode())
                 .andReturn(mockControllerNode).anyTimes();
         replay(mockClusterService);
+
+        monitor.activate();
     }
 
     /**
@@ -102,7 +113,7 @@
     }
 
     private void testLoadMetricWithoutId(ControlMetricType cmt, MetricValue mv) {
-        assertThat(monitor.getLoad(nodeId, cmt, Optional.ofNullable(null)).latest(), is(mv.getLoad()));
+        assertThat(monitor.getLocalLoad(cmt, Optional.ofNullable(null)).latest(), is(mv.getLoad()));
     }
 
     private void testUpdateMetricWithResource(ControlMetricType cmt, MetricValue mv, String resourceName) {
@@ -111,7 +122,7 @@
     }
 
     private void testLoadMetricWithResource(ControlMetricType cmt, MetricValue mv, String resourceName) {
-        assertThat(monitor.getLoad(nodeId, cmt, resourceName).latest(), is(mv.getLoad()));
+        assertThat(monitor.getLocalLoad(cmt, resourceName).latest(), is(mv.getLoad()));
     }
 
     private void testUpdateMetricWithId(ControlMetricType cmt, MetricValue mv, DeviceId did) {
@@ -120,7 +131,7 @@
     }
 
     private void testLoadMetricWithId(ControlMetricType cmt, MetricValue mv, DeviceId did) {
-        assertThat(monitor.getLoad(nodeId, cmt, Optional.of(did)).latest(), is(mv.getLoad()));
+        assertThat(monitor.getLocalLoad(cmt, Optional.of(did)).latest(), is(mv.getLoad()));
     }
 
     /**
diff --git a/apps/cpman/app/src/test/java/org/onosproject/cpman/impl/message/ControlPlaneMonitorServiceAdaptor.java b/apps/cpman/app/src/test/java/org/onosproject/cpman/impl/message/ControlPlaneMonitorServiceAdaptor.java
index 85b361c..80946bb 100644
--- a/apps/cpman/app/src/test/java/org/onosproject/cpman/impl/message/ControlPlaneMonitorServiceAdaptor.java
+++ b/apps/cpman/app/src/test/java/org/onosproject/cpman/impl/message/ControlPlaneMonitorServiceAdaptor.java
@@ -25,6 +25,7 @@
 
 import java.util.Optional;
 import java.util.Set;
+import java.util.concurrent.CompletableFuture;
 
 /**
  * Test adapter control plane monitoring service.
@@ -32,23 +33,38 @@
 public class ControlPlaneMonitorServiceAdaptor implements ControlPlaneMonitorService {
     @Override
     public void updateMetric(ControlMetric controlMetric,
-                             int updateIntervalInMinutes, Optional<DeviceId> deviceId) {
+                             int updateIntervalInMinutes,
+                             Optional<DeviceId> deviceId) {
     }
 
     @Override
     public void updateMetric(ControlMetric controlMetric,
-                             int updateIntervalInMinutes, String resourceName) {
+                             int updateIntervalInMinutes,
+                             String resourceName) {
     }
 
     @Override
-    public ControlLoad getLoad(NodeId nodeId,
-                               ControlMetricType type, Optional<DeviceId> deviceId) {
+    public ControlLoad getLocalLoad(ControlMetricType type,
+                                    Optional<DeviceId> deviceId) {
         return null;
     }
 
     @Override
-    public ControlLoad getLoad(NodeId nodeId,
-                               ControlMetricType type, String resourceName) {
+    public ControlLoad getLocalLoad(ControlMetricType type, String resourceName) {
+        return null;
+    }
+
+    @Override
+    public CompletableFuture<ControlLoad> getRemoteLoad(NodeId nodeId,
+                                                        ControlMetricType type,
+                                                        Optional<DeviceId> deviceId) {
+        return null;
+    }
+
+    @Override
+    public CompletableFuture<ControlLoad> getRemoteLoad(NodeId nodeId,
+                                                        ControlMetricType type,
+                                                        String resourceName) {
         return null;
     }
 
diff --git a/apps/cpman/app/src/test/java/org/onosproject/cpman/rest/ControlMetricsResourceTest.java b/apps/cpman/app/src/test/java/org/onosproject/cpman/rest/ControlMetricsResourceTest.java
index f8d6c7d..62e5924 100644
--- a/apps/cpman/app/src/test/java/org/onosproject/cpman/rest/ControlMetricsResourceTest.java
+++ b/apps/cpman/app/src/test/java/org/onosproject/cpman/rest/ControlMetricsResourceTest.java
@@ -182,8 +182,8 @@
     public void testResourcePopulatedArray() {
         expect(mockControlPlaneMonitorService.availableResources(anyObject()))
                 .andReturn(resourceSet).once();
-        expect(mockControlPlaneMonitorService.getLoad(anyObject(), anyObject(),
-        anyString())).andReturn(null).times(4);
+        expect(mockControlPlaneMonitorService.getLocalLoad(anyObject(),
+                anyString())).andReturn(null).times(4);
         replay(mockControlPlaneMonitorService);
 
         final WebTarget wt = target();