From 41ed7ed1ee8a388730ef8c6f44e052b45aa5d244 Mon Sep 17 00:00:00 2001 From: Gilles Thouenon Date: Wed, 13 Oct 2021 15:49:29 +0200 Subject: [PATCH] Fix: Disconnection of netconf node - Add protection to check that a node exists in TransportPCE datastores before removing it. Appeared when the node connection remained in a transient state, and that the node had not been created in PortMapping and the different topologies. - Add a new isNodeExist method in PortMapping to test presence or not of a node in the datastore. JIRA: TRNSPRTPCE-547 Signed-off-by: Gilles Thouenon Change-Id: I93744ea941c909c6a18e7ccc879801f83103efba --- .../transportpce/common/mapping/PortMapping.java | 12 ++++++++++++ .../transportpce/common/mapping/PortMappingImpl.java | 5 +++++ .../networkmodel/NetConfTopologyListener.java | 7 ++++--- .../networkmodel/service/NetworkModelService.java | 5 +++-- .../service/NetworkModelServiceImpl.java | 7 ++++++- .../networkmodel/NetConfTopologyListenerTest.java | 3 +-- 6 files changed, 31 insertions(+), 8 deletions(-) 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 8b04bd5ca..fc7090c85 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 @@ -180,4 +180,16 @@ public interface PortMapping { */ boolean updatePortMappingWithOduSwitchingPools(String nodeId, InstanceIdentifier ospIID, Map>> nbliidMap); + + /** + * This method check the presence or not of a given node inside the PortMapping + * datastore. + * + * @param nodeId + * Unique Identifier for the node of interest. + * + * @return Result true/false based on existance or not of a given node. + */ + boolean isNodeExist(String nodeId); + } 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 13d52cf70..d92ec0e85 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 @@ -204,4 +204,9 @@ public class PortMappingImpl implements PortMapping { return false; } } + + @Override + public boolean isNodeExist(String nodeId) { + return this.getNode(nodeId) != null; + } } diff --git a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/NetConfTopologyListener.java b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/NetConfTopologyListener.java index dfc90dd3d..b1b2cc0b0 100644 --- a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/NetConfTopologyListener.java +++ b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/NetConfTopologyListener.java @@ -75,9 +75,10 @@ public class NetConfTopologyListener implements DataTreeChangeListener { NetconfNode netconfNodeBefore = rootNode.getDataBefore().augmentation(NetconfNode.class); switch (rootNode.getModificationType()) { case DELETE: - this.networkModelService.deleteOpenRoadmnode(nodeId); - onDeviceDisConnected(nodeId); - LOG.info("Device {} correctly disconnected from controller", nodeId); + if (this.networkModelService.deleteOpenRoadmnode(nodeId)) { + onDeviceDisConnected(nodeId); + LOG.info("Device {} correctly disconnected from controller", nodeId); + } break; case WRITE: NetconfNode netconfNodeAfter = rootNode.getDataAfter().augmentation(NetconfNode.class); diff --git a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelService.java b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelService.java index 4845ba307..aaa515238 100644 --- a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelService.java +++ b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelService.java @@ -29,13 +29,14 @@ public interface NetworkModelService { void createOpenRoadmNode(String nodeId, String nodeVersion); /** - * Delete OpenROADM node mapping and topologies. + * Delete OpenROADM node from portmapping and topologies. * * @param nodeId * unique node ID of OpenROADM node. * + * @return result of node deletion from portmapping and topologies */ - void deleteOpenRoadmnode(String nodeId); + boolean deleteOpenRoadmnode(String nodeId); /** * Update termination point, and if need, be associated links, of diff --git a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelServiceImpl.java b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelServiceImpl.java index e5370ee33..5c1ab9dac 100644 --- a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelServiceImpl.java +++ b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelServiceImpl.java @@ -191,8 +191,11 @@ public class NetworkModelServiceImpl implements NetworkModelService { */ @Override - public void deleteOpenRoadmnode(String nodeId) { + public boolean deleteOpenRoadmnode(String nodeId) { try { + if (!this.portMapping.isNodeExist(nodeId)) { + return false; + } NodeKey nodeIdKey = new NodeKey(new NodeId(nodeId)); LOG.info("deleting node in {}", NetworkUtils.UNDERLAY_NETWORK_ID); @@ -263,7 +266,9 @@ public class NetworkModelServiceImpl implements NetworkModelService { LOG.info("all nodes and links deleted ! "); } catch (InterruptedException | ExecutionException | TimeoutException e) { LOG.error("Error when trying to delete node : {}", nodeId, e); + return false; } + return true; } @Override diff --git a/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/NetConfTopologyListenerTest.java b/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/NetConfTopologyListenerTest.java index 8e57c8720..3656c8f02 100644 --- a/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/NetConfTopologyListenerTest.java +++ b/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/NetConfTopologyListenerTest.java @@ -78,7 +78,6 @@ public class NetConfTopologyListenerTest { OPENROADM_DEVICE_VERSION_2_2_1); when(node.getModificationType()).thenReturn(DataObjectModification.ModificationType.DELETE); when(node.getDataBefore()).thenReturn(netconfNode); - when(registrations.remove(anyString())).thenReturn(nodeRegistration); NetConfTopologyListener listener = new NetConfTopologyListener(networkModelService, dataBroker, deviceTransactionManager, portMapping, registrations); @@ -87,7 +86,7 @@ public class NetConfTopologyListenerTest { verify(node, times(1)).getModificationType(); verify(node, times(3)).getDataBefore(); verify(networkModelService, times(1)).deleteOpenRoadmnode(anyString()); - verify(nodeRegistration, times(1)).unregisterListeners(); + verify(nodeRegistration, times(0)).unregisterListeners(); } @Test -- 2.36.6