X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=pce%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Ftransportpce%2Fpce%2Fgnpy%2FGnpyServiceImpl.java;h=26c1b4c6b50b01f7524518bd02adc0e4f0d710fa;hb=6b6a445c84c2eb1c85d4e48c2d10a89c3d598bc5;hp=34bbccb2d7ed0b20553f83f0cc64965e1915e3a7;hpb=aef92d27322ac084e5adadf6d1d187e0b6118187;p=transportpce.git diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/GnpyServiceImpl.java b/pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/GnpyServiceImpl.java index 34bbccb2d..26c1b4c6b 100644 --- a/pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/GnpyServiceImpl.java +++ b/pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/GnpyServiceImpl.java @@ -8,51 +8,65 @@ package org.opendaylight.transportpce.pce.gnpy; +import com.google.common.collect.HashBasedTable; +import com.google.common.collect.Table; import java.math.BigDecimal; import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; - +import java.util.Optional; +import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; +import org.opendaylight.transportpce.common.ServiceRateConstant; +import org.opendaylight.transportpce.common.fixedflex.GridConstant; +import org.opendaylight.transportpce.common.fixedflex.GridUtils; import org.opendaylight.transportpce.pce.constraints.PceConstraints; import org.opendaylight.transportpce.pce.constraints.PceConstraints.ResourcePair; -import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.topo.Elements; -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.rev190624.PathComputationRequestInput; -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.http.org.transportpce.b.c._interface.pathdescription.rev171017.pce.resource.resource.Resource; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress; +import org.opendaylight.transportpce.pce.gnpy.utils.AToZComparator; +import org.opendaylight.transportpce.pce.gnpy.utils.ZToAComparator; +import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.topo.Elements; +import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.topo.ElementsKey; +import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.RouteIncludeEro; +import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.TeHopType; +import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.TePathDisjointness; +import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.common.constraints_config.TeBandwidth; +import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.common.constraints_config.TeBandwidthBuilder; +import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.explicit.route.hop.Type; +import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.explicit.route.hop.type.NumUnnumHopBuilder; +import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.explicit.route.hop.type.num.unnum.hop.NumUnnumHop; +import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.generic.path.constraints.PathConstraints; +import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.generic.path.constraints.PathConstraintsBuilder; +import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.gnpy.specific.parameters.EffectiveFreqSlot; +import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.gnpy.specific.parameters.EffectiveFreqSlotBuilder; +import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.path.route.objects.ExplicitRouteObjects; +import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.path.route.objects.ExplicitRouteObjectsBuilder; +import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.path.route.objects.explicit.route.objects.RouteObjectIncludeExclude; +import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.path.route.objects.explicit.route.objects.RouteObjectIncludeExcludeBuilder; +import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.path.route.objects.explicit.route.objects.RouteObjectIncludeExcludeKey; +import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.service.PathRequest; +import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.service.PathRequestBuilder; +import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.service.PathRequestKey; +import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.synchronization.info.Synchronization; +import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.synchronization.info.SynchronizationBuilder; +import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.synchronization.info.synchronization.Svec; +import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.synchronization.info.synchronization.SvecBuilder; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestInput; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev211210.FrequencyTHz; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.ModulationFormat; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirection; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirection; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZ; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToA; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.Resource; +import org.opendaylight.yangtools.yang.common.Uint32; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + /** * Class to create the service corresponding to GNPy requirements. * @@ -62,62 +76,59 @@ import org.slf4j.LoggerFactory; public class GnpyServiceImpl { private static final Logger LOG = LoggerFactory.getLogger(GnpyServiceImpl.class); - private static final double FIX_CH = 0.05; //Fix-grid channel width (THz) - private static final int NB_SLOT_BW = 4; //Number of slot in 50GHz channel (THz) - private static final double SLOT_BW = 0.00625; //Nominal central frequency granularity (THz) - private static final double MAX_CENTRAL_FREQ = 196.1; //Minimum channel center frequency (openRoadm spec) (THz) - private static final double FLEX_CENTRAL_FREQ = 193.1; //Flex-grid reference channel frequency (THz) - private static final double CONVERT_TH_HZ = 1e12; //Convert THz to Hz - - private List pathRequest = new ArrayList<>(); + + private Map pathRequest = new HashMap<>(); 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 Map mapDisgNodeRefNode = new HashMap<>(); + private Map> mapLinkFiber = new HashMap<>(); private List trxList = new ArrayList<>(); - private List elements = new ArrayList<>(); - private List routeObjectIncludeExcludes = new ArrayList<>(); - private Long index = (long) 0; //index of the element in the path - private IpAddress currentNodeIpAddress = null; + private Map elements = new HashMap<>(); + private Map routeObjectIncludeExcludes = new HashMap<>(); + private String currentNodeId = null; + private AToZComparator atoZComparator = new AToZComparator(); + private ZToAComparator ztoAComparator = new ZToAComparator(); + private static final Table TRX_MODE_TABLE = initTrxModeTable(); + + private static Table initTrxModeTable() { + Table trxModeTable = HashBasedTable.create(); + trxModeTable.put(ServiceRateConstant.RATE_100, GridConstant.SLOT_WIDTH_50, "100 Gbit/s, 27.95 Gbaud, DP-QPSK"); + trxModeTable.put(ServiceRateConstant.RATE_200, GridConstant.SLOT_WIDTH_50, "200 Gbit/s, 31.57 Gbaud, DP-16QAM"); + trxModeTable.put(ServiceRateConstant.RATE_200, GridConstant.SLOT_WIDTH_87_5, "200 Gbit/s, DP-QPSK"); + trxModeTable.put(ServiceRateConstant.RATE_300, GridConstant.SLOT_WIDTH_87_5, "300 Gbit/s, DP-8QAM"); + trxModeTable.put(ServiceRateConstant.RATE_400, GridConstant.SLOT_WIDTH_87_5, "400 Gbit/s, DP-16QAM"); + return trxModeTable; + } + + public static final Map RATE_OUTPUTPOWER = Map.of( + ServiceRateConstant.RATE_100, GridConstant.OUTPUT_POWER_100GB_W, + ServiceRateConstant.RATE_400, GridConstant.OUTPUT_POWER_400GB_W); /* * Construct the GnpyServiceImpl */ - public GnpyServiceImpl(PathComputationRequestInput input, AToZDirection atoz, Long requestId, GnpyTopoImpl gnpyTopo, - PceConstraints pceHardConstraints) throws GnpyException { + public GnpyServiceImpl(PathComputationRequestInput input, AToZDirection atoz, Uint32 requestId, + GnpyTopoImpl gnpyTopo, PceConstraints pceHardConstraints) throws GnpyException { this.elements = gnpyTopo.getElements(); this.mapDisgNodeRefNode = gnpyTopo.getMapDisgNodeRefNode(); - this.mapNodeRefIp = gnpyTopo.getMapNodeRefIp(); this.mapLinkFiber = gnpyTopo.getMapLinkFiber(); - this.mapFiberIp = gnpyTopo.getMapFiberIp(); this.trxList = gnpyTopo.getTrxList(); - try { - this.pathRequest = extractPathRequest(input, atoz, requestId, pceHardConstraints); - this.synchronization = extractSynchronization(requestId); - } catch (NullPointerException e) { - throw new GnpyException("In GnpyServiceImpl: one of the elements is null",e); - } + this.pathRequest = extractPathRequest(input, atoz, requestId.toJava(), pceHardConstraints); + this.synchronization = extractSynchronization(requestId); } - public GnpyServiceImpl(PathComputationRequestInput input, ZToADirection ztoa, Long requestId, GnpyTopoImpl gnpyTopo, - PceConstraints pceHardConstraints) throws GnpyException { + public GnpyServiceImpl(PathComputationRequestInput input, ZToADirection ztoa, Uint32 requestId, + GnpyTopoImpl gnpyTopo, PceConstraints pceHardConstraints) throws GnpyException { this.elements = gnpyTopo.getElements(); this.mapDisgNodeRefNode = gnpyTopo.getMapDisgNodeRefNode(); - this.mapNodeRefIp = gnpyTopo.getMapNodeRefIp(); this.mapLinkFiber = gnpyTopo.getMapLinkFiber(); - this.mapFiberIp = gnpyTopo.getMapFiberIp(); this.trxList = gnpyTopo.getTrxList(); - try { - pathRequest = extractPathRequest(input, ztoa, requestId, pceHardConstraints); - synchronization = extractSynchronization(requestId); - } catch (NullPointerException e) { - throw new GnpyException("In GnpyServiceImpl: one of the elements of service is null",e); - } + pathRequest = extractPathRequest(input, ztoa, requestId.toJava(), pceHardConstraints); + synchronization = extractSynchronization(requestId); } - private List extractPathRequest(PathComputationRequestInput input, AToZDirection atoz, Long requestId, - PceConstraints pceHardConstraints) throws GnpyException { + private Map extractPathRequest( + PathComputationRequestInput input, AToZDirection atoz, Long requestId, + PceConstraints pceHardConstraints) throws GnpyException { // Create the source and destination nodes String sourceNode = input.getServiceAEnd().getNodeId(); @@ -127,30 +138,39 @@ public class GnpyServiceImpl { } // Create explicitRouteObjects - List listAtoZ = atoz.getAToZ(); - if (listAtoZ != null) { - extractRouteObjectIcludeAtoZ(listAtoZ); - } else { + List listAtoZ = new ArrayList<>(atoz.nonnullAToZ().values()); + if (listAtoZ.isEmpty()) { extractHardConstraints(pceHardConstraints); + } else { + Collections.sort(listAtoZ, atoZComparator); + extractRouteObjectIcludeAtoZ(listAtoZ); } + ExplicitRouteObjects explicitRouteObjects = new ExplicitRouteObjectsBuilder() .setRouteObjectIncludeExclude(routeObjectIncludeExcludes).build(); //Create Path Constraint - PathConstraints pathConstraints = createPathConstraints(atoz.getRate(),atoz.getAToZWavelengthNumber()); + PathConstraints pathConstraints = createPathConstraints(atoz.getRate().toJava(), + atoz.getModulationFormat(), + atoz.getAToZMinFrequency(), + atoz.getAToZMaxFrequency()); // Create the path request - List pathRequestList = new ArrayList<>(); - PathRequest pathRequestEl = new PathRequestBuilder().setRequestId(requestId) - .setSource(this.mapNodeRefIp.get(sourceNode)).setDestination(this.mapNodeRefIp.get(destNode)) - .setSrcTpId("srcTpId".getBytes()).setDstTpId("dstTpId".getBytes()).setPathConstraints(pathConstraints) + Map pathRequestMap = new HashMap<>(); + PathRequest pathRequestEl = new PathRequestBuilder().setRequestId(requestId.toString()) + .setSource(sourceNode) + .setDestination(destNode) + .setSrcTpId(sourceNode) + .setDstTpId(destNode) + .setBidirectional(false).setPathConstraints(pathConstraints).setPathConstraints(pathConstraints) .setExplicitRouteObjects(explicitRouteObjects).build(); - pathRequestList.add(pathRequestEl); + pathRequestMap.put(pathRequestEl.key(),pathRequestEl); LOG.debug("In GnpyServiceImpl: path request AToZ is extracted"); - return pathRequestList; + return pathRequestMap; } - private List extractPathRequest(PathComputationRequestInput input, ZToADirection ztoa, Long requestId, - PceConstraints pceHardConstraints) throws GnpyException { + private Map extractPathRequest( + PathComputationRequestInput input, ZToADirection ztoa, Long requestId, + PceConstraints pceHardConstraints) throws GnpyException { // Create the source and destination nodes String sourceNode = input.getServiceZEnd().getNodeId(); String destNode = input.getServiceAEnd().getNodeId(); @@ -158,85 +178,95 @@ public class GnpyServiceImpl { throw new GnpyException("In GnpyServiceImpl: source and destination should be transmitter nodes"); } // Create explicitRouteObjects - List listZtoA = ztoa.getZToA(); - if (listZtoA != null) { - extractRouteObjectIcludeZtoA(listZtoA); - } else { + @NonNull List listZtoA = new ArrayList<>(ztoa.nonnullZToA().values()); + if (listZtoA.isEmpty()) { extractHardConstraints(pceHardConstraints); + } else { + Collections.sort(listZtoA, ztoAComparator); + extractRouteObjectIcludeZtoA(listZtoA); } + ExplicitRouteObjects explicitRouteObjects = new ExplicitRouteObjectsBuilder() .setRouteObjectIncludeExclude(routeObjectIncludeExcludes).build(); //Create Path Constraint - //to be deleted - //Long wavelengthNumber = (ztoa.getZToAWavelengthNumber() != null) ? ztoa.getZToAWavelengthNumber() : null; - PathConstraints pathConstraints = createPathConstraints(ztoa.getRate(),ztoa.getZToAWavelengthNumber()); - // Create the path request - List pathRequestList = new ArrayList<>(); - PathRequest pathRequestEl = new PathRequestBuilder().setRequestId(requestId) - .setSource(this.mapNodeRefIp.get(sourceNode)).setDestination(this.mapNodeRefIp.get(destNode)) - .setSrcTpId("srcTpId".getBytes()).setDstTpId("dstTpId".getBytes()).setPathConstraints(pathConstraints) + PathConstraints pathConstraints = createPathConstraints(ztoa.getRate().toJava(), + ztoa.getModulationFormat(), + ztoa.getZToAMinFrequency(), + ztoa.getZToAMaxFrequency()); + + //Create the path request + Map pathRequestMap = new HashMap<>(); + PathRequest pathRequestEl = new PathRequestBuilder().setRequestId(requestId.toString()) + .setSource(sourceNode) + .setDestination(destNode) + .setSrcTpId(sourceNode) + .setDstTpId(destNode) + .setBidirectional(false).setPathConstraints(pathConstraints) .setExplicitRouteObjects(explicitRouteObjects).build(); - pathRequestList.add(pathRequestEl); - LOG.debug("In GnpyServiceImpl: path request ZToA is extracted"); - return pathRequestList; + pathRequestMap.put(pathRequestEl.key(),pathRequestEl); + LOG.debug("In GnpyServiceImpl: path request ZToA is extracted is extracted"); + return pathRequestMap; } //Extract RouteObjectIncludeExclude list in the case of pre-computed path A-to-Z - private void extractRouteObjectIcludeAtoZ(List listAtoZ) throws GnpyException { - for (int i = 0; i < listAtoZ.size(); i++) { - createResource(listAtoZ.get(i).getResource().getResource()); + private void extractRouteObjectIcludeAtoZ(Collection listAtoZ) throws GnpyException { + Long index = 0L; + for (AToZ entry : listAtoZ) { + index = createResource(entry.getResource().getResource(),index); } } //Extract RouteObjectIncludeExclude list in the case of pre-computed path Z-to-A - private void extractRouteObjectIcludeZtoA(List listZtoA) throws GnpyException { - for (int i = 0; i < listZtoA.size(); i++) { - createResource(listZtoA.get(i).getResource().getResource()); + private void extractRouteObjectIcludeZtoA(@NonNull List listZtoA) throws GnpyException { + Long index = 0L; + for (ZToA entry : listZtoA) { + index = createResource(entry.getResource().getResource(),index); } } //Create a new resource node or link - private void createResource(@Nullable Resource resource) throws GnpyException { + private Long createResource(@Nullable Resource resource, Long index) throws GnpyException { + Long idx = index; if (resource instanceof - org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev171017 + org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705 .pce.resource.resource.resource.Node) { - org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev171017 + org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705 .pce.resource.resource.resource.Node node = - (org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev171017 + (org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705 .pce.resource.resource.resource.Node) resource; if (node.getNodeId() == null) { throw new GnpyException("In gnpyServiceImpl: nodeId is null"); } - addNodeToRouteObject(this.mapDisgNodeRefNode.get(node.getNodeId())); - return; + idx = addNodeToRouteObject(this.mapDisgNodeRefNode.get(node.getNodeId()),idx); } if (resource instanceof - org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev171017 + org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705 .pce.resource.resource.resource.Link) { - org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev171017 + org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705 .pce.resource.resource.resource.Link link = - (org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev171017 + (org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705 .pce.resource.resource.resource.Link) resource; - addLinkToRouteObject(link.getLinkId()); - return; + idx = addLinkToRouteObject(link.getLinkId(),idx); } + return idx; } //Create RouteObjectIncludeExclude list in the case of hard constraint private void extractHardConstraints(PceConstraints pceHardConstraints) throws GnpyException { List listNodeToInclude = getListToInclude(pceHardConstraints); - if (listNodeToInclude != null) { + if (!listNodeToInclude.isEmpty()) { + Long index = 0L; for (int i = 0; i < listNodeToInclude.size(); i++) { String nodeId = listNodeToInclude.get(i); - addNodeToRouteObject(nodeId); + index = addNodeToRouteObject(nodeId, index); } } } - // Create the list of nodes to include + //Create the list of nodes to include private List getListToInclude(PceConstraints pceHardConstraints) { List listNodeToInclude = new ArrayList<>(); if (pceHardConstraints != null) { @@ -253,112 +283,120 @@ public class GnpyServiceImpl { } //Add a node to the route object - private void addNodeToRouteObject(String nodeRef) throws GnpyException { - boolean found = false; - IpAddress ipAddress = this.mapNodeRefIp.get(nodeRef); - if (ipAddress == null) { - throw new GnpyException(String.format("In gnpyServiceImpl : NodeRef %s does not exist", nodeRef)); - } - - for (Elements element : this.elements) { - if (element.getUid().contains(ipAddress.getIpv4Address().getValue().toString())) { - if ((this.currentNodeIpAddress == null) || (this.currentNodeIpAddress != ipAddress)) { - this.currentNodeIpAddress = ipAddress; - RouteObjectIncludeExclude routeObjectIncludeExclude = addRouteObjectIncludeExclude(ipAddress, 1); - routeObjectIncludeExcludes.add(routeObjectIncludeExclude); - index++; - found = true; + private Long addNodeToRouteObject(String nodeRef, Long index) throws GnpyException { + Long idx = index; + for (Elements element : this.elements.values()) { + if (element.getUid().equals(nodeRef)) { + if ((this.currentNodeId == null) || (!this.currentNodeId.equals(nodeRef))) { + this.currentNodeId = nodeRef; + RouteObjectIncludeExclude routeObjectIncludeExclude = addRouteObjectIncludeExclude(nodeRef, + Uint32.valueOf(1), idx); + RouteObjectIncludeExcludeKey key = new RouteObjectIncludeExcludeKey(Uint32.valueOf(idx)); + routeObjectIncludeExcludes.put(key, routeObjectIncludeExclude); + idx += 1; } - return; + return idx; } } - if (!found) { - throw new GnpyException(String.format("In gnpyServiceImpl : NodeRef %s does not exist",nodeRef)); - } + throw new GnpyException(String.format("In gnpyServiceImpl : NodeRef %s does not exist",nodeRef)); } //Add a link to the route object - private void addLinkToRouteObject(String linkId) throws GnpyException { + private Long addLinkToRouteObject(String linkId, Long index) throws GnpyException { + Long idx = index; if (linkId == null) { - throw new GnpyException(String.format("In GnpyServiceImpl: the linkId %s does not exist",linkId)); + throw new GnpyException("In GnpyServiceImpl: the linkId is null"); } //Only the ROADM-to-ROADM link are included in the route object if (!mapLinkFiber.containsKey(linkId)) { - return; + return idx; } List listSubLink = this.mapLinkFiber.get(linkId); if (listSubLink == null) { throw new GnpyException(String.format("In gnpyServiceImpl addNodeRouteObject : no sublink in %s",linkId)); } for (String subLink : listSubLink) { - IpAddress fiberIp = this.mapFiberIp.get(subLink); - if (fiberIp == null) { - throw new GnpyException(String.format("In gnpyServiceImpl addNodeRouteObject : fiberIp of %s is null", - subLink)); - } - RouteObjectIncludeExclude routeObjectIncludeExclude = addRouteObjectIncludeExclude(fiberIp, 1); - routeObjectIncludeExcludes.add(routeObjectIncludeExclude); - index++; + RouteObjectIncludeExclude routeObjectIncludeExclude = + addRouteObjectIncludeExclude(subLink, Uint32.valueOf(1),idx); + RouteObjectIncludeExcludeKey key = new RouteObjectIncludeExcludeKey(Uint32.valueOf(idx)); + routeObjectIncludeExcludes.put(key, routeObjectIncludeExclude); + idx += 1; } + return idx; } // Add routeObjectIncludeExclude - private RouteObjectIncludeExclude addRouteObjectIncludeExclude(IpAddress ipAddress, long teTpValue) { - 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 + private RouteObjectIncludeExclude addRouteObjectIncludeExclude(String nodeId, Uint32 teTpValue, Long index) { + NumUnnumHop numUnnumHop = new org.opendaylight.yang.gen.v1.gnpy.path.rev220221.explicit.route.hop.type.num .unnum.hop.NumUnnumHopBuilder() - .setNodeId(teNodeId.getIpv4Address().getValue().toString()) - .setLinkTpId(teTpId.getUint32().toString()) + .setNodeId(nodeId) + .setLinkTpId(teTpValue.toString()) .setHopType(TeHopType.STRICT).build(); Type type1 = new NumUnnumHopBuilder().setNumUnnumHop(numUnnumHop).build(); // Create routeObjectIncludeExclude element - RouteObjectIncludeExclude routeObjectIncludeExclude = new RouteObjectIncludeExcludeBuilder() - .setIndex(this.index).setExplicitRouteUsage(RouteIncludeEro.class).setType(type1).build(); - return routeObjectIncludeExclude; + return new RouteObjectIncludeExcludeBuilder() + .setIndex(Uint32.valueOf(index)).setExplicitRouteUsage(RouteIncludeEro.class).setType(type1).build(); } //Create the path constraints - private PathConstraints createPathConstraints(Long rate, Long wavelengthNumber) { - // Create EffectiveFreqSlot - int freqNdex = 0; - if (wavelengthNumber != null) { - double freq = (MAX_CENTRAL_FREQ - FIX_CH * (wavelengthNumber - 1)); - freqNdex = (int) Math.round((freq - FLEX_CENTRAL_FREQ) / SLOT_BW); + private PathConstraints createPathConstraints(Long rate, String modulationFormat, FrequencyTHz minFrequency, + FrequencyTHz maxFrequency) { + BigDecimal spacing = GridConstant.SLOT_WIDTH_50; + int mvalue = GridConstant.NB_SLOTS_100G; + int nvalue = 0; + if (minFrequency != null && maxFrequency != null && modulationFormat != null) { + LOG.info("Creating path constraints for rate {}, modulationFormat {}, min freq {}, max freq {}", rate, + modulationFormat, minFrequency, maxFrequency); + ModulationFormat mformat = ModulationFormat.DpQpsk; + Optional optionalModulationFormat = ModulationFormat.forName(modulationFormat); + if (optionalModulationFormat.isPresent()) { + mformat = optionalModulationFormat.get(); + } + spacing = GridConstant.FREQUENCY_SLOT_WIDTH_TABLE.get(Uint32.valueOf(rate), mformat); + FrequencyTHz centralFrequency = GridUtils + .getCentralFrequency(minFrequency.getValue(), maxFrequency.getValue()); + int centralFrequencyBitSetIndex = GridUtils.getIndexFromFrequency(centralFrequency.getValue()); + mvalue = (int) Math.ceil(spacing.doubleValue() / (GridConstant.GRANULARITY)); + nvalue = GridUtils.getNFromFrequencyIndex(centralFrequencyBitSetIndex); } - List effectiveFreqSlot = new ArrayList<>(); - EffectiveFreqSlot effectiveFreqSlot1 = new EffectiveFreqSlotBuilder().setM(NB_SLOT_BW).setN(freqNdex).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(FIX_CH * CONVERT_TH_HZ)).build(); - PathConstraints pathConstraints = new PathConstraintsBuilder().setTeBandwidth(teBandwidth).build(); - return pathConstraints; + LOG.info("Creating path constraints for rate {}, mvalue {}, nvalue {}, spacing {}", rate, + mvalue, nvalue, spacing); + EffectiveFreqSlot effectiveFreqSlot = new EffectiveFreqSlotBuilder() + .setM(Uint32.valueOf(mvalue / 2)).setN(nvalue).build(); + + TeBandwidth teBandwidth = new TeBandwidthBuilder() + .setPathBandwidth(BigDecimal.valueOf(rate * 1e9)) + .setTechnology("flexi-grid").setTrxType("OpenROADM MSA ver. 5.0") + .setTrxMode(TRX_MODE_TABLE.get(Uint32.valueOf(rate), spacing)) + .setOutputPower(GridUtils.convertDbmW(GridConstant.OUTPUT_POWER_100GB_DBM + + 10 * Math.log10(mvalue / (double)GridConstant.NB_SLOTS_100G))) + .setEffectiveFreqSlot(Map.of(effectiveFreqSlot.key(), effectiveFreqSlot)) + .setSpacing(spacing.multiply(BigDecimal.valueOf(1e9))).build(); + return new PathConstraintsBuilder().setTeBandwidth(teBandwidth).build(); } //Create the synchronization - private List extractSynchronization(Long requestId) { + private List extractSynchronization(Uint32 requestId) { // Create RequestIdNumber - List requestIdNumber = new ArrayList<>(); - requestIdNumber.add(requestId); + List requestIdNumber = new ArrayList<>(); + requestIdNumber.add(requestId.toString()); // 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(); + Synchronization synchronization1 = new SynchronizationBuilder() + .setSynchronizationId(Uint32.valueOf(0).toString()) + .setSvec(svec).build(); synchro.add(synchronization1); return (synchro); } - public List getPathRequest() { + public Map getPathRequest() { return pathRequest; } - public void setPathRequest(List pathRequest) { + public void setPathRequest(Map pathRequest) { this.pathRequest = pathRequest; } @@ -370,4 +408,4 @@ public class GnpyServiceImpl { this.synchronization = synchronization; } -} \ No newline at end of file +}