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.rev200202.RouteIncludeEro;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev200202.TeHopType;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev200202.TeNodeId;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev200202.TePathDisjointness;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev200202.TeTpId;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev200202.common.constraints_config.TeBandwidth;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev200202.common.constraints_config.TeBandwidthBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev200202.explicit.route.hop.Type;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev200202.explicit.route.hop.type.NumUnnumHopBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev200202.explicit.route.hop.type.num.unnum.hop.NumUnnumHop;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev200202.generic.path.constraints.PathConstraints;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev200202.generic.path.constraints.PathConstraintsBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev200202.gnpy.specific.parameters.EffectiveFreqSlot;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev200202.gnpy.specific.parameters.EffectiveFreqSlotBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev200202.path.route.objects.ExplicitRouteObjects;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev200202.path.route.objects.ExplicitRouteObjectsBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev200202.path.route.objects.explicit.route.objects.RouteObjectIncludeExclude;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev200202.path.route.objects.explicit.route.objects.RouteObjectIncludeExcludeBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev200202.service.PathRequest;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev200202.service.PathRequestBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev200202.synchronization.info.Synchronization;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev200202.synchronization.info.SynchronizationBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev200202.synchronization.info.synchronization.Svec;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev200202.synchronization.info.synchronization.SvecBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev200128.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.
*
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> pathRequest = new ArrayList<>();
+
+ private Map<PathRequestKey, PathRequest> pathRequest = new HashMap<>();
private List<Synchronization> synchronization = new ArrayList<>();
- private Map<String, String> mapDisgNodeRefNode = new HashMap<String, String>();
- private Map<String, IpAddress> mapNodeRefIp = new HashMap<String, IpAddress>();
- private Map<String, List<String>> mapLinkFiber = new HashMap<String, List<String>>();
- private Map<String, IpAddress> mapFiberIp = new HashMap<String, IpAddress>();
+ private Map<String, String> mapDisgNodeRefNode = new HashMap<>();
+ private Map<String, List<String>> mapLinkFiber = new HashMap<>();
private List<String> trxList = new ArrayList<>();
- private List<Elements> elements = new ArrayList<>();
- private List<RouteObjectIncludeExclude> routeObjectIncludeExcludes = new ArrayList<>();
- private Long index = (long) 0; //index of the element in the path
- private IpAddress currentNodeIpAddress = null;
+ private Map<ElementsKey, Elements> elements = new HashMap<>();
+ private Map<RouteObjectIncludeExcludeKey, RouteObjectIncludeExclude> routeObjectIncludeExcludes = new HashMap<>();
+ private String currentNodeId = null;
+ private AToZComparator atoZComparator = new AToZComparator();
+ private ZToAComparator ztoAComparator = new ZToAComparator();
+ private static final Table<Uint32, BigDecimal, String> TRX_MODE_TABLE = initTrxModeTable();
+
+ private static Table<Uint32, BigDecimal, String> initTrxModeTable() {
+ Table<Uint32, BigDecimal, String> 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<Uint32, BigDecimal> RATE_OUTPUTPOWER = Map.of(
+ ServiceRateConstant.RATE_100, GridConstant.OUTPUT_POWER_100GB_W,
+ ServiceRateConstant.RATE_400, GridConstant.OUTPUT_POWER_400GB_W);
/*
* Construct the GnpyServiceImpl
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.toJava(), 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, 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.toJava(), 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<PathRequest> extractPathRequest(PathComputationRequestInput input, AToZDirection atoz, Long requestId,
- PceConstraints pceHardConstraints) throws GnpyException {
+ private Map<PathRequestKey, PathRequest> extractPathRequest(
+ PathComputationRequestInput input, AToZDirection atoz, Long requestId,
+ PceConstraints pceHardConstraints) throws GnpyException {
// Create the source and destination nodes
String sourceNode = input.getServiceAEnd().getNodeId();
}
// Create explicitRouteObjects
- List<AToZ> listAtoZ = atoz.getAToZ();
- if (listAtoZ != null) {
- extractRouteObjectIcludeAtoZ(listAtoZ);
- } else {
+ List<AToZ> 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
- Long atozWavelength = null;
- if (atoz.getAToZWavelengthNumber() != null) {
- atozWavelength = atoz.getAToZWavelengthNumber().toJava();
- }
- PathConstraints pathConstraints = createPathConstraints(atoz.getRate().toJava(), atozWavelength);
+ PathConstraints pathConstraints = createPathConstraints(atoz.getRate().toJava(),
+ atoz.getModulationFormat(),
+ atoz.getAToZMinFrequency(),
+ atoz.getAToZMaxFrequency());
// Create the path request
- List<PathRequest> 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())
+ Map<PathRequestKey, PathRequest> 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<PathRequest> extractPathRequest(PathComputationRequestInput input, ZToADirection ztoa, Long requestId,
- PceConstraints pceHardConstraints) throws GnpyException {
+ private Map<PathRequestKey, PathRequest> 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();
throw new GnpyException("In GnpyServiceImpl: source and destination should be transmitter nodes");
}
// Create explicitRouteObjects
- List<ZToA> listZtoA = ztoa.getZToA();
- if (listZtoA != null) {
- extractRouteObjectIcludeZtoA(listZtoA);
- } else {
+ @NonNull List<ZToA> 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
- Long ztoaWavelength = null;
- if (ztoa.getZToAWavelengthNumber() != null) {
- ztoaWavelength = ztoa.getZToAWavelengthNumber().toJava();
- }
- PathConstraints pathConstraints = createPathConstraints(ztoa.getRate().toJava(), ztoaWavelength);
+ PathConstraints pathConstraints = createPathConstraints(ztoa.getRate().toJava(),
+ ztoa.getModulationFormat(),
+ ztoa.getZToAMinFrequency(),
+ ztoa.getZToAMaxFrequency());
- // Create the path request
- List<PathRequest> 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())
+ //Create the path request
+ Map<PathRequestKey, PathRequest> 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<AToZ> listAtoZ) throws GnpyException {
- for (int i = 0; i < listAtoZ.size(); i++) {
- createResource(listAtoZ.get(i).getResource().getResource());
+ private void extractRouteObjectIcludeAtoZ(Collection<AToZ> 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<ZToA> listZtoA) throws GnpyException {
- for (int i = 0; i < listZtoA.size(); i++) {
- createResource(listZtoA.get(i).getResource().getResource());
+ private void extractRouteObjectIcludeZtoA(@NonNull List<ZToA> 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<String> 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<String> getListToInclude(PceConstraints pceHardConstraints) {
List<String> listNodeToInclude = new ArrayList<>();
if (pceHardConstraints != null) {
}
//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())) {
- if ((this.currentNodeIpAddress == null) || (this.currentNodeIpAddress != ipAddress)) {
- this.currentNodeIpAddress = ipAddress;
- RouteObjectIncludeExclude routeObjectIncludeExclude =
- addRouteObjectIncludeExclude(ipAddress, Uint32.valueOf(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 does not exist"));
+ 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<String> 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, Uint32.valueOf(1));
- routeObjectIncludeExcludes.add(routeObjectIncludeExclude);
- index++;
+ 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, Uint32 teTpValue) {
- TeNodeId teNodeId = new TeNodeId(ipAddress);
- TeTpId teTpId = new TeTpId(teTpValue);
- NumUnnumHop numUnnumHop = new org.opendaylight.yang.gen.v1.gnpy.path.rev200202.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())
- .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<ModulationFormat> 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> 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<Synchronization> extractSynchronization(Uint32 requestId) {
// Create RequestIdNumber
- List<Uint32> requestIdNumber = new ArrayList<>();
- requestIdNumber.add(requestId);
+ List<String> 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<Synchronization> synchro = new ArrayList<>();
- Synchronization synchronization1 = new SynchronizationBuilder().setSynchronizationId(Long.valueOf(0))
+ Synchronization synchronization1 = new SynchronizationBuilder()
+ .setSynchronizationId(Uint32.valueOf(0).toString())
.setSvec(svec).build();
synchro.add(synchronization1);
return (synchro);
}
- public List<PathRequest> getPathRequest() {
+ public Map<PathRequestKey, PathRequest> getPathRequest() {
return pathRequest;
}
- public void setPathRequest(List<PathRequest> pathRequest) {
+ public void setPathRequest(Map<PathRequestKey, PathRequest> pathRequest) {
this.pathRequest = pathRequest;
}