Allow reading PortDescription from DeviceStore
DeviceManager had to reverse-engineer PortDescription
in order to mark port off-line, etc.
which required domain specific knowledge.
(e.g., OpticalPortOperatorr#descriptionOf)
required work for ONOS-4691
Change-Id: I954f5f2db2cb7db938f498ead4c8e3f84212a53f
diff --git a/core/store/dist/src/main/java/org/onosproject/store/device/impl/GossipDeviceStore.java b/core/store/dist/src/main/java/org/onosproject/store/device/impl/GossipDeviceStore.java
index d2d450e..acc8ff4 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/device/impl/GossipDeviceStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/device/impl/GossipDeviceStore.java
@@ -93,11 +93,13 @@
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
+import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
+import java.util.stream.Stream;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Predicates.notNull;
@@ -835,6 +837,25 @@
}
@Override
+ public Stream<PortDescription> getPortDescriptions(ProviderId pid,
+ DeviceId deviceId) {
+ Map<ProviderId, DeviceDescriptions> descs = this.deviceDescs.get(deviceId);
+ if (descs == null) {
+ return null;
+ }
+ // inner-Map(=descs) is HashMap, thus requires synchronization even for reads
+ final Optional<DeviceDescriptions> devDescs;
+ synchronized (descs) {
+ devDescs = Optional.ofNullable(descs.get(pid));
+ }
+ // DeviceDescriptions is concurrent access-safe
+ return devDescs
+ .map(dd -> dd.getPortDescs().values().stream()
+ .map(Timestamped::value))
+ .orElse(Stream.empty());
+ }
+
+ @Override
public DeviceEvent updatePortStatistics(ProviderId providerId, DeviceId deviceId,
Collection<PortStatistics> newStatsCollection) {
@@ -926,6 +947,26 @@
}
@Override
+ public PortDescription getPortDescription(ProviderId pid,
+ DeviceId deviceId,
+ PortNumber portNumber) {
+ Map<ProviderId, DeviceDescriptions> descs = this.deviceDescs.get(deviceId);
+ if (descs == null) {
+ return null;
+ }
+ // inner-Map(=descs) is HashMap, thus requires synchronization even for reads
+ final Optional<DeviceDescriptions> devDescs;
+ synchronized (descs) {
+ devDescs = Optional.ofNullable(descs.get(pid));
+ }
+ // DeviceDescriptions is concurrent access-safe
+ return devDescs
+ .map(deviceDescriptions -> deviceDescriptions.getPortDesc(portNumber))
+ .map(Timestamped::value)
+ .orElse(null);
+ }
+
+ @Override
public boolean isAvailable(DeviceId deviceId) {
return availableDevices.contains(deviceId);
}