/* * Copyright © 2018 Orange, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.transportpce.pce.gnpy; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.stream.IntStream; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.transportpce.common.NetworkUtils; //import org.opendaylight.yang.gen.v1.gnpy.gnpy.eqpt.config.rev181119.EdfaVariety; //import org.opendaylight.yang.gen.v1.gnpy.gnpy.eqpt.config.rev181119.FiberVariety; import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.Coordinate; import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.Km; import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.edfa.params.Operational; import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.edfa.params.OperationalBuilder; import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.element.type.choice.element.type.Edfa; import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.element.type.choice.element.type.EdfaBuilder; import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.element.type.choice.element.type.FiberRoadmBuilder; import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.element.type.choice.element.type.Transceiver; import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.element.type.choice.element.type.TransceiverBuilder; import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.element.type.choice.element.type.fiberroadm.Params; import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.element.type.choice.element.type.fiberroadm.ParamsBuilder; import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.element.type.choice.element.type.fiberroadm.params.fiberroadm.Fiber; import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.element.type.choice.element.type.fiberroadm.params.fiberroadm.FiberBuilder; import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.element.type.choice.element.type.fiberroadm.params.fiberroadm.Roadm; import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.element.type.choice.element.type.fiberroadm.params.fiberroadm.RoadmBuilder; import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.location.attributes.Location; import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.location.attributes.LocationBuilder; import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.topo.Connections; import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.topo.ConnectionsBuilder; import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.topo.Elements; import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.topo.ElementsBuilder; import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.topo.elements.Metadata; import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.topo.elements.MetadataBuilder; import org.opendaylight.yang.gen.v1.gnpy.path.rev190502.RouteIncludeEro; import org.opendaylight.yang.gen.v1.gnpy.path.rev190502.TeHopType; import org.opendaylight.yang.gen.v1.gnpy.path.rev190502.TeNodeId; import org.opendaylight.yang.gen.v1.gnpy.path.rev190502.TePathDisjointness; import org.opendaylight.yang.gen.v1.gnpy.path.rev190502.TeTpId; import org.opendaylight.yang.gen.v1.gnpy.path.rev190502.common.constraints_config.TeBandwidth; import org.opendaylight.yang.gen.v1.gnpy.path.rev190502.common.constraints_config.TeBandwidthBuilder; import org.opendaylight.yang.gen.v1.gnpy.path.rev190502.explicit.route.hop.Type; import org.opendaylight.yang.gen.v1.gnpy.path.rev190502.explicit.route.hop.type.NumUnnumHopBuilder; import org.opendaylight.yang.gen.v1.gnpy.path.rev190502.explicit.route.hop.type.num.unnum.hop.NumUnnumHop; import org.opendaylight.yang.gen.v1.gnpy.path.rev190502.generic.path.constraints.PathConstraints; import org.opendaylight.yang.gen.v1.gnpy.path.rev190502.generic.path.constraints.PathConstraintsBuilder; import org.opendaylight.yang.gen.v1.gnpy.path.rev190502.gnpy.specific.parameters.EffectiveFreqSlot; import org.opendaylight.yang.gen.v1.gnpy.path.rev190502.gnpy.specific.parameters.EffectiveFreqSlotBuilder; import org.opendaylight.yang.gen.v1.gnpy.path.rev190502.path.route.objects.ExplicitRouteObjects; import org.opendaylight.yang.gen.v1.gnpy.path.rev190502.path.route.objects.ExplicitRouteObjectsBuilder; import org.opendaylight.yang.gen.v1.gnpy.path.rev190502.path.route.objects.explicit.route.objects.RouteObjectIncludeExclude; import org.opendaylight.yang.gen.v1.gnpy.path.rev190502.path.route.objects.explicit.route.objects.RouteObjectIncludeExcludeBuilder; import org.opendaylight.yang.gen.v1.gnpy.path.rev190502.service.PathRequest; import org.opendaylight.yang.gen.v1.gnpy.path.rev190502.service.PathRequestBuilder; import org.opendaylight.yang.gen.v1.gnpy.path.rev190502.synchronization.info.Synchronization; import org.opendaylight.yang.gen.v1.gnpy.path.rev190502.synchronization.info.SynchronizationBuilder; import org.opendaylight.yang.gen.v1.gnpy.path.rev190502.synchronization.info.synchronization.Svec; import org.opendaylight.yang.gen.v1.gnpy.path.rev190502.synchronization.info.synchronization.SvecBuilder; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev171017.PathComputationRequestInput; import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev181130.amplified.link.attributes.AmplifiedLink; import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev181130.amplified.link.attributes.amplified.link.section.element.section.element.Span; import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev181130.amplified.link.attributes.amplified.link.section.element.section.element.ila.Ila; import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev181130.span.attributes.LinkConcatenation; import org.opendaylight.yang.gen.v1.http.org.openroadm.network.rev181130.Node1; 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.networks.network.link.OMSAttributes; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev171017.path.description.AToZDirection; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev171017.path.description.ZToADirection; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev171017.path.description.atoz.direction.AToZ; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev171017.path.description.ztoa.direction.ZToA; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address; 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.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.node.SupportingNode; 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.networks.network.Link; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Class to create the topology corresponding to GNPy requirements. * * @author Ahmed Triki ( ahmed.triki@orange.com ) * */ public class ExtractTopoDataStoreImpl { private static final Logger LOG = LoggerFactory.getLogger(ExtractTopoDataStoreImpl.class); private final DataBroker dataBroker; // private final OpenRoadmTopology openRoadmTopology; // private final OpenRoadmInterfaces openRoadmInterfaces; private List elements = new ArrayList<>(); private List connections = new ArrayList<>(); private List pathRequest = new ArrayList<>(); private List synchronization = new ArrayList<>(); private Map mapDisgNodeRefNode = new HashMap(); private Map mapNodeRefIp = new HashMap(); private Map mapLinkFiber = new HashMap(); private Map mapFiberIp = new HashMap(); private static int convertKmM = 1000; /* * Construct the ExtractTopoDataStoreImpl. */ @SuppressWarnings("unchecked") public ExtractTopoDataStoreImpl(final DataBroker dataBroker, PathComputationRequestInput input, AToZDirection atoz, Long requestId) { this.dataBroker = dataBroker; Map> map = extractTopo(); if (map.containsKey("Elements")) { elements = (List) map.get("Elements"); } else { elements = null; } if (map.containsKey("Elements")) { connections = (List) map.get("Connections"); } else { connections = null; } pathRequest = extractPathRequest(input, atoz, requestId); synchronization = extractSynchronization(requestId); } public ExtractTopoDataStoreImpl(final DataBroker dataBroker, PathComputationRequestInput input, ZToADirection ztoa, Long requestId) { this.dataBroker = dataBroker; Map> map = extractTopo(); if (map.containsKey("Elements")) { elements = (List) map.get("Elements"); } else { elements = null; } if (map.containsKey("Elements")) { connections = (List) map.get("Connections"); } else { connections = null; } pathRequest = extractPathRequest(input, ztoa, requestId); synchronization = extractSynchronization(requestId); } /* * extract the topology: all the elements have ipAddress as uid and maintain * a mapping structure to map between the nodeId and the ipAddress (uid) * */ public Map> extractTopo() { Map> map = new HashMap>(); // Define the elements List topoElements = new ArrayList<>(); // Define the connections List topoConnections = new ArrayList<>(); // Define the instance identifier of the OpenRoadm topology InstanceIdentifier insIdOpenRoadmTopo = InstanceIdentifier .builder(Networks.class) .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).build(); // Define the instance identifier of the OpenRoadm network InstanceIdentifier insIdrOpenRoadmNet = InstanceIdentifier .builder(Networks.class) .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))).build(); ReadOnlyTransaction readOnlyTransaction = this.dataBroker.newReadOnlyTransaction(); // Read the data broker try { // Initialize the reading of the data broker // read the configuration part of the data broker that concerns // the openRoadm topology and get all the nodes java.util.Optional openRoadmTopo = readOnlyTransaction .read(LogicalDatastoreType.CONFIGURATION, insIdOpenRoadmTopo).get().toJavaUtil(); java.util.Optional openRoadmNet = readOnlyTransaction .read(LogicalDatastoreType.CONFIGURATION, insIdrOpenRoadmNet).get().toJavaUtil(); if (openRoadmNet.isPresent()) { List openRoadmNetNodeList = openRoadmNet.get().getNode(); if (openRoadmTopo.isPresent()) { List openRoadmTopoNodeList = openRoadmTopo.get().getNode(); List nodesList = new ArrayList<>(); // Create the list of nodes if (!openRoadmTopoNodeList.isEmpty()) { // Create elements for (Node openRoadmTopoNode : openRoadmTopoNodeList) { // Retrieve the supporting node and the type of the // node in openRoadm network List supportingNodeList = openRoadmTopoNode.getSupportingNode(); for (SupportingNode supportingNode : supportingNodeList) { String nodeRef = supportingNode.getNodeRef().getValue(); IpAddress ipAddress = null; // Retrieve the mapping between the openRoadm // topology and openRoadm network mapDisgNodeRefNode.put(openRoadmTopoNode.getNodeId().getValue(), nodeRef); Node1 openRoadmNetNode1 = null; for (Node openRoadmNetNode : openRoadmNetNodeList) { if (openRoadmNetNode.getNodeId().getValue().equals(nodeRef)) { openRoadmNetNode1 = openRoadmNetNode.augmentation(Node1.class); ipAddress = openRoadmNetNode1.getIp(); mapNodeRefIp.put(nodeRef, ipAddress); break; } } if (openRoadmNetNode1.getNodeType().getName().equals("ROADM")) { if (!nodesList.contains(nodeRef)) { Elements element = addElementsRoadm(2, 0, nodeRef, openRoadmNetNode1.getShelf(), -20, ipAddress.getIpv4Address().getValue().toString()); topoElements.add(element); nodesList.add(nodeRef); } } else if (openRoadmNetNode1.getNodeType().getName().equals("XPONDER")) { if (!nodesList.contains(nodeRef)) { Elements element = addElementsTransceiver(2, 0, nodeRef, openRoadmNetNode1.getShelf(), ipAddress.getIpv4Address().getValue().toString()); topoElements.add(element); nodesList.add(nodeRef); } } else { LOG.warn("the type is not implemented"); } } } } else { LOG.warn("no nodes in the network"); } // Create the list of connections Network1 nw1 = openRoadmTopo.get().augmentation(Network1.class); List linksList = nw1.getLink(); // 1:EXPRESS-LINK ; 2:ADD-LINK ; 3:DROP-LINK ; // 4:ROADM-To-ROADM ; 5:XPONDER-INPUT ; 6:XPONDER-OUTPUT int[] externalLink = {4,5,6}; int idFiber = 0; int nbEDFA = 0; if (!linksList.isEmpty()) { LOG.warn("The link list is not empty"); for (Link link : linksList) { Link1 link1 = link.augmentation(Link1.class); int linkType = link1.getLinkType().getIntValue(); if (IntStream.of(externalLink).anyMatch(x -> x == linkType)) { // Verify if the node is a ROADM String srcId = mapDisgNodeRefNode.get(link.getSource().getSourceNode().getValue()); IpAddress srcIp = mapNodeRefIp.get(srcId); String destId = null; IpAddress destIp = null; // Add the links between amplifiers OMSAttributes omsAttributes = link1.getOMSAttributes(); if (omsAttributes != null) { if (omsAttributes.getAmplifiedLink() != null) { List amplifiedLinkList = omsAttributes.getAmplifiedLink() .getAmplifiedLink(); if (!amplifiedLinkList.isEmpty()) { for (AmplifiedLink amplifiedLink : amplifiedLinkList) { Elements element1 = null; if (amplifiedLink.getSectionElement() .getSectionElement() instanceof Ila) { Ila ila = (Ila) amplifiedLink.getSectionElement() .getSectionElement(); String nodeId = ila.getNodeId().getValue(); IpAddress ipEdfa = new IpAddress( new Ipv4Address("1.1.1." + nbEDFA)); nbEDFA++; mapDisgNodeRefNode.put(nodeId, nodeId); mapNodeRefIp.put(nodeId, ipEdfa); // class std_medium_gain // implements EdfaVariety {} element1 = addElementsEdfa(2, 0, "RLD", "Lannion_CAS", ila.getGain().getValue(), ila.getTilt().getValue(), ila.getOutVoaAtt().getValue(), "std_medium_gain", ipEdfa.getIpv4Address().getValue().toString()); } else if (amplifiedLink.getSectionElement() .getSectionElement() instanceof Span) { // Create the location Span span = (Span) amplifiedLink.getSectionElement() .getSectionElement(); String clfi = span.getSpan().getClfi(); IpAddress ipFiber = new IpAddress( new Ipv4Address("2.2.2." + idFiber)); mapLinkFiber.put(link.getLinkId().getValue(), clfi); mapFiberIp.put(clfi, ipFiber); idFiber++; // class SSMF implements // FiberVariety {} element1 = addElementsFiber(2, 0, "RLD", "Lannion_CAS", ipFiber.getIpv4Address().getValue(), 20, 0, 0.2, 0, 0, "SSMF"); } if (element1 != null) { topoElements.add(element1); destId = element1.getUid(); destIp = null; // Create a new link if (srcId != destId) { Connections connection = createNewConnection(srcId, srcIp, destId, destIp); topoConnections.add(connection); srcId = destId; srcIp = destIp; } } } } } else if (omsAttributes.getSpan() != null) { org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130 .networks.network.link.oms.attributes.@Nullable Span span = omsAttributes.getSpan(); String clfi = span.getClfi(); IpAddress ipFiber = new IpAddress(new Ipv4Address("2.2.2." + idFiber)); mapLinkFiber.put(link.getLinkId().getValue(), clfi); mapFiberIp.put(clfi, ipFiber); idFiber++; double attIn = span.getSpanlossCurrent().getValue().doubleValue(); double lossCoef = 0.2; double connIn = 0; double connOut = 0; String typeVariety = "SSMF"; double length = 0; //convert to kilometer // Compute the length of the link List linkConcatenationList = span.getLinkConcatenation(); for (LinkConcatenation linkConcatenation : linkConcatenationList) { double srlgLength = linkConcatenation.getSRLGLength(); length += srlgLength / convertKmM; //convert to kilometer } Elements element1 = addElementsFiber(2, 0, "RLD", "Lannion_CAS", ipFiber.getIpv4Address().getValue(), length, attIn, lossCoef, connIn, connOut, typeVariety); topoElements.add(element1); // Create a new link destId = element1.getUid(); destIp = null; if (srcId != destId) { Connections connection = createNewConnection(srcId, srcIp, destId, destIp); topoConnections.add(connection); srcId = destId; srcIp = destIp; } } else { // Add a fiber String clfi = "Fiber" + idFiber; IpAddress ipFiber = new IpAddress(new Ipv4Address("2.2.2." + idFiber)); mapLinkFiber.put(link.getLinkId().getValue(), clfi); mapFiberIp.put(clfi, ipFiber); idFiber++; // Create a new element // class SSMF implements FiberVariety {} Elements element1 = addElementsFiber(2, 0, "RLD", "Lannion_CAS", ipFiber.getIpv4Address().getValue(), 20, 0, 0.2, 0, 0, "SSMF"); topoElements.add(element1); // Create a new link destId = element1.getUid(); destIp = null; if (srcId != destId) { Connections connection = createNewConnection(srcId, srcIp, destId, destIp); topoConnections.add(connection); srcId = destId; srcIp = destIp; } } } else { LOG.warn("The oms attributes is null!"); } // Create a new link destId = mapDisgNodeRefNode.get(link.getDestination().getDestNode().getValue()); destIp = mapNodeRefIp.get(destId); Connections connection = createNewConnection(srcId, srcIp, destId, destIp); topoConnections.add(connection); } } } else { LOG.warn("no links in the network"); } } else { LOG.warn("No nodes in the selected network ..."); } } } catch (InterruptedException | ExecutionException e) { LOG.error("Error reading the topology", e); readOnlyTransaction.close(); } readOnlyTransaction.close(); map.put("Elements", topoElements); map.put("Connections", topoConnections); return map; } /* * Create the pathRequest */ public List extractPathRequest(PathComputationRequestInput input, AToZDirection atoz, Long requestId) { // List of A to Z List listAtoZ = atoz.getAToZ(); int atozSize = listAtoZ.size(); // String modulationFormat = atoz.getModulationFormat(); // Create the path request List pathRequestList = new ArrayList<>(); // Define the instance identifier // InstanceIdentifier nwInstanceIdentifier = InstanceIdentifier // .builder(Network.class, new NetworkKey(new // NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).build(); // read the configuration part of the data broker that concerns the // nodes ID and get all the nodes // java.util.Optional networkObject = readOnlyTransaction // .read(LogicalDatastoreType.CONFIGURATION, // nwInstanceIdentifier).get().toJavaUtil(); // 1.1 Create explicitRouteObjects // 1.1.1. create RouteObjectIncludeExclude list List routeObjectIncludeExcludes = new ArrayList<>(); IpAddress ipAddressCurrent = null; Long index = (long) 0; //ReadOnlyTransaction readOnlyTransaction = this.dataBroker.newReadOnlyTransaction(); for (int i = 0; i < atozSize; i++) { // String idAtoZ = listAtoZ.get(i).getId(); String nodeId = null; if (listAtoZ.get(i).getResource() .getResource() instanceof org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface .pathdescription.rev171017.pce.resource.resource.resource.Node) { org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev171017.pce .resource.resource.resource.Node node = (org.opendaylight.yang.gen.v1.http.org.transportpce.b.c ._interface.pathdescription.rev171017.pce.resource.resource.resource.Node) listAtoZ .get(i).getResource().getResource(); nodeId = node.getNodeId(); if (nodeId != null) { String nodeRef = mapDisgNodeRefNode.get(nodeId); IpAddress ipAddress = mapNodeRefIp.get(nodeRef); for (Elements element : elements) { if (element.getUid().contains(ipAddress.getIpv4Address().getValue().toString())) { String type = element.getType().getName(); if ((ipAddressCurrent == null) || (ipAddressCurrent != ipAddress)) { ipAddressCurrent = ipAddress; // Fill in routeObjectIncludeExcludes RouteObjectIncludeExclude routeObjectIncludeExclude1 = addRouteObjectIncludeExclude( ipAddress, 1, index); routeObjectIncludeExcludes.add(routeObjectIncludeExclude1); index++; } break; } } } else { LOG.warn("node ID is null"); } } else if (listAtoZ.get(i).getResource() .getResource() instanceof org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface .pathdescription.rev171017.pce.resource.resource.resource.TerminationPoint) { org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev171017.pce .resource.resource.resource.TerminationPoint tp = (org.opendaylight.yang.gen.v1.http.org .transportpce.b.c._interface.pathdescription.rev171017.pce.resource.resource.resource .TerminationPoint) listAtoZ.get(i).getResource().getResource(); // Not used in this version } else if (listAtoZ.get(i).getResource() .getResource() instanceof org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface .pathdescription.rev171017.pce.resource.resource.resource.Link) { org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev171017.pce .resource.resource.resource.Link link = (org.opendaylight.yang.gen.v1.http.org.transportpce .b.c._interface.pathdescription.rev171017.pce.resource.resource.resource.Link) listAtoZ .get(i).getResource().getResource(); String clfi = mapLinkFiber.get(link.getLinkId()); IpAddress fiberIp = mapFiberIp.get(clfi); if (clfi != null) { RouteObjectIncludeExclude routeObjectIncludeExclude1 = addRouteObjectIncludeExclude(fiberIp, 1, index); routeObjectIncludeExcludes.add(routeObjectIncludeExclude1); index++; } } } // Create ExplicitRouteObjects ExplicitRouteObjects explicitRouteObjects = new ExplicitRouteObjectsBuilder() .setRouteObjectIncludeExclude(routeObjectIncludeExcludes).build(); // 1. Create the path request element 1 // Find parameters // String serviceName = input.getServiceName(); String sourceNode = input.getServiceAEnd().getNodeId(); String destNode = input.getServiceZEnd().getNodeId(); // 1.2 Create a path constraints Long rate = atoz.getRate(); // Long wavelengthNumber = atoz.getAToZWavelengthNumber(); // Create EffectiveFreqSlot List effectiveFreqSlot = new ArrayList<>(); EffectiveFreqSlot effectiveFreqSlot1 = new EffectiveFreqSlotBuilder().setM(5).setN(8).build(); effectiveFreqSlot.add(effectiveFreqSlot1); // Create Te-Bandwidth TeBandwidth teBandwidth = new TeBandwidthBuilder().setPathBandwidth(new BigDecimal(rate)) .setTechnology("flexi-grid").setTrxType("openroadm-beta1").setTrxMode("W100G") .setEffectiveFreqSlot(effectiveFreqSlot).setSpacing(new BigDecimal(50000000000.0)).build(); // .setMaxNbOfChannel(new Long(80)).setOutputPower(new // BigDecimal(0.0012589254117941673)) PathConstraints pathConstraints = new PathConstraintsBuilder().setTeBandwidth(teBandwidth).build(); // PathRequest pathRequest1 = new // PathRequestBuilder().setRequestId(new // Long(0)).setSource(mapNodeRefIp.get(sourceNode)) // .setDestination(mapNodeRefIp.get(destNode)).setSrcTpId(input.getServiceAEnd().getTxDirection() // .getPort().getPortName().getBytes()) // .setDstTpId(input.getServiceAEnd().getRxDirection().getPort().getPortName().getBytes()) // .setPathConstraints(pathConstraints) // .setExplicitRouteObjects(explicitRouteObjects).build(); PathRequest pathRequest1 = new PathRequestBuilder().setRequestId(requestId) .setSource(mapNodeRefIp.get(sourceNode)).setDestination(mapNodeRefIp.get(destNode)) .setSrcTpId("srcTpId".getBytes()).setDstTpId("dstTpId".getBytes()).setPathConstraints(pathConstraints) .setExplicitRouteObjects(explicitRouteObjects).build(); pathRequestList.add(pathRequest1); //readOnlyTransaction.close(); return pathRequestList; } public List extractPathRequest(PathComputationRequestInput input, ZToADirection ztoa, Long requestId) { // List of A to Z List listZToA = ztoa.getZToA(); int ztoaSize = listZToA.size(); // String modulationFormat = ztoa.getModulationFormat(); // Create the path request List servicePathRequest = new ArrayList<>(); // Define the instance identifier InstanceIdentifier nwInstanceIdentifier = InstanceIdentifier .builder(Networks.class) .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).build(); //ReadOnlyTransaction readOnlyTransaction = this.dataBroker.newReadOnlyTransaction(); // read the configuration part of the data broker that concerns the // nodes ID and get all the nodes // java.util.Optional networkObject = readOnlyTransaction // .read(LogicalDatastoreType.CONFIGURATION, // nwInstanceIdentifier).get().toJavaUtil(); // 1.1 Create explicitRouteObjects // 1.1.1. create RouteObjectIncludeExclude list List routeObjectIncludeExcludes = new ArrayList<>(); IpAddress ipAddressCurrent = null; Long index = (long) 0; for (int i = 0; i < ztoaSize; i++) { // String idZtoA = listZToA.get(i).getId(); String nodeId = null; if (listZToA.get(i).getResource() .getResource() instanceof org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface .pathdescription.rev171017.pce.resource.resource.resource.Node) { org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev171017.pce .resource.resource.resource.Node node = (org.opendaylight.yang.gen.v1.http.org.transportpce.b.c ._interface.pathdescription.rev171017.pce.resource.resource.resource.Node) listZToA.get(i) .getResource().getResource(); nodeId = node.getNodeId(); if (nodeId != null) { String nodeRef = mapDisgNodeRefNode.get(nodeId); IpAddress ipAddress = mapNodeRefIp.get(nodeRef); for (Elements element : elements) { if (element.getUid().contains(ipAddress.getIpv4Address().getValue().toString())) { // String type = element.getType().getName(); if ((ipAddressCurrent == null) || (ipAddressCurrent != ipAddress)) { ipAddressCurrent = ipAddress; // Fill in routeObjectIncludeExcludes RouteObjectIncludeExclude routeObjectIncludeExclude1 = addRouteObjectIncludeExclude( ipAddress, 1, index); routeObjectIncludeExcludes.add(routeObjectIncludeExclude1); index++; } break; } } } else { LOG.warn("node ID is null"); } } else if (listZToA.get(i).getResource() .getResource() instanceof org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface .pathdescription.rev171017.pce.resource.resource.resource.TerminationPoint) { org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev171017.pce .resource.resource.resource.TerminationPoint tp = (org.opendaylight.yang.gen.v1.http.org .transportpce.b.c._interface.pathdescription.rev171017.pce.resource.resource.resource .TerminationPoint) listZToA.get(i).getResource().getResource(); // Not used in this version } else if (listZToA.get(i).getResource() .getResource() instanceof org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface .pathdescription.rev171017.pce.resource.resource.resource.Link) { org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev171017.pce .resource.resource.resource.Link link = (org.opendaylight.yang.gen.v1.http.org.transportpce .b.c._interface.pathdescription.rev171017.pce.resource.resource.resource.Link) listZToA.get(i) .getResource().getResource(); String clfi = mapLinkFiber.get(link.getLinkId()); IpAddress fiberIp = mapFiberIp.get(clfi); if (clfi != null) { RouteObjectIncludeExclude routeObjectIncludeExclude1 = addRouteObjectIncludeExclude(fiberIp, 1, index); routeObjectIncludeExcludes.add(routeObjectIncludeExclude1); index++; } } } // Create ExplicitRouteObjects ExplicitRouteObjects explicitRouteObjects = new ExplicitRouteObjectsBuilder() .setRouteObjectIncludeExclude(routeObjectIncludeExcludes).build(); // 1. Create the path request element 1 // Find parameters // String serviceName = input.getServiceName(); String sourceNode = input.getServiceZEnd().getNodeId(); String destNode = input.getServiceAEnd().getNodeId(); // 1.2 Create a path constraints Long rate = ztoa.getRate(); // Long wavelengthNumber = ztoa.getZToAWavelengthNumber(); // Create EffectiveFreqSlot List effectiveFreqSlot = new ArrayList<>(); EffectiveFreqSlot effectiveFreqSlot1 = new EffectiveFreqSlotBuilder().setM(5).setN(8).build(); effectiveFreqSlot.add(effectiveFreqSlot1); // Create Te-Bandwidth TeBandwidth teBandwidth = new TeBandwidthBuilder().setPathBandwidth(new BigDecimal(rate)) .setTechnology("flexi-grid").setTrxType("openroadm-beta1").setTrxMode("W100G") .setEffectiveFreqSlot(effectiveFreqSlot).setSpacing(new BigDecimal(50000000000.0)).build(); // .setMaxNbOfChannel(new Long(80)).setOutputPower(new // BigDecimal(0.0012589254117941673)) PathConstraints pathConstraints = new PathConstraintsBuilder().setTeBandwidth(teBandwidth).build(); // PathRequest pathRequest1 = new // PathRequestBuilder().setRequestId(new // Long(0)).setSource(mapNodeRefIp.get(sourceNode)) // .setDestination(mapNodeRefIp.get(destNode)).setSrcTpId(input.getServiceAEnd().getTxDirection() // .getPort().getPortName().getBytes()) // .setDstTpId(input.getServiceAEnd().getRxDirection().getPort().getPortName().getBytes()) // .setPathConstraints(pathConstraints) // .setExplicitRouteObjects(explicitRouteObjects).build(); PathRequest pathRequest1 = new PathRequestBuilder().setRequestId(requestId) .setSource(mapNodeRefIp.get(sourceNode)).setDestination(mapNodeRefIp.get(destNode)) .setSrcTpId("srcTpId".getBytes()).setDstTpId("dstTpId".getBytes()).setPathConstraints(pathConstraints) .setExplicitRouteObjects(explicitRouteObjects).build(); servicePathRequest.add(pathRequest1); //readOnlyTransaction.close(); return servicePathRequest; } /* * Create the synchronization */ public List extractSynchronization(Long requestId) { // Create RequestIdNumber List requestIdNumber = new ArrayList<>(); requestIdNumber.add(0, new Long(0)); // Create a synchronization Svec svec = new SvecBuilder().setRelaxable(true).setDisjointness(new TePathDisjointness(true, true, false)) .setRequestIdNumber(requestIdNumber).build(); List synchro = new ArrayList<>(); Synchronization synchronization1 = new SynchronizationBuilder().setSynchronizationId(new Long(0)).setSvec(svec) .build(); synchro.add(synchronization1); return (synchro); } /* * Method to add Fiber */ private Elements addElementsFiber(double latitude, double longitude, String region, String city, String clfi, double length, double attIn, double lossCoef, double connIn, double connOut, String typeVariety) { // Create an amplifier after the roadm Coordinate c1 = new Coordinate(new BigDecimal(latitude)); Coordinate c2 = new Coordinate(new BigDecimal(longitude)); Location location1 = new LocationBuilder().setRegion(region).setCity(city).setLatitude(c1).setLongitude(c2) .build(); Metadata metadata1 = new MetadataBuilder().setLocation(location1).build(); Fiber fiber = new FiberBuilder().setLength(new BigDecimal(length)).setLengthUnits(Km.class) .setAttIn(new BigDecimal(attIn)).setLossCoef(new BigDecimal(lossCoef)).setConIn(new BigDecimal(connIn)) .setConOut(new BigDecimal(connOut)).build(); Params params1 = new ParamsBuilder().setFiberroadm(fiber).build(); // TypeElement Fiber = ; //new TypeElement(Fiber); Elements element1 = new ElementsBuilder().setUid(clfi) .setType(org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.Fiber.class) .setTypeVariety(typeVariety).setMetadata(metadata1) .setElementType(new FiberRoadmBuilder().setParams(params1).build()).build(); return element1; } /* * Method to add Edfa */ private Elements addElementsEdfa(double latitude, double longitude, String region, String city, BigDecimal gainTarget, BigDecimal tiltTarget, BigDecimal outVoa, String typeVariety, String uidEdfa) { // Create an amplifier after the roadm Coordinate c1 = new Coordinate(new BigDecimal(latitude)); Coordinate c2 = new Coordinate(new BigDecimal(longitude)); Location location1 = new LocationBuilder().setRegion(region).setCity(city).setLatitude(c1).setLongitude(c2) .build(); Metadata metadata1 = new MetadataBuilder().setLocation(location1).build(); Operational operational = new OperationalBuilder().setGainTarget(gainTarget).setTiltTarget(tiltTarget) .setOutVoa(outVoa).build(); Edfa edfa = new EdfaBuilder() // .setTypeVariety(typeVariety) .setOperational(operational).build(); Elements element1 = new ElementsBuilder().setUid(uidEdfa) // Choose an // ip // address .setType(org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.Edfa.class) .setMetadata(metadata1).setElementType(edfa).setTypeVariety(typeVariety).build(); return element1; } /* * Method to add ROADM */ private Elements addElementsRoadm(double latitude, double longitude, String region, String city, double targetPchOutDb, String uidRoadm) { Coordinate c1 = new Coordinate(new BigDecimal(latitude)); Coordinate c2 = new Coordinate(new BigDecimal(longitude)); Location location1 = new LocationBuilder().setRegion(region).setCity(city).setLatitude(c1).setLongitude(c2) .build(); Metadata metadata1 = new MetadataBuilder().setLocation(location1).build(); // Create the roadm Roadm roadm = new RoadmBuilder().setTargetPchOutDb(new BigDecimal(targetPchOutDb)).build(); Params params1 = new ParamsBuilder().setFiberroadm(roadm).build(); Elements element1 = new ElementsBuilder().setUid(uidRoadm) .setType(org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.Roadm.class) .setMetadata(metadata1).setElementType(new FiberRoadmBuilder().setParams(params1).build()).build(); return element1; } /* * Method to add Transceiver */ private Elements addElementsTransceiver(double latitude, double longitude, String region, String city, String uidTrans) { Coordinate c1 = new Coordinate(new BigDecimal(latitude)); Coordinate c2 = new Coordinate(new BigDecimal(longitude)); Location location1 = new LocationBuilder().setRegion(region).setCity(city).setLatitude(c1).setLongitude(c2) .build(); Metadata metadata1 = new MetadataBuilder().setLocation(location1).build(); Transceiver transceiver = new TransceiverBuilder().build(); Elements element1 = new ElementsBuilder().setUid(uidTrans) .setType(org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.Transceiver.class) .setMetadata(metadata1).setElementType(transceiver).build(); return element1; } /* * Add routeObjectIncludeExclude */ private RouteObjectIncludeExclude addRouteObjectIncludeExclude(IpAddress ipAddress, long teTpValue, long index) { TeNodeId teNodeId = new TeNodeId(ipAddress); TeTpId teTpId = new TeTpId(teTpValue); NumUnnumHop numUnnumHop = new org.opendaylight.yang.gen.v1.gnpy.path.rev190502.explicit.route.hop.type.num .unnum.hop.NumUnnumHopBuilder() .setNodeId(teNodeId.getIpv4Address().getValue().toString()).setLinkTpId(teTpId.getUint32().toString()) .setHopType(TeHopType.STRICT).build(); Type type1 = new NumUnnumHopBuilder().setNumUnnumHop(numUnnumHop).build(); // Create routeObjectIncludeExclude element 1 RouteObjectIncludeExclude routeObjectIncludeExclude1 = new RouteObjectIncludeExcludeBuilder().setIndex(index) .setExplicitRouteUsage(RouteIncludeEro.class).setType(type1).build(); return routeObjectIncludeExclude1; } private String fromToNodeForConnection(String id, IpAddress ip) { String fromToNode = id; if (ip != null) { fromToNode = ip.getIpv4Address().getValue().toString(); } return (fromToNode); } private Connections createNewConnection(String srcId, IpAddress srcIp, String destId, IpAddress destIp) { String fromNode = srcId; String toNode = destId; if (srcIp != null) { fromNode = srcIp.getIpv4Address().getValue().toString(); } if (destIp != null) { toNode = destIp.getIpv4Address().getValue().toString(); } Connections connection1 = new ConnectionsBuilder().setFromNode(fromNode).setToNode(toNode).build(); return (connection1); } public List getElements() { return elements; } public void setElements(List elements) { this.elements = elements; } public List getConnections() { return connections; } public void setConnections(List connections) { this.connections = connections; } public List getPathRequest() { return pathRequest; } public void setPathRequest(List pathRequest) { this.pathRequest = pathRequest; } public List getSynchronization() { return synchronization; } public void setSynchronization(List synchronization) { this.synchronization = synchronization; } public List createEmptyPathRequest(PathComputationRequestInput input, AToZDirection atoz) { // List of A to Z // List listAtoZ = atoz.getAToZ(); // int atozSize = listAtoZ.size(); // Create the path request List pathRequestList = new ArrayList<>(); // 1. Create the path request element 1 // Find parameters // String serviceName = input.getServiceName(); String sourceNode = input.getServiceAEnd().getNodeId(); String destNode = input.getServiceZEnd().getNodeId(); // 1.2 Create a path constraints Long rate = atoz.getRate(); // Create EffectiveFreqSlot List effectiveFreqSlot = new ArrayList<>(); EffectiveFreqSlot effectiveFreqSlot1 = new EffectiveFreqSlotBuilder().setM(5).setN(8).build(); effectiveFreqSlot.add(effectiveFreqSlot1); // Create Te-Bandwidth TeBandwidth teBandwidth = new TeBandwidthBuilder().setPathBandwidth(new BigDecimal(rate)) .setTechnology("flexi-grid").setTrxType("openroadm-beta1").setTrxMode("W100G") .setEffectiveFreqSlot(effectiveFreqSlot).setSpacing(new BigDecimal(50000000000.0)).build(); PathConstraints pathConstraints = new PathConstraintsBuilder().setTeBandwidth(teBandwidth).build(); PathRequest pathRequest1 = new PathRequestBuilder().setRequestId(new Long(0)) .setSource(mapNodeRefIp.get(sourceNode)).setDestination(mapNodeRefIp.get(destNode)) .setSrcTpId("srcTpId".getBytes()).setDstTpId("dstTpId".getBytes()).setPathConstraints(pathConstraints) .build(); pathRequestList.add(pathRequest1); return pathRequestList; } }