From: Gilles Thouenon Date: Fri, 28 Jun 2019 15:59:51 +0000 (+0200) Subject: Consolidate portmapping-topo for ROADM X-Git-Tag: 0.4.0~36 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=transportpce.git;a=commitdiff_plain;h=c3abcb7ae105293fee69d7171351a60789c1d8c2 Consolidate portmapping-topo for ROADM - create RDM node in openroadm-topology from its portmapping data only - change the way to create links JIRA: TRNSPRTPCE-109 Change-Id: Ie2790fa7f13a29f6dc67e7491e86d808b29159c8 Signed-off-by: Gilles Thouenon Co-authored-by: Christophe Betoule --- 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 fe3735335..3afe5ab2e 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 @@ -297,21 +297,21 @@ public class PortMappingVersion221 { LOG.warn("{} : Circuit pack {} not found or without ports.", nodeId, circuitPackName); continue; // TODO continue or return false? } - CircuitPacks circuitPack = circuitPackObject.get(); - for (Ports port : circuitPack.getPorts()) { - if (port.getLogicalConnectionPoint() != null) { - String logicalConnectionPoint = getLogicalConnectionPort(port, srgIndex); - LOG.info("{} : Logical Connection Point for {} {} is {}", nodeId, circuitPackName, port - .getPortName(), - logicalConnectionPoint); + List portList = circuitPackObject.get().getPorts(); + portList.sort(Comparator.comparing(Ports::getPortName)); + int portIndex = 1; + for (Ports port : portList) { + if (port.getPortQual() == null) { + continue; + } else if (PortQual.RoadmExternal.getIntValue() == port.getPortQual().getIntValue()) { + String logicalConnectionPoint = createLogicalConnectionPort(port, srgIndex, portIndex); + LOG.info("{} : Logical Connection Point for {} {} is {}", nodeId, circuitPackName, + port.getPortName(), logicalConnectionPoint); portMapList.add(createMappingObject(nodeId, port, circuitPackName, logicalConnectionPoint)); - } else if (PortQual.RoadmInternal.equals(port.getPortQual())) { - LOG.info("Port is internal, skipping Logical Connection Point missing for {} {}", - circuitPackName, - port.getPortName()); - } else if (port.getLogicalConnectionPoint() == null) { - LOG.info("Value missing, Skipping Logical Connection Point missing for {} {}", circuitPackName, - port.getPortName()); + portIndex++; + } else { + LOG.info("{} : port {} on {} is not roadm-external. No logicalConnectionPoint for this port.", + nodeId, port.getPortName(), circuitPackName); } } } @@ -362,6 +362,23 @@ public class PortMappingVersion221 { return null; // TODO return false or continue? } + private String createLogicalConnectionPort(Ports port, int srgIndex, int portIndex) { + String lcp = null; + switch (port.getPortDirection()) { + case Tx: + lcp = "SRG" + srgIndex + "-PP" + portIndex + "-TX"; + break; + case Rx: + lcp = "SRG" + srgIndex + "-PP" + portIndex + "-RX"; + break; + case Bidirectional: + lcp = "SRG" + srgIndex + "-PP" + portIndex + "-TXRX"; + break; + default: + LOG.error("Unsupported port direction for port {} : {}", port, port.getPortDirection()); + } + return lcp; + } private List getDegrees(String deviceId, Info ordmInfo) { List degrees = new ArrayList<>(); @@ -384,10 +401,8 @@ public class PortMappingVersion221 { Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT); if (ordmDegreeObject.isPresent()) { degrees.add(ordmDegreeObject.get()); - } else { - LOG.info("Device has {} degree", degreeCounter - 1); - break; } + LOG.info("Device {} has {} degree", degrees.size()); } return degrees; } @@ -498,7 +513,8 @@ public class PortMappingVersion221 { String logicalConnectionPoint) { MappingBuilder mpBldr = new MappingBuilder(); mpBldr.withKey(new MappingKey(logicalConnectionPoint)).setLogicalConnectionPoint(logicalConnectionPoint) - .setSupportingCircuitPackName(circuitPackName).setSupportingPort(port.getPortName()); + .setSupportingCircuitPackName(circuitPackName).setSupportingPort(port.getPortName()) + .setPortDirection(port.getPortDirection().getName()); // Get OMS and OTS interface provisioned on the TTP's if (logicalConnectionPoint.contains(StringConstants.TTP_TOKEN) && (port.getInterfaces() != null)) { 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 2cccea98f..6b8e624f2 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 @@ -79,7 +79,10 @@ public class NetworkModelServiceImpl implements NetworkModelService { LOG.warn("Could not generate port mapping for {} skipping network model creation", nodeId); return; } - this.linkDiscovery.readLLDP(new NodeId(nodeId), openRoadmVersion); + + if (portMapping.getNode(nodeId).getNodeType().getIntValue() == 1) { + this.linkDiscovery.readLLDP(new NodeId(nodeId), openRoadmVersion); + } Node clliNode = ClliNetwork.createNode(this.deviceTransactionManager, nodeId, openRoadmVersion); if (clliNode == null) { diff --git a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmTopology22.java b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmTopology22.java index cf0ba1e76..37887d095 100644 --- a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmTopology22.java +++ b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmTopology22.java @@ -10,18 +10,19 @@ package org.opendaylight.transportpce.networkmodel.util; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; import java.util.List; -import java.util.Optional; +import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import java.util.stream.Collectors; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.transportpce.common.NetworkUtils; -import org.opendaylight.transportpce.common.Timeouts; import org.opendaylight.transportpce.common.device.DeviceTransactionManager; import org.opendaylight.transportpce.common.network.NetworkTransactionService; -import org.opendaylight.transportpce.networkmodel.dto.NodeData; import org.opendaylight.transportpce.networkmodel.dto.TopologyShard; 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; @@ -33,17 +34,6 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.No import org.opendaylight.yang.gen.v1.http.org.openroadm.degree.rev181130.degree.node.attributes.AvailableWavelengths; import org.opendaylight.yang.gen.v1.http.org.openroadm.degree.rev181130.degree.node.attributes.AvailableWavelengthsBuilder; import org.opendaylight.yang.gen.v1.http.org.openroadm.degree.rev181130.degree.node.attributes.AvailableWavelengthsKey; -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.pack.PortsKey; -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.circuit.packs.CircuitPacksKey; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.degree.ConnectionPorts; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.OrgOpenroadmDevice; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.Degree; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.DegreeKey; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.Info; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.SharedRiskGroup; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.SharedRiskGroupKey; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.Link1; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.Link1Builder; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.Node1; @@ -77,6 +67,8 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.top import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkKey; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.link.DestinationBuilder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.link.SourceBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointKey; @@ -88,9 +80,6 @@ import org.slf4j.LoggerFactory; public class OpenRoadmTopology22 { private static final Logger LOG = LoggerFactory.getLogger(OpenRoadmTopology22.class); - private static final int DEFAULT_PORT_DIRECTION = -1; - private static final int MAX_DEGREE = 20; - private static final int MAX_SRG = 20; private NetworkTransactionService networkTransactionService; private final DeviceTransactionManager deviceTransactionManager; @@ -144,136 +133,66 @@ public class OpenRoadmTopology22 { public TopologyShard createTopologyShard(Nodes mappingNode) { int numOfDegrees; int numOfSrgs; - int portDirectionEnum = DEFAULT_PORT_DIRECTION; - String nodeId = mappingNode.getNodeId(); - - InstanceIdentifier infoIID = InstanceIdentifier.create(OrgOpenroadmDevice.class).child(Info.class); - java.util.Optional deviceInfoOpt = - deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, infoIID, - Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT); - Info deviceInfo; - if (deviceInfoOpt.isPresent()) { - deviceInfo = deviceInfoOpt.get(); - } else { - LOG.error("Unable to get device info for device {}!", nodeId); - return null; - } List nodes = new ArrayList<>(); - // Check if node is ROADM - if (NodeTypes.Rdm.getName().equals(mappingNode.getNodeType().getName())) { - - /* - * Adding Degree Node Get Degree Number -> x then get connection ports then find the port directions - * to decide whether TX/RX/TXRX Get value for max degree from info subtree, required for iteration - * if not present assume to be 20 (temporary) - */ - - Integer maxDegree; - if (deviceInfo.getMaxDegrees() != null) { - maxDegree = deviceInfo.getMaxDegrees(); - } else { - maxDegree = MAX_DEGREE; - } + List links = new ArrayList<>(); - // Starting with degree Number = 1 - Integer degreeCounter = 1; - - while (degreeCounter <= maxDegree) { - LOG.info("creating degree node {}/{}", degreeCounter, maxDegree); - NodeData nodeData = createDegreeNode(nodeId, degreeCounter); - if (nodeData != null) { - NodeBuilder tempNode = nodeData.getNodeBuilder(); - portDirectionEnum = nodeData.getPortDirectionEnum(); - nodes.add(tempNode.build()); - degreeCounter++; - } - // null returned if Degree number= degreeCounter not present in the device - else { - break; + // Check if node is ROADM + if (NodeTypes.Rdm.getIntValue() == mappingNode.getNodeType().getIntValue()) { + LOG.info("creating rdm node in openroadmtopology for node {}", mappingNode.getNodeId()); + // transform flat mapping list to per degree and per srg mapping lists + Map> mapDeg = new HashMap(); + Map> mapSrg = new HashMap(); + List mappingList = mappingNode.getMapping(); + mappingList.sort(Comparator.comparing(Mapping::getLogicalConnectionPoint)); + + List nodeShardList = new ArrayList(); + for (Mapping mapping : mappingList) { + String str = mapping.getLogicalConnectionPoint().split("-")[0]; + if (!nodeShardList.contains(str)) { + nodeShardList.add(str); } } - numOfDegrees = degreeCounter - 1; - - Integer maxSrg; - if (deviceInfo.getMaxSrgs() != null) { - maxSrg = deviceInfo.getMaxSrgs(); - } else { - maxSrg = MAX_SRG; - } - - // Starting with degree Number = 1 - Integer srgCounter = 1; - - while (srgCounter <= maxSrg) { - LOG.info("creating SRG node {}/{}", srgCounter, maxSrg); - NodeBuilder tempNode = createSrgNode(nodeId, srgCounter, portDirectionEnum); - - if (tempNode != null) { - nodes.add(tempNode.build()); - srgCounter++; + for (String str : nodeShardList) { + List interList = new ArrayList(); + interList = mappingList.stream().filter(x -> x.getLogicalConnectionPoint().contains(str)) + .collect(Collectors.toList()); + if (str.contains("DEG")) { + mapDeg.put(str, interList); + } else if (str.contains("SRG")) { + mapSrg.put(str, interList); } else { - // null returned if Degree number= degreeCounter not present in the device - break; + LOG.error("unknown element"); } } - numOfSrgs = srgCounter - 1; + // create degree nodes + for (String k : mapDeg.keySet()) { + NodeBuilder ietfNode = createDegree(k, mapDeg.get(k), mappingNode.getNodeId()); + nodes.add(ietfNode.build()); + } + // create srg nodes + for (String k : mapSrg.keySet()) { + NodeBuilder ietfNode = createSrg(k, mapSrg.get(k), mappingNode.getNodeId()); + nodes.add(ietfNode.build()); + } + numOfDegrees = mapDeg.size(); + numOfSrgs = mapSrg.size(); LOG.info("adding links numOfDegrees={} numOfSrgs={}", numOfDegrees, numOfSrgs); - List links = new ArrayList<>(); - links.addAll(createExpressLinks(nodeId, numOfDegrees, portDirectionEnum)); - links.addAll(createAddDropLinks(nodeId, numOfDegrees, numOfSrgs, portDirectionEnum)); + links.addAll(createNewLinks(nodes)); LOG.info("created nodes/links: {}/{}", nodes.size(), links.size()); return new TopologyShard(nodes, links); - } else if (NodeTypes.Xpdr.getName().equals(mappingNode.getNodeType().getName())) { + } else if (NodeTypes.Xpdr.getIntValue() == mappingNode.getNodeType().getIntValue()) { // Check if node is XPONDER LOG.info("creating xpdr node in openroadmtopology for node {}", mappingNode.getNodeId()); NodeBuilder ietfNode = createXpdr(mappingNode); nodes.add(ietfNode.build()); - List links = new ArrayList<>(); return new TopologyShard(nodes, links); } LOG.error("Device node Type not managed yet"); return null; } - /** - * This private method gets the list of circuit packs on a xponder. For each circuit pack on a - * Xponder, it does a get on circuit-pack subtree with circuit-pack-name as key in order to get the - * list of ports. It then iterates over the list of ports to get ports with port-qual as - * xpdr-network/xpdr-client. The line and client ports are saved as: - * - *

- * 1. LINEn - * - *

- * 2. CLNTn - */ - private int getNoOfClientPorts(String deviceId) { - // Creating for Xponder Line and Client Ports - InstanceIdentifier deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class); - Optional deviceObject = - deviceTransactionManager.getDataFromDevice(deviceId, LogicalDatastoreType.CONFIGURATION, deviceIID, - Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT); - - // Variable to keep track of number of client ports - int client = 1; - if (deviceObject.isPresent()) { - for (CircuitPacks cp : deviceObject.get().getCircuitPacks()) { - if (cp.getPorts() != null) { - for (Ports port : cp.getPorts()) { - if ((port.getPortQual() != null) && (port.getPortQual().getIntValue() == 4)) { - client++; - } - } - } - } - } else { - return 0; - } - return client; - } - private NodeBuilder createXpdr(Nodes mappingNode) { // Create ietf node setting supporting-node data NodeBuilder ietfNodeBldr = createTopoLayerNode(mappingNode.getNodeId()); @@ -333,260 +252,119 @@ public class OpenRoadmTopology22 { return ietfNodeBldr; } - - private NodeData createDegreeNode(String nodeId, int degreeCounter) { - // Create augmentation node to inorder to add degree - Node1Builder node1bldr = new Node1Builder(); - // set node type to degree - node1bldr.setNodeType(OpenroadmNodeType.DEGREE); - - // Get connection ports on degree number = degreeCounter in order to get port - // direction - List degreeConPorts = getDegreePorts(nodeId, degreeCounter); - if (degreeConPorts == null || degreeConPorts.isEmpty()) { - return null; - } - + private NodeBuilder createDegree(String degNb, List degListMap, String nodeId) { + // Create ietf node setting supporting-node data + NodeBuilder ietfNodeBldr = createTopoLayerNode(nodeId); + // set node-id + String nodeIdtopo = new StringBuilder().append(nodeId).append("-").append(degNb).toString(); + ietfNodeBldr.setNodeId(new NodeId(nodeIdtopo)); + ietfNodeBldr.withKey((new NodeKey(new NodeId(nodeIdtopo)))); + // Create openroadm-network-topo augmentation to set node type to DEGREE + Node1Builder ontNode1Bldr = new Node1Builder(); + ontNode1Bldr.setNodeType(OpenroadmNodeType.DEGREE); + // set degree-attributes DegreeAttributesBuilder degAttBldr = new DegreeAttributesBuilder(); - degAttBldr.setDegreeNumber(degreeCounter); + degAttBldr.setDegreeNumber(new Integer(degNb.split("DEG")[1])); degAttBldr.setAvailableWavelengths(create96AvalWaveDegree()); - node1bldr.setDegreeAttributes(degAttBldr.build()); - - String nodeIdtopo = new StringBuilder(nodeId).append("-DEG").append(degreeCounter).toString(); - // Create a generic Topo Layer node - NodeBuilder nodebldr = createTopoLayerNode(nodeId); - nodebldr.setNodeId(new NodeId(nodeIdtopo)); - // Ad degree node specific augmentation - nodebldr.addAugmentation(Node1.class, node1bldr.build()); - // Get Port direction - int portDirectionEnum = getPortDirection(nodeId, degreeConPorts.get(0).getCircuitPackName(), - degreeConPorts.get(0).getPortName().toString()); - - /* - * if bi-directional then create 2 tp's : - * - * --> TTP-TXRX --> CTP-TXRX - * - * if uni-directional : - * - * --> TTP-TX - * --> TTP-RX - * --> CTP-TX - * --> CTP-RX - */ - TerminationPoint1Builder tp1Bldr = new TerminationPoint1Builder(); - TerminationPointBuilder tempTpBldr; + ontNode1Bldr.setDegreeAttributes(degAttBldr.build()); + ietfNodeBldr.addAugmentation(Node1.class, ontNode1Bldr.build()); + // Create tp-list List tpList = new ArrayList<>(); - if (portDirectionEnum == 1 || portDirectionEnum == 2) { - // ports are uni Directional on a degree, therefore 4 termination points - // Create TTP-TX termination - - tempTpBldr = createTpBldr("DEG" + degreeCounter + "-TTP-TX"); - tp1Bldr.setTpType(OpenroadmTpType.DEGREETXTTP); - tempTpBldr.addAugmentation(TerminationPoint1.class, tp1Bldr.build()); - tpList.add(tempTpBldr.build()); - - // Create TTP-RX termination - tp1Bldr = new TerminationPoint1Builder(); - tempTpBldr = createTpBldr("DEG" + degreeCounter + "-TTP-RX"); - tp1Bldr.setTpType(OpenroadmTpType.DEGREERXTTP); - - tempTpBldr.addAugmentation(TerminationPoint1.class,tp1Bldr.build()); - tpList.add(tempTpBldr.build()); - - // Create CTP-TX termination - tp1Bldr = new TerminationPoint1Builder(); - tempTpBldr = createTpBldr("DEG" + degreeCounter + "-CTP-TX"); - tp1Bldr.setTpType(OpenroadmTpType.DEGREETXCTP); - tempTpBldr.addAugmentation(TerminationPoint1.class,tp1Bldr.build()); - tpList.add(tempTpBldr.build()); - - // Create CTP-RX termination - tp1Bldr = new TerminationPoint1Builder(); - tempTpBldr = createTpBldr("DEG" + degreeCounter + "-CTP-RX"); - tp1Bldr.setTpType(OpenroadmTpType.DEGREERXCTP); - tempTpBldr.addAugmentation(TerminationPoint1.class,tp1Bldr.build()); - tpList.add(tempTpBldr.build()); - - } else if (portDirectionEnum == 3) { - // Ports are bi directional therefore 2 termination points - // Create TTP-TXRX termination - tp1Bldr = new TerminationPoint1Builder(); - tempTpBldr = createTpBldr("DEG" + degreeCounter + "-TTP-TXRX"); - tp1Bldr.setTpType(OpenroadmTpType.DEGREETXRXTTP); - tempTpBldr.addAugmentation(TerminationPoint1.class,tp1Bldr.build()); - tpList.add(tempTpBldr.build()); - - // Create CTP-TXRX termination - tp1Bldr = new TerminationPoint1Builder(); - tempTpBldr = createTpBldr("DEG" + degreeCounter + "-CTP-TXRX"); - tp1Bldr.setTpType(OpenroadmTpType.DEGREETXRXCTP); - tempTpBldr.addAugmentation(TerminationPoint1.class,tp1Bldr.build()); - tpList.add(tempTpBldr.build()); - + TerminationPointBuilder ietfTpBldr; + for (Mapping m : degListMap) { + ietfTpBldr = createTpBldr(m.getLogicalConnectionPoint()); + // Add openroadm-network-topology tp augmentations + TerminationPoint1Builder ontTp1Bldr = new TerminationPoint1Builder(); + switch (m.getPortDirection()) { + case "bidirectional": + ontTp1Bldr.setTpType(OpenroadmTpType.DEGREETXRXTTP); + break; + case "tx": + ontTp1Bldr.setTpType(OpenroadmTpType.DEGREETXTTP); + break; + case "rx": + ontTp1Bldr.setTpType(OpenroadmTpType.DEGREERXTTP); + break; + default: + LOG.error("impossible to set tp-type to {}", m.getLogicalConnectionPoint()); + } + ietfTpBldr.addAugmentation(TerminationPoint1.class, ontTp1Bldr.build()); + tpList.add(ietfTpBldr.build()); } + // Add CTP to tp-list + ietfTpBldr = createTpBldr(degNb + "-CTP-TXRX"); + TerminationPoint1Builder ontTp1Bldr = new TerminationPoint1Builder(); + ontTp1Bldr.setTpType(OpenroadmTpType.DEGREETXRXCTP); + ietfTpBldr.addAugmentation(TerminationPoint1.class, ontTp1Bldr.build()); + tpList.add(ietfTpBldr.build()); - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder tpNode1 - = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology - .rev180226.Node1Builder(); - - tpNode1.setTerminationPoint(tpList); - - nodebldr.addAugmentation( - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class, - tpNode1.build()); - return new NodeData(nodebldr, portDirectionEnum); + // Create ietf node augmentation to support ietf tp-list + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 + .Node1Builder ietfNode1 = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology + .rev180226.Node1Builder(); + ietfNode1.setTerminationPoint(tpList); + ietfNodeBldr.addAugmentation( + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class, + ietfNode1.build()); + return ietfNodeBldr; } - - private NodeBuilder createSrgNode(String nodeId, int srgCounter, int portDirectionEnum) { - // Create augmentation node to in order to add srg - Node1Builder node1bldr = new Node1Builder(); - // set node type to SRG - node1bldr.setNodeType(OpenroadmNodeType.SRG); - - node1bldr.setNodeType(OpenroadmNodeType.SRG); - + private NodeBuilder createSrg(String srgNb, List srgListMap, String nodeId) { + // Create ietf node setting supporting-node data + NodeBuilder ietfNodeBldr = createTopoLayerNode(nodeId); + // set node-id + String nodeIdtopo = new StringBuilder().append(nodeId).append("-").append(srgNb).toString(); + ietfNodeBldr.setNodeId(new NodeId(nodeIdtopo)); + ietfNodeBldr.withKey((new NodeKey(new NodeId(nodeIdtopo)))); + // Create openroadm-network-topo augmentation to set node type to DEGREE + Node1Builder ontNode1Bldr = new Node1Builder(); + ontNode1Bldr.setNodeType(OpenroadmNodeType.SRG); + // set srg-attributes SrgAttributesBuilder srgAttrBldr = new SrgAttributesBuilder(); srgAttrBldr.setAvailableWavelengths(create96AvalWaveSrg()); - node1bldr.setSrgAttributes(srgAttrBldr.build()); - // Create a generic Topo Layer node - NodeBuilder nodebldr = createTopoLayerNode(nodeId); - nodebldr.addAugmentation(Node1.class, node1bldr.build()); - - - // Get connection ports on degree number = degreeCounter in order to get port - // direction - int maxPpPorts = getMaxPp(nodeId, srgCounter); - if (maxPpPorts == -1) { - return null; - } - + ontNode1Bldr.setSrgAttributes(srgAttrBldr.build()); + ietfNodeBldr.addAugmentation(Node1.class, ontNode1Bldr.build()); - String nodeIdtopo = new StringBuilder().append(nodeId).append("-SRG").append(srgCounter).toString(); - nodebldr.setNodeId(new NodeId(nodeIdtopo)); + // Create tp-list List tpList = new ArrayList<>(); - - TerminationPoint1Builder tp1Bldr; - TerminationPointBuilder tempTpBldr; - - for (int i = 1; i <= maxPpPorts; i++) { - if (portDirectionEnum == 1 || portDirectionEnum == 2) { - if (i >= maxPpPorts / 2) { + TerminationPointBuilder ietfTpBldr; + for (Mapping m : srgListMap) { + ietfTpBldr = createTpBldr(m.getLogicalConnectionPoint()); + // Add openroadm-network-topology tp augmentations + TerminationPoint1Builder ontTp1Bldr = new TerminationPoint1Builder(); + switch (m.getPortDirection()) { + case "bidirectional": + ontTp1Bldr.setTpType(OpenroadmTpType.SRGTXRXPP); break; - } - // ports are uni Directional on a degree, therefore 4 termination points - // Create PP-TX termination - tempTpBldr = createTpBldr("SRG" + srgCounter + "-PP" + i + "-TX"); - tp1Bldr = new TerminationPoint1Builder(); - tp1Bldr.setTpType(OpenroadmTpType.SRGTXPP); - tempTpBldr.addAugmentation(TerminationPoint1.class, tp1Bldr.build()); - tpList.add(tempTpBldr.build()); - - // Create PP-RX termination - tempTpBldr = createTpBldr("SRG" + srgCounter + "-PP" + i + "-RX"); - tp1Bldr = new TerminationPoint1Builder(); - tp1Bldr.setTpType(OpenroadmTpType.SRGRXPP); - tempTpBldr.addAugmentation(TerminationPoint1.class, tp1Bldr.build()); - tpList.add(tempTpBldr.build()); - - } else if (portDirectionEnum == 3) { - // Ports are bi directional therefore 2 termination points - // Create PP-TXRX termination - tempTpBldr = createTpBldr("SRG" + srgCounter + "-PP" + i + "-TXRX"); - tp1Bldr = new TerminationPoint1Builder(); - tp1Bldr.setTpType(OpenroadmTpType.SRGTXRXPP); - tempTpBldr.addAugmentation(TerminationPoint1.class, tp1Bldr.build()); - tpList.add(tempTpBldr.build()); + case "tx": + ontTp1Bldr.setTpType(OpenroadmTpType.SRGTXPP); + break; + case "rx": + ontTp1Bldr.setTpType(OpenroadmTpType.SRGRXPP); + break; + default: + LOG.error("impossible to set tp-type to {}", m.getLogicalConnectionPoint()); } + ietfTpBldr.addAugmentation(TerminationPoint1.class, ontTp1Bldr.build()); + tpList.add(ietfTpBldr.build()); } + // Add CP to tp-list + ietfTpBldr = createTpBldr(srgNb + "-CP-TXRX"); + TerminationPoint1Builder ontTp1Bldr = new TerminationPoint1Builder(); + ontTp1Bldr.setTpType(OpenroadmTpType.SRGTXRXCP); + ietfTpBldr.addAugmentation(TerminationPoint1.class, ontTp1Bldr.build()); + tpList.add(ietfTpBldr.build()); - switch (portDirectionEnum) { - case 1: // ports are uni Directional on a degree - case 2: - // Create CP-TX termination - tempTpBldr = createTpBldr("SRG" + srgCounter + "-CP" + "-TX"); - tp1Bldr = new TerminationPoint1Builder(); - tp1Bldr.setTpType(OpenroadmTpType.SRGTXCP); - tempTpBldr.addAugmentation(TerminationPoint1.class, tp1Bldr.build()); - tpList.add(tempTpBldr.build()); - // Create CP-RX termination - tempTpBldr = createTpBldr("SRG" + srgCounter + "-CP" + "-RX"); - tp1Bldr = new TerminationPoint1Builder(); - tp1Bldr.setTpType(OpenroadmTpType.SRGRXCP); - tempTpBldr.addAugmentation(TerminationPoint1.class, tp1Bldr.build()); - tpList.add(tempTpBldr.build()); - break; - case 3: - // Ports are bi directional therefore 2 termination points - // Create CP-TXRX termination - tempTpBldr = createTpBldr("SRG" + srgCounter + "-CP" + "-TXRX"); - tp1Bldr = new TerminationPoint1Builder(); - tp1Bldr.setTpType(OpenroadmTpType.SRGTXRXCP); - tempTpBldr.addAugmentation(TerminationPoint1.class, tp1Bldr.build()); - tpList.add(tempTpBldr.build()); - break; - default: - LOG.error("No correponsding direction to the value: {}", portDirectionEnum); - break; - } - - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder tpNode1 = - new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder(); - - tpNode1.setTerminationPoint(tpList); - - nodebldr.addAugmentation( + // Create ietf node augmentation to support ietf tp-list + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 + .Node1Builder ietfNode1 = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology + .rev180226.Node1Builder(); + ietfNode1.setTerminationPoint(tpList); + ietfNodeBldr.addAugmentation( org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class, - tpNode1.build()); - - return nodebldr; - } - - /* - * This method will return the TTP ports in the device for a given degree number to be used by the - * node to create TTP and CTP termination point on the device - */ - private List getDegreePorts(String deviceId, Integer degreeCounter) { - List degreeConPorts = new ArrayList<>(); - LOG.info("Getting Connection ports for Degree Number {}", degreeCounter); - InstanceIdentifier deviceIID = - InstanceIdentifier.create(OrgOpenroadmDevice.class).child(Degree.class, new DegreeKey(degreeCounter)); - - Optional ordmDegreeObject = - deviceTransactionManager.getDataFromDevice(deviceId, LogicalDatastoreType.CONFIGURATION, deviceIID, - Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT); - - if (ordmDegreeObject.isPresent()) { - degreeConPorts.addAll(new ArrayList<>(ordmDegreeObject.get().getConnectionPorts())); - } else { - LOG.info("Device has {} degree", (degreeCounter - 1)); - return Collections.emptyList(); - } - return degreeConPorts; - } - - private int getMaxPp(String deviceId, Integer srgCounter) { - int maxPpPorts; - LOG.info("Getting max pp ports for Srg Number {}", srgCounter); - InstanceIdentifier deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class) - .child(SharedRiskGroup.class, new SharedRiskGroupKey(srgCounter)); - Optional ordmSrgObject = - deviceTransactionManager.getDataFromDevice(deviceId, LogicalDatastoreType.OPERATIONAL, deviceIID, - Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT); - if (ordmSrgObject.isPresent()) { - if (ordmSrgObject.get().getMaxAddDropPorts() != null) { - maxPpPorts = ordmSrgObject.get().getMaxAddDropPorts(); - } else { - LOG.info("Max add drop ports absent"); - return -1; - } - } else { - LOG.info("SRG absent"); - return -1; - } - return maxPpPorts; + ietfNode1.build()); + return ietfNodeBldr; } private NodeBuilder createTopoLayerNode(String nodeId) { @@ -603,30 +381,6 @@ public class OpenRoadmTopology22 { return nodebldr; } - // Return 0 for null/error values - // Return 1 for tx - // Return 2 for rx - // Return 3 for bi-directional - - private int getPortDirection(String deviceId, String circuitPackName, String portName) { - InstanceIdentifier portIID = InstanceIdentifier.create(OrgOpenroadmDevice.class) - .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName)) - .child(Ports.class, new PortsKey(portName)); - LOG.info("Fetching Port Direction for port {} at circuit pack {}", portName, circuitPackName); - Optional portObject = - deviceTransactionManager.getDataFromDevice(deviceId, LogicalDatastoreType.OPERATIONAL, portIID, - Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT); - if (portObject.isPresent()) { - Ports port = portObject.get(); - if (port.getPortDirection() != null) { - return port.getPortDirection().getIntValue(); - } else { - LOG.warn("Port direction value missing for {} {}", circuitPackName, port.getPortName()); - return 0; - } - } - return 0; - } // This method returns a generic termination point builder for a given tpid private TerminationPointBuilder createTpBldr(String tpId) { @@ -638,147 +392,79 @@ public class OpenRoadmTopology22 { return tpBldr; } - - - - - private List createExpressLinks(String nodeId, int numOfDegrees, int portDirectionEnum) { - LOG.info("creating express links {} {} {}", nodeId, numOfDegrees, portDirectionEnum); - List links = new ArrayList<>(); - - String srcNode; - String destNode; - - String srcTp; - String destTp; - - // ports are uni-directional - if (portDirectionEnum == 1 || portDirectionEnum == 2) { - LOG.info("creating uni-directional express links"); - for (int i = 1; i <= numOfDegrees; i++) { - for (int j = i + 1; j <= numOfDegrees; j++) { - - srcNode = nodeId + "-DEG" + i; - destNode = nodeId + "-DEG" + j; - - // AtoZ direction - srcTp = "DEG" + i + "-CTP-TX"; - destTp = "DEG" + j + "-CTP-RX"; - - LinkBuilder expLinkBldr = TopologyUtils.createLink(srcNode, destNode, srcTp, destTp); - - Link1Builder lnk1Bldr = new Link1Builder(); - lnk1Bldr.setLinkType(OpenroadmLinkType.EXPRESSLINK); - expLinkBldr.addAugmentation(Link1.class, lnk1Bldr.build()); - links.add(expLinkBldr.build()); - - // ZtoA direction - srcTp = "DEG" + i + "-CTP-RX"; - destTp = "DEG" + j + "-CTP-TX"; - - expLinkBldr = TopologyUtils.createLink(destNode, srcNode, destTp, srcTp); - expLinkBldr.addAugmentation(Link1.class, lnk1Bldr.build()); - links.add(expLinkBldr.build()); - - } - } - } - - // ports are bi-directional - if (portDirectionEnum == 3) { - LOG.info("creating bi-directional express links"); - for (int i = 1; i <= numOfDegrees; i++) { - for (int j = i + 1; j <= numOfDegrees; j++) { - - srcNode = nodeId + "-DEG" + i; - destNode = nodeId + "-DEG" + j; - - // AtoZ direction - srcTp = "DEG" + i + "-CTP-TXRX"; - destTp = "DEG" + j + "-CTP-TXRX"; - - Link1Builder lnk1Bldr = new Link1Builder(); - lnk1Bldr.setLinkType(OpenroadmLinkType.EXPRESSLINK); - LinkBuilder expLinkBldr = TopologyUtils.createLink(srcNode, destNode, srcTp, destTp); - expLinkBldr.addAugmentation(Link1.class, lnk1Bldr.build()); - links.add(expLinkBldr.build()); - - // ZtoA direction - expLinkBldr = TopologyUtils.createLink(destNode, srcNode, destTp, srcTp); - expLinkBldr.addAugmentation(Link1.class, lnk1Bldr.build()); - links.add(expLinkBldr.build()); - } - } - } - return links; + private LinkBuilder createLink(String srcNode, String destNode, String srcTp, String destTp) { + LinkBuilder ietfLinkBldr = new LinkBuilder(); + //create source link + SourceBuilder ietfSrcLinkBldr = new SourceBuilder().setSourceNode(new NodeId(srcNode)).setSourceTp(srcTp); + //create destination link + DestinationBuilder ietfDestLinkBldr = new DestinationBuilder().setDestNode(new NodeId(destNode)) + .setDestTp(destTp); + ietfLinkBldr.setSource(ietfSrcLinkBldr.build()) + .setDestination(ietfDestLinkBldr.build()) + .setLinkId(LinkIdUtil.buildLinkId(srcNode, srcTp, destNode, destTp)) + .withKey(new LinkKey(ietfLinkBldr.getLinkId())); + return ietfLinkBldr; } - private List createAddDropLinks(String nodeId, int numOfDegrees, int numOfSrgs, int portDirectionEnum) { - LOG.info("creating add-drop links {} {} {} {}", nodeId, numOfDegrees, numOfSrgs, portDirectionEnum); + private List createNewLinks(List nodes) { List links = new ArrayList<>(); - String srcNode; String destNode; - String srcTp; String destTp; - - // ports are uni-directional - if (portDirectionEnum == 1 || portDirectionEnum == 2) { - LOG.info("creating uni-directional add-drop links"); - for (int i = 1; i <= numOfDegrees; i++) { - for (int j = 1; j <= numOfSrgs; j++) { - - srcNode = nodeId + "-DEG" + i; - destNode = nodeId + "-SRG" + j; - - // drop links - srcTp = "DEG" + i + "-CTP-TX"; - destTp = "SRG" + j + "-CP-RX"; - - LinkBuilder addDropLinkBldr = TopologyUtils.createLink(srcNode, destNode, srcTp, destTp); - Link1Builder lnk1Bldr = new Link1Builder(); - lnk1Bldr.setLinkType(OpenroadmLinkType.DROPLINK); - addDropLinkBldr.addAugmentation(Link1.class, lnk1Bldr.build()); - links.add(addDropLinkBldr.build()); - - // add links direction - srcTp = "DEG" + i + "-CTP-RX"; - destTp = "SRG" + j + "-CP-TX"; - - addDropLinkBldr = TopologyUtils.createLink(destNode, srcNode, destTp, srcTp); - lnk1Bldr.setLinkType(OpenroadmLinkType.ADDLINK); - addDropLinkBldr.addAugmentation(Link1.class, lnk1Bldr.build()); - links.add(addDropLinkBldr.build()); - + for (int i = 0; i < nodes.size() - 1; i++) { + for (int j = i + 1; j < nodes.size(); j++) { + srcNode = nodes.get(i).getNodeId().getValue(); + destNode = nodes.get(j).getNodeId().getValue(); + // A to Z direction + srcTp = nodes.get(i).augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf + .network.topology.rev180226.Node1.class).getTerminationPoint().stream() + .filter(tp -> tp.getTpId().getValue().contains("CP") || tp.getTpId().getValue().contains("CTP")) + .findFirst().get().getTpId().getValue(); + destTp = nodes.get(j).augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf + .network.topology.rev180226.Node1.class).getTerminationPoint().stream() + .filter(tp -> tp.getTpId().getValue().contains("CP") || tp.getTpId().getValue().contains("CTP")) + .findFirst().get().getTpId().getValue(); + LinkBuilder ietfAzLinkBldr = createLink(srcNode, destNode, srcTp, destTp); + Link1Builder ontAzLinkBldr = new Link1Builder(); + int srcNodeType = nodes.get(i).augmentation(Node1.class).getNodeType().getIntValue(); + int destNodeType = nodes.get(j).augmentation(Node1.class).getNodeType().getIntValue(); + if (srcNodeType == 11 && destNodeType == 11) { + ontAzLinkBldr.setLinkType(OpenroadmLinkType.EXPRESSLINK); + } else if (srcNodeType == 11 && destNodeType == 12) { + ontAzLinkBldr.setLinkType(OpenroadmLinkType.DROPLINK); + } else if (srcNodeType == 12 && destNodeType == 11) { + ontAzLinkBldr.setLinkType(OpenroadmLinkType.ADDLINK); + } else { + continue; } - } - } - // ports are bi-directional - if (portDirectionEnum == 3) { - LOG.info("creating bi-directional add-drop links"); - for (int i = 1; i <= numOfDegrees; i++) { - for (int j = 1; j <= numOfSrgs; j++) { - - srcNode = nodeId + "-DEG" + i; - destNode = nodeId + "-SRG" + j; - - // drop links - srcTp = "DEG" + i + "-CTP-TXRX"; - destTp = "SRG" + j + "-CP-TXRX"; - - LinkBuilder addDropLinkBldr = TopologyUtils.createLink(srcNode, destNode, srcTp, destTp); - Link1Builder lnk1Bldr = new Link1Builder(); - lnk1Bldr.setLinkType(OpenroadmLinkType.DROPLINK); - addDropLinkBldr.addAugmentation(Link1.class, lnk1Bldr.build()); - links.add(addDropLinkBldr.build()); - - // add link - addDropLinkBldr = TopologyUtils.createLink(destNode, srcNode, destTp, srcTp); - lnk1Bldr.setLinkType(OpenroadmLinkType.ADDLINK); - addDropLinkBldr.addAugmentation(Link1.class, lnk1Bldr.build()); - links.add(addDropLinkBldr.build()); + // Z to A direction + LinkBuilder ietfZaLinkBldr = createLink(destNode, srcNode, destTp, srcTp); + Link1Builder ontZaLinkBldr = new Link1Builder(); + if (srcNodeType == 11 && destNodeType == 11) { + ontZaLinkBldr.setLinkType(OpenroadmLinkType.EXPRESSLINK); + } else if (destNodeType == 11 && srcNodeType == 12) { + ontZaLinkBldr.setLinkType(OpenroadmLinkType.DROPLINK); + } else if (destNodeType == 12 && srcNodeType == 11) { + ontZaLinkBldr.setLinkType(OpenroadmLinkType.ADDLINK); + } else { + continue; } + // set opposite link augmentations + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Link1Builder ocnAzLinkBldr = + new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Link1Builder() + .setOppositeLink(ietfZaLinkBldr.getLinkId()); + ietfAzLinkBldr.addAugmentation(Link1.class, ontAzLinkBldr.build()); + ietfAzLinkBldr.addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130 + .Link1.class, ocnAzLinkBldr.build()); + ietfZaLinkBldr.addAugmentation(Link1.class, ontZaLinkBldr.build()); + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Link1Builder ocnZaLinkBldr = + new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Link1Builder() + .setOppositeLink(ietfAzLinkBldr.getLinkId()); + ietfZaLinkBldr.addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130 + .Link1.class, ocnZaLinkBldr.build()); + links.add(ietfAzLinkBldr.build()); + links.add(ietfZaLinkBldr.build()); } } return links;