package org.opendaylight.transportpce.pce.networkanalyzer;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.BitSet;
import org.opendaylight.transportpce.common.StringConstants;
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.types.rev200327.xpdr.odu.switching.pools.OduSwitchingPools;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmNodeType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmTpType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.OduSwitchingPools;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
+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.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODTU4TsAllocated;
import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODTUCnTs;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.Node1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.TerminationPoint1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.termination.point.XpdrTpPortConnectionAttributes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.If100GEODU4;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.If10GEODU2e;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.If1GEODU0;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.IfOCHOTU4ODU4;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.IfOtsiOtsigroup;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.SupportedIfCapability;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev200529.xpdr.otn.tp.attributes.OdtuTpnPool;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.Node1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.TerminationPoint1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.networks.network.node.termination.point.XpdrTpPortConnectionAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If100GEODU4;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If10GEODU2e;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If1GEODU0;
+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.xponder.rev211210.xpdr.otn.tp.attributes.OdtuTpnPool;
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.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
StringConstants.SERVICE_TYPE_1GE, "ODU0",
StringConstants.SERVICE_TYPE_10GE, "ODU2e",
StringConstants.SERVICE_TYPE_100GE_M, "ODU4");
+ private static final String INTERMEDIATE_MODETYPE = "intermediate";
+ private static final String AZ_MODETYPE = "AZ";
private boolean valid = true;
private Map<String, String> clientPerNwTp = new HashMap<>();
private String clientPort;
- public PceOtnNode(
- Node node,
- OpenroadmNodeType nodeType,
- NodeId nodeId,
- String pceNodeType,
- String serviceType,
- String clientPort) {
+ @SuppressFBWarnings(value = "MC_OVERRIDABLE_METHOD_CALL_IN_CONSTRUCTOR",
+ justification = "need to initialise available tribport and tribslt")
+ public PceOtnNode(Node node, OpenroadmNodeType nodeType, NodeId nodeId, String pceNodeType, String serviceType,
+ String clientPort) {
this.node = node;
this.nodeId = nodeId;
this.nodeType = nodeType;
this.availableXpdrClientTps = new ArrayList<>();
this.usableXpdrClientTps = new ArrayList<>();
this.adminStates = node
- .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1.class)
+ .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1.class)
.getAdministrativeState();
this.state = node
- .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1.class)
+ .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1.class)
.getOperationalState();
this.tpAvailableTribPort.clear();
checkAvailableTribPort();
return;
}
for (TerminationPoint tp : allTps) {
- org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
+ org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
.TerminationPoint1 ocnTp1
= tp.augmentation(
- org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
+ org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
.TerminationPoint1.class);
if (ocnTp1 == null) {
LOG.warn("null ocn TP {}", tp);
//TODO many nested structures below, this needs to be reworked
switch (ocnTp1.getTpType()) {
case XPONDERNETWORK:
- if (SERVICE_TYPE_ODU_LIST.contains(this.otnServiceType)
- || StringConstants.SERVICE_TYPE_100GE_S.equals(this.otnServiceType)) {
- // TODO verify the capability of network port to support ODU4 CTP interface creation
- if (!checkTpForOdtuTermination(ontTp1)) {
- LOG.error("TP {} of {} does not allow {} termination creation",
- tp.getTpId().getValue(),
- node.getNodeId().getValue(),
- "ODU4");
- continue;
- }
- } else if (SERVICE_TYPE_ETH_TS_NB_MAP.containsKey(this.otnServiceType)) {
- if (!checkOdtuTTPforLoOduCreation(
- ontTp1, SERVICE_TYPE_ETH_TS_NB_MAP.get(this.otnServiceType))) {
- LOG.error("TP {} of {} does not allow {} termination creation",
- tp.getTpId().getValue(),
- node.getNodeId().getValue(),
- SERVICE_TYPE_ETH_ODU_STRING_MAP.get(this.otnServiceType));
- continue;
- }
+ String notCreatedServiceType = xpdrNetTpCreation(ontTp1);
+ if (notCreatedServiceType == null) {
+ LOG.info("TP {} of XPONDER {} is validated",
+ tp.getTpId().getValue(),
+ node.getNodeId().getValue());
+ this.availableXpdrNWTps.add(tp.getTpId());
} else {
LOG.error("TP {} of {} does not allow {} termination creation",
tp.getTpId().getValue(),
node.getNodeId().getValue(),
- "any");
- continue;
+ notCreatedServiceType);
}
- LOG.info("TP {} of XPONDER {} is validated",
- tp.getTpId(),
- node.getNodeId().getValue());
- this.availableXpdrNWTps.add(tp.getTpId());
break;
-
case XPONDERCLIENT:
- if (SERVICE_TYPE_ETH_CLASS_MAP.containsKey(otnServiceType)) {
- if (checkClientTp(ontTp1)) {
- LOG.info("TP {} of XPONDER {} is validated",
- tp.getTpId(),
- node.getNodeId().getValue());
- this.availableXpdrClientTps.add(tp.getTpId());
- } else {
- LOG.error("TP {} of {} does not allow lo-ODU (ODU2e or ODU0) termination creation",
- tp.getTpId().getValue(),
- node.getNodeId().getValue());
- }
+ if (!SERVICE_TYPE_ETH_CLASS_MAP.containsKey(this.otnServiceType)) {
+ continue;
+ }
+ if (checkClientTp(ontTp1)) {
+ LOG.info("TP {} of XPONDER {} is validated",
+ tp.getTpId(),
+ node.getNodeId().getValue());
+ this.availableXpdrClientTps.add(tp.getTpId());
+ } else {
+ LOG.error("TP {} of {} does not allow lo-ODU (ODU2e or ODU0) termination creation",
+ tp.getTpId().getValue(),
+ node.getNodeId().getValue());
}
break;
LOG.debug("unsupported ocn TP type {}", ocnTp1.getTpType());
}
}
- this.valid = SERVICE_TYPE_ODU_LIST.contains(this.otnServiceType)
- || SERVICE_TYPE_ETH_CLASS_MAP.containsKey(this.otnServiceType)
- && checkSwPool(availableXpdrNWTps, availableXpdrClientTps);
+ this.valid = checkSwPool(availableXpdrNWTps, availableXpdrClientTps);
+ }
+
+ private String xpdrNetTpCreation(TerminationPoint1 ontTp1) {
+ if (SERVICE_TYPE_ODU_LIST.contains(this.otnServiceType)
+ || StringConstants.SERVICE_TYPE_100GE_S.equals(this.otnServiceType)) {
+ // TODO verify the capability of network port to support ODU4 CTP interface creation
+ if (checkTpForOdtuTermination(ontTp1)) {
+ //success
+ return null;
+ }
+ return "ODU4";
+ }
+ if (SERVICE_TYPE_ETH_TS_NB_MAP.containsKey(this.otnServiceType)) {
+ if (checkOdtuTTPforLoOduCreation(
+ ontTp1,
+ SERVICE_TYPE_ETH_TS_NB_MAP.get(this.otnServiceType))) {
+ //success
+ return null;
+ }
+ return SERVICE_TYPE_ETH_ODU_STRING_MAP.get(this.otnServiceType);
+ }
+ //failure
+ return "any";
}
private boolean checkSwPool(List<TpId> netwTps, List<TpId> clientTps) {
+ if (SERVICE_TYPE_ODU_LIST.contains(this.otnServiceType)) {
+ return true;
+ }
+ if (!SERVICE_TYPE_ETH_CLASS_MAP.containsKey(this.otnServiceType)) {
+ return false;
+ }
if (netwTps == null) {
return false;
}
node1.getSwitchingPools().nonnullOduSwitchingPools()
.values().stream().findFirst().get()
.getNonBlockingList().values());
- if (nblList == null) {
- return false;
- }
netwTps.sort(Comparator.comparing(TpId::getValue));
switch (modeType) {
- case "intermediate":
+ case INTERMEDIATE_MODETYPE:
return checkIntermediateSwPool(nblList, netwTps);
- case "AZ":
+ case AZ_MODETYPE:
if (clientTps == null) {
return false;
}
for (SupportedInterfaceCapability sic :
ontTp1.getTpSupportedInterfaces().getSupportedInterfaceCapability().values()) {
LOG.info("in checkTpForOduTermination - sic = {}", sic.getIfCapType());
- if ((sic.getIfCapType().equals(IfOCHOTU4ODU4.class) || sic.getIfCapType().equals(IfOtsiOtsigroup.class))
+ if ((sic.getIfCapType().equals(IfOCHOTU4ODU4.class)
+ || sic.getIfCapType().equals(IfOtsiOtsigroup.class))
&& (ontTp1.getXpdrTpPortConnectionAttributes() == null
|| ontTp1.getXpdrTpPortConnectionAttributes().getTsPool() == null)) {
return true;
}
private boolean checkFirstOdtuTpn(OdtuTpnPool otPool) {
- return (otPool.getOdtuType().equals(ODTU4TsAllocated.class)
- || otPool.getOdtuType().equals(ODTUCnTs.class))
+ return (otPool.getOdtuType().getSimpleName().equals(ODTU4TsAllocated.class.getSimpleName())
+ || otPool.getOdtuType().getSimpleName().equals(ODTUCnTs.class.getSimpleName()))
&& !otPool.getTpnPool().isEmpty();
}
ontTp1.getTpSupportedInterfaces().getSupportedInterfaceCapability().values()) {
LOG.debug("in checkTpForOduTermination - sic = {}", sic.getIfCapType());
// we could also check the administrative status of the tp
- if (SERVICE_TYPE_ETH_CLASS_MAP.containsKey(otnServiceType)
- && sic.getIfCapType().equals(SERVICE_TYPE_ETH_CLASS_MAP.get(otnServiceType))) {
+ if (SERVICE_TYPE_ETH_CLASS_MAP.get(otnServiceType).getSimpleName()
+ .equals(sic.getIfCapType().getSimpleName())) {
return true;
}
}
}
if (this.nodeId.getValue().equals(anodeId)
|| (this.nodeId.getValue().equals(znodeId))) {
- initXndrTps("AZ");
+ initXndrTps(AZ_MODETYPE);
} else if (OpenroadmNodeType.SWITCH.equals(this.nodeType)) {
- initXndrTps("intermediate");
+ initXndrTps(INTERMEDIATE_MODETYPE);
} else {
LOG.info("validateAZxponder: XPONDER is ignored == {}", nodeId.getValue());
valid = false;
return;
}
// Validate switch for use as an intermediate XPONDER on the path
- initXndrTps("intermediate");
+ initXndrTps(INTERMEDIATE_MODETYPE);
if (this.valid) {
LOG.info("validateIntermediateSwitch: Switch usable for transit == {}", nodeId.getValue());
} else {
.getTerminationPoint().values().stream()
.filter(type -> type
.augmentation(
- org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
+ org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
.TerminationPoint1.class)
.getTpType()
.equals(OpenroadmTpType.XPONDERNETWORK))
if (portConAttr != null && portConAttr.getOdtuTpnPool() != null) {
OdtuTpnPool otPool = portConAttr.getOdtuTpnPool().values().stream().findFirst().get();
if (checkFirstOdtuTpn(otPool)) {
- tpAvailableTribPort.put(tp.getTpId().getValue(), otPool.getTpnPool());
+ tpAvailableTribPort.put(tp.getTpId().getValue(), new ArrayList<>(otPool.getTpnPool()));
}
}
}
.getTerminationPoint().values().stream()
.filter(type -> type
.augmentation(
- org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
+ org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
.TerminationPoint1.class)
.getTpType().equals(OpenroadmTpType.XPONDERNETWORK))
.collect(Collectors.toList())
XpdrTpPortConnectionAttributes portConAttr =
tp.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes();
if (portConAttr != null && portConAttr.getTsPool() != null) {
- tpAvailableTribSlot.put(tp.getTpId().getValue(), portConAttr.getTsPool());
+ tpAvailableTribSlot.put(tp.getTpId().getValue(), new ArrayList<>(portConAttr.getTsPool()));
}
}
}