From: Guillaume Lambert Date: Thu, 21 Mar 2019 16:27:23 +0000 (+0000) Subject: Merge "PortMapping for device 1.2.1 and 2.2" X-Git-Tag: 0.4.0~101 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=transportpce.git;a=commitdiff_plain;h=41f5183ed09a0096f512615a7cb26c257081ecbd;hp=473d1d133bce818c40d5907f32a942ca634cc014 Merge "PortMapping for device 1.2.1 and 2.2" --- diff --git a/common/src/main/java/org/opendaylight/transportpce/common/mapping/MappingUtilsImpl.java b/common/src/main/java/org/opendaylight/transportpce/common/mapping/MappingUtilsImpl.java index b87971a1f..ca3e02978 100644 --- a/common/src/main/java/org/opendaylight/transportpce/common/mapping/MappingUtilsImpl.java +++ b/common/src/main/java/org/opendaylight/transportpce/common/mapping/MappingUtilsImpl.java @@ -49,11 +49,10 @@ public class MappingUtilsImpl implements MappingUtils { case _121: return StringConstants.OPENROADM_DEVICE_VERSION_1_2_1; default: - return StringConstants.OPENROADM_DEVICE_VERSION_1_2_1; + LOG.warn("unknown openROADM device version"); } } else { LOG.warn("Could not find mapping for nodeId {}", nodeId); - return StringConstants.OPENROADM_DEVICE_VERSION_1_2_1; } } catch (InterruptedException | ExecutionException ex) { LOG.error("Unable to read mapping for nodeId {}",nodeId, ex); 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 a636105c4..987c545ae 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 @@ -8,6 +8,7 @@ package org.opendaylight.transportpce.common.mapping; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev170228.network.Nodes; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev170228.network.nodes.Mapping; public interface PortMapping { @@ -41,7 +42,7 @@ public interface PortMapping { * * @return true/false based on status of operation */ - boolean createMappingData(String nodeId); + boolean createMappingData(String nodeId, String nodeVersion); /** * This method removes mapping data from the datastore after disconnecting @@ -78,4 +79,17 @@ public interface PortMapping { Mapping getMapping(String nodeId, String logicalConnPoint); boolean updateMapping(String nodeId, Mapping mapping); + + /** + * This method returns all Mapping informations already stored in the MD-SAL + * data store for a given openroadm device. Beyound the list of mappings, it + * gives access to general node information as its version or its node type, + * etc. + * + * @param nodeId + * Unique Identifier for the node of interest. + * + * @return node data if success otherwise null. + */ + Nodes getNode(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 2dac08d05..7374530d4 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 @@ -48,16 +48,13 @@ public class PortMappingImpl implements PortMapping { } @Override - public boolean createMappingData(String nodeId) { - - String openROADMversion = mappingUtils.getOpenRoadmVersion(nodeId); - if (openROADMversion.equals(OPENROADM_DEVICE_VERSION_1_2_1)) { + public boolean createMappingData(String nodeId, String nodeVersion) { + if (nodeVersion.equals(OPENROADM_DEVICE_VERSION_1_2_1)) { return portMappingVersion121.createMappingData(nodeId); } - else if (openROADMversion.equals(OPENROADM_DEVICE_VERSION_2_2)) { + else if (nodeVersion.equals(OPENROADM_DEVICE_VERSION_2_2)) { return portMappingVersion22.createMappingData(nodeId); } - else { return false; } @@ -127,5 +124,25 @@ public class PortMappingImpl implements PortMapping { } } + @Override + public Nodes getNode(String nodeId) { + InstanceIdentifier nodePortMappingIID = InstanceIdentifier.builder(Network.class).child(Nodes.class, + new NodesKey(nodeId)).build(); + try (ReadOnlyTransaction readTx = this.dataBroker.newReadOnlyTransaction()) { + Optional nodePortMapObject = readTx.read(LogicalDatastoreType.CONFIGURATION, nodePortMappingIID) + .get().toJavaUtil(); + if (nodePortMapObject.isPresent()) { + Nodes node = nodePortMapObject.get(); + LOG.info("Found node {} in portmapping.", nodeId); + return node; + } else { + LOG.warn("Could not find node {} in portmapping.", nodeId); + } + } catch (InterruptedException | ExecutionException ex) { + LOG.error("Unable to get node {} in portmapping", nodeId); + } + return null; + } + } diff --git a/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion121.java b/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion121.java index 9a0c9b49c..742e2953a 100644 --- a/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion121.java +++ b/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion121.java @@ -84,7 +84,7 @@ public class PortMappingVersion121 { public boolean createMappingData(String nodeId) { - LOG.info("Create Mapping Data for node {}", nodeId); + LOG.info("Create Mapping Data for node 1.2.1 {}", nodeId); List portMapList = new ArrayList<>(); InstanceIdentifier infoIID = InstanceIdentifier.create(OrgOpenroadmDevice.class).child(Info.class); Optional deviceInfoOptional = this.deviceTransactionManager.getDataFromDevice(nodeId, diff --git a/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion22.java b/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion22.java index aa61ace73..b1e66a3cf 100644 --- a/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion22.java +++ b/common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion22.java @@ -86,7 +86,7 @@ public class PortMappingVersion22 { public boolean createMappingData(String nodeId) { - LOG.info("Create Mapping Data for node {}", nodeId); + LOG.info("Create Mapping Data for node 2.2 {}", nodeId); List portMapList = new ArrayList<>(); InstanceIdentifier infoIID = InstanceIdentifier.create(OrgOpenroadmDevice.class).child(Info.class); Optional deviceInfoOptional = this.deviceTransactionManager @@ -199,16 +199,16 @@ public class PortMappingVersion22 { continue; } for (Ports port : cp.getPorts()) { - if (Port.PortQual.XpdrNetwork.equals(port.getPortQual())) { + if (Port.PortQual.XpdrNetwork.getName().equals(port.getPortQual().getName())) { portMapList.add(createMappingObject(nodeId, port, circuitPackName, "XPDR1-" + StringConstants.NETWORK_TOKEN + line)); line++; - } else if (Port.PortQual.XpdrClient.equals(port.getPortQual())) { + } else if (Port.PortQual.XpdrClient.getName().equals(port.getPortQual().getName())) { portMapList.add(createMappingObject(nodeId, port, circuitPackName, "XPDR1-" + StringConstants.CLIENT_TOKEN + client)); client++; } else { - LOG.warn("Not supported type of port! Port type: {}", port.getPortQual()); + LOG.warn("Not supported type of port! Port type: {}", port.getPortQual().getName()); } } } @@ -236,7 +236,7 @@ public class PortMappingVersion22 { InstanceIdentifier srgIID = InstanceIdentifier.create(OrgOpenroadmDevice.class) .child(SharedRiskGroup.class, new SharedRiskGroupKey(srgCounter)); Optional ordmSrgObject = this.deviceTransactionManager.getDataFromDevice(deviceId, - LogicalDatastoreType.CONFIGURATION, srgIID, + LogicalDatastoreType.OPERATIONAL, srgIID, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT); if (ordmSrgObject.isPresent()) { srgCps.addAll(ordmSrgObject.get().getCircuitPacks()); @@ -352,7 +352,7 @@ public class PortMappingVersion22 { InstanceIdentifier deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class) .child(Degree.class, new DegreeKey(degreeCounter)); Optional ordmDegreeObject = this.deviceTransactionManager.getDataFromDevice(deviceId, - LogicalDatastoreType.CONFIGURATION, deviceIID, + LogicalDatastoreType.OPERATIONAL, deviceIID, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT); if (ordmDegreeObject.isPresent()) { degrees.add(ordmDegreeObject.get()); @@ -425,7 +425,7 @@ public class PortMappingVersion22 { NodesBuilder nodesBldr = new NodesBuilder(); nodesBldr.withKey(new NodesKey(deviceInfo.getNodeId().getValue())).setNodeId(deviceInfo.getNodeId().getValue()); nodesBldr.setNodeType(NodeTypes.forValue(nodeType)); - nodesBldr.setOpenroadmVersion(Nodes.OpenroadmVersion._121); + nodesBldr.setOpenroadmVersion(Nodes.OpenroadmVersion._22); if (portMapList != null) { nodesBldr.setMapping(portMapList); } 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 9772212e0..a09a3be7e 100644 --- a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/NetConfTopologyListener.java +++ b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/NetConfTopologyListener.java @@ -8,10 +8,15 @@ package org.opendaylight.transportpce.networkmodel; import java.util.Collection; +import java.util.Collections; +import java.util.List; import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + 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; @@ -39,6 +44,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netmod.notification.r 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; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.available.capabilities.AvailableCapability; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; @@ -154,14 +160,17 @@ public class NetConfTopologyListener implements DataTreeChangeListener { NetconfNodeConnectionStatus.ConnectionStatus connectionStatus = netconfNode.getConnectionStatus(); try { - long count = netconfNode.getAvailableCapabilities().getAvailableCapability().stream() - .filter(cp -> cp.getCapability().contains(StringConstants.OPENROADM_DEVICE_MODEL_NAME)) - .count(); - if (count > 0) { + List deviceCapabilities = netconfNode.getAvailableCapabilities() + .getAvailableCapability().stream().filter(cp -> cp.getCapability() + .contains(StringConstants.OPENROADM_DEVICE_MODEL_NAME)).collect(Collectors.toList()); + if (!deviceCapabilities.isEmpty()) { + Collections.sort(deviceCapabilities, (cp0, cp1) -> cp1.getCapability() + .compareTo(cp0.getCapability())); LOG.info("OpenROADM node detected: {} {}", nodeId, connectionStatus.name()); switch (connectionStatus) { case Connected: - this.networkModelService.createOpenROADMnode(nodeId); + this.networkModelService.createOpenROADMnode(nodeId, deviceCapabilities.get(0) + .getCapability()); onDeviceConnected(nodeId); break; case Connecting: @@ -174,6 +183,7 @@ public class NetConfTopologyListener implements DataTreeChangeListener { break; } } + LOG.error("Not an openROADM node"); } catch (NullPointerException e) { LOG.error("Cannot get available Capabilities"); } 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 f5f2f2ca2..f3242a1e4 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 @@ -19,8 +19,10 @@ public interface NetworkModelService { * * @param nodeId * unique node ID of new OpenROADM node + * @param nodeVersion + * OpenROADM node version */ - void createOpenROADMnode(String nodeId); + void createOpenROADMnode(String nodeId, String nodeVersion); /** * Delete OpenROADM node mapping and topologies. 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 81079870e..c38356c80 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 @@ -64,70 +64,74 @@ public class NetworkModelServiceImpl implements NetworkModelService { } @Override - public void createOpenROADMnode(String nodeId) { + public void createOpenROADMnode(String nodeId, String nodeVersion) { try { LOG.info("createOpenROADMNode: {} ", nodeId); - this.portMapping.createMappingData(nodeId); - this.linkDiscovery.readLLDP(new NodeId(nodeId)); + boolean isPortMapping = this.portMapping.createMappingData(nodeId, nodeVersion); + if (isPortMapping && "1.2.1".equals(this.portMapping.getNode(nodeId).getOpenroadmVersion().getName())) { + this.linkDiscovery.readLLDP(new NodeId(nodeId)); - Node clliNode = ClliNetwork.createNode(this.deviceTransactionManager, nodeId); - if (clliNode == null) { - LOG.error("Unable to create clli node! Node id: {}", nodeId); - return; - } + Node clliNode = ClliNetwork.createNode(this.deviceTransactionManager, nodeId); + if (clliNode == null) { + LOG.error("Unable to create clli node! Node id: {}", nodeId); + return; + } - Node openRoadmNode = OpenRoadmNetwork.createNode(nodeId, this.deviceTransactionManager); - if (openRoadmNode == null) { - LOG.error("Unable to create OpenRoadm node! Node id: {}", nodeId); - return; - } + Node openRoadmNode = OpenRoadmNetwork.createNode(nodeId, this.deviceTransactionManager); + if (openRoadmNode == null) { + LOG.error("Unable to create OpenRoadm node! Node id: {}", nodeId); + return; + } - TopologyShard topologyShard = this.openRoadmTopology.createTopologyShard(nodeId); - if (topologyShard == null) { - LOG.error("Unable to create topology shard for node {}!", nodeId); - return; - } - this.topologyShardMountedDevice.put(nodeId, topologyShard); + TopologyShard topologyShard = this.openRoadmTopology.createTopologyShard(nodeId); + if (topologyShard == null) { + 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); - InstanceIdentifier iiClliNode = InstanceIdentifier - .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))) - .child(Node.class, clliNode.key()) - .build(); - writeTransaction.merge(LogicalDatastoreType.CONFIGURATION, iiClliNode, clliNode, - CREATE_MISSING_PARENTS); - LOG.info("creating node in {}", NetworkUtils.UNDERLAY_NETWORK_ID); - InstanceIdentifier iiOpenRoadmNode = InstanceIdentifier - .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))) - .child(Node.class, openRoadmNode.key()) - .build(); - writeTransaction.merge(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmNode, openRoadmNode, - CREATE_MISSING_PARENTS); - for (Node openRoadmTopologyNode: topologyShard.getNodes()) { - LOG.info("creating 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.key()) + WriteTransaction writeTransaction = this.dataBroker.newWriteOnlyTransaction(); + LOG.info("creating node in {}", NetworkUtils.CLLI_NETWORK_ID); + InstanceIdentifier iiClliNode = InstanceIdentifier + .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))) + .child(Node.class, clliNode.key()) .build(); - writeTransaction.merge(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmTopologyNode, - openRoadmTopologyNode, CREATE_MISSING_PARENTS); - } - for (Link openRoadmTopologyLink: topologyShard.getLinks()) { - LOG.info("creating 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.key()) + writeTransaction.merge(LogicalDatastoreType.CONFIGURATION, iiClliNode, clliNode, + CREATE_MISSING_PARENTS); + LOG.info("creating node in {}", NetworkUtils.UNDERLAY_NETWORK_ID); + InstanceIdentifier iiOpenRoadmNode = InstanceIdentifier + .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))) + .child(Node.class, openRoadmNode.key()) .build(); - writeTransaction.merge(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmTopologyLink, - openRoadmTopologyLink, CREATE_MISSING_PARENTS); + writeTransaction.merge(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmNode, openRoadmNode, + CREATE_MISSING_PARENTS); + for (Node openRoadmTopologyNode: topologyShard.getNodes()) { + LOG.info("creating 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.key()) + .build(); + writeTransaction.merge(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmTopologyNode, + openRoadmTopologyNode, CREATE_MISSING_PARENTS); + } + for (Link openRoadmTopologyLink: topologyShard.getLinks()) { + LOG.info("creating 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.key()) + .build(); + writeTransaction.merge(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmTopologyLink, + openRoadmTopologyLink, CREATE_MISSING_PARENTS); + } + writeTransaction.submit().get(); + LOG.info("all nodes and links created"); + } else { + LOG.warn("openroadm-topology is not managed yet with openROADM device 2.2"); } - writeTransaction.submit().get(); - LOG.info("all nodes and links created"); } catch (InterruptedException | ExecutionException e) { LOG.error("ERROR: ", e); }