upgrade openroadm models to 2.2.1
[transportpce.git] / networkmodel / src / main / java / org / opendaylight / transportpce / networkmodel / NetConfTopologyListener.java
index a09a3be7e0178a594a5fa51cefaf487874be6de6..58830f5111a424fae5ce86c55b29688d42fbe83c 100644 (file)
@@ -25,21 +25,31 @@ 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;
 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.DeviceListener221;
 import org.opendaylight.transportpce.networkmodel.listeners.LldpListener;
+import org.opendaylight.transportpce.networkmodel.listeners.LldpListener221;
 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;
+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;
@@ -60,6 +70,7 @@ public class NetConfTopologyListener implements DataTreeChangeListener<Node> {
     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) {
@@ -68,10 +79,13 @@ public class NetConfTopologyListener implements DataTreeChangeListener<Node> {
         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()) {
@@ -88,32 +102,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 =
+                notificationService.get().registerNotificationListener(deOperationsListener);
+
+            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 OrgOpenroadmTcaListener 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";
+            }
+
+            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 OrgOpenroadmDeOperationsListener deOperationsListener = new DeOperationsListener();
-        LOG.info("Registering notification listener on OrgOpenroadmDeOperationsListener for node: {}", nodeId);
-        final ListenerRegistration<OrgOpenroadmDeOperationsListener>
-            accessDeOperationasNotificationListenerRegistration =
+            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 OrgOpenroadmDeviceListener deviceListener = new DeviceListener();
-        LOG.info("Registering notification listener on OrgOpenroadmDeviceListener for node: {}", nodeId);
-        final ListenerRegistration<OrgOpenroadmDeviceListener> accessDeviceNotificationListenerRegistration =
+            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 OrgOpenroadmLldpListener lldpListener = new LldpListener(this.linkDiscovery, nodeId);
-        LOG.info("Registering notification listener on OrgOpenroadmLldpListener for node: {}", nodeId);
-        final ListenerRegistration<OrgOpenroadmLldpListener> accessLldpNotificationListenerRegistration =
+            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 OrgOpenroadmTcaListener tcaListener = new TcaListener();
-        LOG.info("Registering notification listener on OrgOpenroadmTcaListener for node: {}", nodeId);
-        final ListenerRegistration<OrgOpenroadmTcaListener> accessTcaNotificationListenerRegistration =
+            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 {
+                LOG.error("Failed to get RpcService for node {}", nodeId);
+            }
+            NodeRegistration22 nodeRegistration22 = new NodeRegistration22(nodeId,
+                accessAlarmNotificationListenerRegistration,
+                accessDeOperationasNotificationListenerRegistration, accessDeviceNotificationListenerRegistration,
+                accessLldpNotificationListenerRegistration, accessTcaNotificationListenerRegistration);
+            registrations22.put(nodeId, nodeRegistration22);
+
+        }
+
     }
 
     private void onDeviceDisConnected(final String nodeId) {
@@ -171,7 +280,7 @@ public class NetConfTopologyListener implements DataTreeChangeListener<Node> {
                                     case Connected:
                                         this.networkModelService.createOpenROADMnode(nodeId, deviceCapabilities.get(0)
                                             .getCapability());
-                                        onDeviceConnected(nodeId);
+                                        onDeviceConnected(nodeId,deviceCapabilities.get(0).getCapability());
                                         break;
                                     case Connecting:
                                     case UnableToConnect:
@@ -183,7 +292,7 @@ public class NetConfTopologyListener implements DataTreeChangeListener<Node> {
                                         break;
                                 }
                             }
-                            LOG.error("Not an openROADM node");
+
                         } catch (NullPointerException e) {
                             LOG.error("Cannot get available Capabilities");
                         }
@@ -204,8 +313,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()) {
@@ -217,7 +326,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";
         }
     }
 }