Upgrade Network model from 2.1 to 4.1
[transportpce.git] / networkmodel / src / main / java / org / opendaylight / transportpce / networkmodel / NetConfTopologyListener.java
index 059479b021c7b1daf4363bd738441409e6a6cd73..4d6579ae42220768266012866c0416242b288d13 100644 (file)
@@ -8,10 +8,15 @@
 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;
@@ -25,16 +30,19 @@ import org.opendaylight.transportpce.common.StringConstants;
 import org.opendaylight.transportpce.common.Timeouts;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.transportpce.networkmodel.dto.NodeRegistration;
+import org.opendaylight.transportpce.networkmodel.dto.NodeRegistration22;
 import org.opendaylight.transportpce.networkmodel.listeners.AlarmNotificationListener;
+import org.opendaylight.transportpce.networkmodel.listeners.AlarmNotificationListener221;
 import org.opendaylight.transportpce.networkmodel.listeners.DeOperationsListener;
+import org.opendaylight.transportpce.networkmodel.listeners.DeOperationsListener221;
 import org.opendaylight.transportpce.networkmodel.listeners.DeviceListener;
-import org.opendaylight.transportpce.networkmodel.listeners.LldpListener;
+import org.opendaylight.transportpce.networkmodel.listeners.DeviceListener221;
 import org.opendaylight.transportpce.networkmodel.listeners.TcaListener;
+import org.opendaylight.transportpce.networkmodel.listeners.TcaListener221;
 import org.opendaylight.transportpce.networkmodel.service.NetworkModelService;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.alarm.rev161014.OrgOpenroadmAlarmListener;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.de.operations.rev161014.OrgOpenroadmDeOperationsListener;
 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;
@@ -43,6 +51,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netmod.notification.r
 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;
@@ -54,22 +63,26 @@ public class NetConfTopologyListener implements DataTreeChangeListener<Node> {
     private static final Logger LOG = LoggerFactory.getLogger(NetConfTopologyListener.class);
 
     private final NetworkModelService networkModelService;
-    private final R2RLinkDiscovery linkDiscovery;
+    //private final R2RLinkDiscovery linkDiscovery;
     private final DataBroker dataBroker;
     private final DeviceTransactionManager deviceTransactionManager;
     private final Map<String, NodeRegistration> registrations;
+    private final Map<String, NodeRegistration22> registrations22;
 
     public NetConfTopologyListener(final NetworkModelService networkModelService, final DataBroker dataBroker,
-            final R2RLinkDiscovery linkDiscovery, DeviceTransactionManager deviceTransactionManager) {
+             DeviceTransactionManager deviceTransactionManager) {
         this.networkModelService = networkModelService;
-        this.linkDiscovery = linkDiscovery;
+        //this.linkDiscovery = linkDiscovery;
         this.dataBroker = dataBroker;
         this.deviceTransactionManager = deviceTransactionManager;
         this.registrations = new ConcurrentHashMap<>();
+        this.registrations22 = new ConcurrentHashMap<>();
     }
 
-    private void onDeviceConnected(final String nodeId) {
+    private void onDeviceConnected(final String nodeId, String openRoadmVersion) {
         LOG.info("onDeviceConnected: {}", nodeId);
+        LOG.info(StringConstants.OPENROADM_DEVICE_VERSION_1_2_1);
+        LOG.info(openRoadmVersion);
         Optional<MountPoint> mountPointOpt = this.deviceTransactionManager.getDeviceMountPoint(nodeId);
         MountPoint mountPoint;
         if (mountPointOpt.isPresent()) {
@@ -86,57 +99,127 @@ public class NetConfTopologyListener implements DataTreeChangeListener<Node> {
             return;
         }
 
-        final OrgOpenroadmAlarmListener alarmListener = new AlarmNotificationListener(this.dataBroker);
-        LOG.info("Registering notification listener on OrgOpenroadmAlarmListener for node: {}", nodeId);
-        final ListenerRegistration<OrgOpenroadmAlarmListener> accessAlarmNotificationListenerRegistration =
+        if (openRoadmVersion.equals(StringConstants.OPENROADM_DEVICE_VERSION_1_2_1)) {
+
+            final OrgOpenroadmAlarmListener alarmListener = new AlarmNotificationListener(this.dataBroker);
+            LOG.info("Registering notification listener on OrgOpenroadmAlarmListener for node: {}", nodeId);
+            final ListenerRegistration<OrgOpenroadmAlarmListener> accessAlarmNotificationListenerRegistration =
                 notificationService.get().registerNotificationListener(alarmListener);
 
-        final OrgOpenroadmDeOperationsListener deOperationsListener = new DeOperationsListener();
-        LOG.info("Registering notification listener on OrgOpenroadmDeOperationsListener for node: {}", nodeId);
-        final ListenerRegistration<OrgOpenroadmDeOperationsListener>
-            accessDeOperationasNotificationListenerRegistration =
+            final OrgOpenroadmDeOperationsListener deOperationsListener = new DeOperationsListener();
+            LOG.info("Registering notification listener on OrgOpenroadmDeOperationsListener for node: {}", nodeId);
+            final ListenerRegistration<OrgOpenroadmDeOperationsListener>
+                accessDeOperationasNotificationListenerRegistration =
                 notificationService.get().registerNotificationListener(deOperationsListener);
 
-        final OrgOpenroadmDeviceListener deviceListener = new DeviceListener();
-        LOG.info("Registering notification listener on OrgOpenroadmDeviceListener for node: {}", nodeId);
-        final ListenerRegistration<OrgOpenroadmDeviceListener> accessDeviceNotificationListenerRegistration =
+            final OrgOpenroadmDeviceListener deviceListener = new DeviceListener();
+            LOG.info("Registering notification listener on OrgOpenroadmDeviceListener for node: {}", nodeId);
+            final ListenerRegistration<OrgOpenroadmDeviceListener> accessDeviceNotificationListenerRegistration =
                 notificationService.get().registerNotificationListener(deviceListener);
 
-        final OrgOpenroadmLldpListener lldpListener = new LldpListener(this.linkDiscovery, nodeId);
-        LOG.info("Registering notification listener on OrgOpenroadmLldpListener for node: {}", nodeId);
-        final ListenerRegistration<OrgOpenroadmLldpListener> accessLldpNotificationListenerRegistration =
-                notificationService.get().registerNotificationListener(lldpListener);
+//            final OrgOpenroadmLldpListener lldpListener = new LldpListener(this.linkDiscovery, nodeId);
+//            LOG.info("Registering notification listener on OrgOpenroadmLldpListener for node: {}", nodeId);
+//            final ListenerRegistration<OrgOpenroadmLldpListener> accessLldpNotificationListenerRegistration =
+//                notificationService.get().registerNotificationListener(lldpListener);
 
-        final OrgOpenroadmTcaListener tcaListener = new TcaListener();
-        LOG.info("Registering notification listener on OrgOpenroadmTcaListener for node: {}", nodeId);
-        final ListenerRegistration<OrgOpenroadmTcaListener> accessTcaNotificationListenerRegistration =
+            TcaListener tcaListener = new TcaListener();
+            LOG.info("Registering notification listener on OrgOpenroadmTcaListener for node: {}", nodeId);
+            final ListenerRegistration<OrgOpenroadmTcaListener> accessTcaNotificationListenerRegistration =
                 notificationService.get().registerNotificationListener(tcaListener);
 
+            String streamName = "NETCONF"; //getSupportedStream(nodeId);
 
+            if (streamName == null) {
+                streamName = "OPENROADM";
+            }
 
-        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) {
+            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,
+                null, accessTcaNotificationListenerRegistration);
+            registrations.put(nodeId, nodeRegistration);
+
+        } else if (openRoadmVersion.equals(StringConstants.OPENROADM_DEVICE_VERSION_2_2_1)) {
+            final org.opendaylight.yang.gen.v1.http.org.openroadm.alarm.rev181019.OrgOpenroadmAlarmListener
+                alarmListener = new AlarmNotificationListener221(dataBroker);
+            LOG.info("Registering notification listener on OrgOpenroadmAlarmListener for node: {}", nodeId);
+            final ListenerRegistration<org.opendaylight.yang.gen.v1.http.org.openroadm.alarm.rev181019
+                .OrgOpenroadmAlarmListener> accessAlarmNotificationListenerRegistration =
+                notificationService.get().registerNotificationListener(alarmListener);
+
+            final org.opendaylight.yang.gen.v1.http.org.openroadm.de.operations.rev181019
+                .OrgOpenroadmDeOperationsListener deOperationsListener = new DeOperationsListener221();
+            LOG.info("Registering notification listener on OrgOpenroadmDeOperationsListener for node: {}", nodeId);
+            final ListenerRegistration<org.opendaylight.yang.gen.v1.http.org.openroadm.de.operations.rev181019
+                .OrgOpenroadmDeOperationsListener> accessDeOperationasNotificationListenerRegistration =
+                notificationService.get().registerNotificationListener(deOperationsListener);
+
+            final org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.OrgOpenroadmDeviceListener
+                deviceListener = new DeviceListener221();
+            LOG.info("Registering notification listener on OrgOpenroadmDeviceListener for node: {}", nodeId);
+            final ListenerRegistration<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019
+                .OrgOpenroadmDeviceListener> accessDeviceNotificationListenerRegistration =
+                notificationService.get().registerNotificationListener(deviceListener);
+
+//            final org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev181019.OrgOpenroadmLldpListener
+//                lldpListener = new LldpListener221(linkDiscovery, nodeId);
+//            LOG.info("Registering notification listener on OrgOpenroadmLldpListener for node: {}", nodeId);
+//            final ListenerRegistration<org.opendaylight.yang.gen.v1.http.org.openroadm
+//                .lldp.rev181019.OrgOpenroadmLldpListener> accessLldpNotificationListenerRegistration =
+//                notificationService.get().registerNotificationListener(lldpListener);
+
+            final org.opendaylight.yang.gen.v1.http.org.openroadm.tca.rev181019.OrgOpenroadmTcaListener
+                tcaListener = new TcaListener221();
+            LOG.info("Registering notification listener on OrgOpenroadmTcaListener for node: {}", nodeId);
+            final ListenerRegistration<org.opendaylight.yang.gen.v1.http.org.openroadm.tca.rev181019
+                .OrgOpenroadmTcaListener> accessTcaNotificationListenerRegistration =
+                notificationService.get().registerNotificationListener(tcaListener);
+
+
+            String streamName = "NETCONF";
+            //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 {
-                final CreateSubscriptionInputBuilder createSubscriptionInputBuilder =
-                    new CreateSubscriptionInputBuilder();
-                createSubscriptionInputBuilder.setStream(new StreamNameType(streamName));
-                LOG.info("Triggering notification stream {} for node {}", streamName, nodeId);
-                rpcService.createSubscription(createSubscriptionInputBuilder.build());
+                LOG.error("Failed to get RpcService for node {}", nodeId);
             }
-        } else {
-            LOG.error("Failed to get RpcService for node {}", nodeId);
-        }
-        NodeRegistration nodeRegistration = new NodeRegistration(nodeId, accessAlarmNotificationListenerRegistration,
+            NodeRegistration22 nodeRegistration22 = new NodeRegistration22(nodeId,
+                accessAlarmNotificationListenerRegistration,
                 accessDeOperationasNotificationListenerRegistration, accessDeviceNotificationListenerRegistration,
-                accessLldpNotificationListenerRegistration, accessTcaNotificationListenerRegistration);
-        this.registrations.put(nodeId, nodeRegistration);
+                null, accessTcaNotificationListenerRegistration);
+            registrations22.put(nodeId, nodeRegistration22);
+
+        }
+
     }
 
     private void onDeviceDisConnected(final String nodeId) {
@@ -146,7 +229,7 @@ public class NetConfTopologyListener implements DataTreeChangeListener<Node> {
             nodeRegistration.getAccessAlarmNotificationListenerRegistration().close();
             nodeRegistration.getAccessDeOperationasNotificationListenerRegistration().close();
             nodeRegistration.getAccessDeviceNotificationListenerRegistration().close();
-            nodeRegistration.getAccessLldpNotificationListenerRegistration().close();
+//            nodeRegistration.getAccessLldpNotificationListenerRegistration().close();
             nodeRegistration.getAccessTcaNotificationListenerRegistration().close();
         }
     }
@@ -163,17 +246,17 @@ public class NetConfTopologyListener implements DataTreeChangeListener<Node> {
             }
             if (rootNode.getModificationType() == ModificationType.DELETE) {
                 if (rootNode.getDataBefore() != null) {
-                    String nodeId = rootNode.getDataBefore().getKey().getNodeId().getValue();
+                    String nodeId = rootNode.getDataBefore().key().getNodeId().getValue();
                     LOG.info("Node {} deleted", nodeId);
-                    this.networkModelService.deleteOpenROADMnode(nodeId);
+                    this.networkModelService.deleteOpenRoadmnode(nodeId);
                     onDeviceDisConnected(nodeId);
                 } else {
                     LOG.error("rootNode.getDataBefore is null !");
                 }
                 continue;
             }
-            String nodeId = rootNode.getDataAfter().getKey().getNodeId().getValue();
-            NetconfNode netconfNode = rootNode.getDataAfter().getAugmentation(NetconfNode.class);
+            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()) {
@@ -183,19 +266,22 @@ public class NetConfTopologyListener implements DataTreeChangeListener<Node> {
                         NetconfNodeConnectionStatus.ConnectionStatus connectionStatus =
                                 netconfNode.getConnectionStatus();
                         try {
-                            long count = netconfNode.getAvailableCapabilities().getAvailableCapability().stream()
-                                .filter(cp -> cp.getCapability().contains(StringConstants.OPENROADM_DEVICE_MODEL_NAME))
-                                .count();
-                            if (count > 0) {
+                            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);
-                                        onDeviceConnected(nodeId);
+                                        this.networkModelService.createOpenRoadmNode(nodeId, deviceCapabilities.get(0)
+                                            .getCapability());
+                                        onDeviceConnected(nodeId,deviceCapabilities.get(0).getCapability());
                                         break;
                                     case Connecting:
                                     case UnableToConnect:
-                                        this.networkModelService.setOpenROADMnodeStatus(nodeId, connectionStatus);
+                                        this.networkModelService.setOpenRoadmNodeStatus(nodeId, connectionStatus);
                                         onDeviceDisConnected(nodeId);
                                         break;
                                     default:
@@ -203,6 +289,7 @@ public class NetConfTopologyListener implements DataTreeChangeListener<Node> {
                                         break;
                                 }
                             }
+
                         } catch (NullPointerException e) {
                             LOG.error("Cannot get available Capabilities");
                         }
@@ -223,8 +310,8 @@ public class NetConfTopologyListener implements DataTreeChangeListener<Node> {
                     this.deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL,
                             streamsIID, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
             if (!ordmInfoObject.isPresent()) {
-                LOG.error("Info subtree is not present");
-                return null;
+                LOG.error("Get Stream RPC is not supported");
+                return "NETCONF";
             }
             for (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netmod.notification.rev080714.netconf
                         .streams.Stream strm : ordmInfoObject.get().getStream()) {
@@ -236,7 +323,7 @@ public class NetConfTopologyListener implements DataTreeChangeListener<Node> {
             return "NETCONF";
         } catch (NullPointerException ex) {
             LOG.error("NullPointerException thrown while getting Info from a non Open ROADM device {}", nodeId);
-            return null;
+            return "NETCONF";
         }
     }
 }