2 * Copyright © 2020 Orange. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.transportpce.networkmodel.util;
11 import com.google.common.collect.ImmutableMap;
12 import java.util.ArrayList;
13 import java.util.HashMap;
14 import java.util.HashSet;
15 import java.util.List;
18 import java.util.stream.Collectors;
19 import org.eclipse.jdt.annotation.Nullable;
20 import org.opendaylight.transportpce.common.NetworkUtils;
21 import org.opendaylight.transportpce.networkmodel.dto.OtnTopoNode;
22 import org.opendaylight.transportpce.networkmodel.dto.TopologyShard;
23 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.OtnLinkType;
24 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220922.mapping.Mapping;
25 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220922.network.Nodes;
26 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
27 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.XpdrNodeTypes;
28 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
29 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.OduSwitchingPools;
30 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.OduSwitchingPoolsBuilder;
31 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.OduSwitchingPoolsKey;
32 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
33 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListBuilder;
34 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListKey;
35 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
36 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
37 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmTpType;
38 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
39 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityBuilder;
40 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityKey;
41 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODTU4TsAllocated;
42 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODTUCnTs;
43 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODU0;
44 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODU2;
45 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODU2e;
46 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODU4;
47 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OdtuTypeIdentity;
48 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OduRateIdentity;
49 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.Link1;
50 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.Link1Builder;
51 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.Node1Builder;
52 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.TerminationPoint1;
53 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.TerminationPoint1Builder;
54 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.networks.network.node.SwitchingPoolsBuilder;
55 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.networks.network.node.TpBandwidthSharingBuilder;
56 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.networks.network.node.XpdrAttributesBuilder;
57 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.networks.network.node.termination.point.TpSupportedInterfacesBuilder;
58 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.networks.network.node.termination.point.XpdrTpPortConnectionAttributesBuilder;
59 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If100GE;
60 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If100GEODU4;
61 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If10GE;
62 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If10GEODU2;
63 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If10GEODU2e;
64 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If1GEODU0;
65 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If400GE;
66 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOCH;
67 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOCHOTU4ODU4;
68 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOTU4ODU4;
69 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOtsiOtsigroup;
70 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.SupportedIfCapability;
71 import org.opendaylight.yang.gen.v1.http.org.openroadm.switching.pool.types.rev191129.SwitchingPoolTypes;
72 import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev211210.xpdr.otn.tp.attributes.OdtuTpnPool;
73 import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev211210.xpdr.otn.tp.attributes.OdtuTpnPoolBuilder;
74 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
75 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
76 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
77 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeBuilder;
78 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeKey;
79 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNode;
80 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeBuilder;
81 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeKey;
82 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
83 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
84 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkBuilder;
85 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
86 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointBuilder;
87 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointKey;
88 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.termination.point.SupportingTerminationPoint;
89 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.termination.point.SupportingTerminationPointBuilder;
90 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.termination.point.SupportingTerminationPointKey;
91 import org.opendaylight.yangtools.yang.common.Uint16;
92 import org.opendaylight.yangtools.yang.common.Uint32;
93 import org.slf4j.Logger;
94 import org.slf4j.LoggerFactory;
96 public final class OpenRoadmOtnTopology {
98 private static final Logger LOG = LoggerFactory.getLogger(OpenRoadmOtnTopology.class);
99 private static final String CLIENT = "-CLIENT";
100 private static final String NETWORK = "-NETWORK";
101 private static final String XPDR = "-XPDR";
102 private static final String OTN_PARAMS_ERROR = "Error with otn parameters of supported link {}";
103 private static final int NB_TRIB_PORTS = 80;
104 private static final int NB_TRIB_SLOTS = 80;
106 private static final Map<String, OduRateIdentity> RATE_MAP = Map.of(
107 "If100GEODU4", ODU4.VALUE,
108 "IfOCHOTU4ODU4", ODU4.VALUE,
109 "If1GEODU0", ODU0.VALUE,
110 "If10GEODU2", ODU2.VALUE,
111 "If10GEODU2e", ODU2e.VALUE);
112 private static final Map<OtnLinkType, Long> OTNLINKTYPE_BW_MAP = Map.of(
113 OtnLinkType.ODTU4, 100000L,
114 OtnLinkType.ODUC4, 400000L,
115 OtnLinkType.ODUC3, 300000L,
116 OtnLinkType.ODUC2, 200000L);
117 private static final Map<OtnLinkType, Long> OTNLINKTYPE_OTU_BW_MAP = Map.of(
118 OtnLinkType.OTU4, 100000L,
119 OtnLinkType.OTUC4, 400000L);
120 private static final Map<Uint32, Long> SERVICERATE_BWINCR_MAP = Map.of(
121 Uint32.valueOf(1), 1000L,
122 Uint32.valueOf(10), 10000L,
123 Uint32.valueOf(100), 100000L);
124 private static final Map<Uint32, OdtuTypeIdentity> SERVICERATE_ODTUTYPECLASS_MAP = Map.of(
125 Uint32.valueOf(1), ODTU4TsAllocated.VALUE,
126 Uint32.valueOf(10), ODTU4TsAllocated.VALUE,
127 Uint32.valueOf(100), ODTUCnTs.VALUE);
129 private OpenRoadmOtnTopology() {
132 public static TopologyShard createTopologyShard(Nodes mappingNode) {
133 List<Node> nodes = new ArrayList<>();
134 List<Link> links = new ArrayList<>();
135 Map<Integer, OtnTopoNode> xpdrMap = convertPortMappingToOtnNodeList(mappingNode);
136 for (OtnTopoNode node : xpdrMap.values()) {
137 switch (node.getNodeType()) {
139 nodes.add(createTpdr(node));
142 nodes.add(createMuxpdr(node));
145 nodes.add(createSwitch(node));
149 // TODO: Need to revisit this method
150 nodes.add(createRegen(node));
153 LOG.error("unknown otn node type {}", node.getNodeType().getName());
157 return new TopologyShard(nodes, links);
160 public static TopologyShard createOtnLinks(String nodeA, String tpA, String nodeZ, String tpZ,
161 OtnLinkType linkType) {
163 return new TopologyShard(
165 OTNLINKTYPE_OTU_BW_MAP.containsKey(linkType)
166 ? initialiseOtnLinks(nodeA, tpA, nodeZ, tpZ, linkType)
170 public static TopologyShard createOtnLinks(
171 org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.renderer.rpc.result.sp
173 OtnLinkType linkType) {
175 return new TopologyShard(
177 initialiseOtnLinks(notifLink.getATermination().getNodeId(),
178 notifLink.getATermination().getTpId(),
179 notifLink.getZTermination().getNodeId(),
180 notifLink.getZTermination().getTpId(),
184 public static TopologyShard createOtnLinks(
185 org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.renderer.rpc.result.sp
187 List<Link> supportedOtu4links, List<TerminationPoint> supportedTPs, OtnLinkType linkType) {
189 if (OTNLINKTYPE_OTU_BW_MAP.containsKey(linkType)) {
190 return new TopologyShard(
193 notifLink.getATermination().getNodeId(), notifLink.getATermination().getTpId(),
194 notifLink.getZTermination().getNodeId(), notifLink.getZTermination().getTpId(), linkType));
195 } else if (OTNLINKTYPE_BW_MAP.containsKey(linkType)) {
196 List<Link> links = initialiseOtnLinks(
197 notifLink.getATermination().getNodeId(), notifLink.getATermination().getTpId(),
198 notifLink.getZTermination().getNodeId(), notifLink.getZTermination().getTpId(), linkType);
199 links.addAll(updateOtnLinkBwParameters(supportedOtu4links, linkType));
200 List<TerminationPoint> updatedTPs = new ArrayList<>();
201 for (TerminationPoint tp : supportedTPs) {
202 updatedTPs.add(updateTp(tp, true, linkType));
204 return new TopologyShard(null, links, updatedTPs);
210 public static TopologyShard createOtnLinks(List<Link> suppOtuLinks, List<TerminationPoint> oldTps,
211 OtnLinkType linkType) {
213 List<Link> links = new ArrayList<>();
214 for (Link link : suppOtuLinks) {
215 if (link.augmentation(Link1.class) == null) {
216 LOG.error("Error with OTN parameters of supported link {}", link.getLinkId().getValue());
219 if (!OTNLINKTYPE_BW_MAP.containsKey(linkType)) {
220 LOG.error("Error with link {} : unsupported OTN link type", link.getLinkId().getValue());
223 if (link.augmentation(Link1.class).getAvailableBandwidth().longValue() < OTNLINKTYPE_BW_MAP.get(linkType)) {
224 LOG.error("Error with link {} : unsufficient available bandwith", link.getLinkId().getValue());
227 links.add(updateOtnLinkBwParameters(link, 0L, OTNLINKTYPE_BW_MAP.get(linkType)));
229 if (links.size() == 2) {
230 links.addAll(initialiseOtnLinks(suppOtuLinks.get(0).getSource().getSourceNode().getValue(),
231 suppOtuLinks.get(0).getSource().getSourceTp().getValue(),
232 suppOtuLinks.get(0).getDestination().getDestNode().getValue(),
233 suppOtuLinks.get(0).getDestination().getDestTp().getValue(),
236 List<TerminationPoint> tps = new ArrayList<>();
237 for (TerminationPoint tp : oldTps) {
238 tps.add(updateTp(tp, true, linkType));
240 return links.size() == 4 && tps.size() == 2
241 ? new TopologyShard(null, links, tps)
242 : new TopologyShard(null, null, null);
245 public static TopologyShard updateOtnLinks(List<Link> suppOduLinks, List<TerminationPoint> oldTps,
246 Uint32 serviceRate, Short tribPortNb, Short minTribSlotNb, Short maxTribSlotNb, boolean isDeletion) {
248 List<Link> links = new ArrayList<>();
249 if (!SERVICERATE_BWINCR_MAP.containsKey(serviceRate)) {
250 LOG.warn("Error with not managed service rate {}", serviceRate.toString());
251 return new TopologyShard(null, null, null);
253 Long bwIncr = SERVICERATE_BWINCR_MAP.get(serviceRate);
254 for (Link link : suppOduLinks) {
255 if (link.augmentation(Link1.class) == null
256 || link.augmentation(Link1.class).getAvailableBandwidth() == null
257 || link.augmentation(Link1.class).getUsedBandwidth() == null) {
258 LOG.error(OTN_PARAMS_ERROR, link.getLinkId().getValue());
260 Uint32 avlBw = link.augmentation(Link1.class).getAvailableBandwidth();
261 Uint32 usedBw = link.augmentation(Link1.class).getUsedBandwidth();
262 if (avlBw.toJava() < bwIncr) {
267 ? updateOtnLinkBwParameters(link, avlBw.toJava() + bwIncr, usedBw.toJava() - bwIncr)
268 : updateOtnLinkBwParameters(link, avlBw.toJava() - bwIncr, usedBw.toJava() + bwIncr)
272 List<TerminationPoint> tps = new ArrayList<>();
273 for (TerminationPoint tp : oldTps) {
275 tps.add(updateNodeTpTsPool(tp, serviceRate, tribPortNb, minTribSlotNb, maxTribSlotNb, isDeletion));
278 if (links.isEmpty() || tps.isEmpty()) {
279 LOG.error("unable to update otn links");
280 return new TopologyShard(null, null, null);
282 return new TopologyShard(null, links, tps);
286 public static TopologyShard updateOtnLinks(List<Link> suppOtuLinks, boolean isDeletion) {
288 List<Link> links = new ArrayList<>();
289 for (Link link : suppOtuLinks) {
290 if (link.augmentation(Link1.class) == null
291 || link.augmentation(Link1.class).getAvailableBandwidth() == null
292 || link.augmentation(Link1.class).getUsedBandwidth() == null) {
293 LOG.error(OTN_PARAMS_ERROR, link.getLinkId().getValue());
297 ? updateOtnLinkBwParameters(link, Long.valueOf(100000), Long.valueOf(0))
298 : updateOtnLinkBwParameters(link, Long.valueOf(0), Long.valueOf(100000))
302 if (links.isEmpty()) {
303 LOG.error("unable to update otn links");
304 return new TopologyShard(null, null, null);
306 return new TopologyShard(null, links, null);
310 public static TopologyShard deleteOtnLinks(List<Link> suppOtuLinks, List<TerminationPoint> oldTps,
311 OtnLinkType linkType) {
313 List<Link> links = new ArrayList<>();
314 for (Link link : suppOtuLinks) {
315 if (link.augmentation(Link1.class) == null
316 || link.augmentation(
317 org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630
318 .Link1.class) == null) {
319 LOG.error(OTN_PARAMS_ERROR, link.getLinkId().getValue());
320 return new TopologyShard(null, null, null);
322 OtnLinkType otnLinkType = link.augmentation(
323 org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.Link1.class)
325 if (!OTNLINKTYPE_OTU_BW_MAP.containsKey(otnLinkType)) {
326 //TODO shouldn't other link type listed in OTNLINKTYPE_BW_MAP be handled too ?
327 LOG.warn("Unexpected otn-link-type {} for link {}", otnLinkType, link.getLinkId());
330 links.add(updateOtnLinkBwParameters(link, OTNLINKTYPE_OTU_BW_MAP.get(otnLinkType) , 0L));
332 List<TerminationPoint> tps = new ArrayList<>();
333 for (TerminationPoint tp : oldTps) {
334 tps.add(updateTp(tp, false, linkType));
337 links.isEmpty() || tps.isEmpty()
338 ? new TopologyShard(null, null, null)
339 : new TopologyShard(null, links, tps);
342 private static List<Link> initialiseOtnLinks(String nodeA, String tpA, String nodeZ, String tpZ,
343 OtnLinkType linkType) {
345 List<Link> links = new ArrayList<>();
346 String nodeATopo = formatNodeName(nodeA, tpA);
347 String nodeZTopo = formatNodeName(nodeZ, tpZ);
348 org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.Link1 tpceLink1
349 = new org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.Link1Builder()
350 .setOtnLinkType(linkType).build();
351 Link1Builder otnLink1Bldr = new Link1Builder()
352 .setUsedBandwidth(Uint32.valueOf(0));
353 if (OTNLINKTYPE_OTU_BW_MAP.containsKey(linkType)) {
354 otnLink1Bldr.setAvailableBandwidth(Uint32.valueOf(OTNLINKTYPE_OTU_BW_MAP.get(linkType)));
355 } else if (OTNLINKTYPE_BW_MAP.containsKey(linkType)) {
356 otnLink1Bldr.setAvailableBandwidth(Uint32.valueOf(OTNLINKTYPE_BW_MAP.get(linkType)));
358 LOG.error("unable to set available bandwidth to unknown link type");
361 LinkBuilder ietfLinkAZBldr = TopologyUtils.createLink(nodeATopo, nodeZTopo, tpA, tpZ, linkType.getName());
362 links.add(ietfLinkAZBldr
363 .addAugmentation(tpceLink1)
364 .addAugmentation(otnLink1Bldr.build())
366 new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1Builder(
367 ietfLinkAZBldr.augmentation(
368 org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1.class))
369 .setLinkType(OpenroadmLinkType.OTNLINK)
370 .setOperationalState(State.InService)
371 .setAdministrativeState(AdminStates.InService)
375 LinkBuilder ietfLinkZABldr = TopologyUtils.createLink(nodeZTopo, nodeATopo, tpZ, tpA, linkType.getName());
376 links.add(ietfLinkZABldr
377 .addAugmentation(tpceLink1)
378 .addAugmentation(otnLink1Bldr.build())
380 new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1Builder(
381 ietfLinkZABldr.augmentation(
382 org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1.class))
383 .setLinkType(OpenroadmLinkType.OTNLINK)
384 .setOperationalState(State.InService)
385 .setAdministrativeState(AdminStates.InService)
391 private static Link updateOtnLinkBwParameters(Link link, Long availBw, Long usedBw) {
393 LOG.debug("in updateOtnLinkBwParameters with availBw = {}, usedBw = {}", availBw, usedBw);
394 return new LinkBuilder(link)
396 new Link1Builder(link.augmentation(Link1.class))
397 .setAvailableBandwidth(Uint32.valueOf(availBw))
398 .setUsedBandwidth(Uint32.valueOf(usedBw))
403 private static List<Link> updateOtnLinkBwParameters(List<Link> supportedLinks, OtnLinkType linkType) {
405 LOG.debug("in updateOtnLinkBwParameters with supportedLinks = {}, linkType = {}", supportedLinks, linkType);
406 List<Link> updatedlinks = new ArrayList<>();
407 for (Link link : supportedLinks) {
409 new LinkBuilder(link)
410 .addAugmentation(new Link1Builder(link.augmentation(Link1.class))
411 .setAvailableBandwidth(Uint32.valueOf(0))
413 OTNLINKTYPE_BW_MAP.containsKey(linkType)
414 ? Uint32.valueOf(OTNLINKTYPE_BW_MAP.get(linkType))
422 private static TerminationPoint updateTp(TerminationPoint originalTp, boolean addingTsTpnPoolTermination,
423 OtnLinkType linkType) {
425 LOG.debug("in updateTp");
426 TerminationPointBuilder tpBldr = new TerminationPointBuilder(originalTp);
427 TerminationPoint1Builder otnTp1Bldr =
428 new TerminationPoint1Builder(tpBldr.augmentation(TerminationPoint1.class));
429 XpdrTpPortConnectionAttributesBuilder xtpcaBldr =
430 new XpdrTpPortConnectionAttributesBuilder(otnTp1Bldr.getXpdrTpPortConnectionAttributes());
431 if (addingTsTpnPoolTermination) {
432 Set<Uint16> tsPool = new HashSet<>();
433 for (int i = 1; i <= NB_TRIB_SLOTS; i++) {
434 tsPool.add(Uint16.valueOf(i));
436 xtpcaBldr.setTsPool(tsPool);
437 Set<Uint16> tpnPool = new HashSet<>();
438 int nbTribPort = NB_TRIB_PORTS;
439 if (OtnLinkType.ODUC4.equals(linkType)) {
442 for (int i = 1; i <= nbTribPort; i++) {
443 tpnPool.add(Uint16.valueOf(i));
445 OdtuTpnPool oduTpnPool = new OdtuTpnPoolBuilder()
446 .setOdtuType(ODTU4TsAllocated.VALUE)
449 xtpcaBldr.setOdtuTpnPool(ImmutableMap.of(oduTpnPool.key(),oduTpnPool));
451 xtpcaBldr.setTsPool(null);
452 xtpcaBldr.setOdtuTpnPool(ImmutableMap.of());
454 return tpBldr.addAugmentation(otnTp1Bldr.setXpdrTpPortConnectionAttributes(xtpcaBldr.build()).build()).build();
457 private static TerminationPoint updateNodeTpTsPool(TerminationPoint tp, Uint32 serviceRate, Short tribPortNb,
458 Short minTribSlotNb, Short maxTribSlotNb, boolean isDeletion) {
460 LOG.debug("in updateNodeTpTsPool");
461 TerminationPointBuilder tpBldr = new TerminationPointBuilder(tp);
463 XpdrTpPortConnectionAttributesBuilder xtpcaBldr =
464 new XpdrTpPortConnectionAttributesBuilder(
465 tpBldr.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes());
466 Set<Uint16> tsPool = new HashSet<>(xtpcaBldr.getTsPool());
468 for (int i = minTribSlotNb; i <= maxTribSlotNb; i++) {
469 tsPool.add(Uint16.valueOf(i));
472 for (int i = minTribSlotNb; i <= maxTribSlotNb; i++) {
473 tsPool.remove(Uint16.valueOf(i));
476 xtpcaBldr.setTsPool(tsPool);
478 List<OdtuTpnPool> odtuTpnPoolValues = new ArrayList<>(xtpcaBldr.getOdtuTpnPool().values());
479 if (odtuTpnPoolValues.get(0).getTpnPool() == null) {
480 tpnPool = new HashSet<>();
482 tpnPool = new HashSet<>(odtuTpnPoolValues.get(0).getTpnPool());
484 tpnPool.add(Uint16.valueOf(tribPortNb));
486 tpnPool.remove(Uint16.valueOf(tribPortNb));
489 OdtuTypeIdentity odtuType;
490 if (SERVICERATE_ODTUTYPECLASS_MAP.containsKey(serviceRate)) {
491 odtuType = SERVICERATE_ODTUTYPECLASS_MAP.get(serviceRate);
494 LOG.warn("Unable to set the odtu-type");
496 OdtuTpnPool odtuTpnPool = new OdtuTpnPoolBuilder()
497 .setOdtuType(odtuType)
502 new TerminationPoint1Builder(tp.augmentation(TerminationPoint1.class))
503 .setXpdrTpPortConnectionAttributes(
505 .setOdtuTpnPool(ImmutableMap.of(odtuTpnPool.key(),odtuTpnPool))
511 private static Map<Integer, OtnTopoNode> convertPortMappingToOtnNodeList(Nodes mappingNode) {
513 List<Mapping> networkMappings =
514 mappingNode.nonnullMapping().values().stream()
515 .filter(k -> k.getLogicalConnectionPoint().contains("NETWORK"))
516 .collect(Collectors.toList());
517 Map<Integer, OtnTopoNode> xpdrMap = new HashMap<>();
518 for (Mapping mapping : networkMappings) {
519 Integer xpdrNb = Integer.parseInt(mapping.getLogicalConnectionPoint().split("XPDR")[1].split("-")[0]);
520 if (!xpdrMap.containsKey(xpdrNb)) {
521 List<Mapping> xpdrNetMaps =
522 mappingNode.nonnullMapping().values().stream()
523 .filter(k -> k.getLogicalConnectionPoint().contains("XPDR" + xpdrNb + NETWORK))
524 .collect(Collectors.toList());
525 List<Mapping> xpdrClMaps =
526 mappingNode.nonnullMapping().values().stream()
527 .filter(k -> k.getLogicalConnectionPoint().contains("XPDR" + xpdrNb + CLIENT))
528 .collect(Collectors.toList());
532 mappingNode.getNodeId(),
533 mappingNode.getNodeInfo().getNodeClli(),
535 mapping.getXpdrType() == null
537 : mapping.getXpdrType(),
538 fillConnectionMapLcp(xpdrNetMaps),
539 fillConnectionMapLcp(xpdrClMaps),
545 LOG.debug("there are {} xpdr to build", xpdrMap.size());
546 xpdrMap.forEach((k, v) -> LOG.debug("xpdr {} = {} - {} - {} - {}",
547 k, v.getNodeId(), v.getNodeType(), v.getNbTpClient(), v.getNbTpNetwork()));
551 private static Map<String, String> fillConnectionMapLcp(List<Mapping> mappingList) {
553 Map<String, String> xpdrConnectionMap = new HashMap<>();
554 for (Mapping map : mappingList) {
555 xpdrConnectionMap.put(map.getLogicalConnectionPoint(), map.getConnectionMapLcp());
557 return xpdrConnectionMap;
560 private static Node createTpdr(OtnTopoNode node) {
561 Map<TerminationPointKey,TerminationPoint> tpMap = new HashMap<>();
562 createTP(tpMap, node, OpenroadmTpType.XPONDERCLIENT, false);
563 createTP(tpMap, node, OpenroadmTpType.XPONDERNETWORK, true);
565 return new NodeBuilder()
566 .setNodeId(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
567 .withKey(new NodeKey(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())))
568 .setSupportingNode(createSupportingNodes(node))
572 new XpdrAttributesBuilder()
573 .setXpdrNumber(Uint16.valueOf(node.getXpdrNb()))
577 new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder()
578 .setNodeType(OpenroadmNodeType.TPDR)
579 .setOperationalState(State.InService)
580 .setAdministrativeState(AdminStates.InService)
583 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
585 .setTerminationPoint(tpMap)
590 // TODO: This is same as createTpdr. After Open ROADM network models are updated,
591 // we will revisit this method to include regen based data.
592 private static Node createRegen(OtnTopoNode node) {
593 Map<TerminationPointKey,TerminationPoint> tpMap = new HashMap<>();
594 createTP(tpMap, node, OpenroadmTpType.XPONDERCLIENT, false);
595 createTP(tpMap, node, OpenroadmTpType.XPONDERNETWORK, true);
597 return new NodeBuilder()
598 .setNodeId(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
599 .withKey(new NodeKey(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())))
600 .setSupportingNode(createSupportingNodes(node))
604 new XpdrAttributesBuilder()
605 .setXpdrNumber(Uint16.valueOf(node.getXpdrNb()))
609 new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder()
610 .setNodeType(OpenroadmNodeType.TPDR)
611 .setOperationalState(State.InService)
612 .setAdministrativeState(AdminStates.InService)
615 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
617 .setTerminationPoint(tpMap)
622 private static Node createMuxpdr(OtnTopoNode node) {
624 // prepare otn-topology node augmentation
625 // TODO: will need to be completed
626 Map<NonBlockingListKey, NonBlockingList> nbMap = new HashMap<>();
627 for (int i = 1; i <= node.getNbTpClient(); i++) {
628 Set<TpId> tpList = new HashSet<>();
629 tpList.add(new TpId("XPDR" + node.getXpdrNb() + CLIENT + i));
630 tpList.add(new TpId("XPDR" + node.getXpdrNb() + "-NETWORK1"));
631 NonBlockingList nbl = new NonBlockingListBuilder()
632 .setNblNumber(Uint16.valueOf(i))
634 .setAvailableInterconnectBandwidth(Uint32.valueOf(node.getNbTpNetwork() * 10L))
635 .setInterconnectBandwidthUnit(Uint32.valueOf(1000000000))
637 nbMap.put(nbl.key(),nbl);
639 OduSwitchingPools oduSwitchPool = new OduSwitchingPoolsBuilder()
640 .setSwitchingPoolNumber(Uint16.valueOf(1))
641 .setSwitchingPoolType(SwitchingPoolTypes.NonBlocking)
642 .setNonBlockingList(nbMap)
644 Map<TerminationPointKey, TerminationPoint> tpMap = new HashMap<>();
645 createTP(tpMap, node, OpenroadmTpType.XPONDERCLIENT, true);
646 createTP(tpMap, node, OpenroadmTpType.XPONDERNETWORK, true);
648 return new NodeBuilder()
649 .setNodeId(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
650 .withKey(new NodeKey(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())))
651 .setSupportingNode(createSupportingNodes(node))
654 .setTpBandwidthSharing(new TpBandwidthSharingBuilder().build())
656 new XpdrAttributesBuilder()
657 .setXpdrNumber(Uint16.valueOf(node.getXpdrNb()))
660 new SwitchingPoolsBuilder()
661 .setOduSwitchingPools(Map.of(oduSwitchPool.key(),oduSwitchPool))
665 new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder()
666 .setNodeType(OpenroadmNodeType.MUXPDR)
667 .setAdministrativeState(AdminStates.InService)
668 .setOperationalState(State.InService)
671 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
673 .setTerminationPoint(tpMap)
678 private static Node createSwitch(OtnTopoNode node) {
680 Set<TpId> tpl = new HashSet<>();
681 for (int i = 1; i <= node.getNbTpClient(); i++) {
682 tpl.add(new TpId("XPDR" + node.getXpdrNb() + CLIENT + i));
684 for (int i = 1; i <= node.getNbTpNetwork(); i++) {
685 tpl.add(new TpId("XPDR" + node.getXpdrNb() + NETWORK + i));
687 Map<NonBlockingListKey, NonBlockingList> nbMap = new HashMap<>();
688 NonBlockingList nbl = new NonBlockingListBuilder()
689 .setNblNumber(Uint16.valueOf(1))
692 nbMap.put(nbl.key(),nbl);
693 OduSwitchingPools oduSwitchPool = new OduSwitchingPoolsBuilder()
694 .setSwitchingPoolNumber(Uint16.valueOf(1))
695 .setSwitchingPoolType(SwitchingPoolTypes.NonBlocking)
696 .setNonBlockingList(nbMap)
698 Map<OduSwitchingPoolsKey, OduSwitchingPools> oduSwitchPoolList = new HashMap<>();
699 oduSwitchPoolList.put(oduSwitchPool.key(),oduSwitchPool);
700 Map<TerminationPointKey, TerminationPoint> tpMap = new HashMap<>();
701 createTP(tpMap, node, OpenroadmTpType.XPONDERCLIENT, true);
702 createTP(tpMap, node, OpenroadmTpType.XPONDERNETWORK, true);
704 return new NodeBuilder()
705 .setNodeId(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
706 .withKey(new NodeKey(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())))
707 .setSupportingNode(createSupportingNodes(node))
710 .setTpBandwidthSharing(new TpBandwidthSharingBuilder().build())
712 new XpdrAttributesBuilder()
713 .setXpdrNumber(Uint16.valueOf(node.getXpdrNb()))
716 new SwitchingPoolsBuilder()
717 .setOduSwitchingPools(oduSwitchPoolList)
721 new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder()
722 .setNodeType(OpenroadmNodeType.SWITCH)
723 .setOperationalState(State.InService)
724 .setAdministrativeState(AdminStates.InService)
727 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
729 .setTerminationPoint(tpMap)
734 private static void createTP(Map<TerminationPointKey, TerminationPoint> tpMap,
735 OtnTopoNode node, OpenroadmTpType tpType, boolean withRate) {
737 List<Mapping> mappings = null;
740 mappings = node.getXpdrNetMappings();
743 mappings = node.getXpdrClMappings();
746 LOG.error("Error with Termination Point type {}", tpType);
749 fillTpMap(tpMap, node, tpType, withRate, mappings);
752 private static void fillTpMap(Map<TerminationPointKey, TerminationPoint> tpMap, OtnTopoNode node,
753 OpenroadmTpType tpType, boolean withRate, List<Mapping> mappings) {
755 for (Mapping mapping : mappings) {
756 // openroadm-otn-topoology augmentation
757 Map<SupportedInterfaceCapabilityKey, SupportedInterfaceCapability> supIfMap = new HashMap<>();
758 TerminationPoint1Builder otnTp1Bldr = new TerminationPoint1Builder();
759 if (mapping.getSupportedInterfaceCapability() == null) {
760 LOG.warn("mapping {} of node {} has no if-cap-type",
761 mapping.getLogicalConnectionPoint(), node.getNodeId());
763 XpdrTpPortConnectionAttributesBuilder xtpcaBldr = new XpdrTpPortConnectionAttributesBuilder();
764 for (org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.SupportedIfCapability
765 supInterCapa : mapping.getSupportedInterfaceCapability()) {
766 SupportedInterfaceCapability supIfCapa = new SupportedInterfaceCapabilityBuilder()
767 .withKey(new SupportedInterfaceCapabilityKey(convertSupIfCapa(supInterCapa.toString())))
768 .setIfCapType(convertSupIfCapa(supInterCapa.toString()))
770 supIfMap.put(supIfCapa.key(), supIfCapa);
772 otnTp1Bldr.setTpSupportedInterfaces(
773 new TpSupportedInterfacesBuilder()
774 .setSupportedInterfaceCapability(supIfMap)
777 //TODO: It is not logical to assign a priori one of the possible rate to the TP.
778 //Would be worth assigning per default "unallocated" at the tp creation step,
779 //and updating it with correct rate when it supports a specific service.
781 otnTp1Bldr.setXpdrTpPortConnectionAttributes(
782 xtpcaBldr.setRate(fixRate(mapping.getSupportedInterfaceCapability())).build());
788 new TpId(mapping.getLogicalConnectionPoint()),
795 private static void setclientNwTpAttr(Map<TerminationPointKey, TerminationPoint> tpMap, OtnTopoNode node, TpId tpId,
796 OpenroadmTpType tpType, TerminationPoint1 otnTp1, Mapping mapping) {
797 org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1Builder cnTP1BLdr
798 = new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
799 .TerminationPoint1Builder();
802 if (node.getXpdrNetConnectionMap().get(tpId.getValue()) != null) {
803 cnTP1BLdr.setAssociatedConnectionMapTp(Set.of(
804 new TpId(node.getXpdrNetConnectionMap().get(tpId.getValue()))));
806 SupportingTerminationPoint stp = new SupportingTerminationPointBuilder()
807 .setNetworkRef(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))
808 .setNodeRef(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
811 TerminationPoint ietfTpNw =
812 buildIetfTp(cnTP1BLdr, otnTp1, tpType, tpId, Map.of(stp.key(), stp), mapping);
813 tpMap.put(ietfTpNw.key(),ietfTpNw);
816 if (node.getXpdrCliConnectionMap().get(tpId.getValue()) != null) {
817 cnTP1BLdr.setAssociatedConnectionMapTp(Set.of(
818 new TpId(node.getXpdrCliConnectionMap().get(tpId.getValue()))));
820 TerminationPoint ietfTpCl = buildIetfTp(cnTP1BLdr, otnTp1, tpType, tpId, null, mapping);
821 tpMap.put(ietfTpCl.key(),ietfTpCl);
824 LOG.error("Undefined tpType for Termination point {} of {}", tpId.getValue(), node.getNodeId());
829 private static OduRateIdentity fixRate(
830 Set<org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.SupportedIfCapability> list) {
831 for (org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.SupportedIfCapability
833 String simpleName = supIfCap.toString().split("\\{")[0];
834 if (RATE_MAP.containsKey(simpleName)) {
835 return RATE_MAP.get(simpleName);
841 private static Map<SupportingNodeKey,SupportingNode> createSupportingNodes(OtnTopoNode node) {
843 SupportingNode suppNode1 = new SupportingNodeBuilder()
844 .setNetworkRef(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))
845 .setNodeRef(new NodeId(node.getNodeId()))
847 new SupportingNodeKey(
848 new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID),
849 new NodeId(node.getNodeId())))
851 SupportingNode suppNode2 = new SupportingNodeBuilder()
852 .setNetworkRef(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))
853 .setNodeRef(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
855 new SupportingNodeKey(
856 new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID),
857 new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())))
859 SupportingNode suppNode3 = new SupportingNodeBuilder()
860 .setNetworkRef(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))
861 .setNodeRef(new NodeId(node.getClli()))
863 new SupportingNodeKey(
864 new NetworkId(NetworkUtils.CLLI_NETWORK_ID),
865 new NodeId(node.getClli())))
867 Map<SupportingNodeKey,SupportingNode> suppNodeMap = new HashMap<>();
868 suppNodeMap.put(suppNode1.key(),suppNode1);
869 suppNodeMap.put(suppNode2.key(),suppNode2);
870 suppNodeMap.put(suppNode3.key(),suppNode3);
874 private static TerminationPoint buildIetfTp(
875 org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1Builder cnTP1BLdr,
876 TerminationPoint1 otnTp1, OpenroadmTpType tpType, TpId tpId,
877 Map<SupportingTerminationPointKey, SupportingTerminationPoint> supportTpMap, Mapping mapping) {
879 TerminationPointBuilder ietfTpBldr = new TerminationPointBuilder();
880 if (supportTpMap != null) {
881 ietfTpBldr.setSupportingTerminationPoint(supportTpMap);
885 .withKey(new TerminationPointKey(tpId))
886 .addAugmentation(otnTp1)
887 .addAugmentation(cnTP1BLdr.setTpType(tpType)
888 .setAdministrativeState(TopologyUtils.setNetworkAdminState(mapping.getPortAdminState()))
889 .setOperationalState(TopologyUtils.setNetworkOperState(mapping.getPortOperState()))
894 private static String formatNodeName(String nodeName, String tpName) {
896 return nodeName.contains(XPDR)
898 : new StringBuilder(nodeName).append("-").append(tpName.split("-")[0]).toString();
901 private static SupportedIfCapability convertSupIfCapa(String ifCapType) {
902 ImmutableMap<String, SupportedIfCapability> capTypeMap =
903 ImmutableMap.<String, SupportedIfCapability>builder()
904 .put("If400GE{qname=(http://org/openroadm/port/types?revision=2023-05-26)if-400GE}", If400GE.VALUE)
905 .put("IfOTU4ODU4{qname=(http://org/openroadm/port/types?revision=2023-05-26)if-OTU4-ODU4}",
907 .put("IfOtsiOtsigroup{qname=(http://org/openroadm/port/types?revision=2023-05-26)if-otsi-otsigroup}",
908 IfOtsiOtsigroup.VALUE)
909 .put("IfOCH{qname=(http://org/openroadm/port/types?revision=2023-05-26)if-OCH}", IfOCH.VALUE)
910 .put("IfOCHOTU4ODU4{qname=(http://org/openroadm/port/types?revision=2023-05-26)if-OCH-OTU4-ODU4}",
912 .put("If1GEODU0{qname=(http://org/openroadm/port/types?revision=2023-05-26)if-1GE-ODU0}",
914 .put("If10GE{qname=(http://org/openroadm/port/types?revision=2023-05-26)if-10GE}", If10GE.VALUE)
915 .put("If10GEODU2{qname=(http://org/openroadm/port/types?revision=2023-05-26)if-10GE-ODU2}",
917 .put("If10GEODU2e{qname=(http://org/openroadm/port/types?revision=2023-05-26)if-10GE-ODU2e}",
919 .put("If100GE{qname=(http://org/openroadm/port/types?revision=2023-05-26)if-100GE}", If100GE.VALUE)
920 .put("If100GEODU4{qname=(http://org/openroadm/port/types?revision=2023-05-26)if-100GE-ODU4}",
923 if (!capTypeMap.containsKey(ifCapType)) {
924 LOG.error("supported-if-capability {} not supported", ifCapType);
927 return capTypeMap.get(ifCapType);