import org.opendaylight.transportpce.pce.networkanalyzer.PceLink;
import org.opendaylight.transportpce.pce.networkanalyzer.PceNode;
import org.opendaylight.transportpce.pce.networkanalyzer.PceResult;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev230925.PceConstraintMode;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev230925.SpectrumAssignment;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev230925.SpectrumAssignmentBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PceConstraintMode;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.SpectrumAssignment;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.SpectrumAssignmentBuilder;
import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1;
import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmLinkType;
import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
private Double tpceCalculatedMargin = 0.0;
private final NetworkTransactionService networkTransactionService;
+ private final BitSet spectrumConstraint;
- public PostAlgoPathValidator(NetworkTransactionService networkTransactionService) {
+ public PostAlgoPathValidator(NetworkTransactionService networkTransactionService, BitSet spectrumConstraint) {
this.networkTransactionService = networkTransactionService;
+ this.spectrumConstraint = spectrumConstraint;
}
@SuppressWarnings("fallthrough")
BitSet result = BitSet.valueOf(freqMap);
boolean isFlexGrid = true;
LOG.debug("Processing path {} with length {}", path, path.getLength());
+ BitSet pceNodeFreqMap;
+ Set<PceNode> pceNodes = new LinkedHashSet<>();
+
for (PceGraphEdge edge : path.getEdgeList()) {
- NodeId srcNodeId = edge.link().getSourceId();
- LOG.debug("Processing source {} ", srcNodeId);
- if (allPceNodes.containsKey(srcNodeId)) {
- PceNode pceNode = allPceNodes.get(srcNodeId);
- LOG.debug("Processing PCE node {}", pceNode);
- String pceNodeVersion = pceNode.getVersion();
- NodeId pceNodeId = pceNode.getNodeId();
- BigDecimal sltWdthGran = pceNode.getSlotWidthGranularity();
- BigDecimal ctralFreqGran = pceNode.getCentralFreqGranularity();
- if (StringConstants.OPENROADM_DEVICE_VERSION_1_2_1.equals(pceNodeVersion)) {
- LOG.debug("Node {}: version is {} and slot width granularity is {} -> fixed grid mode",
- pceNodeId, pceNodeVersion, sltWdthGran);
- isFlexGrid = false;
- }
- if (sltWdthGran.setScale(0, RoundingMode.CEILING).equals(GridConstant.SLOT_WIDTH_50)
- && ctralFreqGran.setScale(0, RoundingMode.CEILING).equals(GridConstant.SLOT_WIDTH_50)) {
- LOG.debug("Node {}: version is {} with slot width granularity {} and central "
- + "frequency granularity is {} -> fixed grid mode",
- pceNodeId, pceNodeVersion, sltWdthGran, ctralFreqGran);
- isFlexGrid = false;
- }
- BitSet pceNodeFreqMap = pceNode.getBitSetData();
- LOG.debug("Pce node bitset {}", pceNodeFreqMap);
- if (pceNodeFreqMap != null) {
- result.and(pceNodeFreqMap);
- LOG.debug("intermediate bitset {}", result);
- }
+ NodeId srcId = edge.link().getSourceId();
+ NodeId dstId = edge.link().getDestId();
+ LOG.debug("Processing {} to {}", srcId.getValue(), dstId.getValue());
+ if (allPceNodes.containsKey(srcId)) {
+ pceNodes.add(allPceNodes.get(srcId));
+ }
+ if (allPceNodes.containsKey(dstId)) {
+ pceNodes.add(allPceNodes.get(dstId));
+ }
+ }
+
+ for (PceNode pceNode : pceNodes) {
+ LOG.debug("Processing PCE node {}", pceNode);
+ pceNodeFreqMap = pceNode.getBitSetData();
+ LOG.debug("Pce node bitset {}", pceNodeFreqMap);
+ if (pceNodeFreqMap != null) {
+ result.and(pceNodeFreqMap);
+ LOG.debug("intermediate bitset {}", result);
}
+ String pceNodeVersion = pceNode.getVersion();
+ BigDecimal sltWdthGran = pceNode.getSlotWidthGranularity();
+ if (StringConstants.OPENROADM_DEVICE_VERSION_1_2_1.equals(pceNodeVersion)) {
+ LOG.debug("Node {}: version is {} with slot width granularity {} - fixed grid mode",
+ pceNode.getNodeId(), pceNodeVersion, sltWdthGran);
+ isFlexGrid = false;
+ continue;
+ }
+ if (!sltWdthGran.setScale(0, RoundingMode.CEILING).equals(GridConstant.SLOT_WIDTH_50)) {
+ continue;
+ }
+ BigDecimal ctralFreqGran = pceNode.getCentralFreqGranularity();
+ if (!ctralFreqGran.setScale(0, RoundingMode.CEILING).equals(GridConstant.SLOT_WIDTH_50)) {
+ continue;
+ }
+ LOG.debug(
+ "Node {}: version is {} with slot width and central frequency granularities {} {} - fixed grid mode",
+ pceNode.getNodeId(), pceNodeVersion, sltWdthGran, ctralFreqGran);
+ isFlexGrid = false;
}
+ if (spectrumConstraint != null) {
+ result.and(spectrumConstraint);
+ }
+
LOG.debug("Bitset result {}", result);
return computeBestSpectrumAssignment(result, spectralWidthSlotNumber, isFlexGrid);
}