X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=networkmodel%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Ftransportpce%2Fnetworkmodel%2Futil%2FOpenRoadmOtnTopology.java;h=251230bfcbffbdb009ddbf42dadb3be4219bb6a3;hb=268165cb2822b6ce4c55f00cac63eed2bb222ec7;hp=101e52c2f85b0b1fbfe032f82f946f7b9c3f855c;hpb=d78f34d06bc3b6626985514deb99f2493999e2ca;p=transportpce.git diff --git a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmOtnTopology.java b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmOtnTopology.java index 101e52c2f..251230bfc 100644 --- a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmOtnTopology.java +++ b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmOtnTopology.java @@ -18,57 +18,46 @@ import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.transportpce.common.NetworkUtils; import org.opendaylight.transportpce.networkmodel.dto.OtnTopoNode; import org.opendaylight.transportpce.networkmodel.dto.TopologyShard; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev201012.network.Nodes; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev201012.network.nodes.Mapping; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State; import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.XpdrNodeTypes; 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.OduSwitchingPoolsBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.OduSwitchingPoolsKey; -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.topology.types.rev200327.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListKey; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmLinkType; -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.types.rev200529.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityKey; -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.ODU0; -import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODU2e; -import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODU4; -import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.OduRateIdentity; -import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.Link1; -import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.Link1Builder; -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.Node1Builder; -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.TerminationPoint1Builder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.SwitchingPools; -import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.SwitchingPoolsBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.TpBandwidthSharing; -import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.TpBandwidthSharingBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.XpdrAttributes; -import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.XpdrAttributesBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.termination.point.TpSupportedInterfaces; -import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.termination.point.TpSupportedInterfacesBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.termination.point.XpdrTpPortConnectionAttributesBuilder; -import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.If100GE; -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.If10GE; -import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.If10GEODU2; -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.If1GE; -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.IfOCH; -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.SupportedIfCapability; +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.OduSwitchingPoolsBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.OduSwitchingPoolsKey; +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.topology.types.rev201211.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListKey; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType; +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.network.types.rev211210.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityKey; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODTU4TsAllocated; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODTUCnTs; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODU0; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODU2; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODU2e; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODU4; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OdtuTypeIdentity; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OduRateIdentity; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.Link1; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.Link1Builder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.Node1Builder; +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.TerminationPoint1Builder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.networks.network.node.SwitchingPoolsBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.networks.network.node.TpBandwidthSharingBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.networks.network.node.XpdrAttributesBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.networks.network.node.termination.point.TpSupportedInterfacesBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.networks.network.node.termination.point.XpdrTpPortConnectionAttributesBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.SupportedIfCapability; import org.opendaylight.yang.gen.v1.http.org.openroadm.switching.pool.types.rev191129.SwitchingPoolTypes; -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.xponder.rev200529.xpdr.otn.tp.attributes.OdtuTpnPoolBuilder; -import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.OtnLinkType; +import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev211210.xpdr.otn.tp.attributes.OdtuTpnPool; +import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev211210.xpdr.otn.tp.attributes.OdtuTpnPoolBuilder; +import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.OtnLinkType; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId; 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; @@ -97,9 +86,32 @@ public final class OpenRoadmOtnTopology { private static final String CLIENT = "-CLIENT"; private static final String NETWORK = "-NETWORK"; private static final String XPDR = "-XPDR"; + private static final String OTN_PARAMS_ERROR = "Error with otn parameters of supported link {}"; private static final int NB_TRIB_PORTS = 80; private static final int NB_TRIB_SLOTS = 80; - private static final int NB_TRIB_SLOT_PER_10GE = 8; + + private static final Map> RATE_MAP = Map.of( + "If100GEODU4", ODU4.class, + "IfOCHOTU4ODU4", ODU4.class, + "If1GEODU0", ODU0.class, + "If10GEODU2", ODU2.class, + "If10GEODU2e", ODU2e.class); + private static final Map OTNLINKTYPE_BW_MAP = Map.of( + OtnLinkType.ODTU4, 100000L, + OtnLinkType.ODUC4, 400000L, + OtnLinkType.ODUC3, 300000L, + OtnLinkType.ODUC2, 200000L); + private static final Map OTNLINKTYPE_OTU_BW_MAP = Map.of( + OtnLinkType.OTU4, 100000L, + OtnLinkType.OTUC4, 400000L); + private static final Map SERVICERATE_BWINCR_MAP = Map.of( + Uint32.valueOf(1), 1000L, + Uint32.valueOf(10), 10000L, + Uint32.valueOf(100), 100000L); + private static final Map> SERVICERATE_ODTUTYPECLASS_MAP = Map.of( + Uint32.valueOf(1), ODTU4TsAllocated.class, + Uint32.valueOf(10), ODTU4TsAllocated.class, + Uint32.valueOf(100), ODTUCnTs.class); private OpenRoadmOtnTopology() { } @@ -128,181 +140,292 @@ public final class OpenRoadmOtnTopology { } public static TopologyShard createOtnLinks(String nodeA, String tpA, String nodeZ, String tpZ, - OtnLinkType linkType) { - List links = null; - if (OtnLinkType.OTU4.equals(linkType)) { - links = initialiseOtnLinks(nodeA, tpA, nodeZ, tpZ, linkType, "OTU4"); + OtnLinkType linkType) { + + return new TopologyShard( + null, + OTNLINKTYPE_OTU_BW_MAP.containsKey(linkType) + ? initialiseOtnLinks(nodeA, tpA, nodeZ, tpZ, linkType) + : null); + } + + public static TopologyShard createOtnLinks( + org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.renderer.rpc.result.sp + .Link notifLink, + OtnLinkType linkType) { + + return new TopologyShard( + null, + initialiseOtnLinks(notifLink.getATermination().getNodeId(), + notifLink.getATermination().getTpId(), + notifLink.getZTermination().getNodeId(), + notifLink.getZTermination().getTpId(), + linkType)); + } + + public static TopologyShard createOtnLinks( + org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.renderer.rpc.result.sp + .Link notifLink, + List supportedOtu4links, List supportedTPs, OtnLinkType linkType) { + + if (OTNLINKTYPE_OTU_BW_MAP.containsKey(linkType)) { + return new TopologyShard( + null, + initialiseOtnLinks( + notifLink.getATermination().getNodeId(), notifLink.getATermination().getTpId(), + notifLink.getZTermination().getNodeId(), notifLink.getZTermination().getTpId(), linkType)); + } else if (OTNLINKTYPE_BW_MAP.containsKey(linkType)) { + List links = initialiseOtnLinks( + notifLink.getATermination().getNodeId(), notifLink.getATermination().getTpId(), + notifLink.getZTermination().getNodeId(), notifLink.getZTermination().getTpId(), linkType); + links.addAll(updateOtnLinkBwParameters(supportedOtu4links, linkType)); + List updatedTPs = new ArrayList<>(); + for (TerminationPoint tp : supportedTPs) { + updatedTPs.add(updateTp(tp, true, linkType)); + } + return new TopologyShard(null, links, updatedTPs); + } else { + return null; } - return new TopologyShard(null, links); } - public static TopologyShard createOtnLinks(List suppOtu4Links, List oldTps) { + public static TopologyShard createOtnLinks(List suppOtuLinks, List oldTps, + OtnLinkType linkType) { + List links = new ArrayList<>(); - for (Link link : suppOtu4Links) { - if (link.augmentation(Link1.class) != null - && link.augmentation(Link1.class).getAvailableBandwidth().equals(Uint32.valueOf(100000))) { - links.add(updateOtnLinkBwParameters(link, 0L, 100000L)); - } else { - LOG.error("Error with otn parameters of supported link {}", link.getLinkId().getValue()); + for (Link link : suppOtuLinks) { + if (link.augmentation(Link1.class) == null) { + LOG.error("Error with OTN parameters of supported link {}", link.getLinkId().getValue()); + continue; + } + if (!OTNLINKTYPE_BW_MAP.containsKey(linkType)) { + LOG.error("Error with link {} : unsupported OTN link type", link.getLinkId().getValue()); + continue; } + if (link.augmentation(Link1.class).getAvailableBandwidth().longValue() < OTNLINKTYPE_BW_MAP.get(linkType)) { + LOG.error("Error with link {} : unsufficient available bandwith", link.getLinkId().getValue()); + continue; + } + links.add(updateOtnLinkBwParameters(link, 0L, OTNLINKTYPE_BW_MAP.get(linkType))); } if (links.size() == 2) { - links.addAll(initialiseOtnLinks(suppOtu4Links.get(0).getSource().getSourceNode().getValue(), - suppOtu4Links.get(0).getSource().getSourceTp().toString(), - suppOtu4Links.get(0).getDestination().getDestNode().getValue(), - suppOtu4Links.get(0).getDestination().getDestTp().toString(), - OtnLinkType.ODTU4, "ODU4")); + links.addAll(initialiseOtnLinks(suppOtuLinks.get(0).getSource().getSourceNode().getValue(), + suppOtuLinks.get(0).getSource().getSourceTp().getValue(), + suppOtuLinks.get(0).getDestination().getDestNode().getValue(), + suppOtuLinks.get(0).getDestination().getDestTp().getValue(), + linkType)); } List tps = new ArrayList<>(); for (TerminationPoint tp : oldTps) { - tps.add(updateTp(tp, true)); - } - if (links.size() == 4 && tps.size() == 2) { - return new TopologyShard(null, links, tps); - } else { - return new TopologyShard(null, null, null); + tps.add(updateTp(tp, true, linkType)); } + return links.size() == 4 && tps.size() == 2 + ? new TopologyShard(null, links, tps) + : new TopologyShard(null, null, null); } - public static TopologyShard updateOtnLinks(List suppOdu4Links, List oldTps, - String serviceRate, Short tribPortNb, Short tribSoltNb, boolean isDeletion) { + public static TopologyShard updateOtnLinks(List suppOduLinks, List oldTps, + Uint32 serviceRate, Short tribPortNb, Short minTribSlotNb, Short maxTribSlotNb, boolean isDeletion) { + List links = new ArrayList<>(); - Long bwIncr = 10000L; - if ("1G".equals(serviceRate)) { - bwIncr = 1000L; + if (!SERVICERATE_BWINCR_MAP.containsKey(serviceRate)) { + LOG.warn("Error with not managed service rate {}", serviceRate.toString()); + return new TopologyShard(null, null, null); } - for (Link link : suppOdu4Links) { - if (link.augmentation(Link1.class) != null && link.augmentation(Link1.class).getAvailableBandwidth() != null - && link.augmentation(Link1.class).getUsedBandwidth() != null) { + Long bwIncr = SERVICERATE_BWINCR_MAP.get(serviceRate); + for (Link link : suppOduLinks) { + if (link.augmentation(Link1.class) == null + || link.augmentation(Link1.class).getAvailableBandwidth() == null + || link.augmentation(Link1.class).getUsedBandwidth() == null) { + LOG.error(OTN_PARAMS_ERROR, link.getLinkId().getValue()); + } else { Uint32 avlBw = link.augmentation(Link1.class).getAvailableBandwidth(); Uint32 usedBw = link.augmentation(Link1.class).getUsedBandwidth(); if (avlBw.toJava() < bwIncr) { bwIncr = 0L; } - if (isDeletion) { - links.add(updateOtnLinkBwParameters(link, avlBw.toJava() + bwIncr, - usedBw.toJava() - bwIncr)); - } else { - links.add(updateOtnLinkBwParameters(link, avlBw.toJava() - bwIncr, - usedBw.toJava() + bwIncr)); - } - } else { - LOG.error("Error with otn parameters of supported link {}", link.getLinkId().getValue()); + links.add( + isDeletion + ? updateOtnLinkBwParameters(link, avlBw.toJava() + bwIncr, usedBw.toJava() - bwIncr) + : updateOtnLinkBwParameters(link, avlBw.toJava() - bwIncr, usedBw.toJava() + bwIncr) + ); } } List tps = new ArrayList<>(); for (TerminationPoint tp : oldTps) { - if (bwIncr != 0) { - tps.add(updateNodeTpTsPool(tp, serviceRate, tribPortNb, tribSoltNb, isDeletion)); + if (bwIncr > 0L) { + tps.add(updateNodeTpTsPool(tp, serviceRate, tribPortNb, minTribSlotNb, maxTribSlotNb, isDeletion)); } } - if (!links.isEmpty() && !tps.isEmpty()) { - return new TopologyShard(null, links, tps); - } else { + if (links.isEmpty() || tps.isEmpty()) { LOG.error("unable to update otn links"); return new TopologyShard(null, null, null); + } else { + return new TopologyShard(null, links, tps); } } - public static TopologyShard deleteOtnLinks(List suppOtu4Links, List oldTps) { + public static TopologyShard updateOtnLinks(List suppOtuLinks, boolean isDeletion) { + List links = new ArrayList<>(); - for (Link link : suppOtu4Links) { - if (link.augmentation(Link1.class) != null) { - links.add(updateOtnLinkBwParameters(link, 100000L, 0L)); + for (Link link : suppOtuLinks) { + if (link.augmentation(Link1.class) == null + || link.augmentation(Link1.class).getAvailableBandwidth() == null + || link.augmentation(Link1.class).getUsedBandwidth() == null) { + LOG.error(OTN_PARAMS_ERROR, link.getLinkId().getValue()); } else { - LOG.error("Error with otn parameters of supported link {}", link.getLinkId().getValue()); + links.add( + isDeletion + ? updateOtnLinkBwParameters(link, Long.valueOf(100000), Long.valueOf(0)) + : updateOtnLinkBwParameters(link, Long.valueOf(0), Long.valueOf(100000)) + ); + } + } + if (links.isEmpty()) { + LOG.error("unable to update otn links"); + return new TopologyShard(null, null, null); + } else { + return new TopologyShard(null, links, null); + } + } + + public static TopologyShard deleteOtnLinks(List suppOtuLinks, List oldTps, + OtnLinkType linkType) { + + List links = new ArrayList<>(); + for (Link link : suppOtuLinks) { + if (link.augmentation(Link1.class) == null + || link.augmentation( + org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.Link1.class) == null) { + LOG.error(OTN_PARAMS_ERROR, link.getLinkId().getValue()); + return new TopologyShard(null, null, null); } + OtnLinkType otnLinkType = link.augmentation( + org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.Link1.class).getOtnLinkType(); + if (!OTNLINKTYPE_OTU_BW_MAP.containsKey(otnLinkType)) { + //TODO shouldn't other link type listed in OTNLINKTYPE_BW_MAP be handled too ? + LOG.warn("Unexpected otn-link-type {} for link {}", otnLinkType, link.getLinkId()); + continue; + } + links.add(updateOtnLinkBwParameters(link, OTNLINKTYPE_OTU_BW_MAP.get(otnLinkType) , 0L)); } List tps = new ArrayList<>(); for (TerminationPoint tp : oldTps) { - tps.add(updateTp(tp, false)); - } - if (links.size() == 2 && tps.size() == 2) { - return new TopologyShard(null, links, tps); - } else { - return new TopologyShard(null, null, null); + tps.add(updateTp(tp, false, linkType)); } + return + links.isEmpty() || tps.isEmpty() + ? new TopologyShard(null, null, null) + : new TopologyShard(null, links, tps); } private static List initialiseOtnLinks(String nodeA, String tpA, String nodeZ, String tpZ, - OtnLinkType linkType, String linkIdPrefix) { + OtnLinkType linkType) { + List links = new ArrayList<>(); - org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.Link1 tpceLink1 - = new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.Link1Builder() - .setOtnLinkType(linkType).build(); - Link1 otnLink1 = new Link1Builder() - .setAvailableBandwidth(Uint32.valueOf(100000)) - .setUsedBandwidth(Uint32.valueOf(0)) - .build(); - // create link A-Z - String nodeATopo; - String nodeZTopo; - if (nodeA.contains(XPDR) && nodeZ.contains(XPDR)) { - nodeATopo = nodeA; - nodeZTopo = nodeZ; + String nodeATopo = formatNodeName(nodeA, tpA); + String nodeZTopo = formatNodeName(nodeZ, tpZ); + org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.Link1 tpceLink1 + = new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.Link1Builder() + .setOtnLinkType(linkType).build(); + Link1Builder otnLink1Bldr = new Link1Builder() + .setUsedBandwidth(Uint32.valueOf(0)); + if (OTNLINKTYPE_OTU_BW_MAP.containsKey(linkType)) { + otnLink1Bldr.setAvailableBandwidth(Uint32.valueOf(OTNLINKTYPE_OTU_BW_MAP.get(linkType))); + } else if (OTNLINKTYPE_BW_MAP.containsKey(linkType)) { + otnLink1Bldr.setAvailableBandwidth(Uint32.valueOf(OTNLINKTYPE_BW_MAP.get(linkType))); } else { - nodeATopo = nodeA + "-" + tpA.split("-")[0]; - nodeZTopo = nodeZ + "-" + tpZ.split("-")[0]; + LOG.error("unable to set available bandwidth to unknown link type"); } - LinkBuilder ietfLinkAZBldr = TopologyUtils.createLink(nodeATopo, nodeZTopo, tpA, tpZ, linkIdPrefix); - ietfLinkAZBldr + // create link A-Z + LinkBuilder ietfLinkAZBldr = TopologyUtils.createLink(nodeATopo, nodeZTopo, tpA, tpZ, linkType.getName()); + links.add(ietfLinkAZBldr .addAugmentation(tpceLink1) - .addAugmentation(otnLink1) + .addAugmentation(otnLink1Bldr.build()) .addAugmentation( - new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1Builder( + new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1Builder( ietfLinkAZBldr.augmentation( - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1.class)) - .setLinkType(OpenroadmLinkType.OTNLINK) - .setOperationalState(State.InService) - .setAdministrativeState(AdminStates.InService) - .build()); - links.add(ietfLinkAZBldr.build()); + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1.class)) + .setLinkType(OpenroadmLinkType.OTNLINK) + .setOperationalState(State.InService) + .setAdministrativeState(AdminStates.InService) + .build()) + .build()); // create link Z-A - LinkBuilder ietfLinkZABldr = TopologyUtils.createLink(nodeZTopo, nodeATopo, tpZ, tpA, linkIdPrefix); - ietfLinkZABldr + LinkBuilder ietfLinkZABldr = TopologyUtils.createLink(nodeZTopo, nodeATopo, tpZ, tpA, linkType.getName()); + links.add(ietfLinkZABldr .addAugmentation(tpceLink1) - .addAugmentation(otnLink1) + .addAugmentation(otnLink1Bldr.build()) .addAugmentation( - new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1Builder( + new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1Builder( ietfLinkZABldr.augmentation( - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1.class)) - .setLinkType(OpenroadmLinkType.OTNLINK) - .setOperationalState(State.InService) - .setAdministrativeState(AdminStates.InService) - .build()); - links.add(ietfLinkZABldr.build()); + org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1.class)) + .setLinkType(OpenroadmLinkType.OTNLINK) + .setOperationalState(State.InService) + .setAdministrativeState(AdminStates.InService) + .build()) + .build()); return links; } private static Link updateOtnLinkBwParameters(Link link, Long availBw, Long usedBw) { + LOG.debug("in updateOtnLinkBwParameters with availBw = {}, usedBw = {}", availBw, usedBw); - LinkBuilder updatedLinkBldr = new LinkBuilder(link); - Link1Builder updatedLink1Bldr = new Link1Builder(link.augmentation(Link1.class)) - .setAvailableBandwidth(Uint32.valueOf(availBw)) - .setUsedBandwidth(Uint32.valueOf(usedBw)); - updatedLinkBldr.addAugmentation(updatedLink1Bldr.build()); - return updatedLinkBldr.build(); + return new LinkBuilder(link) + .addAugmentation( + new Link1Builder(link.augmentation(Link1.class)) + .setAvailableBandwidth(Uint32.valueOf(availBw)) + .setUsedBandwidth(Uint32.valueOf(usedBw)) + .build()) + .build(); } - private static TerminationPoint updateTp(TerminationPoint originalTp, boolean addingTsTpnPoolTermination) { + private static List updateOtnLinkBwParameters(List supportedLinks, OtnLinkType linkType) { + + LOG.debug("in updateOtnLinkBwParameters with supportedLinks = {}, linkType = {}", supportedLinks, linkType); + List updatedlinks = new ArrayList<>(); + for (Link link : supportedLinks) { + updatedlinks.add( + new LinkBuilder(link) + .addAugmentation(new Link1Builder(link.augmentation(Link1.class)) + .setAvailableBandwidth(Uint32.valueOf(0)) + .setUsedBandwidth( + OTNLINKTYPE_BW_MAP.containsKey(linkType) + ? Uint32.valueOf(OTNLINKTYPE_BW_MAP.get(linkType)) + : Uint32.valueOf(0)) + .build()) + .build()); + } + return updatedlinks; + } + + private static TerminationPoint updateTp(TerminationPoint originalTp, boolean addingTsTpnPoolTermination, + OtnLinkType linkType) { + LOG.debug("in updateTp"); TerminationPointBuilder tpBldr = new TerminationPointBuilder(originalTp); - TerminationPoint1Builder otnTp1Bldr = new TerminationPoint1Builder( - tpBldr.augmentation(TerminationPoint1.class)); - XpdrTpPortConnectionAttributesBuilder xtpcaBldr = new XpdrTpPortConnectionAttributesBuilder(otnTp1Bldr - .getXpdrTpPortConnectionAttributes()); + TerminationPoint1Builder otnTp1Bldr = + new TerminationPoint1Builder(tpBldr.augmentation(TerminationPoint1.class)); + XpdrTpPortConnectionAttributesBuilder xtpcaBldr = + new XpdrTpPortConnectionAttributesBuilder(otnTp1Bldr.getXpdrTpPortConnectionAttributes()); if (addingTsTpnPoolTermination) { List tsPool = new ArrayList<>(); - for (int i = 0; i < NB_TRIB_SLOTS; i++) { - tsPool.add(Uint16.valueOf(i + 1)); + for (int i = 1; i <= NB_TRIB_SLOTS; i++) { + tsPool.add(Uint16.valueOf(i)); } xtpcaBldr.setTsPool(tsPool); List tpnPool = new ArrayList<>(); - for (int i = 1; i <= NB_TRIB_PORTS; i++) { + int nbTribPort = NB_TRIB_PORTS; + if (OtnLinkType.ODUC4.equals(linkType)) { + nbTribPort = 4; + } + for (int i = 1; i <= nbTribPort; i++) { tpnPool.add(Uint16.valueOf(i)); } - OdtuTpnPool oduTpnPool = new OdtuTpnPoolBuilder().setOdtuType(ODTU4TsAllocated.class) - .setTpnPool(tpnPool).build(); + OdtuTpnPool oduTpnPool = new OdtuTpnPoolBuilder() + .setOdtuType(ODTU4TsAllocated.class) + .setTpnPool(tpnPool) + .build(); xtpcaBldr.setOdtuTpnPool(ImmutableMap.of(oduTpnPool.key(),oduTpnPool)); } else { xtpcaBldr.setTsPool(null); @@ -311,155 +434,148 @@ public final class OpenRoadmOtnTopology { return tpBldr.addAugmentation(otnTp1Bldr.setXpdrTpPortConnectionAttributes(xtpcaBldr.build()).build()).build(); } - private static TerminationPoint updateNodeTpTsPool(TerminationPoint tp, String serviceRate, Short tribPortNb, - Short tribSlotNb, boolean isDeletion) { + private static TerminationPoint updateNodeTpTsPool(TerminationPoint tp, Uint32 serviceRate, Short tribPortNb, + Short minTribSlotNb, Short maxTribSlotNb, boolean isDeletion) { + LOG.debug("in updateNodeTpTsPool"); TerminationPointBuilder tpBldr = new TerminationPointBuilder(tp); @Nullable - XpdrTpPortConnectionAttributesBuilder xtpcaBldr = new XpdrTpPortConnectionAttributesBuilder( - tpBldr.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes()); + XpdrTpPortConnectionAttributesBuilder xtpcaBldr = + new XpdrTpPortConnectionAttributesBuilder( + tpBldr.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes()); List tsPool = new ArrayList<>(xtpcaBldr.getTsPool()); - switch (serviceRate) { - case "1G": - if (isDeletion) { - tsPool.add(Uint16.valueOf(tribSlotNb)); - } else { - tsPool.remove(Uint16.valueOf(tribSlotNb)); - } - break; - case "10G": - if (isDeletion) { - for (int i = 0; i < NB_TRIB_SLOT_PER_10GE; i++) { - tsPool.add(Uint16.valueOf(tribSlotNb + i)); - } - } else { - for (int i = 0; i < NB_TRIB_SLOT_PER_10GE; i++) { - tsPool.remove(Uint16.valueOf(tribSlotNb + i)); - } - } - break; - default: - LOG.error("error updating tpn and ts pool for tp {}", tp.getTpId().getValue()); - break; + if (isDeletion) { + for (int i = minTribSlotNb; i <= maxTribSlotNb; i++) { + tsPool.add(Uint16.valueOf(i)); + } + } else { + for (int i = minTribSlotNb; i <= maxTribSlotNb; i++) { + tsPool.remove(Uint16.valueOf(i)); + } } xtpcaBldr.setTsPool(tsPool); List tpnPool; List odtuTpnPoolValues = new ArrayList<>(xtpcaBldr.getOdtuTpnPool().values()); - if (odtuTpnPoolValues.get(0).getTpnPool() != null) { + if (odtuTpnPoolValues.get(0).getTpnPool() == null) { + tpnPool = new ArrayList<>(); + } else { tpnPool = new ArrayList<>(odtuTpnPoolValues.get(0).getTpnPool()); if (isDeletion) { tpnPool.add(Uint16.valueOf(tribPortNb)); } else { tpnPool.remove(Uint16.valueOf(tribPortNb)); } + } + Class odtuType; + if (SERVICERATE_ODTUTYPECLASS_MAP.containsKey(serviceRate)) { + odtuType = SERVICERATE_ODTUTYPECLASS_MAP.get(serviceRate); } else { - tpnPool = new ArrayList<>(); + odtuType = null; + LOG.warn("Unable to set the odtu-type"); } - OdtuTpnPool odtuTpnPool = new OdtuTpnPoolBuilder().setOdtuType(ODTU4TsAllocated.class) - .setTpnPool(tpnPool).build(); - xtpcaBldr.setOdtuTpnPool(ImmutableMap.of(odtuTpnPool.key(),odtuTpnPool)); - - tpBldr.addAugmentation(new TerminationPoint1Builder(tp.augmentation(TerminationPoint1.class)) - .setXpdrTpPortConnectionAttributes(xtpcaBldr.build()).build()); - return tpBldr.build(); + OdtuTpnPool odtuTpnPool = new OdtuTpnPoolBuilder() + .setOdtuType(odtuType) + .setTpnPool(tpnPool) + .build(); + return tpBldr + .addAugmentation( + new TerminationPoint1Builder(tp.augmentation(TerminationPoint1.class)) + .setXpdrTpPortConnectionAttributes( + xtpcaBldr + .setOdtuTpnPool(ImmutableMap.of(odtuTpnPool.key(),odtuTpnPool)) + .build()) + .build()) + .build(); } private static Map convertPortMappingToOtnNodeList(Nodes mappingNode) { - List networkMappings = mappingNode.nonnullMapping().values() - .stream().filter(k -> k.getLogicalConnectionPoint() - .contains("NETWORK")).collect(Collectors.toList()); + + List networkMappings = + mappingNode.nonnullMapping().values().stream() + .filter(k -> k.getLogicalConnectionPoint().contains("NETWORK")) + .collect(Collectors.toList()); Map xpdrMap = new HashMap<>(); for (Mapping mapping : networkMappings) { Integer xpdrNb = Integer.parseInt(mapping.getLogicalConnectionPoint().split("XPDR")[1].split("-")[0]); if (!xpdrMap.containsKey(xpdrNb)) { - List xpdrNetMaps = mappingNode.nonnullMapping().values() - .stream().filter(k -> k.getLogicalConnectionPoint() - .contains("XPDR" + xpdrNb + NETWORK)).collect(Collectors.toList()); - List xpdrClMaps = mappingNode.nonnullMapping().values() - .stream().filter(k -> k.getLogicalConnectionPoint() - .contains("XPDR" + xpdrNb + CLIENT)).collect(Collectors.toList()); - OtnTopoNode otnNode = null; - if (mapping.getXponderType() != null) { - otnNode = new OtnTopoNode(mappingNode.getNodeId(), mappingNode.getNodeInfo().getNodeClli(), xpdrNb, - mapping.getXponderType(), fillConnectionMapLcp(xpdrNetMaps), fillConnectionMapLcp(xpdrClMaps), - xpdrNetMaps, xpdrClMaps); - } else { - otnNode = new OtnTopoNode(mappingNode.getNodeId(), mappingNode.getNodeInfo().getNodeClli(), xpdrNb, - XpdrNodeTypes.Tpdr, fillConnectionMapLcp(xpdrNetMaps), fillConnectionMapLcp(xpdrClMaps), - xpdrNetMaps, xpdrClMaps); - } - xpdrMap.put(xpdrNb, otnNode); + List xpdrNetMaps = + mappingNode.nonnullMapping().values().stream() + .filter(k -> k.getLogicalConnectionPoint().contains("XPDR" + xpdrNb + NETWORK)) + .collect(Collectors.toList()); + List xpdrClMaps = + mappingNode.nonnullMapping().values().stream() + .filter(k -> k.getLogicalConnectionPoint().contains("XPDR" + xpdrNb + CLIENT)) + .collect(Collectors.toList()); + xpdrMap.put( + xpdrNb, + new OtnTopoNode( + mappingNode.getNodeId(), + mappingNode.getNodeInfo().getNodeClli(), + xpdrNb, + mapping.getXponderType() == null + ? XpdrNodeTypes.Tpdr + : mapping.getXponderType(), + fillConnectionMapLcp(xpdrNetMaps), + fillConnectionMapLcp(xpdrClMaps), + xpdrNetMaps, + xpdrClMaps + )); } } LOG.debug("there are {} xpdr to build", xpdrMap.size()); - xpdrMap.forEach((k, v) -> LOG.debug("xpdr {} = {} - {} - {} - {}", k, v.getNodeId(), v.getNodeType(), - v.getNbTpClient(), v.getNbTpNetwork())); + xpdrMap.forEach((k, v) -> LOG.debug("xpdr {} = {} - {} - {} - {}", + k, v.getNodeId(), v.getNodeType(), v.getNbTpClient(), v.getNbTpNetwork())); return xpdrMap; } private static Map fillConnectionMapLcp(List mappingList) { + Map xpdrConnectionMap = new HashMap<>(); for (Mapping map : mappingList) { - if (map.getConnectionMapLcp() != null) { - xpdrConnectionMap.put(map.getLogicalConnectionPoint(), map.getConnectionMapLcp()); - } else { - xpdrConnectionMap.put(map.getLogicalConnectionPoint(), null); - } + xpdrConnectionMap.put(map.getLogicalConnectionPoint(), map.getConnectionMapLcp()); } return xpdrConnectionMap; } private static Node createTpdr(OtnTopoNode node) { - // create otn-topology node augmentation - XpdrAttributes xpdrAttr = new XpdrAttributesBuilder() - .setXpdrNumber(Uint16.valueOf(node.getXpdrNb())) - .build(); - Node1 otnNodeAug = new Node1Builder() - .setXpdrAttributes(xpdrAttr) - .build(); - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 ocnNodeAug = - new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1Builder() - .setNodeType(OpenroadmNodeType.TPDR) - .setOperationalState(State.InService) - .setAdministrativeState(AdminStates.InService) - .build(); - // create ietf node augmentation to add TP list Map tpMap = new HashMap<>(); - // creation of tps createTP(tpMap, node, OpenroadmTpType.XPONDERCLIENT, false); createTP(tpMap, node, OpenroadmTpType.XPONDERNETWORK, true); - - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1 ietfNodeAug = - new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder() - .setTerminationPoint(tpMap) - .build(); - // return ietfNode return new NodeBuilder() .setNodeId(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())) .withKey(new NodeKey(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))) .setSupportingNode(createSupportingNodes(node)) - .addAugmentation(otnNodeAug) - .addAugmentation(ocnNodeAug) - .addAugmentation(ietfNodeAug) + .addAugmentation( + new Node1Builder() + .setXpdrAttributes( + new XpdrAttributesBuilder() + .setXpdrNumber(Uint16.valueOf(node.getXpdrNb())) + .build()) + .build()) + .addAugmentation( + new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder() + .setNodeType(OpenroadmNodeType.TPDR) + .setOperationalState(State.InService) + .setAdministrativeState(AdminStates.InService) + .build()) + .addAugmentation( + new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 + .Node1Builder() + .setTerminationPoint(tpMap) + .build()) .build(); } private static Node createMuxpdr(OtnTopoNode node) { - // create otn-topology node augmentation - // TODO: will need to be completed - TpBandwidthSharing tpBwSh = new TpBandwidthSharingBuilder().build(); - XpdrAttributes xpdrAttr = new XpdrAttributesBuilder() - .setXpdrNumber(Uint16.valueOf(node.getXpdrNb())) - .build(); + // prepare otn-topology node augmentation + // TODO: will need to be completed Map nbMap = new HashMap<>(); for (int i = 1; i <= node.getNbTpClient(); i++) { List tpList = new ArrayList<>(); - TpId tpId = new TpId("XPDR" + node.getXpdrNb() + CLIENT + i); - tpList.add(tpId); - tpId = new TpId("XPDR" + node.getXpdrNb() + "-NETWORK1"); - tpList.add(tpId); + tpList.add(new TpId("XPDR" + node.getXpdrNb() + CLIENT + i)); + tpList.add(new TpId("XPDR" + node.getXpdrNb() + "-NETWORK1")); NonBlockingList nbl = new NonBlockingListBuilder() .setNblNumber(Uint16.valueOf(i)) .setTpList(tpList) @@ -473,53 +589,48 @@ public final class OpenRoadmOtnTopology { .setSwitchingPoolType(SwitchingPoolTypes.NonBlocking) .setNonBlockingList(nbMap) .build(); - SwitchingPools switchingPools = new SwitchingPoolsBuilder() - .setOduSwitchingPools(Map.of(oduSwitchPool.key(),oduSwitchPool)) - .build(); - Node1 otnNodeAug = new Node1Builder() - .setTpBandwidthSharing(tpBwSh) - .setXpdrAttributes(xpdrAttr) - .setSwitchingPools(switchingPools) - .build(); - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 ocnNodeAug = - new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1Builder() - .setNodeType(OpenroadmNodeType.MUXPDR) - .setAdministrativeState(AdminStates.InService) - .setOperationalState(State.InService) - .build(); - - // create ietf node augmentation to add TP list Map tpMap = new HashMap<>(); - // creation of tps createTP(tpMap, node, OpenroadmTpType.XPONDERCLIENT, true); createTP(tpMap, node, OpenroadmTpType.XPONDERNETWORK, true); - - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1 ietfNodeAug = - new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder() - .setTerminationPoint(tpMap) - .build(); - // return ietfNode return new NodeBuilder() .setNodeId(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())) .withKey(new NodeKey(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))) .setSupportingNode(createSupportingNodes(node)) - .addAugmentation(otnNodeAug) - .addAugmentation(ocnNodeAug) - .addAugmentation(ietfNodeAug) + .addAugmentation( + new Node1Builder() + .setTpBandwidthSharing(new TpBandwidthSharingBuilder().build()) + .setXpdrAttributes( + new XpdrAttributesBuilder() + .setXpdrNumber(Uint16.valueOf(node.getXpdrNb())) + .build()) + .setSwitchingPools( + new SwitchingPoolsBuilder() + .setOduSwitchingPools(Map.of(oduSwitchPool.key(),oduSwitchPool)) + .build()) + .build()) + .addAugmentation( + new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder() + .setNodeType(OpenroadmNodeType.MUXPDR) + .setAdministrativeState(AdminStates.InService) + .setOperationalState(State.InService) + .build()) + .addAugmentation( + new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 + .Node1Builder() + .setTerminationPoint(tpMap) + .build()) .build(); } private static Node createSwitch(OtnTopoNode node) { + List tpl = new ArrayList<>(); - TpId tpId = null; for (int i = 1; i <= node.getNbTpClient(); i++) { - tpId = new TpId("XPDR" + node.getXpdrNb() + CLIENT + i); - tpl.add(tpId); + tpl.add(new TpId("XPDR" + node.getXpdrNb() + CLIENT + i)); } for (int i = 1; i <= node.getNbTpNetwork(); i++) { - tpId = new TpId("XPDR" + node.getXpdrNb() + NETWORK + i); - tpl.add(tpId); + tpl.add(new TpId("XPDR" + node.getXpdrNb() + NETWORK + i)); } Map nbMap = new HashMap<>(); NonBlockingList nbl = new NonBlockingListBuilder() @@ -527,7 +638,6 @@ public final class OpenRoadmOtnTopology { .setTpList(tpl) .build(); nbMap.put(nbl.key(),nbl); - OduSwitchingPools oduSwitchPool = new OduSwitchingPoolsBuilder() .setSwitchingPoolNumber(Uint16.valueOf(1)) .setSwitchingPoolType(SwitchingPoolTypes.NonBlocking) @@ -535,52 +645,43 @@ public final class OpenRoadmOtnTopology { .build(); Map oduSwitchPoolList = new HashMap<>(); oduSwitchPoolList.put(oduSwitchPool.key(),oduSwitchPool); - SwitchingPools switchingPools = new SwitchingPoolsBuilder() - .setOduSwitchingPools(oduSwitchPoolList) - .build(); - - // create otn-topology node augmentation - // TODO: will need to be completed - TpBandwidthSharing tpBwSh = new TpBandwidthSharingBuilder().build(); - XpdrAttributes xpdrAttr = new XpdrAttributesBuilder() - .setXpdrNumber(Uint16.valueOf(node.getXpdrNb())) - .build(); - - Node1 otnNodeAug = new Node1Builder() - .setTpBandwidthSharing(tpBwSh) - .setXpdrAttributes(xpdrAttr) - .setSwitchingPools(switchingPools) - .build(); - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 ocnNodeAug = - new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1Builder() - .setNodeType(OpenroadmNodeType.SWITCH) - .setOperationalState(State.InService) - .setAdministrativeState(AdminStates.InService) - .build(); - - // create ietf node augmentation to add TP list Map tpMap = new HashMap<>(); - // creation of tps createTP(tpMap, node, OpenroadmTpType.XPONDERCLIENT, true); createTP(tpMap, node, OpenroadmTpType.XPONDERNETWORK, true); - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1 ietfNodeAug = - new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder() - .setTerminationPoint(tpMap) - .build(); - // return ietfNode return new NodeBuilder() .setNodeId(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())) .withKey(new NodeKey(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))) .setSupportingNode(createSupportingNodes(node)) - .addAugmentation(otnNodeAug) - .addAugmentation(ocnNodeAug) - .addAugmentation(ietfNodeAug) + .addAugmentation( + new Node1Builder() + .setTpBandwidthSharing(new TpBandwidthSharingBuilder().build()) + .setXpdrAttributes( + new XpdrAttributesBuilder() + .setXpdrNumber(Uint16.valueOf(node.getXpdrNb())) + .build()) + .setSwitchingPools( + new SwitchingPoolsBuilder() + .setOduSwitchingPools(oduSwitchPoolList) + .build()) + .build()) + .addAugmentation( + new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder() + .setNodeType(OpenroadmNodeType.SWITCH) + .setOperationalState(State.InService) + .setAdministrativeState(AdminStates.InService) + .build()) + .addAugmentation( + new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226 + .Node1Builder() + .setTerminationPoint(tpMap) + .build()) .build(); } private static void createTP(Map tpMap, OtnTopoNode node, OpenroadmTpType tpType, boolean withRate) { + List mappings = null; switch (tpType) { case XPONDERNETWORK: @@ -598,37 +699,52 @@ public final class OpenRoadmOtnTopology { private static void fillTpMap(Map tpMap, OtnTopoNode node, OpenroadmTpType tpType, boolean withRate, List mappings) { + for (Mapping mapping : mappings) { // openroadm-otn-topoology augmentation Map supIfMap = new HashMap<>(); - for (Class supInterCapa : mapping.getSupportedInterfaceCapability()) { - SupportedInterfaceCapability supIfCapa = new SupportedInterfaceCapabilityBuilder() - .withKey(new SupportedInterfaceCapabilityKey(convertSupIfCapa(supInterCapa))) - .setIfCapType(convertSupIfCapa(supInterCapa)) - .build(); - supIfMap.put(supIfCapa.key(), supIfCapa); - } - TpSupportedInterfaces tpSupIf = new TpSupportedInterfacesBuilder() - .setSupportedInterfaceCapability(supIfMap) - .build(); - XpdrTpPortConnectionAttributesBuilder xtpcaBldr = new XpdrTpPortConnectionAttributesBuilder(); - if (withRate) { - xtpcaBldr.setRate(fixRate(mapping.getSupportedInterfaceCapability().get(0))); + TerminationPoint1Builder otnTp1Bldr = new TerminationPoint1Builder(); + if (mapping.getSupportedInterfaceCapability() == null) { + LOG.warn("mapping {} of node {} has no if-cap-type", + mapping.getLogicalConnectionPoint(), node.getNodeId()); + } else { + XpdrTpPortConnectionAttributesBuilder xtpcaBldr = new XpdrTpPortConnectionAttributesBuilder(); + for (Class supInterCapa : mapping.getSupportedInterfaceCapability()) { + SupportedInterfaceCapability supIfCapa = new SupportedInterfaceCapabilityBuilder() + .withKey(new SupportedInterfaceCapabilityKey(supInterCapa)) + .setIfCapType(supInterCapa) + .build(); + supIfMap.put(supIfCapa.key(), supIfCapa); + } + otnTp1Bldr.setTpSupportedInterfaces( + new TpSupportedInterfacesBuilder() + .setSupportedInterfaceCapability(supIfMap) + .build() + ); + //TODO: It is not logical to assign a priori one of the possible rate to the TP. + //Would be worth assigning per default "unallocated" at the tp creation step, + //and updating it with correct rate when it supports a specific service. + if (withRate) { + otnTp1Bldr.setXpdrTpPortConnectionAttributes( + xtpcaBldr.setRate(fixRate(mapping.getSupportedInterfaceCapability())).build()); + } } - TerminationPoint1 otnTp1 = new TerminationPoint1Builder() - .setTpSupportedInterfaces(tpSupIf) - .setXpdrTpPortConnectionAttributes(xtpcaBldr.build()) - .build(); - org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1Builder tpceTp1Bldr = - new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1Builder(); - TpId tpId = new TpId(mapping.getLogicalConnectionPoint()); - setclientNwTpAttr(tpMap, node, tpId, tpType, otnTp1, tpceTp1Bldr); + setclientNwTpAttr( + tpMap, + node, + new TpId(mapping.getLogicalConnectionPoint()), + tpType, + otnTp1Bldr.build(), + new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.TerminationPoint1Builder(), + mapping); } } private static void setclientNwTpAttr(Map tpMap, OtnTopoNode node, TpId tpId, OpenroadmTpType tpType, TerminationPoint1 otnTp1, - org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1Builder tpceTp1Bldr) { + org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.TerminationPoint1Builder tpceTp1Bldr, + Mapping mapping) { + switch (tpType) { case XPONDERNETWORK: if (node.getXpdrNetConnectionMap().get(tpId.getValue()) != null) { @@ -637,16 +753,17 @@ public final class OpenRoadmOtnTopology { SupportingTerminationPoint stp = new SupportingTerminationPointBuilder() .setNetworkRef(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)) .setNodeRef(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())) - .setTpRef(tpId.getValue()) + .setTpRef(tpId) .build(); - TerminationPoint ietfTpNw = buildIetfTp(tpceTp1Bldr, otnTp1, tpType, tpId, Map.of(stp.key(), stp)); + TerminationPoint ietfTpNw = + buildIetfTp(tpceTp1Bldr, otnTp1, tpType, tpId, Map.of(stp.key(), stp), mapping); tpMap.put(ietfTpNw.key(),ietfTpNw); break; case XPONDERCLIENT: if (node.getXpdrCliConnectionMap().get(tpId.getValue()) != null) { tpceTp1Bldr.setAssociatedConnectionMapPort(node.getXpdrCliConnectionMap().get(tpId.getValue())); } - TerminationPoint ietfTpCl = buildIetfTp(tpceTp1Bldr, otnTp1, tpType, tpId, null); + TerminationPoint ietfTpCl = buildIetfTp(tpceTp1Bldr, otnTp1, tpType, tpId, null, mapping); tpMap.put(ietfTpCl.key(),ietfTpCl); break; default: @@ -655,65 +772,41 @@ public final class OpenRoadmOtnTopology { } } - private static Class fixRate(Class ifCapType) { - switch (ifCapType.getSimpleName()) { - case "If100GEODU4": - case "IfOCHOTU4ODU4": - return ODU4.class; - case "If1GEODU0": - return ODU0.class; - case "If10GEODU2e": - return ODU2e.class; - default: - return null; - } - } + private static Class fixRate(List> list) { - private static Class convertSupIfCapa(Class ifCapType) { - switch (ifCapType.getSimpleName()) { - case "If100GEODU4": - return If100GEODU4.class; - case "IfOCHOTU4ODU4": - return IfOCHOTU4ODU4.class; - case "If1GEODU0": - return If1GEODU0.class; - case "If10GEODU2e": - return If10GEODU2e.class; - case "If10GEODU2": - return If10GEODU2.class; - case "If100GE": - return If100GE.class; - case "If10GE": - return If10GE.class; - case "If1GE": - return If1GE.class; - case "IfOCH": - return IfOCH.class; - default: - return null; + for (Class class1 : list) { + if (RATE_MAP.containsKey(class1.getSimpleName())) { + return RATE_MAP.get(class1.getSimpleName()); + } } + return null; } private static Map createSupportingNodes(OtnTopoNode node) { + SupportingNode suppNode1 = new SupportingNodeBuilder() .setNetworkRef(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID)) .setNodeRef(new NodeId(node.getNodeId())) - .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID), - new NodeId(node.getNodeId()))) + .withKey( + new SupportingNodeKey( + new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID), + new NodeId(node.getNodeId()))) .build(); SupportingNode suppNode2 = new SupportingNodeBuilder() .setNetworkRef(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)) .setNodeRef(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())) - .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID), - new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))) + .withKey( + new SupportingNodeKey( + new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID), + new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))) .build(); SupportingNode suppNode3 = new SupportingNodeBuilder() .setNetworkRef(new NetworkId(NetworkUtils.CLLI_NETWORK_ID)) .setNodeRef(new NodeId(node.getClli())) - .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID), - new NodeId(node.getClli()))) + .withKey( + new SupportingNodeKey( + new NetworkId(NetworkUtils.CLLI_NETWORK_ID), + new NodeId(node.getClli()))) .build(); Map suppNodeMap = new HashMap<>(); suppNodeMap.put(suppNode1.key(),suppNode1); @@ -723,9 +816,9 @@ public final class OpenRoadmOtnTopology { } private static TerminationPoint buildIetfTp( - org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1Builder tpceTp1Bldr, - TerminationPoint1 otnTp1, OpenroadmTpType tpType, TpId tpId, - Map supportTpMap) { + org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.TerminationPoint1Builder tpceTp1Bldr, + TerminationPoint1 otnTp1, OpenroadmTpType tpType, TpId tpId, + Map supportTpMap, Mapping mapping) { TerminationPointBuilder ietfTpBldr = new TerminationPointBuilder(); if (tpceTp1Bldr.getAssociatedConnectionMapPort() != null) { @@ -734,17 +827,23 @@ public final class OpenRoadmOtnTopology { if (supportTpMap != null) { ietfTpBldr.setSupportingTerminationPoint(supportTpMap); } - org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1 ocnTp = - new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1Builder() - .setTpType(tpType) - .setAdministrativeState(AdminStates.InService) - .setOperationalState(State.InService) - .build(); - - ietfTpBldr.setTpId(tpId) + return ietfTpBldr + .setTpId(tpId) .withKey(new TerminationPointKey(tpId)) .addAugmentation(otnTp1) - .addAugmentation(ocnTp); - return ietfTpBldr.build(); + .addAugmentation( + new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1Builder() + .setTpType(tpType) + .setAdministrativeState(TopologyUtils.setNetworkAdminState(mapping.getPortAdminState())) + .setOperationalState(TopologyUtils.setNetworkOperState(mapping.getPortOperState())) + .build()) + .build(); + } + + private static String formatNodeName(String nodeName, String tpName) { + + return nodeName.contains(XPDR) + ? nodeName + : new StringBuilder(nodeName).append("-").append(tpName.split("-")[0]).toString(); } }