Hack to update degree port on portmapping 17/102917/11
authorGilles Thouenon <gilles.thouenon@orange.com>
Fri, 28 Oct 2022 12:52:36 +0000 (14:52 +0200)
committerGilles Thouenon <gilles.thouenon@orange.com>
Sat, 4 Mar 2023 07:32:41 +0000 (08:32 +0100)
- make the 'port-oper-state' of a ROADM degree port in portmapping
  depends on both the device port state and the OTS operational state
  supported by the port (if any)
- add a detection of changeNotification on an interface in
  DeviceListener221

JIRA: TRNSPRTPCE-713
Signed-off-by: Gilles Thouenon <gilles.thouenon@orange.com>
Change-Id: I86da3c656c7df7590ab083e970fda364b098358e

common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMapping.java
common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingImpl.java
common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion221.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/DeviceListener221.java

index 4342590e968ff87c8162ffc3286d2fc1930159a6..5dafc18d3b69bc8e9543794d430b3ddac5281eb5 100644 (file)
@@ -109,6 +109,30 @@ public interface PortMapping {
      */
     Mapping getMapping(String nodeId, String circuitPackName, String portName);
 
+    /**
+     * This method for a given node's termination point returns the Mapping object
+     * based on portmapping.yang model stored in the MD-SAL data store which is
+     * created when the node is connected for the first time. The mapping object
+     * basically contains the following attributes of interest:
+     *
+     * <p>
+     * 1. Supporting circuit pack
+     *
+     * <p>
+     * 2. Supporting port
+     *
+     * <p>
+     * 3. Supporting OTS/OMS interface (if port on ROADM)
+     *
+     * @param nodeId
+     *            Unique Identifier for the node of interest.
+     * @param interfName
+     *            Name of the OTS interface
+     *
+     * @return Result Mapping object if success otherwise null.
+     */
+    Mapping getMappingFromOtsInterface(String nodeId, String interfName);
+
     /**
      * This method removes a given mapping data from the mapping list
      * stored in the datastore while the Netconf device is already
index 9d15dffac4826e5cd3f3a569b3c6d789ae4c88ac..d19b07b64fe015f12ac2733468c754383bb93cd5 100644 (file)
@@ -123,7 +123,7 @@ public class PortMappingImpl implements PortMapping {
             .child(Nodes.class, new NodesKey(nodeId));
         try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
             Optional<Nodes> portMapppingOpt = readTx.read(LogicalDatastoreType.CONFIGURATION, portMappingIID).get();
-            if (!portMapppingOpt.isPresent()) {
+            if (portMapppingOpt.isEmpty()) {
                 LOG.warn("Could not get portMapping for node {}", nodeId);
                 return null;
             }
@@ -248,4 +248,27 @@ public class PortMappingImpl implements PortMapping {
         return this.getNode(nodeId) != null;
     }
 
+    @Override
+    public Mapping getMappingFromOtsInterface(String nodeId, String interfName) {
+        KeyedInstanceIdentifier<Nodes, NodesKey> nodePortmappingIID = InstanceIdentifier.create(Network.class)
+            .child(Nodes.class, new NodesKey(nodeId));
+        try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
+            Optional<Nodes> nodePortmapppingOpt
+                = readTx.read(LogicalDatastoreType.CONFIGURATION, nodePortmappingIID).get();
+            if (nodePortmapppingOpt.isEmpty()) {
+                LOG.warn("Could not get portMapping for node {}", nodeId);
+                return null;
+            }
+            Map<MappingKey, Mapping> mappings = nodePortmapppingOpt.get().getMapping();
+            for (Mapping mapping : mappings.values()) {
+                if (interfName.equals(mapping.getSupportingOts())) {
+                    return mapping;
+                }
+            }
+        } catch (InterruptedException | ExecutionException ex) {
+            LOG.error("Unable to get mapping list for nodeId {}", nodeId, ex);
+        }
+        return null;
+    }
+
 }
index d92c69905ee10a57f47fb90629c96019ebfddd05..056c092defc7fa4d65aa9de886f23a3e17a03137 100644 (file)
@@ -199,7 +199,18 @@ public class PortMappingVersion221 {
         try {
             Ports port = deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL,
                 portId, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT).get();
-            Mapping newMapping = updateMappingObject(nodeId, port, oldMapping);
+            Interface otsInterface = null;
+            if (oldMapping.getSupportingOts() != null) {
+                InstanceIdentifier<Interface> interfId = InstanceIdentifier
+                    .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                    .child(Interface.class, new InterfaceKey(oldMapping.getSupportingOts()))
+                    .build();
+                otsInterface = deviceTransactionManager
+                    .getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, interfId, Timeouts.DEVICE_READ_TIMEOUT,
+                        Timeouts.DEVICE_READ_TIMEOUT_UNIT)
+                    .get();
+            }
+            Mapping newMapping = updateMappingObject(nodeId, port, oldMapping, otsInterface);
             LOG.debug(PortMappingUtils.UPDATE_MAPPING_LOGMSG,
                 nodeId, oldMapping, oldMapping.getLogicalConnectionPoint(), newMapping);
             final WriteTransaction writeTransaction = this.dataBroker.newWriteOnlyTransaction();
@@ -805,9 +816,9 @@ public class PortMappingVersion221 {
         return mpBldr.build();
     }
 
-    private Mapping updateMappingObject(String nodeId, Ports port, Mapping oldmapping) {
+    private Mapping updateMappingObject(String nodeId, Ports port, Mapping oldmapping, Interface otsInterf) {
         MappingBuilder mpBldr = new MappingBuilder(oldmapping);
-        updateMappingStates(mpBldr, port, oldmapping);
+        updateMappingStates(mpBldr, port, oldmapping, otsInterf);
         if (port.getInterfaces() == null) {
             return mpBldr.build();
         }
@@ -816,15 +827,20 @@ public class PortMappingVersion221 {
         return mpBldr.build();
     }
 
-    private MappingBuilder updateMappingStates(MappingBuilder mpBldr, Ports port, Mapping oldmapping) {
+    private MappingBuilder updateMappingStates(MappingBuilder mpBldr, Ports port, Mapping oldmapping,
+            Interface otsInterf) {
         if (port.getAdministrativeState() != null
-            && !port.getAdministrativeState().getName().equals(oldmapping.getPortAdminState())) {
+                && !port.getAdministrativeState().getName().equals(oldmapping.getPortAdminState())) {
             mpBldr.setPortAdminState(port.getAdministrativeState().name());
         }
         if (port.getOperationalState() != null
-            && !port.getOperationalState().getName().equals(oldmapping.getPortOperState())) {
+                && !port.getOperationalState().getName().equals(oldmapping.getPortOperState())) {
             mpBldr.setPortOperState(port.getOperationalState().name());
         }
+        if (otsInterf != null && otsInterf.getOperationalState() != null
+                && !otsInterf.getOperationalState().name().equals(oldmapping.getPortOperState())) {
+            mpBldr.setPortOperState(otsInterf.getOperationalState().name());
+        }
         return mpBldr;
     }
 
index 66e3704875669526c9728c74e4189b9f2b592fe1..7135e8f24e9e41891815ec47b467b171b212e899 100644 (file)
@@ -18,6 +18,7 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.OtdrScan
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.change.notification.Edit;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.circuit.pack.Ports;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.circuit.packs.CircuitPacks;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces.grp.Interface;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
 import org.slf4j.Logger;
@@ -43,6 +44,7 @@ public class DeviceListener221 implements OrgOpenroadmDeviceListener {
      */
     @Override
     public void onChangeNotification(ChangeNotification notification) {
+        LOG.info("notification received from device {}: {}", this.nodeId, notification.toString());
         if (notification.getEdit() == null) {
             LOG.warn("unable to handle {} notificatin received - list of edit is null", ChangeNotification.QNAME);
             return;
@@ -77,6 +79,27 @@ public class DeviceListener221 implements OrgOpenroadmDeviceListener {
                     Thread thread = new Thread(handleNetconfEvent);
                     thread.start();
                     break;
+                case "Interface":
+                    LinkedList<PathArgument> pathInter = new LinkedList<>();
+                    edit.getTarget().getPathArguments().forEach(p -> pathInter.add(p));
+                    InstanceIdentifier<Interface> interfIID = InstanceIdentifier.unsafeOf(pathInter);
+                    String interfName = InstanceIdentifier.keyOf(interfIID).getName();
+                    LOG.info("interface {} modified on device {}", interfName, this.nodeId);
+                    Mapping oldMapping2 = portMapping.getMappingFromOtsInterface(nodeId, interfName);
+                    if (oldMapping2 == null) {
+                        return;
+                    }
+                    Runnable handleNetconfEvent2 = new Runnable() {
+                        @Override
+                        public void run() {
+                            portMapping.updateMapping(nodeId, oldMapping2);
+                            LOG.info("{} : mapping data for {} updated", nodeId,
+                                oldMapping2.getLogicalConnectionPoint());
+                        }
+                    };
+                    Thread thread2 = new Thread(handleNetconfEvent2);
+                    thread2.start();
+                    break;
                 default:
                     LOG.debug("modification of type {} not managed yet", edit.getTarget().getTargetType());
                     break;