Committed by
Yuta HIGUCHI
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
Showing
7 changed files
with
137 additions
and
118 deletions
| ... | @@ -24,6 +24,7 @@ import org.onosproject.store.Store; | ... | @@ -24,6 +24,7 @@ import org.onosproject.store.Store; |
| 24 | 24 | ||
| 25 | import java.util.Collection; | 25 | import java.util.Collection; |
| 26 | import java.util.List; | 26 | import java.util.List; |
| 27 | +import java.util.stream.Stream; | ||
| 27 | 28 | ||
| 28 | /** | 29 | /** |
| 29 | * Manages inventory of infrastructure devices; not intended for direct use. | 30 | * Manages inventory of infrastructure devices; not intended for direct use. |
| ... | @@ -115,6 +116,15 @@ public interface DeviceStore extends Store<DeviceEvent, DeviceStoreDelegate> { | ... | @@ -115,6 +116,15 @@ public interface DeviceStore extends Store<DeviceEvent, DeviceStoreDelegate> { |
| 115 | List<Port> getPorts(DeviceId deviceId); | 116 | List<Port> getPorts(DeviceId deviceId); |
| 116 | 117 | ||
| 117 | /** | 118 | /** |
| 119 | + * Returns the stream of port descriptions that belong to the specified device. | ||
| 120 | + * | ||
| 121 | + * @param providerId provider identifier | ||
| 122 | + * @param deviceId device identifier | ||
| 123 | + * @return stream of device portdescriptions | ||
| 124 | + */ | ||
| 125 | + Stream<PortDescription> getPortDescriptions(ProviderId providerId, DeviceId deviceId); | ||
| 126 | + | ||
| 127 | + /** | ||
| 118 | * Updates the port statistics of the specified device using the give port | 128 | * Updates the port statistics of the specified device using the give port |
| 119 | * statistics. | 129 | * statistics. |
| 120 | * | 130 | * |
| ... | @@ -152,6 +162,16 @@ public interface DeviceStore extends Store<DeviceEvent, DeviceStoreDelegate> { | ... | @@ -152,6 +162,16 @@ public interface DeviceStore extends Store<DeviceEvent, DeviceStoreDelegate> { |
| 152 | Port getPort(DeviceId deviceId, PortNumber portNumber); | 162 | Port getPort(DeviceId deviceId, PortNumber portNumber); |
| 153 | 163 | ||
| 154 | /** | 164 | /** |
| 165 | + * Returns the specified device port description. | ||
| 166 | + * | ||
| 167 | + * @param providerId provider identifier | ||
| 168 | + * @param deviceId device identifier | ||
| 169 | + * @param portNumber port number | ||
| 170 | + * @return device port description | ||
| 171 | + */ | ||
| 172 | + PortDescription getPortDescription(ProviderId providerId, DeviceId deviceId, PortNumber portNumber); | ||
| 173 | + | ||
| 174 | + /** | ||
| 155 | * Indicates whether the specified device is available/online. | 175 | * Indicates whether the specified device is available/online. |
| 156 | * | 176 | * |
| 157 | * @param deviceId device identifier | 177 | * @param deviceId device identifier | ... | ... |
| ... | @@ -24,6 +24,7 @@ import org.onosproject.net.provider.ProviderId; | ... | @@ -24,6 +24,7 @@ import org.onosproject.net.provider.ProviderId; |
| 24 | 24 | ||
| 25 | import java.util.Collection; | 25 | import java.util.Collection; |
| 26 | import java.util.List; | 26 | import java.util.List; |
| 27 | +import java.util.stream.Stream; | ||
| 27 | 28 | ||
| 28 | /** | 29 | /** |
| 29 | * Test adapter for the DeviceStore API. | 30 | * Test adapter for the DeviceStore API. |
| ... | @@ -78,6 +79,12 @@ public class DeviceStoreAdapter implements DeviceStore { | ... | @@ -78,6 +79,12 @@ public class DeviceStoreAdapter implements DeviceStore { |
| 78 | } | 79 | } |
| 79 | 80 | ||
| 80 | @Override | 81 | @Override |
| 82 | + public Stream<PortDescription> getPortDescriptions(ProviderId providerId, | ||
| 83 | + DeviceId deviceId) { | ||
| 84 | + return Stream.empty(); | ||
| 85 | + } | ||
| 86 | + | ||
| 87 | + @Override | ||
| 81 | public DeviceEvent updatePortStatistics(ProviderId providerId, DeviceId deviceId, | 88 | public DeviceEvent updatePortStatistics(ProviderId providerId, DeviceId deviceId, |
| 82 | Collection<PortStatistics> portStats) { | 89 | Collection<PortStatistics> portStats) { |
| 83 | return null; | 90 | return null; |
| ... | @@ -99,6 +106,13 @@ public class DeviceStoreAdapter implements DeviceStore { | ... | @@ -99,6 +106,13 @@ public class DeviceStoreAdapter implements DeviceStore { |
| 99 | } | 106 | } |
| 100 | 107 | ||
| 101 | @Override | 108 | @Override |
| 109 | + public PortDescription getPortDescription(ProviderId providerId, | ||
| 110 | + DeviceId deviceId, | ||
| 111 | + PortNumber portNumber) { | ||
| 112 | + return null; | ||
| 113 | + } | ||
| 114 | + | ||
| 115 | + @Override | ||
| 102 | public boolean isAvailable(DeviceId deviceId) { | 116 | public boolean isAvailable(DeviceId deviceId) { |
| 103 | return false; | 117 | return false; |
| 104 | } | 118 | } | ... | ... |
| ... | @@ -59,11 +59,13 @@ import java.util.List; | ... | @@ -59,11 +59,13 @@ import java.util.List; |
| 59 | import java.util.Map; | 59 | import java.util.Map; |
| 60 | import java.util.Map.Entry; | 60 | import java.util.Map.Entry; |
| 61 | import java.util.Objects; | 61 | import java.util.Objects; |
| 62 | +import java.util.Optional; | ||
| 62 | import java.util.Set; | 63 | import java.util.Set; |
| 63 | import java.util.concurrent.ConcurrentHashMap; | 64 | import java.util.concurrent.ConcurrentHashMap; |
| 64 | import java.util.concurrent.ConcurrentMap; | 65 | import java.util.concurrent.ConcurrentMap; |
| 65 | import java.util.concurrent.TimeUnit; | 66 | import java.util.concurrent.TimeUnit; |
| 66 | import java.util.concurrent.atomic.AtomicReference; | 67 | import java.util.concurrent.atomic.AtomicReference; |
| 68 | +import java.util.stream.Stream; | ||
| 67 | 69 | ||
| 68 | import static com.google.common.base.Preconditions.checkArgument; | 70 | import static com.google.common.base.Preconditions.checkArgument; |
| 69 | import static com.google.common.base.Preconditions.checkNotNull; | 71 | import static com.google.common.base.Preconditions.checkNotNull; |
| ... | @@ -416,6 +418,15 @@ public class SimpleDeviceStore | ... | @@ -416,6 +418,15 @@ public class SimpleDeviceStore |
| 416 | } | 418 | } |
| 417 | 419 | ||
| 418 | @Override | 420 | @Override |
| 421 | + public Stream<PortDescription> getPortDescriptions(ProviderId providerId, | ||
| 422 | + DeviceId deviceId) { | ||
| 423 | + return Optional.ofNullable(deviceDescs.get(deviceId)) | ||
| 424 | + .map(m -> m.get(providerId)) | ||
| 425 | + .map(descs -> descs.portDescs.values().stream()) | ||
| 426 | + .orElse(Stream.empty()); | ||
| 427 | + } | ||
| 428 | + | ||
| 429 | + @Override | ||
| 419 | public DeviceEvent updatePortStatistics(ProviderId providerId, DeviceId deviceId, | 430 | public DeviceEvent updatePortStatistics(ProviderId providerId, DeviceId deviceId, |
| 420 | Collection<PortStatistics> newStatsCollection) { | 431 | Collection<PortStatistics> newStatsCollection) { |
| 421 | 432 | ||
| ... | @@ -480,6 +491,16 @@ public class SimpleDeviceStore | ... | @@ -480,6 +491,16 @@ public class SimpleDeviceStore |
| 480 | } | 491 | } |
| 481 | 492 | ||
| 482 | @Override | 493 | @Override |
| 494 | + public PortDescription getPortDescription(ProviderId providerId, | ||
| 495 | + DeviceId deviceId, | ||
| 496 | + PortNumber portNumber) { | ||
| 497 | + return Optional.ofNullable(deviceDescs.get(deviceId)) | ||
| 498 | + .map(m -> m.get(providerId)) | ||
| 499 | + .map(descs -> descs.getPortDesc(portNumber)) | ||
| 500 | + .orElse(null); | ||
| 501 | + } | ||
| 502 | + | ||
| 503 | + @Override | ||
| 483 | public List<PortStatistics> getPortStatistics(DeviceId deviceId) { | 504 | public List<PortStatistics> getPortStatistics(DeviceId deviceId) { |
| 484 | Map<PortNumber, PortStatistics> portStats = devicePortStats.get(deviceId); | 505 | Map<PortNumber, PortStatistics> portStats = devicePortStats.get(deviceId); |
| 485 | if (portStats == null) { | 506 | if (portStats == null) { | ... | ... |
| ... | @@ -86,6 +86,7 @@ import org.onosproject.net.optical.device.OmsPortHelper; | ... | @@ -86,6 +86,7 @@ import org.onosproject.net.optical.device.OmsPortHelper; |
| 86 | import org.onosproject.net.optical.device.OtuPortHelper; | 86 | import org.onosproject.net.optical.device.OtuPortHelper; |
| 87 | import org.onosproject.net.provider.AbstractListenerProviderRegistry; | 87 | import org.onosproject.net.provider.AbstractListenerProviderRegistry; |
| 88 | import org.onosproject.net.provider.AbstractProviderService; | 88 | import org.onosproject.net.provider.AbstractProviderService; |
| 89 | +import org.onosproject.net.provider.Provider; | ||
| 89 | import org.slf4j.Logger; | 90 | import org.slf4j.Logger; |
| 90 | 91 | ||
| 91 | import com.google.common.util.concurrent.Futures; | 92 | import com.google.common.util.concurrent.Futures; |
| ... | @@ -367,6 +368,17 @@ public class DeviceManager | ... | @@ -367,6 +368,17 @@ public class DeviceManager |
| 367 | 368 | ||
| 368 | } | 369 | } |
| 369 | 370 | ||
| 371 | + private PortDescription ensurePortEnabledState(PortDescription desc, boolean enabled) { | ||
| 372 | + if (desc.isEnabled() != enabled) { | ||
| 373 | + return new DefaultPortDescription(desc.portNumber(), | ||
| 374 | + enabled, | ||
| 375 | + desc.type(), | ||
| 376 | + desc.portSpeed(), | ||
| 377 | + desc.annotations()); | ||
| 378 | + } | ||
| 379 | + return desc; | ||
| 380 | + } | ||
| 381 | + | ||
| 370 | @Override | 382 | @Override |
| 371 | public void deviceDisconnected(DeviceId deviceId) { | 383 | public void deviceDisconnected(DeviceId deviceId) { |
| 372 | checkNotNull(deviceId, DEVICE_ID_NULL); | 384 | checkNotNull(deviceId, DEVICE_ID_NULL); |
| ... | @@ -374,17 +386,9 @@ public class DeviceManager | ... | @@ -374,17 +386,9 @@ public class DeviceManager |
| 374 | 386 | ||
| 375 | log.info("Device {} disconnected from this node", deviceId); | 387 | log.info("Device {} disconnected from this node", deviceId); |
| 376 | 388 | ||
| 377 | - List<Port> ports = store.getPorts(deviceId); | 389 | + List<PortDescription> descs = store.getPortDescriptions(provider().id(), deviceId) |
| 378 | - final Device device = getDevice(deviceId); | 390 | + .map(desc -> ensurePortEnabledState(desc, false)) |
| 379 | - | 391 | + .collect(Collectors.toList()); |
| 380 | - List<PortDescription> descs = ports.stream().map( | ||
| 381 | - port -> (!(Device.Type.ROADM.equals(device.type()) || | ||
| 382 | - (Device.Type.OTN.equals(device.type())) || | ||
| 383 | - (Device.Type.FIBER_SWITCH.equals(device.type())))) ? | ||
| 384 | - new DefaultPortDescription(port.number(), false, | ||
| 385 | - port.type(), port.portSpeed()) : | ||
| 386 | - OpticalPortOperator.descriptionOf(port, false) | ||
| 387 | - ).collect(Collectors.toList()); | ||
| 388 | 392 | ||
| 389 | store.updatePorts(this.provider().id(), deviceId, descs); | 393 | store.updatePorts(this.provider().id(), deviceId, descs); |
| 390 | try { | 394 | try { |
| ... | @@ -524,9 +528,12 @@ public class DeviceManager | ... | @@ -524,9 +528,12 @@ public class DeviceManager |
| 524 | Device device = nullIsNotFound(getDevice(deviceId), "Device not found"); | 528 | Device device = nullIsNotFound(getDevice(deviceId), "Device not found"); |
| 525 | if ((Device.Type.ROADM.equals(device.type())) || | 529 | if ((Device.Type.ROADM.equals(device.type())) || |
| 526 | (Device.Type.OTN.equals(device.type()))) { | 530 | (Device.Type.OTN.equals(device.type()))) { |
| 527 | - Port port = getPort(deviceId, portDescription.portNumber()); | ||
| 528 | // FIXME This is ignoring all other info in portDescription given as input?? | 531 | // FIXME This is ignoring all other info in portDescription given as input?? |
| 529 | - portDescription = OpticalPortOperator.descriptionOf(port, portDescription.isEnabled()); | 532 | + PortDescription storedPortDesc = store.getPortDescription(provider().id(), |
| 533 | + deviceId, | ||
| 534 | + portDescription.portNumber()); | ||
| 535 | + portDescription = ensurePortEnabledState(storedPortDesc, | ||
| 536 | + portDescription.isEnabled()); | ||
| 530 | } | 537 | } |
| 531 | 538 | ||
| 532 | portDescription = consolidate(deviceId, portDescription); | 539 | portDescription = consolidate(deviceId, portDescription); |
| ... | @@ -847,13 +854,14 @@ public class DeviceManager | ... | @@ -847,13 +854,14 @@ public class DeviceManager |
| 847 | if (event.configClass().equals(OpticalPortConfig.class)) { | 854 | if (event.configClass().equals(OpticalPortConfig.class)) { |
| 848 | ConnectPoint cpt = (ConnectPoint) event.subject(); | 855 | ConnectPoint cpt = (ConnectPoint) event.subject(); |
| 849 | DeviceId did = cpt.deviceId(); | 856 | DeviceId did = cpt.deviceId(); |
| 857 | + Provider provider = getProvider(did); | ||
| 850 | Port dpt = getPort(did, cpt.port()); | 858 | Port dpt = getPort(did, cpt.port()); |
| 851 | 859 | ||
| 852 | - if (dpt != null) { | 860 | + if (dpt != null && provider != null) { |
| 853 | OpticalPortConfig opc = networkConfigService.getConfig(cpt, OpticalPortConfig.class); | 861 | OpticalPortConfig opc = networkConfigService.getConfig(cpt, OpticalPortConfig.class); |
| 854 | - PortDescription desc = OpticalPortOperator.descriptionOf(dpt); | 862 | + PortDescription desc = store.getPortDescription(provider.id(), did, cpt.port()); |
| 855 | desc = OpticalPortOperator.combine(opc, desc); | 863 | desc = OpticalPortOperator.combine(opc, desc); |
| 856 | - if (desc != null && getProvider(did) != null) { | 864 | + if (desc != null) { |
| 857 | de = store.updatePortStatus(getProvider(did).id(), did, desc); | 865 | de = store.updatePortStatus(getProvider(did).id(), did, desc); |
| 858 | } | 866 | } |
| 859 | } | 867 | } | ... | ... |
| ... | @@ -20,13 +20,10 @@ import static org.onosproject.net.optical.device.OduCltPortHelper.oduCltPortDesc | ... | @@ -20,13 +20,10 @@ import static org.onosproject.net.optical.device.OduCltPortHelper.oduCltPortDesc |
| 20 | import static org.onosproject.net.optical.device.OmsPortHelper.omsPortDescription; | 20 | import static org.onosproject.net.optical.device.OmsPortHelper.omsPortDescription; |
| 21 | import static org.onosproject.net.optical.device.OtuPortHelper.otuPortDescription; | 21 | import static org.onosproject.net.optical.device.OtuPortHelper.otuPortDescription; |
| 22 | import static org.slf4j.LoggerFactory.getLogger; | 22 | import static org.slf4j.LoggerFactory.getLogger; |
| 23 | -import static com.google.common.base.Preconditions.checkNotNull; | ||
| 24 | - | ||
| 25 | import org.onosproject.net.config.ConfigOperator; | 23 | import org.onosproject.net.config.ConfigOperator; |
| 26 | import org.onosproject.net.config.basics.OpticalPortConfig; | 24 | import org.onosproject.net.config.basics.OpticalPortConfig; |
| 27 | import org.onosproject.net.AnnotationKeys; | 25 | import org.onosproject.net.AnnotationKeys; |
| 28 | import org.onosproject.net.DefaultAnnotations; | 26 | import org.onosproject.net.DefaultAnnotations; |
| 29 | -import org.onosproject.net.Port; | ||
| 30 | import org.onosproject.net.PortNumber; | 27 | import org.onosproject.net.PortNumber; |
| 31 | import org.onosproject.net.SparseAnnotations; | 28 | import org.onosproject.net.SparseAnnotations; |
| 32 | import org.onosproject.net.device.DefaultPortDescription; | 29 | import org.onosproject.net.device.DefaultPortDescription; |
| ... | @@ -35,11 +32,6 @@ import org.onosproject.net.device.OduCltPortDescription; | ... | @@ -35,11 +32,6 @@ import org.onosproject.net.device.OduCltPortDescription; |
| 35 | import org.onosproject.net.device.OmsPortDescription; | 32 | import org.onosproject.net.device.OmsPortDescription; |
| 36 | import org.onosproject.net.device.OtuPortDescription; | 33 | import org.onosproject.net.device.OtuPortDescription; |
| 37 | import org.onosproject.net.device.PortDescription; | 34 | import org.onosproject.net.device.PortDescription; |
| 38 | -import org.onosproject.net.optical.OchPort; | ||
| 39 | -import org.onosproject.net.optical.OduCltPort; | ||
| 40 | -import org.onosproject.net.optical.OmsPort; | ||
| 41 | -import org.onosproject.net.optical.OpticalDevice; | ||
| 42 | -import org.onosproject.net.optical.OtuPort; | ||
| 43 | import org.slf4j.Logger; | 35 | import org.slf4j.Logger; |
| 44 | 36 | ||
| 45 | /** | 37 | /** |
| ... | @@ -184,98 +176,4 @@ public final class OpticalPortOperator implements ConfigOperator { | ... | @@ -184,98 +176,4 @@ public final class OpticalPortOperator implements ConfigOperator { |
| 184 | return DefaultAnnotations.union(an, b.build()); | 176 | return DefaultAnnotations.union(an, b.build()); |
| 185 | } | 177 | } |
| 186 | 178 | ||
| 187 | - /** | ||
| 188 | - * Returns a description built from an existing port. | ||
| 189 | - * | ||
| 190 | - * @param port the device port | ||
| 191 | - * @return a PortDescription based on the port | ||
| 192 | - */ | ||
| 193 | - public static PortDescription descriptionOf(Port port) { | ||
| 194 | - checkNotNull(port, "Must supply non-null Port"); | ||
| 195 | - final boolean isUp = port.isEnabled(); | ||
| 196 | - return descriptionOfPort(port, isUp); | ||
| 197 | - } | ||
| 198 | - | ||
| 199 | - /** | ||
| 200 | - * Returns a description built from an existing port and reported status. | ||
| 201 | - * | ||
| 202 | - * @param port port | ||
| 203 | - * @param isEnabled true if enabled | ||
| 204 | - * @return a PortDescription based on the port | ||
| 205 | - */ | ||
| 206 | - static PortDescription descriptionOf(Port port, boolean isEnabled) { | ||
| 207 | - checkNotNull(port, "Must supply non-null Port"); | ||
| 208 | - final boolean isup = isEnabled; | ||
| 209 | - return descriptionOfPort(port, isup); | ||
| 210 | - } | ||
| 211 | - | ||
| 212 | - private static PortDescription descriptionOfPort(Port port, final boolean isup) { | ||
| 213 | - final PortNumber ptn = port.number(); | ||
| 214 | - final SparseAnnotations an = (SparseAnnotations) port.annotations(); | ||
| 215 | - switch (port.type()) { | ||
| 216 | - case OMS: | ||
| 217 | - if (port instanceof org.onosproject.net.OmsPort) { | ||
| 218 | - // remove if-block once deprecation is complete | ||
| 219 | - org.onosproject.net.OmsPort oms = (org.onosproject.net.OmsPort) port; | ||
| 220 | - return omsPortDescription(ptn, isup, oms.minFrequency(), | ||
| 221 | - oms.maxFrequency(), oms.grid(), an); | ||
| 222 | - } | ||
| 223 | - if (port.element().is(OpticalDevice.class)) { | ||
| 224 | - OpticalDevice optDevice = port.element().as(OpticalDevice.class); | ||
| 225 | - if (optDevice.portIs(port, OmsPort.class)) { | ||
| 226 | - OmsPort oms = optDevice.portAs(port, OmsPort.class).get(); | ||
| 227 | - return omsPortDescription(ptn, isup, oms.minFrequency(), | ||
| 228 | - oms.maxFrequency(), oms.grid(), an); | ||
| 229 | - } | ||
| 230 | - } | ||
| 231 | - return new DefaultPortDescription(ptn, isup, port.type(), port.portSpeed(), an); | ||
| 232 | - case OCH: | ||
| 233 | - if (port instanceof org.onosproject.net.OchPort) { | ||
| 234 | - // remove if-block once old OchPort deprecation is complete | ||
| 235 | - org.onosproject.net.OchPort och = (org.onosproject.net.OchPort) port; | ||
| 236 | - return ochPortDescription(ptn, isup, och.signalType(), | ||
| 237 | - och.isTunable(), och.lambda(), an); | ||
| 238 | - } | ||
| 239 | - if (port.element().is(OpticalDevice.class)) { | ||
| 240 | - OpticalDevice optDevice = port.element().as(OpticalDevice.class); | ||
| 241 | - if (optDevice.portIs(port, OchPort.class)) { | ||
| 242 | - OchPort och = optDevice.portAs(port, OchPort.class).get(); | ||
| 243 | - return ochPortDescription(ptn, isup, och.signalType(), | ||
| 244 | - och.isTunable(), och.lambda(), an); | ||
| 245 | - } | ||
| 246 | - } | ||
| 247 | - return new DefaultPortDescription(ptn, isup, port.type(), port.portSpeed(), an); | ||
| 248 | - | ||
| 249 | - case ODUCLT: | ||
| 250 | - if (port instanceof org.onosproject.net.OduCltPort) { | ||
| 251 | - // remove if-block once deprecation is complete | ||
| 252 | - org.onosproject.net.OduCltPort odu = (org.onosproject.net.OduCltPort) port; | ||
| 253 | - return oduCltPortDescription(ptn, isup, odu.signalType(), an); | ||
| 254 | - } | ||
| 255 | - if (port.element().is(OpticalDevice.class)) { | ||
| 256 | - OpticalDevice optDevice = port.element().as(OpticalDevice.class); | ||
| 257 | - if (optDevice.portIs(port, OduCltPort.class)) { | ||
| 258 | - OduCltPort odu = (OduCltPort) port; | ||
| 259 | - return oduCltPortDescription(ptn, isup, odu.signalType(), an); | ||
| 260 | - } | ||
| 261 | - } | ||
| 262 | - return new DefaultPortDescription(ptn, isup, port.type(), port.portSpeed(), an); | ||
| 263 | - case OTU: | ||
| 264 | - if (port instanceof org.onosproject.net.OtuPort) { | ||
| 265 | - // remove if-block once deprecation is complete | ||
| 266 | - org.onosproject.net.OtuPort otu = (org.onosproject.net.OtuPort) port; | ||
| 267 | - return otuPortDescription(ptn, isup, otu.signalType(), an); | ||
| 268 | - } | ||
| 269 | - if (port.element().is(OpticalDevice.class)) { | ||
| 270 | - OpticalDevice optDevice = port.element().as(OpticalDevice.class); | ||
| 271 | - if (optDevice.portIs(port, OtuPort.class)) { | ||
| 272 | - OtuPort otu = (OtuPort) port; | ||
| 273 | - return otuPortDescription(ptn, isup, otu.signalType(), an); | ||
| 274 | - } | ||
| 275 | - } | ||
| 276 | - return new DefaultPortDescription(ptn, isup, port.type(), port.portSpeed(), an); | ||
| 277 | - default: | ||
| 278 | - return new DefaultPortDescription(ptn, isup, port.type(), port.portSpeed(), an); | ||
| 279 | - } | ||
| 280 | - } | ||
| 281 | } | 179 | } | ... | ... |
| ... | @@ -87,6 +87,7 @@ import java.util.Set; | ... | @@ -87,6 +87,7 @@ import java.util.Set; |
| 87 | import java.util.concurrent.TimeUnit; | 87 | import java.util.concurrent.TimeUnit; |
| 88 | import java.util.concurrent.atomic.AtomicReference; | 88 | import java.util.concurrent.atomic.AtomicReference; |
| 89 | import java.util.stream.Collectors; | 89 | import java.util.stream.Collectors; |
| 90 | +import java.util.stream.Stream; | ||
| 90 | 91 | ||
| 91 | import static com.google.common.base.Preconditions.checkArgument; | 92 | import static com.google.common.base.Preconditions.checkArgument; |
| 92 | import static com.google.common.base.Verify.verify; | 93 | import static com.google.common.base.Verify.verify; |
| ... | @@ -575,11 +576,27 @@ public class ECDeviceStore | ... | @@ -575,11 +576,27 @@ public class ECDeviceStore |
| 575 | } | 576 | } |
| 576 | 577 | ||
| 577 | @Override | 578 | @Override |
| 579 | + public Stream<PortDescription> getPortDescriptions(ProviderId pid, | ||
| 580 | + DeviceId deviceId) { | ||
| 581 | + | ||
| 582 | + return portDescriptions.entrySet().stream() | ||
| 583 | + .filter(e -> e.getKey().providerId().equals(pid)) | ||
| 584 | + .map(Map.Entry::getValue); | ||
| 585 | + } | ||
| 586 | + | ||
| 587 | + @Override | ||
| 578 | public Port getPort(DeviceId deviceId, PortNumber portNumber) { | 588 | public Port getPort(DeviceId deviceId, PortNumber portNumber) { |
| 579 | return devicePorts.getOrDefault(deviceId, Maps.newHashMap()).get(portNumber); | 589 | return devicePorts.getOrDefault(deviceId, Maps.newHashMap()).get(portNumber); |
| 580 | } | 590 | } |
| 581 | 591 | ||
| 582 | @Override | 592 | @Override |
| 593 | + public PortDescription getPortDescription(ProviderId pid, | ||
| 594 | + DeviceId deviceId, | ||
| 595 | + PortNumber portNumber) { | ||
| 596 | + return portDescriptions.get(new PortKey(pid, deviceId, portNumber)); | ||
| 597 | + } | ||
| 598 | + | ||
| 599 | + @Override | ||
| 583 | public DeviceEvent updatePortStatistics(ProviderId providerId, | 600 | public DeviceEvent updatePortStatistics(ProviderId providerId, |
| 584 | DeviceId deviceId, | 601 | DeviceId deviceId, |
| 585 | Collection<PortStatistics> newStatsCollection) { | 602 | Collection<PortStatistics> newStatsCollection) { | ... | ... |
| ... | @@ -93,11 +93,13 @@ import java.util.List; | ... | @@ -93,11 +93,13 @@ import java.util.List; |
| 93 | import java.util.Map; | 93 | import java.util.Map; |
| 94 | import java.util.Map.Entry; | 94 | import java.util.Map.Entry; |
| 95 | import java.util.Objects; | 95 | import java.util.Objects; |
| 96 | +import java.util.Optional; | ||
| 96 | import java.util.Set; | 97 | import java.util.Set; |
| 97 | import java.util.concurrent.ConcurrentMap; | 98 | import java.util.concurrent.ConcurrentMap; |
| 98 | import java.util.concurrent.ExecutorService; | 99 | import java.util.concurrent.ExecutorService; |
| 99 | import java.util.concurrent.ScheduledExecutorService; | 100 | import java.util.concurrent.ScheduledExecutorService; |
| 100 | import java.util.concurrent.TimeUnit; | 101 | import java.util.concurrent.TimeUnit; |
| 102 | +import java.util.stream.Stream; | ||
| 101 | 103 | ||
| 102 | import static com.google.common.base.Preconditions.checkArgument; | 104 | import static com.google.common.base.Preconditions.checkArgument; |
| 103 | import static com.google.common.base.Predicates.notNull; | 105 | import static com.google.common.base.Predicates.notNull; |
| ... | @@ -835,6 +837,25 @@ public class GossipDeviceStore | ... | @@ -835,6 +837,25 @@ public class GossipDeviceStore |
| 835 | } | 837 | } |
| 836 | 838 | ||
| 837 | @Override | 839 | @Override |
| 840 | + public Stream<PortDescription> getPortDescriptions(ProviderId pid, | ||
| 841 | + DeviceId deviceId) { | ||
| 842 | + Map<ProviderId, DeviceDescriptions> descs = this.deviceDescs.get(deviceId); | ||
| 843 | + if (descs == null) { | ||
| 844 | + return null; | ||
| 845 | + } | ||
| 846 | + // inner-Map(=descs) is HashMap, thus requires synchronization even for reads | ||
| 847 | + final Optional<DeviceDescriptions> devDescs; | ||
| 848 | + synchronized (descs) { | ||
| 849 | + devDescs = Optional.ofNullable(descs.get(pid)); | ||
| 850 | + } | ||
| 851 | + // DeviceDescriptions is concurrent access-safe | ||
| 852 | + return devDescs | ||
| 853 | + .map(dd -> dd.getPortDescs().values().stream() | ||
| 854 | + .map(Timestamped::value)) | ||
| 855 | + .orElse(Stream.empty()); | ||
| 856 | + } | ||
| 857 | + | ||
| 858 | + @Override | ||
| 838 | public DeviceEvent updatePortStatistics(ProviderId providerId, DeviceId deviceId, | 859 | public DeviceEvent updatePortStatistics(ProviderId providerId, DeviceId deviceId, |
| 839 | Collection<PortStatistics> newStatsCollection) { | 860 | Collection<PortStatistics> newStatsCollection) { |
| 840 | 861 | ||
| ... | @@ -926,6 +947,26 @@ public class GossipDeviceStore | ... | @@ -926,6 +947,26 @@ public class GossipDeviceStore |
| 926 | } | 947 | } |
| 927 | 948 | ||
| 928 | @Override | 949 | @Override |
| 950 | + public PortDescription getPortDescription(ProviderId pid, | ||
| 951 | + DeviceId deviceId, | ||
| 952 | + PortNumber portNumber) { | ||
| 953 | + Map<ProviderId, DeviceDescriptions> descs = this.deviceDescs.get(deviceId); | ||
| 954 | + if (descs == null) { | ||
| 955 | + return null; | ||
| 956 | + } | ||
| 957 | + // inner-Map(=descs) is HashMap, thus requires synchronization even for reads | ||
| 958 | + final Optional<DeviceDescriptions> devDescs; | ||
| 959 | + synchronized (descs) { | ||
| 960 | + devDescs = Optional.ofNullable(descs.get(pid)); | ||
| 961 | + } | ||
| 962 | + // DeviceDescriptions is concurrent access-safe | ||
| 963 | + return devDescs | ||
| 964 | + .map(deviceDescriptions -> deviceDescriptions.getPortDesc(portNumber)) | ||
| 965 | + .map(Timestamped::value) | ||
| 966 | + .orElse(null); | ||
| 967 | + } | ||
| 968 | + | ||
| 969 | + @Override | ||
| 929 | public boolean isAvailable(DeviceId deviceId) { | 970 | public boolean isAvailable(DeviceId deviceId) { |
| 930 | return availableDevices.contains(deviceId); | 971 | return availableDevices.contains(deviceId); |
| 931 | } | 972 | } | ... | ... |
-
Please register or login to post a comment