From 054e23d0cf94fdeecc00ed66e04b236072277ae3 Mon Sep 17 00:00:00 2001 From: Ray Milkey Date: Thu, 22 Mar 2018 13:37:11 -0700 Subject: [PATCH] Add uptimes to device and cluster REST APIs Change-Id: I0ccdf4e33135be4bcfd1674a76ff4b39e992268b --- .../org/onosproject/cli/NodesListCommand.java | 8 +------- .../org/onosproject/cluster/ClusterService.java | 16 ++++++++++++++++ .../onosproject/net/device/DeviceService.java | 10 ++++++++++ .../net/device/DeviceServiceAdapter.java | 5 +++++ .../net/utils/ForwardingDeviceService.java | 5 +++++ .../codec/impl/ControllerNodeCodec.java | 4 +++- .../org/onosproject/codec/impl/DeviceCodec.java | 7 +++++-- .../net/device/impl/DeviceManager.java | 9 +++++++++ .../impl/VirtualNetworkDeviceManager.java | 6 ++++++ .../ctl/impl/NetconfDeviceServiceMock.java | 5 +++++ .../pcelabelstore/util/MockDeviceService.java | 5 +++++ .../rest/resources/DevicesResourceTest.java | 10 ++++++++-- 12 files changed, 78 insertions(+), 12 deletions(-) diff --git a/cli/src/main/java/org/onosproject/cli/NodesListCommand.java b/cli/src/main/java/org/onosproject/cli/NodesListCommand.java index 4e49fe9c1e..ab1216eb7a 100644 --- a/cli/src/main/java/org/onosproject/cli/NodesListCommand.java +++ b/cli/src/main/java/org/onosproject/cli/NodesListCommand.java @@ -20,13 +20,11 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import org.apache.karaf.shell.commands.Command; -import org.onlab.util.Tools; import org.onosproject.cluster.ClusterAdminService; import org.onosproject.cluster.ControllerNode; import org.onosproject.core.Version; import org.onosproject.utils.Comparators; -import java.time.Instant; import java.util.Collections; import java.util.List; @@ -51,11 +49,7 @@ public class NodesListCommand extends AbstractShellCommand { } else { ControllerNode self = service.getLocalNode(); for (ControllerNode node : nodes) { - Instant lastUpdated = service.getLastUpdatedInstant(node.id()); - String timeAgo = "Never"; - if (lastUpdated != null) { - timeAgo = Tools.timeAgo(lastUpdated.toEpochMilli()); - } + String timeAgo = service.localStatus(node.id()); Version version = service.getVersion(node.id()); print(FMT, node.id(), node.ip(), node.tcpPort(), service.getState(node.id()), diff --git a/core/api/src/main/java/org/onosproject/cluster/ClusterService.java b/core/api/src/main/java/org/onosproject/cluster/ClusterService.java index 1a75e5fccb..54f23cd3f9 100644 --- a/core/api/src/main/java/org/onosproject/cluster/ClusterService.java +++ b/core/api/src/main/java/org/onosproject/cluster/ClusterService.java @@ -20,6 +20,7 @@ import java.util.Optional; import java.util.Set; import org.joda.time.DateTime; +import org.onlab.util.Tools; import org.onosproject.core.Version; import org.onosproject.event.ListenerService; @@ -81,6 +82,21 @@ public interface ClusterService extends ListenerService { .put("id", node.id().toString()) .put("ip", node.ip().toString()) .put("tcpPort", node.tcpPort()) - .put("status", service.getState(node.id()).toString()); + .put("status", service.getState(node.id()).toString()) + .put("lastUpdate", Long.toString(service.getLastUpdatedInstant(node.id()).toEpochMilli())) + .put("humanReadableLastUpdate", service.localStatus(node.id())); } diff --git a/core/common/src/main/java/org/onosproject/codec/impl/DeviceCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/DeviceCodec.java index 029549e166..d34092a73b 100644 --- a/core/common/src/main/java/org/onosproject/codec/impl/DeviceCodec.java +++ b/core/common/src/main/java/org/onosproject/codec/impl/DeviceCodec.java @@ -47,7 +47,8 @@ public final class DeviceCodec extends AnnotatedCodec { private static final String SERIAL = "serial"; private static final String CHASSIS_ID = "chassisId"; private static final String DRIVER = "driver"; - + private static final String LAST_UPDATE = "lastUpdate"; + private static final String HUMAN_READABLE_LAST_UPDATE = "humanReadableLastUpdate"; @Override public ObjectNode encode(Device device, CodecContext context) { @@ -64,7 +65,9 @@ public final class DeviceCodec extends AnnotatedCodec { .put(SW, device.swVersion()) .put(SERIAL, device.serialNumber()) .put(DRIVER, driveService.getDriver(device.id()).name()) - .put(CHASSIS_ID, device.chassisId().toString()); + .put(CHASSIS_ID, device.chassisId().toString()) + .put(LAST_UPDATE, Long.toString(service.getLastUpdatedInstant(device.id()))) + .put(HUMAN_READABLE_LAST_UPDATE, service.localStatus(device.id())); return annotate(result, device, context); } diff --git a/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java b/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java index c82c1f531c..9f5040aae0 100644 --- a/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java +++ b/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java @@ -344,6 +344,15 @@ public class DeviceManager return (ls.connected) ? "connected " + timeAgo : "disconnected " + timeAgo; } + @Override + public long getLastUpdatedInstant(DeviceId deviceId) { + LocalStatus ls = deviceLocalStatus.get(deviceId); + if (ls == null) { + return 0; + } + return ls.dateTime.toEpochMilli(); + } + // Check a device for control channel connectivity. private boolean isReachable(DeviceId deviceId) { if (deviceId == null) { diff --git a/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/VirtualNetworkDeviceManager.java b/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/VirtualNetworkDeviceManager.java index 3f808b4ae1..601a05d7db 100644 --- a/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/VirtualNetworkDeviceManager.java +++ b/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/VirtualNetworkDeviceManager.java @@ -182,6 +182,12 @@ public class VirtualNetworkDeviceManager return null; } + @Override + public long getLastUpdatedInstant(DeviceId deviceId) { + // TODO not supported at this time + return 0; + } + /** * Translates VirtualNetworkEvent to DeviceEvent. */ diff --git a/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfDeviceServiceMock.java b/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfDeviceServiceMock.java index 3e9a614169..f89df2b70c 100644 --- a/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfDeviceServiceMock.java +++ b/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfDeviceServiceMock.java @@ -116,4 +116,9 @@ class NetconfDeviceServiceMock implements DeviceService { public String localStatus(DeviceId deviceId) { return null; } + + @Override + public long getLastUpdatedInstant(DeviceId deviceId) { + return 0; + } } \ No newline at end of file diff --git a/protocols/pcep/server/ctl/src/test/java/org/onosproject/pcelabelstore/util/MockDeviceService.java b/protocols/pcep/server/ctl/src/test/java/org/onosproject/pcelabelstore/util/MockDeviceService.java index 571dd019d7..5ff1f54fc6 100644 --- a/protocols/pcep/server/ctl/src/test/java/org/onosproject/pcelabelstore/util/MockDeviceService.java +++ b/protocols/pcep/server/ctl/src/test/java/org/onosproject/pcelabelstore/util/MockDeviceService.java @@ -151,4 +151,9 @@ public class MockDeviceService implements DeviceService { // TODO Auto-generated method stub return null; } + + @Override + public long getLastUpdatedInstant(DeviceId deviceId) { + return 0; + } } diff --git a/web/api/src/test/java/org/onosproject/rest/resources/DevicesResourceTest.java b/web/api/src/test/java/org/onosproject/rest/resources/DevicesResourceTest.java index 75d33a84b6..19fb7824b4 100644 --- a/web/api/src/test/java/org/onosproject/rest/resources/DevicesResourceTest.java +++ b/web/api/src/test/java/org/onosproject/rest/resources/DevicesResourceTest.java @@ -173,8 +173,8 @@ public class DevicesResourceTest extends ResourceTest { @Override public boolean matchesSafely(JsonArray json) { - final int minExpectedAttributes = 9; - final int maxExpectedAttributes = 10; + final int minExpectedAttributes = 11; + final int maxExpectedAttributes = 12; boolean deviceFound = false; @@ -234,6 +234,12 @@ public class DevicesResourceTest extends ResourceTest { expect(mockDeviceService.getRole(isA(DeviceId.class))) .andReturn(MastershipRole.MASTER) .anyTimes(); + expect(mockDeviceService.getLastUpdatedInstant(isA(DeviceId.class))) + .andReturn(0L) + .anyTimes(); + expect(mockDeviceService.localStatus(isA(DeviceId.class))) + .andReturn("") + .anyTimes(); // Register the services needed for the test