From: Martial COULIBALY Date: Tue, 10 Apr 2018 15:12:52 +0000 (+0200) Subject: Bugs correction in NetworkModelService X-Git-Tag: v0.2.0~55 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=transportpce.git;a=commitdiff_plain;h=693587d930bbac1d8711bf12f5e9b9df3562b00d Bugs correction in NetworkModelService Modify NetworkModelService class to add deleteOpenROADMnode function to be able to : - delete OpenROADM node portmapping - delete OpenROADM node topologies (clli-network, openroadm-network, openroadm-topology) created in datastores. Modify NetConfTopologyListener OnDataTreeChanged to allow Portmapping working in Oxygen. This issue is similar to the previous commit "Bug correction in RendererNotificationImpl" JIRA: TRNSPRTPCE-18 Change-Id: Ib529aff433c14c1c103f39be158b2a7746cb0cef Signed-off-by: Martial COULIBALY --- 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 0fc982ec5..15f67bf5c 100644 --- a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/NetConfTopologyListener.java +++ b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/NetConfTopologyListener.java @@ -16,6 +16,7 @@ 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; import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener; import org.opendaylight.controller.md.sal.binding.api.DataTreeModification; import org.opendaylight.controller.md.sal.binding.api.MountPoint; @@ -157,16 +158,28 @@ public class NetConfTopologyListener implements DataTreeChangeListener { LOG.info("onDataTreeChanged"); for (DataTreeModification change : changes) { DataObjectModification rootNode = change.getRootNode(); - if (rootNode.getDataAfter() == null) { + if ((rootNode.getDataAfter() == null) && (rootNode.getModificationType() != ModificationType.DELETE)) { + LOG.error("rootNode.getDataAfter is null : Node not connected via Netconf protocol"); + continue; + } + if (rootNode.getModificationType() == ModificationType.DELETE) { + if (rootNode.getDataBefore() != null) { + String nodeId = rootNode.getDataBefore().getKey().getNodeId().getValue(); + LOG.info("Node {} deleted", 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); + if ((netconfNode != null) && !StringConstants.DEFAULT_NETCONF_NODEID.equals(nodeId)) { switch (rootNode.getModificationType()) { case WRITE: LOG.info("Node added: {}", nodeId); - break; case SUBTREE_MODIFIED: NetconfNodeConnectionStatus.ConnectionStatus connectionStatus = netconfNode.getConnectionStatus(); @@ -191,10 +204,8 @@ public class NetConfTopologyListener implements DataTreeChangeListener { } } break; - case DELETE: - LOG.info("Node deleted: {}", nodeId); - break; default: + LOG.warn("Unexpected connection status : {}", rootNode.getModificationType()); break; } } 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 3a5e54d41..f5f2f2ca2 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 @@ -22,6 +22,14 @@ public interface NetworkModelService { */ void createOpenROADMnode(String nodeId); + /** + * Delete OpenROADM node mapping and topologies. + * + * @param nodeId unique node ID of OpenROADM node + * + */ + void deleteOpenROADMnode(String nodeId); + /** * Set/update connection status of OpenROADM node. * 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 daf085245..78e4510a2 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 @@ -7,6 +7,7 @@ */ package org.opendaylight.transportpce.networkmodel.service; +import java.util.HashMap; import java.util.concurrent.ExecutionException; import org.opendaylight.controller.md.sal.binding.api.DataBroker; @@ -25,6 +26,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NetworkKey; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NodeId; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.network.Node; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.network.NodeKey; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.Network1; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.network.Link; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus; @@ -42,6 +44,7 @@ public class NetworkModelServiceImpl implements NetworkModelService { private final DeviceTransactionManager deviceTransactionManager; private final OpenRoadmTopology openRoadmTopology; private final PortMapping portMapping; + private HashMap topologyShardMountedDevice; public NetworkModelServiceImpl(final DataBroker dataBroker, final R2RLinkDiscovery linkDiscovery, DeviceTransactionManager deviceTransactionManager, @@ -51,6 +54,7 @@ public class NetworkModelServiceImpl implements NetworkModelService { this.deviceTransactionManager = deviceTransactionManager; this.openRoadmTopology = openRoadmTopology; this.portMapping = portMapping; + this.topologyShardMountedDevice = new HashMap(); } public void init() { @@ -85,6 +89,7 @@ public class NetworkModelServiceImpl implements NetworkModelService { LOG.error("Unable to create topology shard for node {}!", nodeId); return; } + this.topologyShardMountedDevice.put(nodeId, topologyShard); WriteTransaction writeTransaction = this.dataBroker.newWriteOnlyTransaction(); LOG.info("creating node in {}", NetworkUtils.CLLI_NETWORK_ID); @@ -140,4 +145,58 @@ public class NetworkModelServiceImpl implements NetworkModelService { */ } + /* (non-Javadoc) + * @see org.opendaylight.transportpce.networkmodel.service.NetworkModelService#deleteOpenROADMnode(java.lang.String) + */ + @Override + public void deleteOpenROADMnode(String nodeId) { + try { + LOG.info("deleteOpenROADMnode: {} ", nodeId); + this.portMapping.deleteMappingData(nodeId); + + NodeKey nodeIdKey = new NodeKey(new NodeId(nodeId)); + WriteTransaction writeTransaction = this.dataBroker.newWriteOnlyTransaction(); + LOG.info("deleting node in {}", NetworkUtils.CLLI_NETWORK_ID); + InstanceIdentifier iiClliNode = InstanceIdentifier + .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))) + .child(Node.class, nodeIdKey) + .build(); + writeTransaction.delete(LogicalDatastoreType.CONFIGURATION, iiClliNode); + LOG.info("deleting node in {}", NetworkUtils.UNDERLAY_NETWORK_ID); + InstanceIdentifier iiOpenRoadmNode = InstanceIdentifier + .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))) + .child(Node.class, nodeIdKey) + .build(); + writeTransaction.delete(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmNode); + TopologyShard topologyShard = this.topologyShardMountedDevice.get(nodeId); + if (topologyShard != null) { + LOG.info("TopologyShard for node '{}' is present", nodeId); + for (Node openRoadmTopologyNode: topologyShard .getNodes()) { + LOG.info("deleting node {} in {}", openRoadmTopologyNode.getNodeId().getValue(), + NetworkUtils.OVERLAY_NETWORK_ID); + InstanceIdentifier iiOpenRoadmTopologyNode = InstanceIdentifier + .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))) + .child(Node.class, openRoadmTopologyNode.getKey()) + .build(); + writeTransaction.delete(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmTopologyNode); + } + for (Link openRoadmTopologyLink: topologyShard.getLinks()) { + LOG.info("deleting link {} in {}", openRoadmTopologyLink.getLinkId().getValue(), + NetworkUtils.OVERLAY_NETWORK_ID); + InstanceIdentifier iiOpenRoadmTopologyLink = InstanceIdentifier + .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))) + .augmentation(Network1.class) + .child(Link.class, openRoadmTopologyLink.getKey()) + .build(); + writeTransaction.delete(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmTopologyLink); + } + } else { + LOG.warn("TopologyShard for node '{}' is not present", nodeId); + } + writeTransaction.submit().get(); + LOG.info("all nodes and links deleted ! "); + } catch (InterruptedException | ExecutionException e) { + LOG.error("Error when trying to delete node : {}", nodeId, e); + } + } }