Enable to query the control metrics from remote node
Change-Id: Ifef1c6eafd7cc79ed99be51f7faa26d97aeb2f67
diff --git a/apps/cpman/api/src/main/java/org/onosproject/cpman/ControlLoadSnapshot.java b/apps/cpman/api/src/main/java/org/onosproject/cpman/ControlLoadSnapshot.java
new file mode 100644
index 0000000..36e436a
--- /dev/null
+++ b/apps/cpman/api/src/main/java/org/onosproject/cpman/ControlLoadSnapshot.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.cpman;
+
+import com.google.common.base.MoreObjects;
+
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+/**
+ * A container class that is used to wrap the control metric response.
+ */
+public class ControlLoadSnapshot {
+
+ private final long latest;
+ private final long average;
+ private final long time;
+
+ /**
+ * Instantiates a new control metric response with given latest, average, time.
+ *
+ * @param latest latest value of control metric
+ * @param average average value of control metric
+ * @param time last logging time fo control metric
+ */
+ public ControlLoadSnapshot(long latest, long average, long time) {
+ this.latest = latest;
+ this.average = average;
+ this.time = time;
+ }
+
+ /**
+ * Returns latest value of control metric.
+ *
+ * @return latest value of control metric
+ */
+ public long latest() {
+ return latest;
+ }
+
+ /**
+ * Returns last logging time of control metric.
+ *
+ * @return last logging time of control metric
+ */
+ public long time() {
+ return time;
+ }
+
+ /**
+ * Returns average value of control metric.
+ *
+ * @return average value of control metric
+ */
+ public long average() {
+ return average;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(latest, average, time);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof ControlLoadSnapshot) {
+ final ControlLoadSnapshot other = (ControlLoadSnapshot) obj;
+ return Objects.equals(this.latest, other.latest) &&
+ Objects.equals(this.average, other.average) &&
+ Objects.equals(this.time, other.time);
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ MoreObjects.ToStringHelper helper;
+ helper = toStringHelper(this)
+ .add("latest", latest)
+ .add("average", average)
+ .add("time", time);
+ return helper.toString();
+ }
+}
diff --git a/apps/cpman/api/src/main/java/org/onosproject/cpman/ControlMetricsRequest.java b/apps/cpman/api/src/main/java/org/onosproject/cpman/ControlMetricsRequest.java
new file mode 100644
index 0000000..8ee505a
--- /dev/null
+++ b/apps/cpman/api/src/main/java/org/onosproject/cpman/ControlMetricsRequest.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.cpman;
+
+import com.google.common.base.MoreObjects;
+import org.onosproject.net.DeviceId;
+
+import java.util.Objects;
+import java.util.Optional;
+import java.util.concurrent.TimeUnit;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+/**
+ * A container class that is used to request control metric of remote node.
+ */
+public class ControlMetricsRequest {
+ private final ControlMetricType type;
+ private Optional<DeviceId> deviceId;
+ private String resourceName;
+ private int duration;
+ private TimeUnit unit;
+
+ /**
+ * Instantiates a new control metric request of the control metric type and
+ * device identifier.
+ *
+ * @param type control metric type
+ * @param deviceId device identifier
+ */
+ public ControlMetricsRequest(ControlMetricType type, Optional<DeviceId> deviceId) {
+ this.type = type;
+ this.deviceId = deviceId;
+ }
+
+ /**
+ * Instantiates a new control metric request of the control metric type and
+ * device identifier with the given projected time range.
+ *
+ * @param type control metric type
+ * @param duration projected time duration
+ * @param unit projected time unit
+ * @param deviceId device dientifer
+ */
+ public ControlMetricsRequest(ControlMetricType type, int duration, TimeUnit unit,
+ Optional<DeviceId> deviceId) {
+ this.type = type;
+ this.deviceId = deviceId;
+ this.duration = duration;
+ this.unit = unit;
+ }
+
+ /**
+ * Instantiates a new control metric request of the control metric type and
+ * resource name.
+ *
+ * @param type control metric type
+ * @param resourceName resource name
+ */
+ public ControlMetricsRequest(ControlMetricType type, String resourceName) {
+ this.type = type;
+ this.resourceName = resourceName;
+ }
+
+ /**
+ * Instantiates a new control metric request of the control metric type and
+ * resource name with the given projected time range.
+ *
+ * @param type control metric type
+ * @param duration projected time duration
+ * @param unit projected time unit
+ * @param resourceName resource name
+ */
+ public ControlMetricsRequest(ControlMetricType type, int duration, TimeUnit unit,
+ String resourceName) {
+ this.type = type;
+ this.resourceName = resourceName;
+ this.duration = duration;
+ this.unit = unit;
+ }
+
+ /**
+ * Obtains control metric type.
+ *
+ * @return control metric type
+ */
+ public ControlMetricType getType() {
+ return type;
+ }
+
+ /**
+ * Obtains resource name.
+ *
+ * @return resource name
+ */
+ public String getResourceName() {
+ return resourceName;
+ }
+
+ /**
+ * Obtains device identifier.
+ *
+ * @return device identifier
+ */
+ public Optional<DeviceId> getDeviceId() {
+ return deviceId;
+ }
+
+ /**
+ * Obtains projected time duration.
+ *
+ * @return projected time duration
+ */
+ public int getDuration() {
+ return duration;
+ }
+
+ /**
+ * Obtains projected time unit.
+ *
+ * @return projected time unit
+ */
+ public TimeUnit getUnit() {
+ return unit;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(type, deviceId, resourceName, duration, unit.toString());
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof ControlMetricsRequest) {
+ final ControlMetricsRequest other = (ControlMetricsRequest) obj;
+ return Objects.equals(this.type, other.type) &&
+ Objects.equals(this.deviceId, other.deviceId) &&
+ Objects.equals(this.resourceName, other.resourceName) &&
+ Objects.equals(this.duration, other.duration) &&
+ Objects.equals(this.unit, other.unit);
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ MoreObjects.ToStringHelper helper;
+ helper = toStringHelper(this)
+ .add("type", type)
+ .add("resourceName", resourceName)
+ .add("duration", duration)
+ .add("timeUnit", unit);
+ if (deviceId != null) {
+ helper.add("deviceId", deviceId.get());
+ }
+ return helper.toString();
+ }
+}
diff --git a/apps/cpman/api/src/main/java/org/onosproject/cpman/ControlPlaneMonitorService.java b/apps/cpman/api/src/main/java/org/onosproject/cpman/ControlPlaneMonitorService.java
index 9a9930f..32ccdd6 100644
--- a/apps/cpman/api/src/main/java/org/onosproject/cpman/ControlPlaneMonitorService.java
+++ b/apps/cpman/api/src/main/java/org/onosproject/cpman/ControlPlaneMonitorService.java
@@ -21,8 +21,9 @@
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
-import static org.onosproject.cpman.ControlResource.*;
+import static org.onosproject.cpman.ControlResource.Type;
/**
* Control Plane Statistics Service Interface.
@@ -52,50 +53,65 @@
String resourceName);
/**
- * Obtains local control plane load of a specific device.
+ * Obtains snapshot of control plane load of a specific device.
* The metrics range from control messages and system metrics
- * (e.g., CPU and memory info)
- *
- * @param type control metric type
- * @param deviceId device identifier
- * @return control plane load
- */
- ControlLoad getLocalLoad(ControlMetricType type, Optional<DeviceId> deviceId);
-
- /**
- * Obtains local control plane load of a specific resource.
- * The metrics range from I/O device metrics
- * (e.g., disk and network interface)
- *
- * @param type control metric type
- * @param resourceName resource name
- * @return control plane load
- */
- ControlLoad getLocalLoad(ControlMetricType type, String resourceName);
-
- /**
- * Obtains remote control plane load of a specific device.
+ * (e.g., CPU and memory info).
+ * If the device id is not specified, it returns system metrics, otherwise,
+ * it returns control message stats of the given device.
*
* @param nodeId node identifier
* @param type control metric type
* @param deviceId device identifier
- * @return completable future object of control load
+ * @return completable future object of control load snapshot
*/
- CompletableFuture<ControlLoad> getRemoteLoad(NodeId nodeId,
- ControlMetricType type,
- Optional<DeviceId> deviceId);
+ CompletableFuture<ControlLoadSnapshot> getLoad(NodeId nodeId,
+ ControlMetricType type,
+ Optional<DeviceId> deviceId);
/**
- * Obtains remote control plane load of a specific resource.
+ * Obtains snapshot of control plane load of a specific resource.
+ * The metrics include I/O device metrics (e.g., disk and network metrics).
*
* @param nodeId node identifier
* @param type control metric type
* @param resourceName resource name
- * @return completable future object of control load
+ * @return completable future object of control load snapshot
*/
- CompletableFuture<ControlLoad> getRemoteLoad(NodeId nodeId,
- ControlMetricType type,
- String resourceName);
+ CompletableFuture<ControlLoadSnapshot> getLoad(NodeId nodeId,
+ ControlMetricType type,
+ String resourceName);
+
+ /**
+ * Obtains snapshot of control plane load of a specific device with the
+ * projected range.
+ *
+ * @param nodeId node identifier
+ * @param type control metric type
+ * @param duration projected duration
+ * @param unit projected time unit
+ * @param deviceId device identifier
+ * @return completable future object of control load snapshot
+ */
+ CompletableFuture<ControlLoadSnapshot> getLoad(NodeId nodeId,
+ ControlMetricType type,
+ int duration, TimeUnit unit,
+ Optional<DeviceId> deviceId);
+
+ /**
+ * Obtains snapshot of control plane load of a specific resource with the
+ * projected range.
+ *
+ * @param nodeId node identifier
+ * @param type control metric type
+ * @param duration projected duration
+ * @param unit projected time unit
+ * @param resourceName resource name
+ * @return completable future object of control load snapshot
+ */
+ CompletableFuture<ControlLoadSnapshot> getLoad(NodeId nodeId,
+ ControlMetricType type,
+ int duration, TimeUnit unit,
+ String resourceName);
/**
* Obtains a list of names of available resources.
diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/cli/ControlMetricsStatsListCommand.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/cli/ControlMetricsStatsListCommand.java
index d4253f9..adf65a9 100644
--- a/apps/cpman/app/src/main/java/org/onosproject/cpman/cli/ControlMetricsStatsListCommand.java
+++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/cli/ControlMetricsStatsListCommand.java
@@ -17,16 +17,18 @@
import org.apache.karaf.shell.commands.Argument;
import org.apache.karaf.shell.commands.Command;
+import org.onlab.util.Tools;
import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.cluster.ClusterService;
import org.onosproject.cluster.NodeId;
-import org.onosproject.cpman.ControlLoad;
+import org.onosproject.cpman.ControlLoadSnapshot;
import org.onosproject.cpman.ControlMetricType;
import org.onosproject.cpman.ControlPlaneMonitorService;
import org.onosproject.net.DeviceId;
import java.util.Optional;
import java.util.Set;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
import static org.onosproject.cpman.ControlResource.CONTROL_MESSAGE_METRICS;
import static org.onosproject.cpman.ControlResource.CPU_METRICS;
@@ -45,20 +47,25 @@
"averageValue=%d, latestTime=%s";
private static final String INVALID_TYPE = "Invalid control resource type.";
- @Argument(index = 0, name = "type",
+ private static final long TIMEOUT_MILLIS = 3000;
+
+ @Argument(index = 0, name = "node", description = "ONOS node identifier",
+ required = true, multiValued = false)
+ String node = null;
+
+ @Argument(index = 1, name = "type",
description = "Resource type (cpu|memory|disk|network|control_message)",
required = true, multiValued = false)
String type = null;
- @Argument(index = 1, name = "name", description = "Resource name (or Device Id)",
+ @Argument(index = 2, name = "name", description = "Resource name (or Device Id)",
required = false, multiValued = false)
String name = null;
@Override
protected void execute() {
ControlPlaneMonitorService service = get(ControlPlaneMonitorService.class);
- ClusterService clusterService = get(ClusterService.class);
- NodeId nodeId = clusterService.getLocalNode().id();
+ NodeId nodeId = NodeId.nodeId(node);
switch (type) {
case "cpu":
printMetricsStats(service, nodeId, CPU_METRICS);
@@ -74,7 +81,8 @@
break;
case "control_message":
if (name != null) {
- printMetricsStats(service, nodeId, CONTROL_MESSAGE_METRICS, DeviceId.deviceId(name));
+ printMetricsStats(service, nodeId, CONTROL_MESSAGE_METRICS,
+ DeviceId.deviceId(name));
}
break;
default:
@@ -89,8 +97,8 @@
}
private void printMetricsStats(ControlPlaneMonitorService service, NodeId nodeId,
- Set<ControlMetricType> typeSet, String name) {
- printMetricsStats(service, nodeId, typeSet, name, null);
+ Set<ControlMetricType> typeSet, String resName) {
+ printMetricsStats(service, nodeId, typeSet, resName, null);
}
private void printMetricsStats(ControlPlaneMonitorService service, NodeId nodeId,
@@ -99,19 +107,39 @@
}
private void printMetricsStats(ControlPlaneMonitorService service, NodeId nodeId,
- Set<ControlMetricType> typeSet, String name, DeviceId did) {
- if (name == null && did == null) {
- typeSet.forEach(s -> print(s, service.getLocalLoad(s, Optional.ofNullable(null))));
- } else if (name == null && did != null) {
- typeSet.forEach(s -> print(s, service.getLocalLoad(s, Optional.of(did))));
- } else if (name != null && did == null) {
- typeSet.forEach(s -> print(s, service.getLocalLoad(s, name)));
+ Set<ControlMetricType> typeSet, String resName, DeviceId did) {
+ if (resName == null && did == null) {
+ typeSet.forEach(s -> {
+ CompletableFuture<ControlLoadSnapshot> cf =
+ service.getLoad(nodeId, s, Optional.empty());
+ ControlLoadSnapshot cmr =
+ Tools.futureGetOrElse(cf, TIMEOUT_MILLIS, TimeUnit.MILLISECONDS, null);
+ printRemote(s, cmr);
+ });
+ } else if (resName == null && did != null) {
+ typeSet.forEach(s -> {
+ CompletableFuture<ControlLoadSnapshot> cf =
+ service.getLoad(nodeId, s, Optional.of(did));
+ ControlLoadSnapshot cmr =
+ Tools.futureGetOrElse(cf, TIMEOUT_MILLIS, TimeUnit.MILLISECONDS, null);
+ printRemote(s, cmr);
+ });
+ } else if (resName != null && did == null) {
+ typeSet.forEach(s -> {
+ CompletableFuture<ControlLoadSnapshot> cf =
+ service.getLoad(nodeId, s, resName);
+ ControlLoadSnapshot cmr =
+ Tools.futureGetOrElse(cf, TIMEOUT_MILLIS, TimeUnit.MILLISECONDS, null);
+ printRemote(s, cmr);
+ });
}
}
- private void print(ControlMetricType type, ControlLoad cl) {
- if (cl != null) {
- print(FMT, type.toString(), cl.latest(), cl.average(), cl.time());
+ private void printRemote(ControlMetricType cmType, ControlLoadSnapshot cls) {
+ if (cls != null) {
+ print(FMT, cmType.toString(), cls.latest(), cls.average(), cls.time());
+ } else {
+ print("Failed to retrieve metric value for type {}", cmType.toString());
}
}
}
diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/codec/ControlLoadCodec.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/codec/ControlLoadSnapshotCodec.java
similarity index 70%
rename from apps/cpman/app/src/main/java/org/onosproject/cpman/codec/ControlLoadCodec.java
rename to apps/cpman/app/src/main/java/org/onosproject/cpman/codec/ControlLoadSnapshotCodec.java
index fdd080b..7caf3ba 100644
--- a/apps/cpman/app/src/main/java/org/onosproject/cpman/codec/ControlLoadCodec.java
+++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/codec/ControlLoadSnapshotCodec.java
@@ -18,22 +18,22 @@
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.onosproject.codec.CodecContext;
import org.onosproject.codec.JsonCodec;
-import org.onosproject.cpman.ControlLoad;
+import org.onosproject.cpman.ControlLoadSnapshot;
/**
- * Control load codec.
+ * Control load snapshot codec.
*/
-public final class ControlLoadCodec extends JsonCodec<ControlLoad> {
+public final class ControlLoadSnapshotCodec extends JsonCodec<ControlLoadSnapshot> {
private static final String TIME = "time";
private static final String LATEST = "latest";
private static final String AVERAGE = "average";
@Override
- public ObjectNode encode(ControlLoad controlLoad, CodecContext context) {
+ public ObjectNode encode(ControlLoadSnapshot controlLoadSnapshot, CodecContext context) {
return context.mapper().createObjectNode()
- .put(TIME, controlLoad.time())
- .put(LATEST, controlLoad.latest())
- .put(AVERAGE, controlLoad.average());
+ .put(TIME, controlLoadSnapshot.time())
+ .put(LATEST, controlLoadSnapshot.latest())
+ .put(AVERAGE, controlLoadSnapshot.average());
}
}
diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/ControlMetricsRequest.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/ControlMetricsRequest.java
deleted file mode 100644
index 1e87958..0000000
--- a/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/ControlMetricsRequest.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.cpman.impl;
-
-import com.google.common.base.MoreObjects;
-import org.onosproject.cpman.ControlMetricType;
-import org.onosproject.net.DeviceId;
-
-import java.util.Objects;
-import java.util.Optional;
-
-import static com.google.common.base.MoreObjects.toStringHelper;
-
-/**
- * A container class that is used to request control metric of remote node.
- */
-public class ControlMetricsRequest {
- private final ControlMetricType type;
- private Optional<DeviceId> deviceId;
- private String resourceName;
-
- /**
- * Instantiates a new control metric request with the given control metric
- * type and device identifier.
- *
- * @param type control metric type
- * @param deviceId device identifier
- */
- public ControlMetricsRequest(ControlMetricType type, Optional<DeviceId> deviceId) {
- this.type = type;
- this.deviceId = deviceId;
- }
-
- /**
- * Instantiates a new control metric request with the given control metric
- * type and resource name.
- *
- * @param type control metric type
- * @param resourceName resource name
- */
- public ControlMetricsRequest(ControlMetricType type, String resourceName) {
- this.type = type;
- this.resourceName = resourceName;
- }
-
- /**
- * Obtains control metric type.
- *
- * @return control metric type
- */
- public ControlMetricType getType() {
- return type;
- }
-
- /**
- * Obtains resource name.
- *
- * @return resource name
- */
- public String getResourceName() {
- return resourceName;
- }
-
- /**
- * Obtains device identifier.
- *
- * @return device identifier
- */
- public Optional<DeviceId> getDeviceId() {
- return deviceId;
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(type, deviceId, resourceName);
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj instanceof ControlMetricsRequest) {
- final ControlMetricsRequest other = (ControlMetricsRequest) obj;
- return Objects.equals(this.type, other.type) &&
- Objects.equals(this.deviceId, other.deviceId) &&
- Objects.equals(this.resourceName, other.resourceName);
- }
- return false;
- }
-
- @Override
- public String toString() {
- MoreObjects.ToStringHelper helper;
- helper = toStringHelper(this)
- .add("type", type)
- .add("resourceName", resourceName);
- if (deviceId != null) {
- helper.add("deviceId", deviceId.get());
- }
- return helper.toString();
- }
-}
diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/ControlPlaneMonitor.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/ControlPlaneMonitor.java
index 68981a6..d32d2e0 100644
--- a/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/ControlPlaneMonitor.java
+++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/ControlPlaneMonitor.java
@@ -29,8 +29,10 @@
import org.onosproject.cluster.ClusterService;
import org.onosproject.cluster.NodeId;
import org.onosproject.cpman.ControlLoad;
+import org.onosproject.cpman.ControlLoadSnapshot;
import org.onosproject.cpman.ControlMetric;
import org.onosproject.cpman.ControlMetricType;
+import org.onosproject.cpman.ControlMetricsRequest;
import org.onosproject.cpman.ControlPlaneMonitorService;
import org.onosproject.cpman.MetricsDatabase;
import org.onosproject.net.DeviceId;
@@ -45,12 +47,10 @@
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import static com.google.common.base.Preconditions.checkArgument;
-import static org.onlab.util.Tools.groupedThreads;
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;
@@ -84,7 +84,7 @@
ImmutableSet.of(Type.CONTROL_MESSAGE, Type.DISK, Type.NETWORK);
private static final MessageSubject CONTROL_STATS =
- new MessageSubject("control-plane-stats");
+ new MessageSubject("control-plane-stats");
private Map<ControlMetricType, Double> cpuBuf;
private Map<ControlMetricType, Double> memoryBuf;
@@ -95,19 +95,16 @@
private Map<Type, Set<String>> availableResourceMap;
private Set<DeviceId> availableDeviceIdSet;
- private ExecutorService messageHandlingExecutor;
-
private static final String METRIC_TYPE_NULL = "Control metric type cannot be null";
- Set<Map<ControlMetricType, Double>> debugSets = Sets.newHashSet();
-
private static final Serializer SERIALIZER = Serializer
.using(new KryoNamespace.Builder()
.register(KryoNamespaces.API)
+ .register(KryoNamespaces.BASIC)
.register(ControlMetricsRequest.class)
- .register(DefaultControlLoad.class)
- .register(DefaultMetricsDatabase.class)
+ .register(ControlLoadSnapshot.class)
.register(ControlMetricType.class)
+ .register(TimeUnit.class)
.nextId(KryoNamespaces.BEGIN_USER_CUSTOM_ID).build());
@Activate
@@ -127,11 +124,8 @@
availableResourceMap = Maps.newConcurrentMap();
availableDeviceIdSet = Sets.newConcurrentHashSet();
- messageHandlingExecutor = Executors.newSingleThreadScheduledExecutor(
- groupedThreads("onos/app/cpman", "message-handlers", log));
-
- communicationService.addSubscriber(CONTROL_STATS,
- SERIALIZER::decode, this::handleRequest, messageHandlingExecutor);
+ communicationService.<ControlMetricsRequest, ControlLoadSnapshot>addSubscriber(CONTROL_STATS,
+ SERIALIZER::decode, this::handleRequest, SERIALIZER::encode);
log.info("Started");
}
@@ -243,9 +237,263 @@
}
@Override
- public ControlLoad getLocalLoad(ControlMetricType type,
- Optional<DeviceId> deviceId) {
+ public CompletableFuture<ControlLoadSnapshot> getLoad(NodeId nodeId,
+ ControlMetricType type,
+ Optional<DeviceId> deviceId) {
+ if (clusterService.getLocalNode().id().equals(nodeId)) {
+ return CompletableFuture.completedFuture(snapshot(getLocalLoad(type, deviceId)));
+ } else {
+ return communicationService.sendAndReceive(createRequest(type, deviceId),
+ CONTROL_STATS, SERIALIZER::encode, SERIALIZER::decode, nodeId);
+ }
+ }
+
+ @Override
+ public CompletableFuture<ControlLoadSnapshot> getLoad(NodeId nodeId,
+ ControlMetricType type,
+ String resourceName) {
+ if (clusterService.getLocalNode().id().equals(nodeId)) {
+ return CompletableFuture.completedFuture(snapshot(getLocalLoad(type, resourceName)));
+ } else {
+ return communicationService.sendAndReceive(createRequest(type, resourceName),
+ CONTROL_STATS, SERIALIZER::encode, SERIALIZER::decode, nodeId);
+ }
+ }
+
+ @Override
+ public CompletableFuture<ControlLoadSnapshot> getLoad(NodeId nodeId,
+ ControlMetricType type,
+ int duration, TimeUnit unit,
+ Optional<DeviceId> deviceId) {
+ if (clusterService.getLocalNode().id().equals(nodeId)) {
+ return CompletableFuture.completedFuture(snapshot(getLocalLoad(type, deviceId), duration, unit));
+ } else {
+ return communicationService.sendAndReceive(createRequest(type, duration, unit, deviceId),
+ CONTROL_STATS, SERIALIZER::encode, SERIALIZER::decode, nodeId);
+ }
+ }
+
+ @Override
+ public CompletableFuture<ControlLoadSnapshot> getLoad(NodeId nodeId,
+ ControlMetricType type,
+ int duration, TimeUnit unit,
+ String resourceName) {
+ if (clusterService.getLocalNode().id().equals(nodeId)) {
+ return CompletableFuture.completedFuture(snapshot(getLocalLoad(type, resourceName), duration, unit));
+ } else {
+ return communicationService.sendAndReceive(createRequest(type, duration, unit, resourceName),
+ CONTROL_STATS, SERIALIZER::encode, SERIALIZER::decode, nodeId);
+ }
+ }
+
+ @Override
+ public Set<String> availableResources(Type resourceType) {
+ if (RESOURCE_TYPE_SET.contains(resourceType)) {
+ if (Type.CONTROL_MESSAGE.equals(resourceType)) {
+ return availableDeviceIdSet.stream().map(id ->
+ id.toString()).collect(Collectors.toSet());
+ } else {
+ Set<String> res = availableResourceMap.get(resourceType);
+ return res == null ? ImmutableSet.of() : res;
+ }
+ }
+ return ImmutableSet.of();
+ }
+
+ /**
+ * Builds and returns metric database instance with given resource name,
+ * resource type and metric type.
+ *
+ * @param resourceName resource name
+ * @param resourceType resource type
+ * @param metricTypes metric type
+ * @return metric database instance
+ */
+ private MetricsDatabase genMDbBuilder(String resourceName,
+ Type resourceType,
+ Set<ControlMetricType> metricTypes) {
+ MetricsDatabase.Builder builder = new DefaultMetricsDatabase.Builder();
+ builder.withMetricName(resourceType.toString());
+ builder.withResourceName(resourceName);
+ metricTypes.forEach(type -> builder.addMetricType(type.toString()));
+ return builder.build();
+ }
+
+ /**
+ * Updates network metrics with given metric map and resource name.
+ *
+ * @param metricMap a metric map which is comprised of metric type and value
+ * @param resourceName resource name
+ */
+ private void updateNetworkMetrics(Map<ControlMetricType, Double> metricMap,
+ String resourceName) {
+ networkMetricsMap.putIfAbsent(resourceName, genMDbBuilder(resourceName,
+ Type.NETWORK, NETWORK_METRICS));
+ networkMetricsMap.get(resourceName).updateMetrics(convertMap(metricMap));
+ }
+
+ /**
+ * Updates disk metrics with given metric map and resource name.
+ *
+ * @param metricMap a metric map which is comprised of metric type and value
+ * @param resourceName resource name
+ */
+ private void updateDiskMetrics(Map<ControlMetricType, Double> metricMap,
+ String resourceName) {
+ diskMetricsMap.putIfAbsent(resourceName, genMDbBuilder(resourceName,
+ Type.DISK, DISK_METRICS));
+ diskMetricsMap.get(resourceName).updateMetrics(convertMap(metricMap));
+ }
+
+ /**
+ * Updates control message metrics with given metric map and device identifier.
+ *
+ * @param metricMap a metric map which is comprised of metric type and value
+ * @param deviceId device identifier
+ */
+ private void updateControlMessages(Map<ControlMetricType, Double> metricMap,
+ DeviceId deviceId) {
+ controlMessageMap.putIfAbsent(deviceId, genMDbBuilder(deviceId.toString(),
+ Type.CONTROL_MESSAGE, CONTROL_MESSAGE_METRICS));
+ controlMessageMap.get(deviceId).updateMetrics(convertMap(metricMap));
+ }
+
+ /**
+ * Converts metric map into a new map which contains string formatted metric type as key.
+ *
+ * @param metricMap metric map in which ControlMetricType is key
+ * @return a new map in which string formatted metric type is key
+ */
+ private Map<String, Double> convertMap(Map<ControlMetricType, Double> metricMap) {
+ if (metricMap == null) {
+ return ImmutableMap.of();
+ }
+ Map newMap = Maps.newConcurrentMap();
+ metricMap.forEach((k, v) -> newMap.putIfAbsent(k.toString(), v));
+ return newMap;
+ }
+
+ /**
+ * Handles control metric request from remote node.
+ *
+ * @param request control metric request
+ * @return completable future object of control load snapshot
+ */
+ private CompletableFuture<ControlLoadSnapshot> handleRequest(ControlMetricsRequest request) {
+
+ checkArgument(request.getType() != null, METRIC_TYPE_NULL);
+
+ ControlLoad load;
+ if (request.getResourceName() != null && request.getUnit() != null) {
+ load = getLocalLoad(request.getType(), request.getResourceName());
+ } else {
+ load = getLocalLoad(request.getType(), request.getDeviceId());
+ }
+
+ long average;
+ if (request.getUnit() != null) {
+ average = load.average(request.getDuration(), request.getUnit());
+ } else {
+ average = load.average();
+ }
+ ControlLoadSnapshot resp =
+ new ControlLoadSnapshot(load.latest(), average, load.time());
+ return CompletableFuture.completedFuture(resp);
+ }
+
+ /**
+ * Generates a control metric request.
+ *
+ * @param type control metric type
+ * @param deviceId device identifier
+ * @return control metric request instance
+ */
+ private ControlMetricsRequest createRequest(ControlMetricType type,
+ Optional<DeviceId> deviceId) {
+ return new ControlMetricsRequest(type, deviceId);
+ }
+
+ /**
+ * Generates a control metric request with given projected time range.
+ *
+ * @param type control metric type
+ * @param duration projected time duration
+ * @param unit projected time unit
+ * @param deviceId device identifier
+ * @return control metric request instance
+ */
+ private ControlMetricsRequest createRequest(ControlMetricType type,
+ int duration, TimeUnit unit,
+ Optional<DeviceId> deviceId) {
+ return new ControlMetricsRequest(type, duration, unit, deviceId);
+ }
+
+ /**
+ * Generates a control metric request.
+ *
+ * @param type control metric type
+ * @param resourceName resource name
+ * @return control metric request instance
+ */
+ private ControlMetricsRequest createRequest(ControlMetricType type,
+ String resourceName) {
+ return new ControlMetricsRequest(type, resourceName);
+ }
+
+ /**
+ * Generates a control metric request with given projected time range.
+ *
+ * @param type control metric type
+ * @param duration projected time duration
+ * @param unit projected time unit
+ * @param resourceName resource name
+ * @return control metric request instance
+ */
+ private ControlMetricsRequest createRequest(ControlMetricType type,
+ int duration, TimeUnit unit,
+ String resourceName) {
+ return new ControlMetricsRequest(type, duration, unit, resourceName);
+ }
+
+ /**
+ * Returns a snapshot of control load.
+ *
+ * @param cl control load
+ * @return a snapshot of control load
+ */
+ private ControlLoadSnapshot snapshot(ControlLoad cl) {
+ if (cl != null) {
+ return new ControlLoadSnapshot(cl.latest(), cl.average(), cl.time());
+ }
+ return null;
+ }
+
+ /**
+ * Returns a snapshot of control load with given projected time range.
+ *
+ * @param cl control load
+ * @param duration projected time duration
+ * @param unit projected time unit
+ * @return a snapshot of control load
+ */
+ private ControlLoadSnapshot snapshot(ControlLoad cl, int duration, TimeUnit unit) {
+ if (cl != null) {
+ return new ControlLoadSnapshot(cl.latest(), cl.average(duration, unit), cl.time());
+ }
+ return null;
+ }
+
+ /**
+ * Returns local control load.
+ *
+ * @param type metric type
+ * @param deviceId device identifier
+ * @return control load
+ */
+ private ControlLoad getLocalLoad(ControlMetricType type,
+ Optional<DeviceId> deviceId) {
if (deviceId.isPresent()) {
+ // returns control message stats
if (CONTROL_MESSAGE_METRICS.contains(type) &&
availableDeviceIdSet.contains(deviceId.get())) {
return new DefaultControlLoad(controlMessageMap.get(deviceId.get()), type);
@@ -264,111 +512,25 @@
return null;
}
- @Override
- public ControlLoad getLocalLoad(ControlMetricType type, String resourceName) {
+ /**
+ * Returns local control load.
+ *
+ * @param type metric type
+ * @param resourceName resource name
+ * @return control load
+ */
+ private ControlLoad getLocalLoad(ControlMetricType type, String resourceName) {
+ // returns disk I/O stats
if (DISK_METRICS.contains(type) &&
availableResources(Type.DISK).contains(resourceName)) {
return new DefaultControlLoad(diskMetricsMap.get(resourceName), type);
}
+ // returns network I/O stats
if (NETWORK_METRICS.contains(type) &&
availableResources(Type.NETWORK).contains(resourceName)) {
return new DefaultControlLoad(networkMetricsMap.get(resourceName), type);
}
return null;
}
-
- @Override
- public CompletableFuture<ControlLoad> getRemoteLoad(NodeId nodeId,
- ControlMetricType type,
- Optional<DeviceId> deviceId) {
- return communicationService.sendAndReceive(createRequest(type, deviceId),
- CONTROL_STATS, SERIALIZER::encode, SERIALIZER::decode, nodeId);
- }
-
- @Override
- public CompletableFuture<ControlLoad> getRemoteLoad(NodeId nodeId,
- ControlMetricType type,
- String resourceName) {
- return communicationService.sendAndReceive(createRequest(type, resourceName),
- CONTROL_STATS, SERIALIZER::encode, SERIALIZER::decode, nodeId);
- }
-
-
- @Override
- public Set<String> availableResources(Type resourceType) {
- if (RESOURCE_TYPE_SET.contains(resourceType)) {
- if (Type.CONTROL_MESSAGE.equals(resourceType)) {
- return availableDeviceIdSet.stream().map(id ->
- id.toString()).collect(Collectors.toSet());
- } else {
- Set<String> res = availableResourceMap.get(resourceType);
- return res == null ? ImmutableSet.of() : res;
- }
- }
- return ImmutableSet.of();
- }
-
- private MetricsDatabase genMDbBuilder(String resourceName,
- Type resourceType,
- Set<ControlMetricType> metricTypes) {
- MetricsDatabase.Builder builder = new DefaultMetricsDatabase.Builder();
- builder.withMetricName(resourceType.toString());
- builder.withResourceName(resourceName);
- metricTypes.forEach(type -> builder.addMetricType(type.toString()));
- return builder.build();
- }
-
- private void updateNetworkMetrics(Map<ControlMetricType, Double> metricMap,
- String resName) {
- networkMetricsMap.putIfAbsent(resName, genMDbBuilder(resName,
- Type.NETWORK, NETWORK_METRICS));
- networkMetricsMap.get(resName).updateMetrics(convertMap(metricMap));
- }
-
- private void updateDiskMetrics(Map<ControlMetricType, Double> metricMap,
- String resName) {
- diskMetricsMap.putIfAbsent(resName, genMDbBuilder(resName,
- Type.DISK, DISK_METRICS));
- diskMetricsMap.get(resName).updateMetrics(convertMap(metricMap));
- }
-
- private void updateControlMessages(Map<ControlMetricType, Double> metricMap,
- DeviceId devId) {
- controlMessageMap.putIfAbsent(devId, genMDbBuilder(devId.toString(),
- Type.CONTROL_MESSAGE, CONTROL_MESSAGE_METRICS));
- controlMessageMap.get(devId).updateMetrics(convertMap(metricMap));
- }
-
- private Map convertMap(Map<ControlMetricType, Double> map) {
- if (map == null) {
- return ImmutableMap.of();
- }
- Map newMap = Maps.newConcurrentMap();
- map.forEach((k, v) -> newMap.putIfAbsent(k.toString(), v));
- return newMap;
- }
-
- private CompletableFuture<ControlLoad> handleRequest(ControlMetricsRequest request) {
-
- checkArgument(request.getType() != null, METRIC_TYPE_NULL);
-
- ControlLoad load;
- if (request.getResourceName() != null) {
- load = getLocalLoad(request.getType(), request.getResourceName());
- } else {
- load = getLocalLoad(request.getType(), request.getDeviceId());
- }
- return CompletableFuture.completedFuture(load);
- }
-
- private ControlMetricsRequest createRequest(ControlMetricType type,
- Optional<DeviceId> deviceId) {
- return new ControlMetricsRequest(type, deviceId);
- }
-
- private ControlMetricsRequest createRequest(ControlMetricType type,
- String resourceName) {
- return new ControlMetricsRequest(type, resourceName);
- }
}
diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/CPManCodecRegistrator.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/CPManCodecRegistrator.java
index aa7709c..5afad2e 100644
--- a/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/CPManCodecRegistrator.java
+++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/CPManCodecRegistrator.java
@@ -21,8 +21,8 @@
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.onosproject.codec.CodecService;
-import org.onosproject.cpman.ControlLoad;
-import org.onosproject.cpman.codec.ControlLoadCodec;
+import org.onosproject.cpman.ControlLoadSnapshot;
+import org.onosproject.cpman.codec.ControlLoadSnapshotCodec;
import org.slf4j.Logger;
import static org.slf4j.LoggerFactory.getLogger;
@@ -40,14 +40,14 @@
@Activate
public void activate() {
- codecService.registerCodec(ControlLoad.class, new ControlLoadCodec());
+ codecService.registerCodec(ControlLoadSnapshot.class, new ControlLoadSnapshotCodec());
log.info("Started");
}
@Deactivate
public void deactivate() {
- codecService.unregisterCodec(ControlLoad.class);
+ codecService.unregisterCodec(ControlLoadSnapshot.class);
log.info("Stopped");
}
diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/ControlMetricsWebResource.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/ControlMetricsWebResource.java
index a5d0baf..5e985b0 100644
--- a/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/ControlMetricsWebResource.java
+++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/ControlMetricsWebResource.java
@@ -18,9 +18,10 @@
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.apache.commons.lang3.StringUtils;
+import org.onlab.util.Tools;
import org.onosproject.cluster.ClusterService;
import org.onosproject.cluster.NodeId;
-import org.onosproject.cpman.ControlLoad;
+import org.onosproject.cpman.ControlLoadSnapshot;
import org.onosproject.cpman.ControlMetricType;
import org.onosproject.cpman.ControlPlaneMonitorService;
import org.onosproject.net.DeviceId;
@@ -34,6 +35,8 @@
import javax.ws.rs.core.Response;
import java.util.Optional;
import java.util.Set;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
import static org.onosproject.cpman.ControlResource.CONTROL_MESSAGE_METRICS;
import static org.onosproject.cpman.ControlResource.CPU_METRICS;
@@ -55,6 +58,7 @@
private final ClusterService clusterService = get(ClusterService.class);
private final NodeId localNodeId = clusterService.getLocalNode().id();
private final ObjectNode root = mapper().createObjectNode();
+ private static final long TIMEOUT_MILLIS = 1000;
/**
* Returns control message metrics of all devices.
@@ -248,31 +252,51 @@
if (name == null && did == null) {
typeSet.forEach(type -> {
ObjectNode metricNode = mapper().createObjectNode();
- ControlLoad load = service.getLocalLoad(type, Optional.ofNullable(null));
- if (load != null) {
- metricNode.set(toCamelCase(type.toString(), true), codec(ControlLoad.class)
- .encode(service.getLocalLoad(type, Optional.ofNullable(null)), this));
- metricsNode.add(metricNode);
+ CompletableFuture<ControlLoadSnapshot> cf =
+ service.getLoad(nodeId, type, Optional.empty());
+
+ if (cf != null) {
+ ControlLoadSnapshot cmr =
+ Tools.futureGetOrElse(cf, TIMEOUT_MILLIS, TimeUnit.MILLISECONDS, null);
+
+ if (cmr != null) {
+ metricNode.set(toCamelCase(type.toString(), true),
+ codec(ControlLoadSnapshot.class).encode(cmr, this));
+ metricsNode.add(metricNode);
+ }
}
});
} else if (name == null) {
typeSet.forEach(type -> {
ObjectNode metricNode = mapper().createObjectNode();
- ControlLoad load = service.getLocalLoad(type, Optional.of(did));
- if (load != null) {
- metricNode.set(toCamelCase(type.toString(), true),
- codec(ControlLoad.class).encode(load, this));
- metricsNode.add(metricNode);
+ CompletableFuture<ControlLoadSnapshot> cf =
+ service.getLoad(nodeId, type, Optional.of(did));
+
+ if (cf != null) {
+ ControlLoadSnapshot cmr =
+ Tools.futureGetOrElse(cf, TIMEOUT_MILLIS, TimeUnit.MILLISECONDS, null);
+ if (cmr != null) {
+ metricNode.set(toCamelCase(type.toString(), true),
+ codec(ControlLoadSnapshot.class).encode(cmr, this));
+ metricsNode.add(metricNode);
+ }
}
+
});
} else if (did == null) {
typeSet.forEach(type -> {
ObjectNode metricNode = mapper().createObjectNode();
- ControlLoad load = service.getLocalLoad(type, name);
- if (load != null) {
- metricNode.set(toCamelCase(type.toString(), true),
- codec(ControlLoad.class).encode(load, this));
- metricsNode.add(metricNode);
+ CompletableFuture<ControlLoadSnapshot> cf =
+ service.getLoad(nodeId, type, name);
+
+ if (cf != null) {
+ ControlLoadSnapshot cmr =
+ Tools.futureGetOrElse(cf, TIMEOUT_MILLIS, TimeUnit.MILLISECONDS, null);
+ if (cmr != null) {
+ metricNode.set(toCamelCase(type.toString(), true),
+ codec(ControlLoadSnapshot.class).encode(cmr, this));
+ metricsNode.add(metricNode);
+ }
}
});
}
diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/SystemMetricsCollectorWebResource.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/SystemMetricsCollectorWebResource.java
index c96d1d9..5dd9413 100644
--- a/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/SystemMetricsCollectorWebResource.java
+++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/SystemMetricsCollectorWebResource.java
@@ -106,31 +106,31 @@
long cpuIdleTime = nullIsIllegal(jsonTree.get("cpuIdleTime").asLong(), INVALID_REQUEST);
aggregator.setMetricsService(metricsService);
- aggregator.addMetrics(Optional.ofNullable(null), SYSTEM_TYPE);
+ aggregator.addMetrics(Optional.empty(), SYSTEM_TYPE);
cm = new ControlMetric(ControlMetricType.CPU_LOAD,
new MetricValue.Builder().load(cpuLoad).add());
- monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, Optional.ofNullable(null));
+ monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, Optional.empty());
aggregator.increment(ControlMetricType.CPU_LOAD, cpuLoad);
cm = new ControlMetric(ControlMetricType.TOTAL_CPU_TIME,
new MetricValue.Builder().load(totalCpuTime).add());
- monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, Optional.ofNullable(null));
+ monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, Optional.empty());
aggregator.increment(ControlMetricType.TOTAL_CPU_TIME, totalCpuTime);
cm = new ControlMetric(ControlMetricType.SYS_CPU_TIME,
new MetricValue.Builder().load(sysCpuTime).add());
- monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, Optional.ofNullable(null));
+ monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, Optional.empty());
aggregator.increment(ControlMetricType.SYS_CPU_TIME, sysCpuTime);
cm = new ControlMetric(ControlMetricType.USER_CPU_TIME,
new MetricValue.Builder().load(userCpuTime).add());
- monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, Optional.ofNullable(null));
+ monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, Optional.empty());
aggregator.increment(ControlMetricType.USER_CPU_TIME, userCpuTime);
cm = new ControlMetric(ControlMetricType.CPU_IDLE_TIME,
new MetricValue.Builder().load(cpuIdleTime).add());
- monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, Optional.ofNullable(null));
+ monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, Optional.empty());
aggregator.increment(ControlMetricType.CPU_IDLE_TIME, cpuIdleTime);
} catch (IOException e) {
@@ -167,26 +167,26 @@
long memFreeRatio = memTotal == 0L ? 0L : (memFree * PERCENT_CONSTANT) / memTotal;
aggregator.setMetricsService(metricsService);
- aggregator.addMetrics(Optional.ofNullable(null), SYSTEM_TYPE);
+ aggregator.addMetrics(Optional.empty(), SYSTEM_TYPE);
cm = new ControlMetric(ControlMetricType.MEMORY_USED_RATIO,
new MetricValue.Builder().load(memUsedRatio).add());
- monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, Optional.ofNullable(null));
+ monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, Optional.empty());
aggregator.increment(ControlMetricType.MEMORY_USED_RATIO, memUsedRatio);
cm = new ControlMetric(ControlMetricType.MEMORY_FREE_RATIO,
new MetricValue.Builder().load(memFreeRatio).add());
- monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, Optional.ofNullable(null));
+ monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, Optional.empty());
aggregator.increment(ControlMetricType.MEMORY_FREE_RATIO, memFreeRatio);
cm = new ControlMetric(ControlMetricType.MEMORY_USED,
new MetricValue.Builder().load(memUsed).add());
- monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, Optional.ofNullable(null));
+ monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, Optional.empty());
aggregator.increment(ControlMetricType.MEMORY_USED, memUsed);
cm = new ControlMetric(ControlMetricType.MEMORY_FREE,
new MetricValue.Builder().load(memFree).add());
- monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, Optional.ofNullable(null));
+ monitorService.updateMetric(cm, UPDATE_INTERVAL_IN_MINUTE, Optional.empty());
aggregator.increment(ControlMetricType.MEMORY_FREE, memFree);
} catch (IOException e) {
diff --git a/apps/cpman/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/cpman/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
index a2b47cf..8a9556d 100644
--- a/apps/cpman/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ b/apps/cpman/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -19,12 +19,14 @@
<command>
<action class="org.onosproject.cpman.cli.ControlMetricsStatsListCommand"/>
<completers>
+ <ref component-id="nodeIdCompleter"/>
<ref component-id="controlResourceTypeCompleter"/>
<ref component-id="resourceNameCompleter"/>
</completers>
</command>
</command-bundle>
+ <bean id="nodeIdCompleter" class="org.onosproject.cli.NodeIdCompleter"/>
<bean id="controlResourceTypeCompleter" class="org.onosproject.cpman.cli.ControlResourceTypeCompleter"/>
<bean id="resourceNameCompleter" class="org.onosproject.cpman.cli.ResourceNameCompleter"/>
</blueprint>
\ No newline at end of file
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 62502f9..39198af 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
@@ -31,6 +31,7 @@
import java.util.Optional;
import java.util.Set;
+import java.util.concurrent.ExecutionException;
import static org.easymock.EasyMock.anyObject;
import static org.easymock.EasyMock.createMock;
@@ -109,11 +110,17 @@
private void testUpdateMetricWithoutId(ControlMetricType cmt, MetricValue mv) {
ControlMetric cm = new ControlMetric(cmt, mv);
- monitor.updateMetric(cm, UPDATE_INTERVAL, Optional.ofNullable(null));
+ monitor.updateMetric(cm, UPDATE_INTERVAL, Optional.empty());
}
- private void testLoadMetricWithoutId(ControlMetricType cmt, MetricValue mv) {
- assertThat(monitor.getLocalLoad(cmt, Optional.ofNullable(null)).latest(), is(mv.getLoad()));
+ private void testLoadMetric(NodeId nodeId, ControlMetricType cmt, MetricValue mv) {
+ try {
+ assertThat(monitor.getLoad(nodeId, cmt, Optional.empty()).get().latest(), is(mv.getLoad()));
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ } catch (ExecutionException e) {
+ e.printStackTrace();
+ }
}
private void testUpdateMetricWithResource(ControlMetricType cmt, MetricValue mv, String resourceName) {
@@ -121,8 +128,14 @@
monitor.updateMetric(cm, UPDATE_INTERVAL, resourceName);
}
- private void testLoadMetricWithResource(ControlMetricType cmt, MetricValue mv, String resourceName) {
- assertThat(monitor.getLocalLoad(cmt, resourceName).latest(), is(mv.getLoad()));
+ private void testLoadMetricWithResource(NodeId nodeId, ControlMetricType cmt, MetricValue mv, String resourceName) {
+ try {
+ assertThat(monitor.getLoad(nodeId, cmt, resourceName).get().latest(), is(mv.getLoad()));
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ } catch (ExecutionException e) {
+ e.printStackTrace();
+ }
}
private void testUpdateMetricWithId(ControlMetricType cmt, MetricValue mv, DeviceId did) {
@@ -130,8 +143,14 @@
monitor.updateMetric(cm, UPDATE_INTERVAL, Optional.of(did));
}
- private void testLoadMetricWithId(ControlMetricType cmt, MetricValue mv, DeviceId did) {
- assertThat(monitor.getLocalLoad(cmt, Optional.of(did)).latest(), is(mv.getLoad()));
+ private void testLoadMetricWithId(NodeId nodeId, ControlMetricType cmt, MetricValue mv, DeviceId did) {
+ try {
+ assertThat(monitor.getLoad(nodeId, cmt, Optional.of(did)).get().latest(), is(mv.getLoad()));
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ } catch (ExecutionException e) {
+ e.printStackTrace();
+ }
}
/**
@@ -142,7 +161,7 @@
MetricValue mv = new MetricValue.Builder().load(30).add();
CPU_METRICS.forEach(cmt -> testUpdateMetricWithoutId(cmt, mv));
- CPU_METRICS.forEach(cmt -> testLoadMetricWithoutId(cmt, mv));
+ CPU_METRICS.forEach(cmt -> testLoadMetric(nodeId, cmt, mv));
}
/**
@@ -153,7 +172,7 @@
MetricValue mv = new MetricValue.Builder().load(40).add();
MEMORY_METRICS.forEach(cmt -> testUpdateMetricWithoutId(cmt, mv));
- MEMORY_METRICS.forEach(cmt -> testLoadMetricWithoutId(cmt, mv));
+ MEMORY_METRICS.forEach(cmt -> testLoadMetric(nodeId, cmt, mv));
}
/**
@@ -169,7 +188,7 @@
testUpdateMetricWithResource(cmt, mv, disk)));
set.forEach(disk -> DISK_METRICS.forEach(cmt ->
- testLoadMetricWithResource(cmt, mv, disk)));
+ testLoadMetricWithResource(nodeId, cmt, mv, disk)));
}
/**
@@ -185,7 +204,7 @@
testUpdateMetricWithResource(cmt, mv, network)));
set.forEach(network -> NETWORK_METRICS.forEach(cmt ->
- testLoadMetricWithResource(cmt, mv, network)));
+ testLoadMetricWithResource(nodeId, cmt, mv, network)));
}
/**
@@ -201,7 +220,7 @@
testUpdateMetricWithId(cmt, mv, devId)));
set.forEach(devId -> CONTROL_MESSAGE_METRICS.forEach(cmt ->
- testLoadMetricWithId(cmt, mv, devId)));
+ testLoadMetricWithId(nodeId, cmt, mv, devId)));
}
/**
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 dbc991b..087b1ab 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
@@ -16,7 +16,7 @@
package org.onosproject.cpman.impl.message;
import org.onosproject.cluster.NodeId;
-import org.onosproject.cpman.ControlLoad;
+import org.onosproject.cpman.ControlLoadSnapshot;
import org.onosproject.cpman.ControlMetric;
import org.onosproject.cpman.ControlMetricType;
import org.onosproject.cpman.ControlPlaneMonitorService;
@@ -26,6 +26,7 @@
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
/**
* Test adapter control plane monitoring service.
@@ -44,27 +45,32 @@
}
@Override
- public ControlLoad getLocalLoad(ControlMetricType type,
- Optional<DeviceId> deviceId) {
+ public CompletableFuture<ControlLoadSnapshot> getLoad(NodeId nodeId,
+ ControlMetricType type,
+ Optional<DeviceId> deviceId) {
return null;
}
@Override
- public ControlLoad getLocalLoad(ControlMetricType type, String resourceName) {
+ public CompletableFuture<ControlLoadSnapshot> getLoad(NodeId nodeId,
+ ControlMetricType type,
+ String resourceName) {
return null;
}
@Override
- public CompletableFuture<ControlLoad> getRemoteLoad(NodeId nodeId,
- ControlMetricType type,
- Optional<DeviceId> deviceId) {
+ public CompletableFuture<ControlLoadSnapshot> getLoad(NodeId nodeId,
+ ControlMetricType type,
+ int duration, TimeUnit unit,
+ Optional<DeviceId> deviceId) {
return null;
}
@Override
- public CompletableFuture<ControlLoad> getRemoteLoad(NodeId nodeId,
- ControlMetricType type,
- String resourceName) {
+ public CompletableFuture<ControlLoadSnapshot> getLoad(NodeId nodeId,
+ ControlMetricType type,
+ int duration, TimeUnit unit,
+ 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 cfcb092..fd6d2c7 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
@@ -15,11 +15,7 @@
*/
package org.onosproject.cpman.rest;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-
-import javax.ws.rs.client.WebTarget;
-
+import com.google.common.collect.ImmutableSet;
import org.glassfish.jersey.server.ResourceConfig;
import org.junit.Before;
import org.junit.Test;
@@ -33,11 +29,14 @@
import org.onosproject.codec.CodecService;
import org.onosproject.codec.impl.CodecManager;
import org.onosproject.cpman.ControlLoad;
+import org.onosproject.cpman.ControlLoadSnapshot;
import org.onosproject.cpman.ControlPlaneMonitorService;
-import org.onosproject.cpman.codec.ControlLoadCodec;
+import org.onosproject.cpman.codec.ControlLoadSnapshotCodec;
import org.onosproject.rest.resources.ResourceTest;
-import com.google.common.collect.ImmutableSet;
+import javax.ws.rs.client.WebTarget;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
import static org.easymock.EasyMock.anyObject;
import static org.easymock.EasyMock.anyString;
@@ -145,7 +144,7 @@
public void setUpTest() {
final CodecManager codecService = new CodecManager();
codecService.activate();
- codecService.registerCodec(ControlLoad.class, new ControlLoadCodec());
+ codecService.registerCodec(ControlLoadSnapshot.class, new ControlLoadSnapshotCodec());
ServiceDirectory testDirectory =
new TestServiceDirectory()
.add(ControlPlaneMonitorService.class,
@@ -184,7 +183,7 @@
public void testResourcePopulatedArray() {
expect(mockControlPlaneMonitorService.availableResources(anyObject()))
.andReturn(resourceSet).once();
- expect(mockControlPlaneMonitorService.getLocalLoad(anyObject(),
+ expect(mockControlPlaneMonitorService.getLoad(anyObject(), anyObject(),
anyString())).andReturn(null).times(4);
replay(mockControlPlaneMonitorService);