Merge "PortMapping for device 1.2.1 and 2.2"
[transportpce.git] / networkmodel / src / main / java / org / opendaylight / transportpce / networkmodel / NetConfTopologyListener.java
index 0fc982ec54852c72b763b9708f0c89416ef05c86..a09a3be7e0178a594a5fa51cefaf487874be6de6 100644 (file)
@@ -8,20 +8,23 @@
 package org.opendaylight.transportpce.networkmodel;
 
 import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
 
 import javax.annotation.Nonnull;
 
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
+import org.opendaylight.controller.md.sal.binding.api.DataObjectModification.ModificationType;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
 import org.opendaylight.controller.md.sal.binding.api.MountPoint;
 import org.opendaylight.controller.md.sal.binding.api.NotificationService;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.sal.binding.api.RpcConsumerRegistry;
 import org.opendaylight.transportpce.common.StringConstants;
 import org.opendaylight.transportpce.common.Timeouts;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
@@ -37,13 +40,11 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.de.operations.rev161014.O
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.OrgOpenroadmDeviceListener;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev161014.OrgOpenroadmLldpListener;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.tca.rev161014.OrgOpenroadmTcaListener;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.CreateSubscriptionInputBuilder;
-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.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.opendaylight.netconf.node.topology.rev150114.NetconfNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus;
+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.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -113,31 +114,6 @@ public class NetConfTopologyListener implements DataTreeChangeListener<Node> {
         final ListenerRegistration<OrgOpenroadmTcaListener> accessTcaNotificationListenerRegistration =
                 notificationService.get().registerNotificationListener(tcaListener);
 
-
-
-        String streamName = getSupportedStream(nodeId);
-        if (streamName == null) {
-            streamName = "OPENROADM";
-        }
-        final Optional<RpcConsumerRegistry> service = mountPoint.getService(RpcConsumerRegistry.class).toJavaUtil();
-        if (service.isPresent()) {
-            final NotificationsService rpcService = service.get().getRpcService(NotificationsService.class);
-            if (rpcService == null) {
-                LOG.error("Failed to get RpcService for node {}", nodeId);
-            } else {
-                final CreateSubscriptionInputBuilder createSubscriptionInputBuilder =
-                    new CreateSubscriptionInputBuilder();
-                createSubscriptionInputBuilder.setStream(new StreamNameType(streamName));
-                LOG.info("Triggering notification stream {} for node {}", streamName, nodeId);
-                rpcService.createSubscription(createSubscriptionInputBuilder.build());
-            }
-        } else {
-            LOG.error("Failed to get RpcService for node {}", nodeId);
-        }
-        NodeRegistration nodeRegistration = new NodeRegistration(nodeId, accessAlarmNotificationListenerRegistration,
-                accessDeOperationasNotificationListenerRegistration, accessDeviceNotificationListenerRegistration,
-                accessLldpNotificationListenerRegistration, accessTcaNotificationListenerRegistration);
-        this.registrations.put(nodeId, nodeRegistration);
     }
 
     private void onDeviceDisConnected(final String nodeId) {
@@ -153,48 +129,67 @@ public class NetConfTopologyListener implements DataTreeChangeListener<Node> {
     }
 
     @Override
+    @SuppressWarnings("checkstyle:FallThrough")
     public void onDataTreeChanged(@Nonnull Collection<DataTreeModification<Node>> changes) {
         LOG.info("onDataTreeChanged");
         for (DataTreeModification<Node> change : changes) {
             DataObjectModification<Node> rootNode = change.getRootNode();
-            if (rootNode.getDataAfter() == null) {
+            if ((rootNode.getDataAfter() == null) && (rootNode.getModificationType() != ModificationType.DELETE)) {
+                LOG.error("rootNode.getDataAfter is null : Node not connected via Netconf protocol");
                 continue;
             }
-            String nodeId = rootNode.getDataAfter().getKey().getNodeId().getValue();
-            NetconfNode netconfNode = rootNode.getDataAfter().getAugmentation(NetconfNode.class);
+            if (rootNode.getModificationType() == ModificationType.DELETE) {
+                if (rootNode.getDataBefore() != null) {
+                    String nodeId = rootNode.getDataBefore().key().getNodeId().getValue();
+                    LOG.info("Node {} deleted", nodeId);
+                    this.networkModelService.deleteOpenROADMnode(nodeId);
+                    onDeviceDisConnected(nodeId);
+                } else {
+                    LOG.error("rootNode.getDataBefore is null !");
+                }
+                continue;
+            }
+            String nodeId = rootNode.getDataAfter().key().getNodeId().getValue();
+            NetconfNode netconfNode = rootNode.getDataAfter().augmentation(NetconfNode.class);
+
             if ((netconfNode != null) && !StringConstants.DEFAULT_NETCONF_NODEID.equals(nodeId)) {
                 switch (rootNode.getModificationType()) {
                     case WRITE:
                         LOG.info("Node added: {}", nodeId);
-                        break;
                     case SUBTREE_MODIFIED:
                         NetconfNodeConnectionStatus.ConnectionStatus connectionStatus =
                                 netconfNode.getConnectionStatus();
-                        long count = netconfNode.getAvailableCapabilities().getAvailableCapability().stream()
-                                .filter(cp -> cp.getCapability().contains(StringConstants.OPENROADM_DEVICE_MODEL_NAME))
-                                .count();
-                        if (count > 0) {
-                            LOG.info("OpenROADM node detected: {} {}", nodeId, connectionStatus.name());
-                            switch (connectionStatus) {
-                                case Connected:
-                                    this.networkModelService.createOpenROADMnode(nodeId);
-                                    onDeviceConnected(nodeId);
-                                    break;
-                                case Connecting:
-                                case UnableToConnect:
-                                    this.networkModelService.setOpenROADMnodeStatus(nodeId, connectionStatus);
-                                    onDeviceDisConnected(nodeId);
-                                    break;
-                                default:
-                                    LOG.warn("Unsupported device state {}", connectionStatus.getName());
-                                    break;
+                        try {
+                            List<AvailableCapability> deviceCapabilities = netconfNode.getAvailableCapabilities()
+                                .getAvailableCapability().stream().filter(cp -> cp.getCapability()
+                                .contains(StringConstants.OPENROADM_DEVICE_MODEL_NAME)).collect(Collectors.toList());
+                            if (!deviceCapabilities.isEmpty()) {
+                                Collections.sort(deviceCapabilities, (cp0, cp1) -> cp1.getCapability()
+                                    .compareTo(cp0.getCapability()));
+                                LOG.info("OpenROADM node detected: {} {}", nodeId, connectionStatus.name());
+                                switch (connectionStatus) {
+                                    case Connected:
+                                        this.networkModelService.createOpenROADMnode(nodeId, deviceCapabilities.get(0)
+                                            .getCapability());
+                                        onDeviceConnected(nodeId);
+                                        break;
+                                    case Connecting:
+                                    case UnableToConnect:
+                                        this.networkModelService.setOpenROADMnodeStatus(nodeId, connectionStatus);
+                                        onDeviceDisConnected(nodeId);
+                                        break;
+                                    default:
+                                        LOG.warn("Unsupported device state {}", connectionStatus.getName());
+                                        break;
+                                }
                             }
+                            LOG.error("Not an openROADM node");
+                        } catch (NullPointerException e) {
+                            LOG.error("Cannot get available Capabilities");
                         }
                         break;
-                    case DELETE:
-                        LOG.info("Node deleted: {}", nodeId);
-                        break;
                     default:
+                        LOG.warn("Unexpected connection status : {}", rootNode.getModificationType());
                         break;
                 }
             }