import java.util.Map;
import java.util.Optional;
import java.util.TreeMap;
+import org.opendaylight.transportpce.common.StringConstants;
import org.opendaylight.transportpce.common.fixedflex.GridConstant;
import org.opendaylight.transportpce.common.mapping.PortMapping;
import org.opendaylight.transportpce.pce.SortPortsByName;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1;
+import org.opendaylight.transportpce.pce.networkanalyzer.port.Preference;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.reroute.request.input.Endpoints;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1;
import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmTpType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.available.freq.map.AvailFreqMapsKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOCH;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOCHOTU4ODU4;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOtsiOtsigroup;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.SupportedIfCapability;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.XpdrNetworkAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmTpType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.available.freq.map.AvailFreqMapsKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.IfOCH;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.IfOCHOTU4ODU4;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.IfOtsiOtsigroup;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.SupportedIfCapability;
import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev191129.ServiceFormat;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev230526.xpdr.mode.attributes.supported.operational.modes.OperationalMode;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev230526.xpdr.mode.attributes.supported.operational.modes.OperationalModeKey;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
import org.opendaylight.yangtools.yang.common.Uint16;
private String version;
private BigDecimal slotWidthGranularity;
private BigDecimal centralFreqGranularity;
+ private Endpoints endpoints;
public PceOpticalNode(String deviceNodeId, String serviceType, PortMapping portMapping, Node node,
OpenroadmNodeType nodeType, String version, BigDecimal slotWidthGranularity,
this.slotWidthGranularity = slotWidthGranularity;
this.centralFreqGranularity = centralFreqGranularity;
this.adminStates = node.augmentation(org.opendaylight.yang.gen.v1.http
- .org.openroadm.common.network.rev211210.Node1.class).getAdministrativeState();
+ .org.openroadm.common.network.rev230526.Node1.class).getAdministrativeState();
this.state = node.augmentation(org.opendaylight.yang.gen.v1.http
- .org.openroadm.common.network.rev211210.Node1.class).getOperationalState();
+ .org.openroadm.common.network.rev230526.Node1.class).getOperationalState();
} else {
- LOG.error("PceNode: one of parameters is not populated : nodeId, node type, slot width granularity");
+ LOG.error("PceNode {} : one of parameters is not populated : nodeId, node type, slot width granularity",
+ deviceNodeId);
this.valid = false;
}
}
- public void initSrgTps() {
+ public void initSrgTps(Preference portPreference) {
this.availableSrgPp.clear();
this.availableSrgCp.clear();
if (!isValid()) {
for (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
.node.TerminationPoint tp : allTps) {
TerminationPoint1 cntp1 = tp.augmentation(TerminationPoint1.class);
- org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.TerminationPoint1 nttp1 = tp
- .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210
+ org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1 nttp1 = tp
+ .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526
.TerminationPoint1.class);
OpenroadmTpType type = cntp1.getTpType();
LOG.debug("type = {} for tp {}", type.getName(), tp);
case SRGTXPP:
case SRGTXRXPP:
LOG.debug("initSrgTpList: SRG-PP tp = {} found", tp.getTpId().getValue());
+ if (!portPreference.isPreferredPort(nodeId.getValue(), tp.getTpId().getValue())) {
+ LOG.warn("initSrgTpList: SRG-PP tp = {} is rejected by the client", tp.getTpId().getValue());
+ break;
+ }
if (isTerminationPointAvailable(nttp1)) {
LOG.debug("initSrgTpList: adding SRG-PP tp '{}'", tp.getTpId().getValue());
this.availableSrgPp.put(tp.getTpId().getValue(), cntp1.getTpType());
}
private boolean isTerminationPointAvailable(
- org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.TerminationPoint1 nttp1) {
+ org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1 nttp1) {
byte[] availableByteArray = new byte[GridConstant.NB_OCTECTS];
Arrays.fill(availableByteArray, (byte) GridConstant.AVAILABLE_SLOT_VALUE);
return nttp1 == null || nttp1.getPpAttributes() == null
}
switch (this.serviceType) {
case "400GE":
- for (Class<? extends SupportedIfCapability> ifCap : mapping.getSupportedInterfaceCapability()) {
- if (ifCap.equals(IfOtsiOtsigroup.class)) {
+ for (SupportedIfCapability ifCap : mapping.getSupportedInterfaceCapability()) {
+ if (ifCap.equals(IfOtsiOtsigroup.VALUE)) {
return true;
}
}
return false;
case "100GE":
- return mapping.getSupportedInterfaceCapability().contains(IfOCH.class)
- || mapping.getSupportedInterfaceCapability().contains(IfOCHOTU4ODU4.class);
+ return mapping.getSupportedInterfaceCapability().contains(IfOCH.VALUE)
+ || mapping.getSupportedInterfaceCapability().contains(IfOCHOTU4ODU4.VALUE);
default:
return true;
}
return;
}
Node1 node1 = this.node.augmentation(Node1.class);
- org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1 node11 =
- this.node.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1
+ org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1 node11 =
+ this.node.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1
.class);
switch (this.nodeType) {
case SRG :
return;
}
for (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
- .node.TerminationPoint tp : allTps) {
+ .node.TerminationPoint tp : allTps) {
TerminationPoint1 cntp1 = tp.augmentation(TerminationPoint1.class);
+ if (cntp1 == null) {
+ LOG.error("initXndrTps: {} - {} has no tp type", this.nodeId, tp.getTpId().toString());
+ continue;
+ }
if (cntp1.getTpType() != OpenroadmTpType.XPONDERNETWORK) {
LOG.debug("initXndrTps: {} is not an Xponder network port", cntp1.getTpType().getName());
continue;
LOG.warn("initXndrTps: XPONDER tp = {} is OOS/degraded", tp.getTpId().getValue());
continue;
}
- org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.TerminationPoint1 nttp1 = tp
- .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210
- .TerminationPoint1.class);
- if (nttp1 != null && nttp1.getXpdrNetworkAttributes().getWavelength() != null) {
- this.usedXpndrNWTps.add(tp.getTpId().getValue());
- LOG.debug("initXndrTps: XPONDER tp = {} is used", tp.getTpId().getValue());
- continue;
+ if (endpoints == null
+ || (!endpoints.getAEndTp().equals(tp.getTpId().getValue())
+ && !endpoints.getZEndTp().equals(tp.getTpId().getValue()))) {
+ org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1 nttp1 =
+ tp.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526
+ .TerminationPoint1.class);
+ if (nttp1 != null && nttp1.getXpdrNetworkAttributes().getWavelength() != null) {
+ this.usedXpndrNWTps.add(tp.getTpId().getValue());
+ LOG.debug("initXndrTps: XPONDER tp = {} is used", tp.getTpId().getValue());
+ continue;
+ }
}
// find Client of this network TP
- org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.TerminationPoint1 tpceTp1 =
- tp.augmentation(org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123
- .TerminationPoint1.class);
- if (tpceTp1 != null) {
- String client = tpceTp1.getAssociatedConnectionMapPort();
+ if (cntp1.getAssociatedConnectionMapTp() != null) {
+ String client = cntp1.getAssociatedConnectionMapTp().iterator().next().getValue();
if (client != null) {
this.clientPerNwTp.put(tp.getTpId().getValue(), client);
this.valid = true;
return null;
}
LOG.debug("getRdmSrgClient: client PP {} for CP {} found !", client, tp);
- return client.get();
+ return client.orElseThrow();
+ }
+
+ @Override
+ public String getOperationalMode() {
+ Node1 node1 = this.node.augmentation(Node1.class);
+ if (node1 == null) {
+ LOG.warn("No openroadm node available for node {}", node);
+ return "";
+ }
+ switch (this.nodeType) {
+ case SRG :
+ if (node1.getSrgAttributes().getSupportedOperationalModes() == null
+ || node1.getSrgAttributes().getSupportedOperationalModes().stream().findFirst().isEmpty()) {
+ LOG.debug("getOperationalMode: SRG has no operational mode declared");
+ return StringConstants.UNKNOWN_MODE;
+ } else {
+ LOG.debug("getOperationalMode: SRG has operational mode declared {}",
+ node1.getSrgAttributes().getSupportedOperationalModes().stream().findFirst().toString());
+ return node1.getSrgAttributes().getSupportedOperationalModes().stream().findFirst().toString();
+ }
+ case DEGREE :
+ if (node1.getDegreeAttributes().getSupportedOperationalModes() == null
+ || node1.getDegreeAttributes().getSupportedOperationalModes().stream().findFirst().isEmpty()) {
+ LOG.debug("getOperationalMode: DEGREE has no operational mode declared");
+ return StringConstants.UNKNOWN_MODE;
+ } else {
+ LOG.debug("getOperationalMode: DEGREE has operational mode declared {}",
+ node1.getDegreeAttributes().getSupportedOperationalModes().stream().findFirst().toString());
+ return node1.getDegreeAttributes().getSupportedOperationalModes().stream().findFirst().toString();
+ }
+ default:
+ LOG.debug("getOperationalMode: Did not succeed retrieving Operational Mode for the node");
+ return "";
+ }
}
+ @Override
+ public String getXponderOperationalMode(XpdrNetworkAttributes tp) {
+ if (tp.getSupportedOperationalModes() == null) {
+ LOG.warn("getOperationalMode: NetworkPort {} has no operational mode declared compatible with service type",
+ tp);
+ return StringConstants.UNKNOWN_MODE;
+ }
+ for (Map.Entry<OperationalModeKey, OperationalMode> mode : tp.getSupportedOperationalModes()
+ .getOperationalMode().entrySet()) {
+ if (mode.getKey().toString().contains(StringConstants.SERVICE_TYPE_RATE
+ .get(this.serviceType).toCanonicalString())) {
+ LOG.info("getOperationalMode: NetworkPort {} has {} operational mode declared", tp,
+ mode.getKey().toString());
+ return mode.getKey().toString();
+ }
+ }
+ LOG.warn("getOperationalMode: NetworkPort {} has no operational mode declared compatible with service type",
+ tp);
+ return StringConstants.UNKNOWN_MODE;
+ }
public void validateAZxponder(String anodeId, String znodeId, ServiceFormat serviceFormat) {
if (!isValid() || this.nodeType != OpenroadmNodeType.XPONDER) {
initXndrTps(serviceFormat);
return;
}
- LOG.debug("validateAZxponder: XPONDER is ignored == {}", nodeId.getValue());
+ LOG.debug("validateAZxponder: XPONDER == {} is ignored, supported by {} for aNodeId {} ", nodeId.getValue(),
+ this.getSupNetworkNodeId(), anodeId);
valid = false;
}
public boolean isValid() {
if (node == null || nodeId == null || nodeType == null || this.getSupNetworkNodeId() == null
- || this.getSupClliNodeId() == null || adminStates == null || state == null) {
- LOG.error("PceNode: one of parameters is not populated : nodeId, node type, supporting nodeId, "
- + "admin state, operational state");
+ || this.getSupClliNodeId() == null || adminStates == null || state == null) {
+ LOG.error("PceNode {}, nodeId {} NodeType {} : one of parameters is not populated : nodeId, node type,"
+ + " supporting nodeId, admin state, operational state", deviceNodeId, nodeId, nodeType);
valid = false;
}
return valid;
return null;
}
+ @Override
+ public OpenroadmNodeType getORNodeType() {
+ return this.nodeType;
+ }
+
@Override
public Map<String, List<Uint16>> getAvailableTribSlots() {
return null;
return centralFreqGranularity;
}
+ public void setEndpoints(Endpoints endpoints) {
+ this.endpoints = endpoints;
+ }
+
}