X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=networkmodel%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Ftransportpce%2Fnetworkmodel%2FNetConfTopologyListener.java;h=ce15d3377f810b3688b34b49e2cd8eb12b57f8ee;hb=f26a8d33de6039fc678a8f053eaf1f49de3a9718;hp=dedc387a0d7c400eb80054f59246a68c34caa8f7;hpb=7945d23c377ed1ea8854ddc3999e23c08802e5d5;p=transportpce.git diff --git a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/NetConfTopologyListener.java b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/NetConfTopologyListener.java index dedc387a0..ce15d3377 100644 --- a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/NetConfTopologyListener.java +++ b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/NetConfTopologyListener.java @@ -9,13 +9,13 @@ package org.opendaylight.transportpce.networkmodel; import com.google.common.annotations.VisibleForTesting; import com.google.common.util.concurrent.ListenableFuture; +import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutionException; -import javax.annotation.Nonnull; import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.DataObjectModification; import org.opendaylight.mdsal.binding.api.DataTreeChangeListener; @@ -23,7 +23,9 @@ import org.opendaylight.mdsal.binding.api.DataTreeModification; import org.opendaylight.mdsal.binding.api.MountPoint; import org.opendaylight.mdsal.binding.api.NotificationService; import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry; +import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.transportpce.common.StringConstants; +import org.opendaylight.transportpce.common.Timeouts; import org.opendaylight.transportpce.common.device.DeviceTransactionManager; import org.opendaylight.transportpce.common.mapping.PortMapping; import org.opendaylight.transportpce.networkmodel.dto.NodeRegistration; @@ -32,10 +34,14 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification. import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.CreateSubscriptionOutput; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.NotificationsService; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.StreamNameType; -import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode; -import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus.ConnectionStatus; -import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.available.capabilities.AvailableCapability; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netmod.notification.rev080714.Netconf; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netmod.notification.rev080714.netconf.Streams; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netmod.notification.rev080714.netconf.streams.Stream; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240118.ConnectionOper.ConnectionStatus; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240118.connection.oper.available.capabilities.AvailableCapability; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev221225.NetconfNode; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.RpcResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -62,7 +68,8 @@ public class NetConfTopologyListener implements DataTreeChangeListener { this.portMapping = portMapping; } - public void onDataTreeChanged(@Nonnull Collection> changes) { + @Override + public void onDataTreeChanged(Collection> changes) { LOG.info("onDataTreeChanged - {}", this.getClass().getSimpleName()); for (DataTreeModification change : changes) { DataObjectModification rootNode = change.getRootNode(); @@ -93,8 +100,8 @@ public class NetConfTopologyListener implements DataTreeChangeListener { return; } this.networkModelService - .createOpenRoadmNode(nodeId, deviceCapabilityOpt.get().getCapability()); - onDeviceConnected(nodeId, deviceCapabilityOpt.get().getCapability()); + .createOpenRoadmNode(nodeId, deviceCapabilityOpt.orElseThrow().getCapability()); + onDeviceConnected(nodeId, deviceCapabilityOpt.orElseThrow().getCapability()); LOG.info("Device {} correctly connected to controller", nodeId); } if (ConnectionStatus.Connected.equals(netconfNodeBefore.getConnectionStatus()) @@ -116,7 +123,7 @@ public class NetConfTopologyListener implements DataTreeChangeListener { LOG.error("Failed to get mount point for node {}", nodeId); return; } - MountPoint mountPoint = mountPointOpt.get(); + MountPoint mountPoint = mountPointOpt.orElseThrow(); final Optional notificationService = mountPoint.getService(NotificationService.class); if (notificationService.isEmpty()) { LOG.error(RPC_SERVICE_FAILED, nodeId); @@ -124,7 +131,7 @@ public class NetConfTopologyListener implements DataTreeChangeListener { } NodeRegistration nodeRegistration = new NodeRegistration( - nodeId, openRoadmVersion, notificationService.get(), this.dataBroker, this.portMapping); + nodeId, openRoadmVersion, notificationService.orElseThrow(), this.dataBroker, this.portMapping); nodeRegistration.registerListeners(); registrations.put(nodeId, nodeRegistration); @@ -141,19 +148,17 @@ public class NetConfTopologyListener implements DataTreeChangeListener { if (service.isEmpty()) { return false; } - final NotificationsService rpcService = service.get().getRpcService(NotificationsService.class); + final NotificationsService rpcService = service.orElseThrow().getRpcService(NotificationsService.class); if (rpcService == null) { LOG.error(RPC_SERVICE_FAILED, nodeId); return false; } // Set the default stream as OPENROADM - for (String streamName : List.of("OPENROADM", "NETCONF")) { + for (String streamName : getSupportedStream(nodeId)) { LOG.info("Triggering notification stream {} for node {}", streamName, nodeId); ListenableFuture> subscription = rpcService.createSubscription( new CreateSubscriptionInputBuilder().setStream(new StreamNameType(streamName)).build()); - // If OpenROADM stream is not supported - // Try NETCONF subscription if (checkSupportedStream(streamName, subscription)) { return true; } @@ -189,4 +194,31 @@ public class NetConfTopologyListener implements DataTreeChangeListener { return subscriptionSuccessful; } + private List getSupportedStream(String nodeId) { + InstanceIdentifier streamsIID = InstanceIdentifier.create(Netconf.class).child(Streams.class); + Optional ordmInfoObject = + deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, streamsIID, + Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT); + if (ordmInfoObject == null || ordmInfoObject.isEmpty() || ordmInfoObject.orElseThrow().getStream().isEmpty()) { + LOG.error("List of streams supports by device is not present"); + return List.of("OPENROADM","NETCONF"); + } + List streams = new ArrayList<>(); + List netconfStreams = new ArrayList<>(); + for (Stream strm : ordmInfoObject.orElseThrow().getStream().values()) { + LOG.debug("Streams are {}", strm); + if ("OPENROADM".equalsIgnoreCase(strm.getName().getValue())) { + streams.add(strm.getName().getValue()); + } else if ("NETCONF".equalsIgnoreCase(strm.getName().getValue())) { + netconfStreams.add(strm.getName().getValue()); + } + } + // If OpenROADM streams are not supported, try NETCONF streams subscription + streams.addAll(netconfStreams); + return + streams.isEmpty() + ? List.of("OPENROADM","NETCONF") + : streams; + } + }