X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=networkmodel%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Ftransportpce%2Fnetworkmodel%2Futil%2FOpenRoadmTopology22.java;h=7fb4a91cd7bafcb3b77510d3721f599b7587691d;hb=66ccddbe00692f230350a19e1a222f09d6abd9a7;hp=f6f214403015a9cb742076f3e75fe6c79bab21c8;hpb=0e8ce89d9db4a8e996dfed2918639b0870264a7f;p=transportpce.git 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 f6f214403..7fb4a91cd 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,19 +10,23 @@ 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.mdsal.common.api.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.rev191115.network.Nodes; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev191115.network.nodes.Mapping; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Link1; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Link1Builder; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.NetworkTypes1; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.NetworkTypes1Builder; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.networks.network.network.types.OpenroadmCommonNetworkBuilder; @@ -31,19 +35,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; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.Node1Builder; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.TerminationPoint1; @@ -75,6 +66,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; @@ -86,17 +79,11 @@ 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; - public OpenRoadmTopology22(NetworkTransactionService networkTransactionService, - DeviceTransactionManager deviceTransactionManager) { + public OpenRoadmTopology22(NetworkTransactionService networkTransactionService) { this.networkTransactionService = networkTransactionService; - this.deviceTransactionManager = deviceTransactionManager; } /** @@ -110,7 +97,7 @@ public class OpenRoadmTopology22 { new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))); this.networkTransactionService.put(LogicalDatastoreType.CONFIGURATION, nwIID.build(), openRoadmTopology); - this.networkTransactionService.submit().get(1, TimeUnit.SECONDS); + this.networkTransactionService.commit().get(1, TimeUnit.SECONDS); LOG.info("OpenRoadm-Topology created successfully."); } catch (ExecutionException | TimeoutException | InterruptedException e) { LOG.warn("Failed to create OpenRoadm-Topology", e); @@ -121,660 +108,381 @@ public class OpenRoadmTopology22 { * Create empty OpenROADM topology. */ private Network createOpenRoadmTopology() { - NetworkBuilder nwBuilder = new NetworkBuilder(); NetworkId nwId = new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID); - nwBuilder.setNetworkId(nwId); - nwBuilder.withKey(new NetworkKey(nwId)); - NetworkTypes1Builder topoNetworkTypesBldr = new NetworkTypes1Builder(); - topoNetworkTypesBldr.setOpenroadmCommonNetwork(new OpenroadmCommonNetworkBuilder().build()); - NetworkTypesBuilder nwTypeBuilder = new NetworkTypesBuilder(); - nwTypeBuilder.addAugmentation(NetworkTypes1.class, topoNetworkTypesBldr.build()); - nwBuilder.setNetworkTypes(nwTypeBuilder.build()); + NetworkTypes1Builder topoNetworkTypesBldr = new NetworkTypes1Builder() + .setOpenroadmCommonNetwork(new OpenroadmCommonNetworkBuilder().build()); + NetworkTypesBuilder nwTypeBuilder = new NetworkTypesBuilder() + .addAugmentation(NetworkTypes1.class, topoNetworkTypesBldr.build()); // Array to store nodes in the topolayer of a roadm/Xponder - Network1Builder nwBldr1 = new Network1Builder(); - // adding expressLinks - nwBldr1.setLink(Collections.emptyList()); - nwBuilder.addAugmentation(Network1.class, nwBldr1.build()); - nwBuilder.setNode(Collections.emptyList()); + Network1Builder nwBldr1 = new Network1Builder() + .setLink(Collections.emptyList()); + NetworkBuilder nwBuilder = new NetworkBuilder() + .setNetworkId(nwId) + .withKey(new NetworkKey(nwId)) + .setNetworkTypes(nwTypeBuilder.build()) + // adding expressLinks + .addAugmentation(Network1.class, nwBldr1.build()) + .setNode(Collections.emptyList()); return nwBuilder.build(); } - public TopologyShard createTopologyShard(String nodeId) { + public TopologyShard createTopologyShard(Nodes mappingNode) { int numOfDegrees; int numOfSrgs; - int portDirectionEnum = DEFAULT_PORT_DIRECTION; - - 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(deviceInfo.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.getNodeInfo().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(deviceInfo.getNodeType().getName())) { + } else if (NodeTypes.Xpdr.getIntValue() == mappingNode.getNodeInfo().getNodeType().getIntValue()) { // Check if node is XPONDER - Integer clientport = getNoOfClientPorts(nodeId); - List links = new ArrayList<>(); - Integer clientCounter = 1; - Integer lineCounter = 1; - while (clientCounter <= clientport) { - NodeBuilder tempNode = createXpdr(clientCounter, lineCounter, nodeId); - if (tempNode == null) { - break; - } - nodes.add(tempNode.build()); - clientCounter++; - lineCounter++; - LOG.info("Entered this loop"); - } + LOG.info("creating xpdr node in openroadmtopology for node {}", mappingNode.getNodeId()); + NodeBuilder ietfNode = createXpdr(mappingNode); + nodes.add(ietfNode.build()); 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++; - } - } - } + private NodeBuilder createXpdr(Nodes mappingNode) { + // set node-id + String nodeIdtopo = new StringBuilder().append(mappingNode.getNodeId()).append("-XPDR1").toString(); + // Create openroadm-network-topo augmentation to set node type to Xponder + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130 + .Node1Builder ocnNode1Bldr = new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130 + .Node1Builder().setNodeType(OpenroadmNodeType.XPONDER); + // Create ietf node setting supporting-node data + NodeBuilder ietfNodeBldr = createTopoLayerNode(mappingNode.getNodeId()) + .setNodeId(new NodeId(nodeIdtopo)) + .withKey((new NodeKey(new NodeId(nodeIdtopo)))) + .addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130 + .Node1.class, ocnNode1Bldr.build()); + + // Create tp-list + List tpList = new ArrayList<>(); + TerminationPointBuilder ietfTpBldr; + for (Mapping m : mappingNode.getMapping()) { + ietfTpBldr = createTpBldr(m.getLogicalConnectionPoint()); + // Add openroadm-network-topology tp augmentations + TerminationPoint1Builder ontTp1Bldr = new TerminationPoint1Builder(); + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130 + .TerminationPoint1Builder ocnTp1Bldr = new org.opendaylight.yang.gen.v1.http.org.openroadm.common + .network.rev181130.TerminationPoint1Builder(); + if (m.getPortQual().equals("xpdr-network")) { + XpdrNetworkAttributesBuilder xpdrNwAttrBldr = new XpdrNetworkAttributesBuilder() + .setTailEquipmentId(m.getAssociatedLcp()); + ontTp1Bldr.setXpdrNetworkAttributes(xpdrNwAttrBldr.build()); + ocnTp1Bldr.setTpType(OpenroadmTpType.XPONDERNETWORK); + org.opendaylight.yang.gen.v1.http.transportpce.topology.rev190625.TerminationPoint1Builder tpceTp1Bldr = + new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev190625.TerminationPoint1Builder() + .setAssociatedConnectionMapPort(m.getAssociatedLcp()); + ietfTpBldr.addAugmentation(TerminationPoint1.class, ontTp1Bldr.build()) + .addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130 + .TerminationPoint1.class, ocnTp1Bldr.build()) + .addAugmentation(org.opendaylight.yang.gen.v1.http.transportpce.topology.rev190625 + .TerminationPoint1.class, tpceTp1Bldr.build()); + tpList.add(ietfTpBldr.build()); + } else if (m.getPortQual().equals("xpdr-client")) { + XpdrClientAttributesBuilder xpdrNwAttrBldr = new XpdrClientAttributesBuilder() + .setTailEquipmentId(m.getAssociatedLcp()); + ontTp1Bldr.setXpdrClientAttributes(xpdrNwAttrBldr.build()); + ocnTp1Bldr.setTpType(OpenroadmTpType.XPONDERCLIENT); + org.opendaylight.yang.gen.v1.http.transportpce.topology.rev190625.TerminationPoint1Builder tpceTp1Bldr = + new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev190625.TerminationPoint1Builder() + .setAssociatedConnectionMapPort(m.getAssociatedLcp()); + ietfTpBldr.addAugmentation(TerminationPoint1.class, ontTp1Bldr.build()) + .addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130 + .TerminationPoint1.class, ocnTp1Bldr.build()) + .addAugmentation(org.opendaylight.yang.gen.v1.http.transportpce.topology.rev190625 + .TerminationPoint1.class, tpceTp1Bldr.build()); + tpList.add(ietfTpBldr.build()); } - } else { - return 0; } - return client; - } - - private NodeBuilder createXpdr(Integer clientCounter, Integer lineCounter, String nodeId) { - // Create a generic Topo Layer node - NodeBuilder nodebldr = createTopoLayerNode(nodeId); - // Create augmentation node to inorder to add degree - Node1Builder node1bldr = new Node1Builder(); - TerminationPoint1Builder tp1Bldr = new TerminationPoint1Builder(); - TerminationPointBuilder tempTpBldr; - // set node type to Xponder - node1bldr.setNodeType(OpenroadmNodeType.XPONDER); - List tpList = new ArrayList<>(); - String nodeIdtopo = new StringBuilder().append(nodeId).append("-XPDR1").toString(); - // Ad degree node specific augmentation - nodebldr.setNodeId(new NodeId(nodeIdtopo)); - nodebldr.withKey((new NodeKey(new NodeId(nodeIdtopo)))); - nodebldr.addAugmentation(Node1.class, node1bldr.build()); - while (clientCounter != 0) { - // Create CLNT-TX termination - tempTpBldr = createTpBldr("XPDR1-CLIENT" + clientCounter); - tp1Bldr.setTpType(OpenroadmTpType.XPONDERCLIENT); - XpdrClientAttributesBuilder xpdrClntBldr = new XpdrClientAttributesBuilder(); - xpdrClntBldr.setTailEquipmentId("XPDR1-NETWORK" + clientCounter); - tp1Bldr.setXpdrClientAttributes(xpdrClntBldr.build()); - tempTpBldr.addAugmentation(TerminationPoint1.class, tp1Bldr.build()); - tpList.add(tempTpBldr.build()); - clientCounter--; } - while (lineCounter != 0) { - // Create LINE-TX termination - tempTpBldr = (createTpBldr("XPDR1-NETWORK" + lineCounter)); - tp1Bldr.setTpType(OpenroadmTpType.XPONDERNETWORK); - XpdrNetworkAttributesBuilder xpdrNwAttrBldr = new XpdrNetworkAttributesBuilder(); - xpdrNwAttrBldr.setTailEquipmentId("XPDR1-CLIENT" + lineCounter); - tp1Bldr.setXpdrNetworkAttributes(xpdrNwAttrBldr.build()); - tempTpBldr.addAugmentation(TerminationPoint1.class, tp1Bldr.build()); - tpList.add(tempTpBldr.build()); - lineCounter--; } - LOG.info("printing tpList {}",tpList); + // 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 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()); - LOG.info("The nodebldr {}",nodebldr); - return nodebldr; + .Node1Builder ietfNode1 = + new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder() + .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 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; - } - - DegreeAttributesBuilder degAttBldr = new DegreeAttributesBuilder(); - degAttBldr.setDegreeNumber(degreeCounter); - 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; - + private NodeBuilder createDegree(String degNb, List degListMap, String nodeId) { + // 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 + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130 + .TerminationPoint1Builder ocnTp1Bldr = new org.opendaylight.yang.gen.v1.http.org.openroadm.common + .network.rev181130.TerminationPoint1Builder(); + switch (m.getPortDirection()) { + case "bidirectional": + ocnTp1Bldr.setTpType(OpenroadmTpType.DEGREETXRXTTP); + break; + case "tx": + ocnTp1Bldr.setTpType(OpenroadmTpType.DEGREETXTTP); + break; + case "rx": + ocnTp1Bldr.setTpType(OpenroadmTpType.DEGREERXTTP); + break; + default: + LOG.error("impossible to set tp-type to {}", m.getLogicalConnectionPoint()); + } + ietfTpBldr.addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130 + .TerminationPoint1.class, ocnTp1Bldr.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( + // Add CTP to tp-list + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.TerminationPoint1Builder ocnTp1Bldr = + new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.TerminationPoint1Builder() + .setTpType(OpenroadmTpType.DEGREETXRXCTP); + ietfTpBldr = createTpBldr(degNb + "-CTP-TXRX").addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm + .common.network.rev181130.TerminationPoint1.class, ocnTp1Bldr.build()); + tpList.add(ietfTpBldr.build()); + + // 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() + .setTerminationPoint(tpList); + + // set node-id + String nodeIdtopo = new StringBuilder().append(nodeId).append("-").append(degNb).toString(); + // set degree-attributes + DegreeAttributesBuilder degAttBldr = new DegreeAttributesBuilder() + .setDegreeNumber(new Integer(degNb.split("DEG")[1])) + .setAvailableWavelengths(create96AvalWaveDegree()); + // Create openroadm-network-topo augmentation to set node type to DEGREE + Node1Builder ontNode1Bldr = new Node1Builder() + .setDegreeAttributes(degAttBldr.build()); + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1Builder ocnNode1Bldr = + new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1Builder() + .setNodeType(OpenroadmNodeType.DEGREE); + + // Create ietf node setting supporting-node data + NodeBuilder ietfNodeBldr = createTopoLayerNode(nodeId) + .setNodeId(new NodeId(nodeIdtopo)) + .withKey((new NodeKey(new NodeId(nodeIdtopo)))) + .addAugmentation(Node1.class, ontNode1Bldr.build()) + .addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130 + .Node1.class, ocnNode1Bldr.build()) + .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); + 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); - - 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; - } - - - String nodeIdtopo = new StringBuilder().append(nodeId).append("-SRG").append(srgCounter).toString(); - nodebldr.setNodeId(new NodeId(nodeIdtopo)); + private NodeBuilder createSrg(String srgNb, List srgListMap, String nodeId) { + // 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 + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130 + .TerminationPoint1Builder ocnTp1Bldr = new org.opendaylight.yang.gen.v1.http.org.openroadm.common + .network.rev181130.TerminationPoint1Builder(); + switch (m.getPortDirection()) { + case "bidirectional": + ocnTp1Bldr.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()); - } - } - - 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( - 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; + case "tx": + ocnTp1Bldr.setTpType(OpenroadmTpType.SRGTXPP); + break; + case "rx": + ocnTp1Bldr.setTpType(OpenroadmTpType.SRGRXPP); + break; + default: + LOG.error("impossible to set tp-type to {}", m.getLogicalConnectionPoint()); } - } else { - LOG.info("SRG absent"); - return -1; + ietfTpBldr.addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130 + .TerminationPoint1.class, ocnTp1Bldr.build()); + tpList.add(ietfTpBldr.build()); } - return maxPpPorts; + // Add CP to tp-list + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.TerminationPoint1Builder ocnTp1Bldr = + new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.TerminationPoint1Builder() + .setTpType(OpenroadmTpType.SRGTXRXCP); + ietfTpBldr = createTpBldr(srgNb + "-CP-TXRX").addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm + .common.network.rev181130.TerminationPoint1.class, ocnTp1Bldr.build()); + tpList.add(ietfTpBldr.build()); + + // 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() + .setTerminationPoint(tpList); + + // set node-id + String nodeIdtopo = new StringBuilder().append(nodeId).append("-").append(srgNb).toString(); + // set srg-attributes + SrgAttributesBuilder srgAttrBldr = new SrgAttributesBuilder().setAvailableWavelengths(create96AvalWaveSrg()); + // Create openroadm-network-topo augmentation to set node type to DEGREE + Node1Builder ontNode1Bldr = new Node1Builder() + .setSrgAttributes(srgAttrBldr.build()); + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1Builder ocnNode1Bldr = + new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1Builder() + .setNodeType(OpenroadmNodeType.SRG); + + // Create ietf node setting supporting-node data + NodeBuilder ietfNodeBldr = createTopoLayerNode(nodeId) + .setNodeId(new NodeId(nodeIdtopo)) + .withKey((new NodeKey(new NodeId(nodeIdtopo)))) + .addAugmentation(Node1.class, ontNode1Bldr.build()) + .addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1.class, + ocnNode1Bldr.build()) + .addAugmentation( + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class, + ietfNode1.build()); + return ietfNodeBldr; } private NodeBuilder createTopoLayerNode(String nodeId) { // Sets the value of Network-ref and Node-ref as a part of the supporting node // attribute - SupportingNodeBuilder supportbldr = new SupportingNodeBuilder(); - supportbldr.withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID), new NodeId(nodeId))); - supportbldr.setNetworkRef(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID)); - supportbldr.setNodeRef(new NodeId(nodeId)); + SupportingNodeBuilder supportbldr = new SupportingNodeBuilder() + .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID), new NodeId(nodeId))) + .setNetworkRef(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID)) + .setNodeRef(new NodeId(nodeId)); ArrayList supportlist = new ArrayList<>(); supportlist.add(supportbldr.build()); - NodeBuilder nodebldr = new NodeBuilder(); - nodebldr.setSupportingNode(supportlist); + NodeBuilder nodebldr = new NodeBuilder().setSupportingNode(supportlist); 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) { - TerminationPointBuilder tpBldr = new TerminationPointBuilder(); TpId tp = new TpId(tpId); TerminationPointKey tpKey = new TerminationPointKey(tp); - tpBldr.withKey(tpKey); - tpBldr.setTpId(tp); + TerminationPointBuilder tpBldr = new TerminationPointBuilder().withKey(tpKey).setTpId(tp); 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) { + //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); + LinkBuilder ietfLinkBldr = new LinkBuilder() + .setSource(ietfSrcLinkBldr.build()) + .setDestination(ietfDestLinkBldr.build()) + .setLinkId(LinkIdUtil.buildLinkId(srcNode, srcTp, destNode, destTp)); + ietfLinkBldr.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(); + Link1Builder ocnAzLinkBldr = new Link1Builder(); + int srcNodeType = nodes.get(i).augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common + .network.rev181130.Node1.class).getNodeType().getIntValue(); + int destNodeType = nodes.get(j).augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common + .network.rev181130.Node1.class).getNodeType().getIntValue(); + //The previous 2 lines generate warnings. + //Casting (nodes.get(i or j).augmentation(Node1.class)) to + //(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1) + //breaks the portmapping + if (srcNodeType == 11 && destNodeType == 11) { + ocnAzLinkBldr.setLinkType(OpenroadmLinkType.EXPRESSLINK); + } else if (srcNodeType == 11 && destNodeType == 12) { + ocnAzLinkBldr.setLinkType(OpenroadmLinkType.DROPLINK); + } else if (srcNodeType == 12 && destNodeType == 11) { + ocnAzLinkBldr.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 + Link1Builder ocnZaLinkBldr = new Link1Builder(); + if (srcNodeType == 11 && destNodeType == 11) { + ocnZaLinkBldr.setLinkType(OpenroadmLinkType.EXPRESSLINK); + } else if (destNodeType == 11 && srcNodeType == 12) { + ocnZaLinkBldr.setLinkType(OpenroadmLinkType.DROPLINK); + } else if (destNodeType == 12 && srcNodeType == 11) { + ocnZaLinkBldr.setLinkType(OpenroadmLinkType.ADDLINK); + } else { + continue; } + // set opposite link augmentations + LinkBuilder ietfAzLinkBldr = createLink(srcNode, destNode, srcTp, destTp); + LinkBuilder ietfZaLinkBldr = createLink(destNode, srcNode, destTp, srcTp); + ocnAzLinkBldr.setOppositeLink(ietfZaLinkBldr.getLinkId()); + ietfAzLinkBldr.addAugmentation(Link1.class, ocnAzLinkBldr.build()) + .addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130 + .Link1.class, ocnAzLinkBldr.build()); + ocnZaLinkBldr.setOppositeLink(ietfAzLinkBldr.getLinkId()); + ietfZaLinkBldr.addAugmentation(Link1.class, ocnZaLinkBldr.build()); + links.add(ietfAzLinkBldr.build()); + links.add(ietfZaLinkBldr.build()); } } return links; @@ -801,18 +509,19 @@ public class OpenRoadmTopology22 { InstanceIdentifierBuilder linkIID = InstanceIdentifier.builder(Networks.class).child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).augmentation(Network1.class) .child(Link.class, new LinkKey(linkId)); - com.google.common.base.Optional link = + java.util.Optional link = networkTransactionService.read(LogicalDatastoreType.CONFIGURATION,linkIID.build()).get(); if (link.isPresent()) { LinkBuilder linkBuilder = new LinkBuilder(link.get()); - Link1Builder link1Builder = new Link1Builder(linkBuilder.augmentation(org.opendaylight - .yang.gen.v1.http.org.openroadm.network.topology.rev181130.Link1.class)); - link1Builder.setAdministrativeState(State.OutOfService); - linkBuilder.removeAugmentation(Link1.class); - linkBuilder.addAugmentation(Link1.class,link1Builder.build()); + org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130 + .Link1Builder link1Builder = new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology + .rev181130.Link1Builder(linkBuilder.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm + .network.topology.rev181130.Link1.class)).setAdministrativeState(State.OutOfService); + linkBuilder.removeAugmentation(Link1.class).addAugmentation(org.opendaylight.yang.gen.v1.http.org + .openroadm.network.topology.rev181130.Link1.class,link1Builder.build()); networkTransactionService.merge(LogicalDatastoreType.CONFIGURATION, linkIID.build(), linkBuilder.build()); - networkTransactionService.submit().get(1, TimeUnit.SECONDS); + networkTransactionService.commit().get(1, TimeUnit.SECONDS); return true; } else { LOG.error("No link found for given LinkId: {}", @@ -830,9 +539,9 @@ public class OpenRoadmTopology22 { List waveList = new ArrayList<>(); for (int i = 1; i < 97; i++) { - AvailableWavelengthsBuilder avalBldr = new AvailableWavelengthsBuilder(); - avalBldr.setIndex((long) i); - avalBldr.withKey(new AvailableWavelengthsKey((long) i)); + AvailableWavelengthsBuilder avalBldr = new AvailableWavelengthsBuilder() + .setIndex((long) i) + .withKey(new AvailableWavelengthsKey((long) i)); waveList.add(avalBldr.build()); } @@ -848,14 +557,13 @@ public class OpenRoadmTopology22 { for (int i = 1; i < 97; i++) { org.opendaylight.yang.gen.v1.http.org.openroadm.srg.rev181130.srg.node.attributes - .AvailableWavelengthsBuilder avalBldr = - new org.opendaylight.yang.gen.v1.http.org.openroadm.srg.rev181130.srg.node - .attributes.AvailableWavelengthsBuilder(); - avalBldr.setIndex((long) i); - avalBldr.withKey( - new org.opendaylight.yang.gen.v1.http.org.openroadm.srg.rev181130.srg.node - .attributes.AvailableWavelengthsKey( - (long) i)); + .AvailableWavelengthsBuilder avalBldr = + new org.opendaylight.yang.gen.v1.http.org.openroadm.srg.rev181130.srg.node.attributes + .AvailableWavelengthsBuilder() + .setIndex((long) i) + .withKey( + new org.opendaylight.yang.gen.v1.http.org.openroadm.srg.rev181130.srg.node.attributes + .AvailableWavelengthsKey((long) i)); waveList.add(avalBldr.build()); }