X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=networkmodel%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Ftransportpce%2Fnetworkmodel%2Futil%2FOpenRoadmTopology.java;h=25994f7116af65dd41600cea1dbb0e3555a232b2;hb=2a4ffb4cfa232a15ff89c29815de7f70e54c1741;hp=acb36c915bf3a602f9a4b14f5615be53edbb091f;hpb=71e9cd410721cce4a96d5f12601b518b6f2ce690;p=transportpce.git diff --git a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmTopology.java b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmTopology.java index acb36c915..25994f711 100644 --- a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmTopology.java +++ b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmTopology.java @@ -8,879 +8,612 @@ package org.opendaylight.transportpce.networkmodel.util; +import static org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.XpdrNodeTypes.Tpdr; + 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 org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import java.util.stream.Collectors; +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.networkmodel.dto.NodeData; +import org.opendaylight.transportpce.common.fixedflex.GridUtils; +import org.opendaylight.transportpce.common.network.NetworkTransactionService; import org.opendaylight.transportpce.networkmodel.dto.TopologyShard; -import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.NodeTypes; -import org.opendaylight.yang.gen.v1.http.org.openroadm.degree.rev170929.degree.node.attributes.AvailableWavelengths; -import org.opendaylight.yang.gen.v1.http.org.openroadm.degree.rev170929.degree.node.attributes.AvailableWavelengthsBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.degree.rev170929.degree.node.attributes.AvailableWavelengthsKey; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.pack.Ports; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.pack.PortsKey; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.packs.CircuitPacks; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.packs.CircuitPacksKey; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.degree.ConnectionPorts; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.OrgOpenroadmDevice; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.Degree; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.DegreeKey; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.Info; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.SharedRiskGroup; -import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.SharedRiskGroupKey; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev170929.Link1; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev170929.Link1Builder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev170929.NetworkTypes1; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev170929.NetworkTypes1Builder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev170929.Node1; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev170929.Node1Builder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev170929.TerminationPoint1; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev170929.TerminationPoint1Builder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev170929.network.network.types.OpenroadmTopologyBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev170929.network.node.DegreeAttributesBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev170929.network.node.SrgAttributesBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev170929.network.node.termination.point.XpdrClientAttributesBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev170929.network.node.termination.point.XpdrNetworkAttributesBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev170929.OpenroadmLinkType; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev170929.OpenroadmNodeType; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev170929.OpenroadmTpType; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.Network; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NetworkBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NetworkId; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NetworkKey; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NodeId; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.network.NetworkTypesBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.network.Node; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.network.NodeBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.network.NodeKey; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.network.node.SupportingNode; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.network.node.SupportingNodeBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.network.node.SupportingNodeKey; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.LinkId; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.Network1; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.Network1Builder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.TpId; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.network.Link; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.network.LinkBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.network.LinkKey; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.network.link.DestinationBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.network.link.SourceBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.network.node.TerminationPoint; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.network.node.TerminationPointBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.network.node.TerminationPointKey; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1Builder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State; +import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1Builder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.TerminationPoint1; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.DegreeAttributes; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.DegreeAttributesBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.SrgAttributes; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.SrgAttributesBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmTpType; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeBuilder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeKey; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNode; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeBuilder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeKey; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.LinkId; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId; +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; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder; +import org.opendaylight.yangtools.yang.common.Uint16; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class OpenRoadmTopology { +public final class OpenRoadmTopology { private static final Logger LOG = LoggerFactory.getLogger(OpenRoadmTopology.class); - private static final int DEFAULT_PORT_DIRECTION = -1; - private static final int MAX_DEGREE = 20; - private static final int MAX_SRG = 20; - - private final DataBroker dataBroker; - private final DeviceTransactionManager deviceTransactionManager; - public OpenRoadmTopology(DataBroker dataBroker, DeviceTransactionManager deviceTransactionManager) { - this.dataBroker = dataBroker; - this.deviceTransactionManager = deviceTransactionManager; + private static Map PORTQUAL_ORD_TYPE_MAP = Map.of( + "xpdr-network", OpenroadmTpType.XPONDERNETWORK, + "switch-network", OpenroadmTpType.XPONDERNETWORK, + "xpdr-client", OpenroadmTpType.XPONDERCLIENT + ); + private static Map> PORTDIR_ORD_TYPE_MAP = Map.of( + "bidirectional", List.of(OpenroadmTpType.DEGREETXRXTTP, OpenroadmTpType.SRGTXRXPP), + "tx", List.of(OpenroadmTpType.DEGREETXTTP, OpenroadmTpType.SRGTXPP), + "rx", List.of(OpenroadmTpType.DEGREERXTTP, OpenroadmTpType.SRGRXPP) + ); + + private OpenRoadmTopology() { } - /** - * This public method creates the OpenROADM Topology Layer and posts it to - * the controller. - */ - public void createTopoLayer(DataBroker controllerdb) { - try { - Network openRoadmTopology = createOpenRoadmTopology(); - InstanceIdentifierBuilder nwIID = InstanceIdentifier.builder(Network.class, - new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))); - WriteTransaction wrtx = controllerdb.newWriteOnlyTransaction(); - wrtx.put(LogicalDatastoreType.CONFIGURATION, nwIID.build(), openRoadmTopology); - wrtx.submit().get(1, TimeUnit.SECONDS); - LOG.info("OpenRoadm-Topology created successfully."); - } catch (ExecutionException | TimeoutException | InterruptedException e) { - LOG.warn("Failed to create OpenRoadm-Topology", e); - } + public static TopologyShard createTopologyShard(Nodes mappingNode) { + return createTopologyShard(mappingNode, true); } - /** - * 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)); - // set network type to Transport Underlay - NetworkTypes1Builder topoNetworkTypesBldr = new NetworkTypes1Builder(); - topoNetworkTypesBldr.setOpenroadmTopology(new OpenroadmTopologyBuilder().build()); - NetworkTypesBuilder nwTypeBuilder = new NetworkTypesBuilder(); - nwTypeBuilder.addAugmentation(NetworkTypes1.class, topoNetworkTypesBldr.build()); - nwBuilder.setNetworkTypes(nwTypeBuilder.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()); - return nwBuilder.build(); + public static TopologyShard createTopologyShard(Nodes mappingNode, boolean firstMount) { + switch (mappingNode.getNodeInfo().getNodeType()) { + case Rdm : + return createRdmTopologyShard(mappingNode, firstMount); + case Xpdr : + return createXpdrTopologyShard(mappingNode); + default : + LOG.error("Device node Type not managed yet"); + return null; + } } - public TopologyShard createTopologyShard(String nodeId) { - int numOfDegrees; - int numOfSrgs; - int portDirectionEnum = DEFAULT_PORT_DIRECTION; - - InstanceIdentifier infoIID = InstanceIdentifier.create(OrgOpenroadmDevice.class).child(Info.class); - java.util.Optional deviceInfoOpt = this.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; - } + public static TopologyShard createRdmTopologyShard(Nodes mappingNode, boolean firstMount) { List nodes = new ArrayList<>(); - - // Check if node is ROADM - if (NodeTypes.Rdm.equals(deviceInfo.getNodeType())) { - - /* - * 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; + 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 = new ArrayList<>(mappingNode.nonnullMapping().values()); + 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); } - - // 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++; - } else { - // null returned if Degree number= degreeCounter not present in the device - break; - } - } - numOfDegrees = degreeCounter - 1; - - Integer maxSrg; - if (deviceInfo.getMaxSrgs() != null) { - maxSrg = deviceInfo.getMaxSrgs(); + } + for (String str : nodeShardList) { + List interList = + mappingList.stream() + .filter(x -> x.getLogicalConnectionPoint().split("-")[0].equals(str)) + .collect(Collectors.toList()); + if (str.contains("DEG")) { + mapDeg.put(str, interList); + } else if (str.contains("SRG")) { + mapSrg.put(str, interList); } else { - maxSrg = MAX_SRG; + LOG.error("unknow element"); } - - // 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++; - } else { - // null returned if Degree number= degreeCounter not present in the device - break; - } - } - numOfSrgs = srgCounter - 1; - - 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)); - LOG.info("created nodes/links: {}/{}", nodes.size(), links.size()); - return new TopologyShard(nodes, links); - } else if (NodeTypes.Xpdr.equals(deviceInfo.getNodeType())) { - // Check if node is XPONDER - XponderPortNumber portNums = getNoOfPorts(nodeId); - List links = new ArrayList<>(); - NodeBuilder tempNode = createXpdr(portNums.getNumOfClientPorts(), portNums.getNumOfLinePorts(), nodeId); - nodes.add(tempNode.build()); - return new TopologyShard(nodes, links); } - - return null; + // create degree nodes + for (Map.Entry> entry : mapDeg.entrySet()) { + nodes.add( + createDegree(entry.getKey(), entry.getValue(), mappingNode.getNodeId(), + mappingNode.getNodeInfo().getNodeClli(), firstMount) + .build()); + } + // create srg nodes + for (Map.Entry> entry : mapSrg.entrySet()) { + nodes.add( + createSrg(entry.getKey(), entry.getValue(), mappingNode.getNodeId(), + mappingNode.getNodeInfo().getNodeClli(), firstMount) + .build()); + } + LOG.info("adding links numOfDegrees={} numOfSrgs={}", mapDeg.size(), mapSrg.size()); + List links = createNewLinks(nodes); + LOG.info("created nodes/links: {}/{}", nodes.size(), links.size()); + return new TopologyShard(nodes, links); } - /** - * 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 XponderPortNumber getNoOfPorts(String deviceId) { - - XponderPortNumber xponderPortNumber = new XponderPortNumber(); - // Creating for Xponder Line and Client Ports - InstanceIdentifier deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class); - Optional deviceObject = this.deviceTransactionManager.getDataFromDevice(deviceId, - LogicalDatastoreType.OPERATIONAL, deviceIID, Timeouts.DEVICE_READ_TIMEOUT, - Timeouts.DEVICE_READ_TIMEOUT_UNIT); - - // Variable to keep track of number of client ports - int client = 0; - int line = 0; - if (deviceObject.isPresent()) { - for (CircuitPacks cp : deviceObject.get().getCircuitPacks()) { - if (cp.getPorts() != null) { - for (Ports port : cp.getPorts()) { - if (port.getPortQual() != null) { - if (port.getPortQual().getIntValue() == 4) { - client++; - } else if (port.getPortQual().getIntValue() == 3) { - line++; - } - } - } + public static TopologyShard createXpdrTopologyShard(Nodes mappingNode) { + List nodes = new ArrayList<>(); + List networkMappings = + mappingNode.nonnullMapping().values() + .stream().filter(k -> k.getLogicalConnectionPoint().contains("NETWORK")) + .collect(Collectors.toList()); + List tpdrList = new ArrayList<>(); + for (Mapping mapping : networkMappings) { + Integer xpdrNb = Integer.parseInt(mapping.getLogicalConnectionPoint().split("XPDR")[1].split("-")[0]); + if (!tpdrList.contains(xpdrNb)) { + tpdrList.add(xpdrNb); + List extractedMappings = mappingNode.nonnullMapping().values() + .stream().filter(lcp -> lcp.getLogicalConnectionPoint().contains("XPDR" + xpdrNb)) + .collect(Collectors.toList()); + Boolean isOtn; + String xpdrType; + switch (mapping.getXponderType() == null ? Tpdr : mapping.getXponderType()) { + case Tpdr : + isOtn = false; + xpdrType = "Tpdr"; + break; + case Mpdr : + case Switch : + isOtn = true; + xpdrType = mapping.getXponderType().getName(); + break; + default : + LOG.warn("cannot create xpdr node {} in openroadm-topology: type {} not supported", + mappingNode.getNodeId() + "-XPDR" + xpdrNb, mapping.getXponderType().getName()); + continue; } + LOG.info("creating xpdr node {} of type {} in openroadm-topology", + mappingNode.getNodeId() + "-XPDR" + xpdrNb, xpdrType); + nodes.add(createXpdr( + mappingNode.getNodeId(), + mappingNode.getNodeInfo().getNodeClli(), + xpdrNb, + extractedMappings, + isOtn) + .build()); } - } else { - return xponderPortNumber; - } - xponderPortNumber.setNumOfClientPorts(client); - xponderPortNumber.setNumOfLinePorts(line); - return xponderPortNumber; - } - - 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 terminationCannot get available Capabilitiesc - 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); - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.Node1Builder tpNode1 = - new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.Node1Builder(); - tpNode1.setTerminationPoint(tpList); - nodebldr.addAugmentation( - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.Node1.class, - tpNode1.build()); - LOG.info("The nodebldr {}", nodebldr); - return nodebldr; + return nodes.isEmpty() ? null : new TopologyShard(nodes, new ArrayList()); } - 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; - - 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()); - + private static NodeBuilder createXpdr(String nodeId, String clli, Integer xpdrNb, List mappings, + boolean isOtn) { + // Create ietf node setting supporting-node data + String nodeIdtopo = new StringBuilder().append(nodeId).append("-XPDR").append(xpdrNb).toString(); + NodeBuilder ietfNodeBldr = createTopoLayerNode(nodeId, clli) + .setNodeId(new NodeId(nodeIdtopo)) + .withKey((new NodeKey(new NodeId(nodeIdtopo)))) + .addAugmentation( + // Create openroadm-network-topo augmentation to set node type to Xponder + new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder() + .setNodeType(OpenroadmNodeType.XPONDER) + .setAdministrativeState(AdminStates.InService) + .setOperationalState(State.InService) + .build()); + // Create tp-map + Map tpMap = new HashMap<>(); + for (Mapping m : mappings) { + if (!PORTQUAL_ORD_TYPE_MAP.containsKey(m.getPortQual())) { + continue; + } + if (isOtn && m.getPortQual().equals("xpdr-client")) { + continue; + } + TerminationPointBuilder ietfTpBldr = createTpBldr(m.getLogicalConnectionPoint()) + .addAugmentation( + // Add openroadm-network-topology tp augmentations + new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210 + .TerminationPoint1Builder() + .setTpType(PORTQUAL_ORD_TYPE_MAP.get(m.getPortQual())) + .setAdministrativeState(TopologyUtils.setNetworkAdminState(m.getPortAdminState())) + .setOperationalState(TopologyUtils.setNetworkOperState(m.getPortOperState())) + .build()); + if (!isOtn) { + ietfTpBldr.addAugmentation( + new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123 + .TerminationPoint1Builder() + .setAssociatedConnectionMapPort(m.getConnectionMapLcp()) + .build()); + } + TerminationPoint ietfTp = ietfTpBldr.build(); + tpMap.put(ietfTp.key(),ietfTp); } - - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.Node1Builder tpNode1 = - new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.Node1Builder(); - - tpNode1.setTerminationPoint(tpList); - - nodebldr.addAugmentation( - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.Node1.class, - tpNode1.build()); - return new NodeData(nodebldr, portDirectionEnum); + // Create ietf node augmentation to support ietf tp-list + return ietfNodeBldr.addAugmentation( + new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder() + .setTerminationPoint(tpMap) + .build()); } - private NodeBuilder createSrgNode(String nodeId, int srgCounter, int portDirectionEnum) { - // Create augmentation node to inorder to add degree - Node1Builder node1bldr = new Node1Builder(); - // set node type to degree - 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)); - List tpList = new ArrayList<>(); - - TerminationPoint1Builder tp1Bldr; - TerminationPointBuilder tempTpBldr; - - for (int i = 1; i <= maxPpPorts; i++) { - if ((portDirectionEnum == 1) || (portDirectionEnum == 2)) { - if (i >= (maxPpPorts / 2)) { - 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()); + private static NodeBuilder createDegree(String degNb, List degListMap, String nodeId, String clli, + boolean firstMount) { + // Create tp-list + Map tpMap = new HashMap<>(); + for (Mapping m : degListMap) { + // Add openroadm-common-network tp type augmentations + // Added states to degree port. TODO: add to mapping relation between abstracted and physical node states + if (!PORTDIR_ORD_TYPE_MAP.containsKey(m.getPortDirection())) { + LOG.error("impossible to set tp-type to {}", m.getLogicalConnectionPoint()); } + TerminationPoint ietfTp = createTpBldr(m.getLogicalConnectionPoint()) + .addAugmentation( + new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210 + .TerminationPoint1Builder() + .setTpType(PORTDIR_ORD_TYPE_MAP.get(m.getPortDirection()).get(0)) + .setAdministrativeState(TopologyUtils.setNetworkAdminState(m.getPortAdminState())) + .setOperationalState(TopologyUtils.setNetworkOperState(m.getPortOperState())) + .build()) + .build(); + tpMap.put(ietfTp.key(),ietfTp); } - - switch (portDirectionEnum) { - case 1: // ports are uni Directional on a degree - // 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()); - break; - case 2: - // 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; + // Add CTP to tp-list + added states. TODO: same comment as before with the relation between states + TerminationPoint ietfTp = createTpBldr(degNb + "-CTP-TXRX") + .addAugmentation(new org.opendaylight.yang.gen.v1.http + .org.openroadm.common.network.rev211210.TerminationPoint1Builder() + .setTpType(OpenroadmTpType.DEGREETXRXCTP) + .setAdministrativeState(AdminStates.InService) + .setOperationalState(State.InService) + .build()) + .build(); + tpMap.put(ietfTp.key(),ietfTp); + // set degree-attributes + DegreeAttributesBuilder degAttBldr = new DegreeAttributesBuilder() + .setDegreeNumber(Uint16.valueOf(degNb.split("DEG")[1])); + if (firstMount) { + degAttBldr.setAvailFreqMaps(GridUtils.initFreqMaps4FixedGrid2Available()); } - - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.Node1Builder tpNode1 = - new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.Node1Builder(); - - tpNode1.setTerminationPoint(tpList); - - nodebldr.addAugmentation( - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.Node1.class, - tpNode1.build()); - - return nodebldr; + DegreeAttributes degAtt = degAttBldr.build(); + // set node-id + String nodeIdtopo = new StringBuilder().append(nodeId).append("-").append(degNb).toString(); + // Create ietf node setting supporting-node data + return createTopoLayerNode(nodeId, clli) + .setNodeId(new NodeId(nodeIdtopo)) + .withKey((new NodeKey(new NodeId(nodeIdtopo)))) + .addAugmentation(new Node1Builder().setDegreeAttributes(degAtt).build()) + .addAugmentation( + new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210 + .Node1Builder() + .setNodeType(OpenroadmNodeType.DEGREE) + .setAdministrativeState(AdminStates.InService) + .setOperationalState(State.InService) + .build()) + .addAugmentation( + new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 + .Node1Builder() + .setTerminationPoint(tpMap) + .build()); } - /* - * 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 = this.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 = this.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; + private static NodeBuilder createSrg(String srgNb, List srgListMap, String nodeId, String clli, + boolean firstMount) { + // Create tp-list + Map tpMap = new HashMap<>(); + for (Mapping m : srgListMap) { + // Added states to srg port. TODO: add to mapping relation between abstracted and physical node states + if (!PORTDIR_ORD_TYPE_MAP.containsKey(m.getPortDirection())) { + LOG.error("impossible to set tp-type to {}", m.getLogicalConnectionPoint()); } - } else { - LOG.info("SRG absent"); - return -1; + TerminationPoint ietfTp = createTpBldr(m.getLogicalConnectionPoint()) + .addAugmentation( + // Add openroadm-common-network tp type augmentations + new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210 + .TerminationPoint1Builder() + .setTpType(PORTDIR_ORD_TYPE_MAP.get(m.getPortDirection()).get(1)) + .setAdministrativeState(TopologyUtils.setNetworkAdminState(m.getPortAdminState())) + .setOperationalState(TopologyUtils.setNetworkOperState(m.getPortOperState())) + .build()) + .build(); + tpMap.put(ietfTp.key(),ietfTp); } - return maxPpPorts; + // Add CP to tp-list + added states. TODO: same comment as before with the relation between states + TerminationPoint ietfTp = createTpBldr(srgNb + "-CP-TXRX") + .addAugmentation( + new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210 + .TerminationPoint1Builder() + .setTpType(OpenroadmTpType.SRGTXRXCP) + .setAdministrativeState(AdminStates.InService) + .setOperationalState(State.InService) + .build()) + .build(); + tpMap.put(ietfTp.key(),ietfTp); + // set srg-attributes + SrgAttributesBuilder srgAttrBldr = new SrgAttributesBuilder(); + if (firstMount) { + srgAttrBldr.setAvailFreqMaps(GridUtils.initFreqMaps4FixedGrid2Available()); + } + SrgAttributes srgAttr = srgAttrBldr.build(); + // Create ietf node augmentation to support ietf tp-list + // Create ietf node setting supporting-node data + String nodeIdtopo = new StringBuilder().append(nodeId).append("-").append(srgNb).toString(); + return createTopoLayerNode(nodeId, clli) + .setNodeId(new NodeId(nodeIdtopo)) + .withKey((new NodeKey(new NodeId(nodeIdtopo)))) + .addAugmentation(new Node1Builder().setSrgAttributes(srgAttr).build()) + .addAugmentation( + new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210 + .Node1Builder() + .setNodeType(OpenroadmNodeType.SRG) + .setAdministrativeState(AdminStates.InService) + .setOperationalState(State.InService) + .build()) + .addAugmentation( + new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 + .Node1Builder() + .setTerminationPoint(tpMap) + .build()); } - private NodeBuilder createTopoLayerNode(String nodeId) { + private static NodeBuilder createTopoLayerNode(String nodeId, String clli) { // 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)); - ArrayList supportlist = new ArrayList<>(); - supportlist.add(supportbldr.build()); - NodeBuilder nodebldr = new NodeBuilder(); - nodebldr.setSupportingNode(supportlist); - return nodebldr; + SupportingNode support1 = 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)) + .build(); + SupportingNode support2 = new SupportingNodeBuilder() + .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID), new NodeId(clli))) + .setNetworkRef(new NetworkId(NetworkUtils.CLLI_NETWORK_ID)) + .setNodeRef(new NodeId(clli)) + .build(); + Map supportlist = new HashMap<>(); + supportlist.put(support1.key(), support1); + supportlist.put(support2.key(), support2); + return new NodeBuilder().setSupportingNode(supportlist); } - // 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 = this.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(); + private static TerminationPointBuilder createTpBldr(String tpId) { TpId tp = new TpId(tpId); - TerminationPointKey tpKey = new TerminationPointKey(tp); - tpBldr.withKey(tpKey); - tpBldr.setTpId(tp); - return tpBldr; + return new TerminationPointBuilder().withKey(new TerminationPointKey(tp)).setTpId(tp); } - // This method returns the linkBuilder object for given source and destination. - public LinkBuilder createLink(String srcNode, String dstNode, String srcTp, String destTp) { - LOG.info("creating link for {}-{}", srcNode, dstNode); - // Create Destination for link - DestinationBuilder dstNodeBldr = new DestinationBuilder(); - dstNodeBldr.setDestTp(destTp); - dstNodeBldr.setDestNode(new NodeId(dstNode)); - // Create Source for the link - SourceBuilder srcNodeBldr = new SourceBuilder(); - srcNodeBldr.setSourceNode(new NodeId(srcNode)); - srcNodeBldr.setSourceTp(srcTp); - LinkBuilder lnkBldr = new LinkBuilder(); - // set link builder attribute - lnkBldr.setDestination(dstNodeBldr.build()); - lnkBldr.setSource(srcNodeBldr.build()); - lnkBldr.setLinkId(LinkIdUtil.buildLinkId(srcNode, srcTp, dstNode, destTp)); - lnkBldr.withKey(new LinkKey(lnkBldr.getLinkId())); - org.opendaylight.yang.gen.v1.http.org.openroadm.opposite.links.rev170929.Link1Builder lnk1Bldr = - new org.opendaylight.yang.gen.v1.http.org.openroadm.opposite.links.rev170929.Link1Builder(); - LinkId oppositeLinkId = LinkIdUtil.getOppositeLinkId(srcNode, srcTp, dstNode, destTp); - lnk1Bldr.setOppositeLink(oppositeLinkId); - lnkBldr.addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.opposite.links.rev170929.Link1.class, - lnk1Bldr.build()); - return lnkBldr; + private static LinkBuilder createLink(String srcNode, String destNode, String srcTp, String destTp) { + LinkId linkId = LinkIdUtil.buildLinkId(srcNode, srcTp, destNode, destTp); + return new LinkBuilder() + .setSource( + new SourceBuilder() + .setSourceNode(new NodeId(srcNode)) + .setSourceTp(new TpId(srcTp)) + .build()) + .setDestination( + new DestinationBuilder() + .setDestNode(new NodeId(destNode)) + .setDestTp(new TpId(destTp)) + .build()) + .setLinkId(linkId) + .withKey(new LinkKey(linkId)); } - private List createExpressLinks(String nodeId, int numOfDegrees, int portDirectionEnum) { - LOG.info("creating express links {} {} {}", nodeId, numOfDegrees, portDirectionEnum); + private static 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 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 = 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 = createLink(destNode, srcNode, destTp, srcTp); - expLinkBldr.addAugmentation(Link1.class, lnk1Bldr.build()); - - links.add(expLinkBldr.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) + .nonnullTerminationPoint().values().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) + .nonnullTerminationPoint().values().stream() + .filter(tp -> tp.getTpId().getValue().contains("CP") || tp.getTpId().getValue().contains("CTP")) + .findFirst().get().getTpId().getValue(); + Link1Builder ocnAzLinkBldr = new Link1Builder(); + Link1Builder ocnZaLinkBldr = new Link1Builder(); + int srcNodeType = nodes.get(i).augmentation(org.opendaylight.yang.gen.v1.http + .org.openroadm.common.network.rev211210.Node1.class).getNodeType().getIntValue(); + int destNodeType = nodes.get(j).augmentation(org.opendaylight.yang.gen.v1.http + .org.openroadm.common.network.rev211210.Node1.class).getNodeType().getIntValue(); + + if (srcNodeType == 11 && destNodeType == 11) { + ocnAzLinkBldr.setLinkType(OpenroadmLinkType.EXPRESSLINK); + ocnZaLinkBldr.setLinkType(OpenroadmLinkType.EXPRESSLINK); + } else if (srcNodeType == 11 && destNodeType == 12) { + ocnAzLinkBldr.setLinkType(OpenroadmLinkType.DROPLINK); + ocnZaLinkBldr.setLinkType(OpenroadmLinkType.ADDLINK); + } else if (srcNodeType == 12 && destNodeType == 11) { + ocnAzLinkBldr.setLinkType(OpenroadmLinkType.ADDLINK); + ocnZaLinkBldr.setLinkType(OpenroadmLinkType.DROPLINK); + } else { + continue; } - } - } - - // 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 = createLink(srcNode, destNode, srcTp, destTp); - expLinkBldr.addAugmentation(Link1.class, lnk1Bldr.build()); - links.add(expLinkBldr.build()); - - // ZtoA direction - expLinkBldr = createLink(destNode, srcNode, destTp, srcTp); - expLinkBldr.addAugmentation(Link1.class, lnk1Bldr.build()); - links.add(expLinkBldr.build()); + // Add state to link. Based on the operational state of the TPs at the edge of the link. + // Similar to getting srcTp and destTp + State srcTpState = nodes.get(i) + .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang + .ietf.network.topology.rev180226.Node1.class) + .getTerminationPoint().values().stream() + .filter(tp -> tp.getTpId().getValue().contains("CP") || tp.getTpId().getValue().contains("CTP")) + .findFirst().get() + .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210 + .TerminationPoint1.class) + .getOperationalState(); + State destTpState = nodes.get(j) + .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang + .ietf.network.topology.rev180226.Node1.class) + .getTerminationPoint().values().stream() + .filter(tp -> tp.getTpId().getValue().contains("CP") || tp.getTpId().getValue().contains("CTP")) + .findFirst().get() + .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210 + .TerminationPoint1.class) + .getOperationalState(); + if (State.InService.equals(srcTpState) && State.InService.equals(destTpState)) { + ocnAzLinkBldr.setAdministrativeState(AdminStates.InService) + .setOperationalState(State.InService); + ocnZaLinkBldr.setAdministrativeState(AdminStates.InService) + .setOperationalState(State.InService); + } else { + ocnAzLinkBldr.setAdministrativeState(AdminStates.OutOfService) + .setOperationalState(State.OutOfService); + ocnZaLinkBldr.setAdministrativeState(AdminStates.OutOfService) + .setOperationalState(State.OutOfService); } + // set opposite link augmentations + LinkBuilder ietfAzLinkBldr = createLink(srcNode, destNode, srcTp, destTp); + LinkBuilder ietfZaLinkBldr = createLink(destNode, srcNode, destTp, srcTp); + ocnAzLinkBldr.setOppositeLink(ietfZaLinkBldr.getLinkId()); + ietfAzLinkBldr.addAugmentation(ocnAzLinkBldr.build()); + ocnZaLinkBldr.setOppositeLink(ietfAzLinkBldr.getLinkId()); + ietfZaLinkBldr.addAugmentation(ocnZaLinkBldr.build()); + links.add(ietfAzLinkBldr.build()); + links.add(ietfZaLinkBldr.build()); } } return links; } - private List createAddDropLinks(String nodeId, int numOfDegrees, int numOfSrgs, int portDirectionEnum) { - LOG.info("creating add-drop links {} {} {} {}", nodeId, numOfDegrees, numOfSrgs, 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 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 = 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 = createLink(destNode, srcNode, destTp, srcTp); - lnk1Bldr.setLinkType(OpenroadmLinkType.ADDLINK); - addDropLinkBldr.addAugmentation(Link1.class, lnk1Bldr.build()); - links.add(addDropLinkBldr.build()); - - } - } - } - // 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 = 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 = createLink(destNode, srcNode, destTp, srcTp); - lnk1Bldr.setLinkType(OpenroadmLinkType.ADDLINK); - addDropLinkBldr.addAugmentation(Link1.class, lnk1Bldr.build()); - links.add(addDropLinkBldr.build()); - } - } + // This method returns the linkBuilder object for given source and destination + public static boolean deleteLink(String srcNode, String dstNode, String srcTp, String destTp, + NetworkTransactionService networkTransactionService) { + LOG.info("deleting link for {}-{}", srcNode, dstNode); + LinkId linkId = LinkIdUtil.buildLinkId(srcNode, srcTp, dstNode, destTp); + if (deleteLinkLinkId(linkId, networkTransactionService)) { + LOG.debug("Link Id {} updated to have admin state down", linkId); + return true; + } else { + LOG.debug("Link Id not found for Source {} and Dest {}", srcNode, dstNode); + return false; } - return links; } - // This method returns the linkBuilder object for given source and destination. - public boolean deleteLink(String srcNode, String dstNode, Integer srcDegId, - Integer destDegId ,String srcTp, String destTp) { - LOG.info("deleting link for {}-{}", srcNode, dstNode); + // This method returns the linkBuilder object for given source and destination + public static boolean deleteLinkLinkId(LinkId linkId , NetworkTransactionService networkTransactionService) { + LOG.info("deleting link for LinkId: {}", linkId.getValue()); try { - LinkId linkId = LinkIdUtil.buildLinkId(srcNode + "-DEG" + srcDegId, - srcTp, dstNode + "-DEG" + destDegId, destTp); - LOG.info("Link is for the link is {}", linkId.getValue()); - InstanceIdentifierBuilder linkIID = InstanceIdentifier - .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))) - .augmentation(Network1.class).child(Link.class, new LinkKey(linkId)); - WriteTransaction wrtx = this.dataBroker.newWriteOnlyTransaction(); - wrtx.delete(LogicalDatastoreType.CONFIGURATION, linkIID.build()); - LOG.info("Deleted"); - wrtx.submit().get(1, TimeUnit.SECONDS); - LOG.info("Submitted"); + 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)); + java.util.Optional link = + networkTransactionService.read(LogicalDatastoreType.CONFIGURATION,linkIID.build()).get(); + if (link.isEmpty()) { + LOG.error("No link found for given LinkId: {}", linkId); + return false; + } + LinkBuilder linkBuilder = new LinkBuilder(link.get()); + networkTransactionService.merge( + LogicalDatastoreType.CONFIGURATION, + linkIID.build(), + linkBuilder + .removeAugmentation(Link1.class) + .addAugmentation( + new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210 + .Link1Builder(linkBuilder + .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210 + .Link1.class)) + .build()) + .build()); + networkTransactionService.commit().get(1, TimeUnit.SECONDS); + return true; + } catch (InterruptedException | ExecutionException | TimeoutException e) { - LOG.error(e.getMessage(), e); + LOG.error("Error deleting link {}", linkId.getValue(), e); return false; } - return true; } - private List create96AvalWaveDegree() { - 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)); - waveList.add(avalBldr.build()); - } - - return waveList; + /** + * Get a builder for instance identifier related to common network termination point. + * @param nodeId String + * @param tpId String + * @return InstanceIdentifierBuilder + */ + public static InstanceIdentifierBuilder createCommonNetworkTerminationPointIIDBuilder(String nodeId, String tpId) { + return InstanceIdentifier.builder(Networks.class) + .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))) + .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226 + .networks.network.Node.class, + new NodeKey(new NodeId(nodeId))) + .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 + .Node1.class) + .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 + .networks.network.node.TerminationPoint.class, + new TerminationPointKey(new TpId(tpId))) + .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210 + .TerminationPoint1.class); } - private List - create96AvalWaveSrg() { - - List - waveList = new ArrayList<>(); - - for (int i = 1; i < 97; i++) { - org.opendaylight.yang.gen.v1.http.org.openroadm.srg.rev170929.srg.node.attributes - .AvailableWavelengthsBuilder avalBldr = - new org.opendaylight.yang.gen.v1.http.org.openroadm.srg.rev170929.srg.node.attributes - .AvailableWavelengthsBuilder(); - avalBldr.setIndex((long) i); - avalBldr.withKey( - new org.opendaylight.yang.gen.v1.http.org.openroadm.srg.rev170929.srg.node.attributes - .AvailableWavelengthsKey((long) i)); - waveList.add(avalBldr.build()); - } - - return waveList; + /** + * Get a builder for instance identifier related to network termination point. + * @param nodeId String + * @param tpId String + * @return InstanceIdentifierBuilder + */ + public static InstanceIdentifierBuilder createNetworkTerminationPointIIDBuilder(String nodeId, + String tpId) { + return InstanceIdentifier.builder(Networks.class) + .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))) + .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226 + .networks.network.Node.class, + new NodeKey(new NodeId(nodeId))) + .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 + .Node1.class) + .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 + .networks.network.node.TerminationPoint.class, + new TerminationPointKey(new TpId(tpId))) + .augmentation(TerminationPoint1.class); } - private class XponderPortNumber { - private int numOfLinePorts; - private int numOfClientPorts; - - XponderPortNumber() { - numOfClientPorts = 0; - numOfLinePorts = 0; - } - - public void setNumOfLinePorts(int numOfLinePorts) { - this.numOfLinePorts = numOfLinePorts; - } - - public void setNumOfClientPorts(int numOfClientPorts) { - this.numOfClientPorts = numOfClientPorts; - } - - public int getNumOfClientPorts() { - return numOfClientPorts; - } + /** + * Get an instance identifier related to network node. + * @param nodeId String + * @return InstanceIdentifier + */ + public static InstanceIdentifier createNetworkNodeIID(String nodeId) { + return InstanceIdentifier.builder(Networks.class) + .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))) + .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226 + .networks.network.Node.class, + new NodeKey(new NodeId(nodeId))) + .augmentation(Node1.class).build(); + } - public int getNumOfLinePorts() { - return numOfLinePorts; - } + /** + * Get an instance identifier related to common network node. + * @param nodeId String + * @return InstanceIdentifier + */ + public static InstanceIdentifier createCommonNetworkNodeIID(String nodeId) { + return InstanceIdentifier.builder(Networks.class) + .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))) + .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226 + .networks.network.Node.class, + new NodeKey(new NodeId(nodeId))) + .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1.class) + .build(); } }