From: Gilles Thouenon Date: Fri, 28 Oct 2022 12:52:36 +0000 (+0200) Subject: Hack to update degree port on portmapping X-Git-Tag: 7.0.0~9 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=a333c0c0b3bbe22066e3bcc4af4007d066c10e89;p=transportpce.git Hack to update degree port on portmapping - 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 Change-Id: I86da3c656c7df7590ab083e970fda364b098358e --- diff --git a/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMapping.java b/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMapping.java index 4342590e9..5dafc18d3 100644 --- a/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMapping.java +++ b/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMapping.java @@ -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: + * + *

+ * 1. Supporting circuit pack + * + *

+ * 2. Supporting port + * + *

+ * 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 diff --git a/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingImpl.java b/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingImpl.java index 9d15dffac..d19b07b64 100644 --- a/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingImpl.java +++ b/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingImpl.java @@ -123,7 +123,7 @@ public class PortMappingImpl implements PortMapping { .child(Nodes.class, new NodesKey(nodeId)); try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) { Optional 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 nodePortmappingIID = InstanceIdentifier.create(Network.class) + .child(Nodes.class, new NodesKey(nodeId)); + try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) { + Optional nodePortmapppingOpt + = readTx.read(LogicalDatastoreType.CONFIGURATION, nodePortmappingIID).get(); + if (nodePortmapppingOpt.isEmpty()) { + LOG.warn("Could not get portMapping for node {}", nodeId); + return null; + } + Map 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; + } + } diff --git a/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion221.java b/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion221.java index d92c69905..056c092de 100644 --- a/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion221.java +++ b/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion221.java @@ -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 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; } diff --git a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/DeviceListener221.java b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/DeviceListener221.java index 66e370487..7135e8f24 100644 --- a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/DeviceListener221.java +++ b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/DeviceListener221.java @@ -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 pathInter = new LinkedList<>(); + edit.getTarget().getPathArguments().forEach(p -> pathInter.add(p)); + InstanceIdentifier 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;