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.SupportedIfCapability;
60 import org.opendaylight.yang.gen.v1.http.org.openroadm.switching.pool.types.rev191129.SwitchingPoolTypes;
61 import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev211210.xpdr.otn.tp.attributes.OdtuTpnPool;
62 import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev211210.xpdr.otn.tp.attributes.OdtuTpnPoolBuilder;
63 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
64 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
65 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
66 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeBuilder;
67 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeKey;
68 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNode;
69 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeBuilder;
70 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeKey;
71 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
72 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
73 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkBuilder;
74 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
75 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointBuilder;
76 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointKey;
77 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.termination.point.SupportingTerminationPoint;
78 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.termination.point.SupportingTerminationPointBuilder;
79 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.termination.point.SupportingTerminationPointKey;
80 import org.opendaylight.yangtools.yang.common.Uint16;
81 import org.opendaylight.yangtools.yang.common.Uint32;
82 import org.slf4j.Logger;
83 import org.slf4j.LoggerFactory;
85 public final class OpenRoadmOtnTopology {
87 private static final Logger LOG = LoggerFactory.getLogger(OpenRoadmOtnTopology.class);
88 private static final String CLIENT = "-CLIENT";
89 private static final String NETWORK = "-NETWORK";
90 private static final String XPDR = "-XPDR";
91 private static final String OTN_PARAMS_ERROR = "Error with otn parameters of supported link {}";
92 private static final int NB_TRIB_PORTS = 80;
93 private static final int NB_TRIB_SLOTS = 80;
95 private static final Map<String, OduRateIdentity> RATE_MAP = Map.of(
96 "If100GEODU4", ODU4.VALUE,
97 "IfOCHOTU4ODU4", ODU4.VALUE,
98 "If1GEODU0", ODU0.VALUE,
99 "If10GEODU2", ODU2.VALUE,
100 "If10GEODU2e", ODU2e.VALUE);
101 private static final Map<OtnLinkType, Long> OTNLINKTYPE_BW_MAP = Map.of(
102 OtnLinkType.ODTU4, 100000L,
103 OtnLinkType.ODUC4, 400000L,
104 OtnLinkType.ODUC3, 300000L,
105 OtnLinkType.ODUC2, 200000L);
106 private static final Map<OtnLinkType, Long> OTNLINKTYPE_OTU_BW_MAP = Map.of(
107 OtnLinkType.OTU4, 100000L,
108 OtnLinkType.OTUC4, 400000L);
109 private static final Map<Uint32, Long> SERVICERATE_BWINCR_MAP = Map.of(
110 Uint32.valueOf(1), 1000L,
111 Uint32.valueOf(10), 10000L,
112 Uint32.valueOf(100), 100000L);
113 private static final Map<Uint32, OdtuTypeIdentity> SERVICERATE_ODTUTYPECLASS_MAP = Map.of(
114 Uint32.valueOf(1), ODTU4TsAllocated.VALUE,
115 Uint32.valueOf(10), ODTU4TsAllocated.VALUE,
116 Uint32.valueOf(100), ODTUCnTs.VALUE);
118 private OpenRoadmOtnTopology() {
121 public static TopologyShard createTopologyShard(Nodes mappingNode) {
122 List<Node> nodes = new ArrayList<>();
123 List<Link> links = new ArrayList<>();
124 Map<Integer, OtnTopoNode> xpdrMap = convertPortMappingToOtnNodeList(mappingNode);
125 for (OtnTopoNode node : xpdrMap.values()) {
126 switch (node.getNodeType()) {
128 nodes.add(createTpdr(node));
131 nodes.add(createMuxpdr(node));
134 nodes.add(createSwitch(node));
138 // TODO: Need to revisit this method
139 nodes.add(createRegen(node));
142 LOG.error("unknown otn node type {}", node.getNodeType().getName());
146 return new TopologyShard(nodes, links);
149 public static TopologyShard createOtnLinks(String nodeA, String tpA, String nodeZ, String tpZ,
150 OtnLinkType linkType) {
152 return new TopologyShard(
154 OTNLINKTYPE_OTU_BW_MAP.containsKey(linkType)
155 ? initialiseOtnLinks(nodeA, tpA, nodeZ, tpZ, linkType)
159 public static TopologyShard createOtnLinks(
160 org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.renderer.rpc.result.sp
162 OtnLinkType linkType) {
164 return new TopologyShard(
166 initialiseOtnLinks(notifLink.getATermination().getNodeId(),
167 notifLink.getATermination().getTpId(),
168 notifLink.getZTermination().getNodeId(),
169 notifLink.getZTermination().getTpId(),
173 public static TopologyShard createOtnLinks(
174 org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.renderer.rpc.result.sp
176 List<Link> supportedOtu4links, List<TerminationPoint> supportedTPs, OtnLinkType linkType) {
178 if (OTNLINKTYPE_OTU_BW_MAP.containsKey(linkType)) {
179 return new TopologyShard(
182 notifLink.getATermination().getNodeId(), notifLink.getATermination().getTpId(),
183 notifLink.getZTermination().getNodeId(), notifLink.getZTermination().getTpId(), linkType));
184 } else if (OTNLINKTYPE_BW_MAP.containsKey(linkType)) {
185 List<Link> links = initialiseOtnLinks(
186 notifLink.getATermination().getNodeId(), notifLink.getATermination().getTpId(),
187 notifLink.getZTermination().getNodeId(), notifLink.getZTermination().getTpId(), linkType);
188 links.addAll(updateOtnLinkBwParameters(supportedOtu4links, linkType));
189 List<TerminationPoint> updatedTPs = new ArrayList<>();
190 for (TerminationPoint tp : supportedTPs) {
191 updatedTPs.add(updateTp(tp, true, linkType));
193 return new TopologyShard(null, links, updatedTPs);
199 public static TopologyShard createOtnLinks(List<Link> suppOtuLinks, List<TerminationPoint> oldTps,
200 OtnLinkType linkType) {
202 List<Link> links = new ArrayList<>();
203 for (Link link : suppOtuLinks) {
204 if (link.augmentation(Link1.class) == null) {
205 LOG.error("Error with OTN parameters of supported link {}", link.getLinkId().getValue());
208 if (!OTNLINKTYPE_BW_MAP.containsKey(linkType)) {
209 LOG.error("Error with link {} : unsupported OTN link type", link.getLinkId().getValue());
212 if (link.augmentation(Link1.class).getAvailableBandwidth().longValue() < OTNLINKTYPE_BW_MAP.get(linkType)) {
213 LOG.error("Error with link {} : unsufficient available bandwith", link.getLinkId().getValue());
216 links.add(updateOtnLinkBwParameters(link, 0L, OTNLINKTYPE_BW_MAP.get(linkType)));
218 if (links.size() == 2) {
219 links.addAll(initialiseOtnLinks(suppOtuLinks.get(0).getSource().getSourceNode().getValue(),
220 suppOtuLinks.get(0).getSource().getSourceTp().getValue(),
221 suppOtuLinks.get(0).getDestination().getDestNode().getValue(),
222 suppOtuLinks.get(0).getDestination().getDestTp().getValue(),
225 List<TerminationPoint> tps = new ArrayList<>();
226 for (TerminationPoint tp : oldTps) {
227 tps.add(updateTp(tp, true, linkType));
229 return links.size() == 4 && tps.size() == 2
230 ? new TopologyShard(null, links, tps)
231 : new TopologyShard(null, null, null);
234 public static TopologyShard updateOtnLinks(List<Link> suppOduLinks, List<TerminationPoint> oldTps,
235 Uint32 serviceRate, Short tribPortNb, Short minTribSlotNb, Short maxTribSlotNb, boolean isDeletion) {
237 List<Link> links = new ArrayList<>();
238 if (!SERVICERATE_BWINCR_MAP.containsKey(serviceRate)) {
239 LOG.warn("Error with not managed service rate {}", serviceRate.toString());
240 return new TopologyShard(null, null, null);
242 Long bwIncr = SERVICERATE_BWINCR_MAP.get(serviceRate);
243 for (Link link : suppOduLinks) {
244 if (link.augmentation(Link1.class) == null
245 || link.augmentation(Link1.class).getAvailableBandwidth() == null
246 || link.augmentation(Link1.class).getUsedBandwidth() == null) {
247 LOG.error(OTN_PARAMS_ERROR, link.getLinkId().getValue());
249 Uint32 avlBw = link.augmentation(Link1.class).getAvailableBandwidth();
250 Uint32 usedBw = link.augmentation(Link1.class).getUsedBandwidth();
251 if (avlBw.toJava() < bwIncr) {
256 ? updateOtnLinkBwParameters(link, avlBw.toJava() + bwIncr, usedBw.toJava() - bwIncr)
257 : updateOtnLinkBwParameters(link, avlBw.toJava() - bwIncr, usedBw.toJava() + bwIncr)
261 List<TerminationPoint> tps = new ArrayList<>();
262 for (TerminationPoint tp : oldTps) {
264 tps.add(updateNodeTpTsPool(tp, serviceRate, tribPortNb, minTribSlotNb, maxTribSlotNb, isDeletion));
267 if (links.isEmpty() || tps.isEmpty()) {
268 LOG.error("unable to update otn links");
269 return new TopologyShard(null, null, null);
271 return new TopologyShard(null, links, tps);
275 public static TopologyShard updateOtnLinks(List<Link> suppOtuLinks, boolean isDeletion) {
277 List<Link> links = new ArrayList<>();
278 for (Link link : suppOtuLinks) {
279 if (link.augmentation(Link1.class) == null
280 || link.augmentation(Link1.class).getAvailableBandwidth() == null
281 || link.augmentation(Link1.class).getUsedBandwidth() == null) {
282 LOG.error(OTN_PARAMS_ERROR, link.getLinkId().getValue());
286 ? updateOtnLinkBwParameters(link, Long.valueOf(100000), Long.valueOf(0))
287 : updateOtnLinkBwParameters(link, Long.valueOf(0), Long.valueOf(100000))
291 if (links.isEmpty()) {
292 LOG.error("unable to update otn links");
293 return new TopologyShard(null, null, null);
295 return new TopologyShard(null, links, null);
299 public static TopologyShard deleteOtnLinks(List<Link> suppOtuLinks, List<TerminationPoint> oldTps,
300 OtnLinkType linkType) {
302 List<Link> links = new ArrayList<>();
303 for (Link link : suppOtuLinks) {
304 if (link.augmentation(Link1.class) == null
305 || link.augmentation(
306 org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630
307 .Link1.class) == null) {
308 LOG.error(OTN_PARAMS_ERROR, link.getLinkId().getValue());
309 return new TopologyShard(null, null, null);
311 OtnLinkType otnLinkType = link.augmentation(
312 org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.Link1.class)
314 if (!OTNLINKTYPE_OTU_BW_MAP.containsKey(otnLinkType)) {
315 //TODO shouldn't other link type listed in OTNLINKTYPE_BW_MAP be handled too ?
316 LOG.warn("Unexpected otn-link-type {} for link {}", otnLinkType, link.getLinkId());
319 links.add(updateOtnLinkBwParameters(link, OTNLINKTYPE_OTU_BW_MAP.get(otnLinkType) , 0L));
321 List<TerminationPoint> tps = new ArrayList<>();
322 for (TerminationPoint tp : oldTps) {
323 tps.add(updateTp(tp, false, linkType));
326 links.isEmpty() || tps.isEmpty()
327 ? new TopologyShard(null, null, null)
328 : new TopologyShard(null, links, tps);
331 private static List<Link> initialiseOtnLinks(String nodeA, String tpA, String nodeZ, String tpZ,
332 OtnLinkType linkType) {
334 List<Link> links = new ArrayList<>();
335 String nodeATopo = formatNodeName(nodeA, tpA);
336 String nodeZTopo = formatNodeName(nodeZ, tpZ);
337 org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.Link1 tpceLink1
338 = new org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.Link1Builder()
339 .setOtnLinkType(linkType).build();
340 Link1Builder otnLink1Bldr = new Link1Builder()
341 .setUsedBandwidth(Uint32.valueOf(0));
342 if (OTNLINKTYPE_OTU_BW_MAP.containsKey(linkType)) {
343 otnLink1Bldr.setAvailableBandwidth(Uint32.valueOf(OTNLINKTYPE_OTU_BW_MAP.get(linkType)));
344 } else if (OTNLINKTYPE_BW_MAP.containsKey(linkType)) {
345 otnLink1Bldr.setAvailableBandwidth(Uint32.valueOf(OTNLINKTYPE_BW_MAP.get(linkType)));
347 LOG.error("unable to set available bandwidth to unknown link type");
350 LinkBuilder ietfLinkAZBldr = TopologyUtils.createLink(nodeATopo, nodeZTopo, tpA, tpZ, linkType.getName());
351 links.add(ietfLinkAZBldr
352 .addAugmentation(tpceLink1)
353 .addAugmentation(otnLink1Bldr.build())
355 new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1Builder(
356 ietfLinkAZBldr.augmentation(
357 org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1.class))
358 .setLinkType(OpenroadmLinkType.OTNLINK)
359 .setOperationalState(State.InService)
360 .setAdministrativeState(AdminStates.InService)
364 LinkBuilder ietfLinkZABldr = TopologyUtils.createLink(nodeZTopo, nodeATopo, tpZ, tpA, linkType.getName());
365 links.add(ietfLinkZABldr
366 .addAugmentation(tpceLink1)
367 .addAugmentation(otnLink1Bldr.build())
369 new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1Builder(
370 ietfLinkZABldr.augmentation(
371 org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1.class))
372 .setLinkType(OpenroadmLinkType.OTNLINK)
373 .setOperationalState(State.InService)
374 .setAdministrativeState(AdminStates.InService)
380 private static Link updateOtnLinkBwParameters(Link link, Long availBw, Long usedBw) {
382 LOG.debug("in updateOtnLinkBwParameters with availBw = {}, usedBw = {}", availBw, usedBw);
383 return new LinkBuilder(link)
385 new Link1Builder(link.augmentation(Link1.class))
386 .setAvailableBandwidth(Uint32.valueOf(availBw))
387 .setUsedBandwidth(Uint32.valueOf(usedBw))
392 private static List<Link> updateOtnLinkBwParameters(List<Link> supportedLinks, OtnLinkType linkType) {
394 LOG.debug("in updateOtnLinkBwParameters with supportedLinks = {}, linkType = {}", supportedLinks, linkType);
395 List<Link> updatedlinks = new ArrayList<>();
396 for (Link link : supportedLinks) {
398 new LinkBuilder(link)
399 .addAugmentation(new Link1Builder(link.augmentation(Link1.class))
400 .setAvailableBandwidth(Uint32.valueOf(0))
402 OTNLINKTYPE_BW_MAP.containsKey(linkType)
403 ? Uint32.valueOf(OTNLINKTYPE_BW_MAP.get(linkType))
411 private static TerminationPoint updateTp(TerminationPoint originalTp, boolean addingTsTpnPoolTermination,
412 OtnLinkType linkType) {
414 LOG.debug("in updateTp");
415 TerminationPointBuilder tpBldr = new TerminationPointBuilder(originalTp);
416 TerminationPoint1Builder otnTp1Bldr =
417 new TerminationPoint1Builder(tpBldr.augmentation(TerminationPoint1.class));
418 XpdrTpPortConnectionAttributesBuilder xtpcaBldr =
419 new XpdrTpPortConnectionAttributesBuilder(otnTp1Bldr.getXpdrTpPortConnectionAttributes());
420 if (addingTsTpnPoolTermination) {
421 Set<Uint16> tsPool = new HashSet<>();
422 for (int i = 1; i <= NB_TRIB_SLOTS; i++) {
423 tsPool.add(Uint16.valueOf(i));
425 xtpcaBldr.setTsPool(tsPool);
426 Set<Uint16> tpnPool = new HashSet<>();
427 int nbTribPort = NB_TRIB_PORTS;
428 if (OtnLinkType.ODUC4.equals(linkType)) {
431 for (int i = 1; i <= nbTribPort; i++) {
432 tpnPool.add(Uint16.valueOf(i));
434 OdtuTpnPool oduTpnPool = new OdtuTpnPoolBuilder()
435 .setOdtuType(ODTU4TsAllocated.VALUE)
438 xtpcaBldr.setOdtuTpnPool(ImmutableMap.of(oduTpnPool.key(),oduTpnPool));
440 xtpcaBldr.setTsPool(null);
441 xtpcaBldr.setOdtuTpnPool(ImmutableMap.of());
443 return tpBldr.addAugmentation(otnTp1Bldr.setXpdrTpPortConnectionAttributes(xtpcaBldr.build()).build()).build();
446 private static TerminationPoint updateNodeTpTsPool(TerminationPoint tp, Uint32 serviceRate, Short tribPortNb,
447 Short minTribSlotNb, Short maxTribSlotNb, boolean isDeletion) {
449 LOG.debug("in updateNodeTpTsPool");
450 TerminationPointBuilder tpBldr = new TerminationPointBuilder(tp);
452 XpdrTpPortConnectionAttributesBuilder xtpcaBldr =
453 new XpdrTpPortConnectionAttributesBuilder(
454 tpBldr.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes());
455 Set<Uint16> tsPool = new HashSet<>(xtpcaBldr.getTsPool());
457 for (int i = minTribSlotNb; i <= maxTribSlotNb; i++) {
458 tsPool.add(Uint16.valueOf(i));
461 for (int i = minTribSlotNb; i <= maxTribSlotNb; i++) {
462 tsPool.remove(Uint16.valueOf(i));
465 xtpcaBldr.setTsPool(tsPool);
467 List<OdtuTpnPool> odtuTpnPoolValues = new ArrayList<>(xtpcaBldr.getOdtuTpnPool().values());
468 if (odtuTpnPoolValues.get(0).getTpnPool() == null) {
469 tpnPool = new HashSet<>();
471 tpnPool = new HashSet<>(odtuTpnPoolValues.get(0).getTpnPool());
473 tpnPool.add(Uint16.valueOf(tribPortNb));
475 tpnPool.remove(Uint16.valueOf(tribPortNb));
478 OdtuTypeIdentity odtuType;
479 if (SERVICERATE_ODTUTYPECLASS_MAP.containsKey(serviceRate)) {
480 odtuType = SERVICERATE_ODTUTYPECLASS_MAP.get(serviceRate);
483 LOG.warn("Unable to set the odtu-type");
485 OdtuTpnPool odtuTpnPool = new OdtuTpnPoolBuilder()
486 .setOdtuType(odtuType)
491 new TerminationPoint1Builder(tp.augmentation(TerminationPoint1.class))
492 .setXpdrTpPortConnectionAttributes(
494 .setOdtuTpnPool(ImmutableMap.of(odtuTpnPool.key(),odtuTpnPool))
500 private static Map<Integer, OtnTopoNode> convertPortMappingToOtnNodeList(Nodes mappingNode) {
502 List<Mapping> networkMappings =
503 mappingNode.nonnullMapping().values().stream()
504 .filter(k -> k.getLogicalConnectionPoint().contains("NETWORK"))
505 .collect(Collectors.toList());
506 Map<Integer, OtnTopoNode> xpdrMap = new HashMap<>();
507 for (Mapping mapping : networkMappings) {
508 Integer xpdrNb = Integer.parseInt(mapping.getLogicalConnectionPoint().split("XPDR")[1].split("-")[0]);
509 if (!xpdrMap.containsKey(xpdrNb)) {
510 List<Mapping> xpdrNetMaps =
511 mappingNode.nonnullMapping().values().stream()
512 .filter(k -> k.getLogicalConnectionPoint().contains("XPDR" + xpdrNb + NETWORK))
513 .collect(Collectors.toList());
514 List<Mapping> xpdrClMaps =
515 mappingNode.nonnullMapping().values().stream()
516 .filter(k -> k.getLogicalConnectionPoint().contains("XPDR" + xpdrNb + CLIENT))
517 .collect(Collectors.toList());
521 mappingNode.getNodeId(),
522 mappingNode.getNodeInfo().getNodeClli(),
524 mapping.getXpdrType() == null
526 : mapping.getXpdrType(),
527 fillConnectionMapLcp(xpdrNetMaps),
528 fillConnectionMapLcp(xpdrClMaps),
534 LOG.debug("there are {} xpdr to build", xpdrMap.size());
535 xpdrMap.forEach((k, v) -> LOG.debug("xpdr {} = {} - {} - {} - {}",
536 k, v.getNodeId(), v.getNodeType(), v.getNbTpClient(), v.getNbTpNetwork()));
540 private static Map<String, String> fillConnectionMapLcp(List<Mapping> mappingList) {
542 Map<String, String> xpdrConnectionMap = new HashMap<>();
543 for (Mapping map : mappingList) {
544 xpdrConnectionMap.put(map.getLogicalConnectionPoint(), map.getConnectionMapLcp());
546 return xpdrConnectionMap;
549 private static Node createTpdr(OtnTopoNode node) {
550 Map<TerminationPointKey,TerminationPoint> tpMap = new HashMap<>();
551 createTP(tpMap, node, OpenroadmTpType.XPONDERCLIENT, false);
552 createTP(tpMap, node, OpenroadmTpType.XPONDERNETWORK, true);
554 return new NodeBuilder()
555 .setNodeId(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
556 .withKey(new NodeKey(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())))
557 .setSupportingNode(createSupportingNodes(node))
561 new XpdrAttributesBuilder()
562 .setXpdrNumber(Uint16.valueOf(node.getXpdrNb()))
566 new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder()
567 .setNodeType(OpenroadmNodeType.TPDR)
568 .setOperationalState(State.InService)
569 .setAdministrativeState(AdminStates.InService)
572 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
574 .setTerminationPoint(tpMap)
579 // TODO: This is same as createTpdr. After Open ROADM network models are updated,
580 // we will revisit this method to include regen based data.
581 private static Node createRegen(OtnTopoNode node) {
582 Map<TerminationPointKey,TerminationPoint> tpMap = new HashMap<>();
583 createTP(tpMap, node, OpenroadmTpType.XPONDERCLIENT, false);
584 createTP(tpMap, node, OpenroadmTpType.XPONDERNETWORK, true);
586 return new NodeBuilder()
587 .setNodeId(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
588 .withKey(new NodeKey(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())))
589 .setSupportingNode(createSupportingNodes(node))
593 new XpdrAttributesBuilder()
594 .setXpdrNumber(Uint16.valueOf(node.getXpdrNb()))
598 new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder()
599 .setNodeType(OpenroadmNodeType.TPDR)
600 .setOperationalState(State.InService)
601 .setAdministrativeState(AdminStates.InService)
604 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
606 .setTerminationPoint(tpMap)
611 private static Node createMuxpdr(OtnTopoNode node) {
613 // prepare otn-topology node augmentation
614 // TODO: will need to be completed
615 Map<NonBlockingListKey, NonBlockingList> nbMap = new HashMap<>();
616 for (int i = 1; i <= node.getNbTpClient(); i++) {
617 Set<TpId> tpList = new HashSet<>();
618 tpList.add(new TpId("XPDR" + node.getXpdrNb() + CLIENT + i));
619 tpList.add(new TpId("XPDR" + node.getXpdrNb() + "-NETWORK1"));
620 NonBlockingList nbl = new NonBlockingListBuilder()
621 .setNblNumber(Uint16.valueOf(i))
623 .setAvailableInterconnectBandwidth(Uint32.valueOf(node.getNbTpNetwork() * 10L))
624 .setInterconnectBandwidthUnit(Uint32.valueOf(1000000000))
626 nbMap.put(nbl.key(),nbl);
628 OduSwitchingPools oduSwitchPool = new OduSwitchingPoolsBuilder()
629 .setSwitchingPoolNumber(Uint16.valueOf(1))
630 .setSwitchingPoolType(SwitchingPoolTypes.NonBlocking)
631 .setNonBlockingList(nbMap)
633 Map<TerminationPointKey, TerminationPoint> tpMap = new HashMap<>();
634 createTP(tpMap, node, OpenroadmTpType.XPONDERCLIENT, true);
635 createTP(tpMap, node, OpenroadmTpType.XPONDERNETWORK, true);
637 return new NodeBuilder()
638 .setNodeId(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
639 .withKey(new NodeKey(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())))
640 .setSupportingNode(createSupportingNodes(node))
643 .setTpBandwidthSharing(new TpBandwidthSharingBuilder().build())
645 new XpdrAttributesBuilder()
646 .setXpdrNumber(Uint16.valueOf(node.getXpdrNb()))
649 new SwitchingPoolsBuilder()
650 .setOduSwitchingPools(Map.of(oduSwitchPool.key(),oduSwitchPool))
654 new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder()
655 .setNodeType(OpenroadmNodeType.MUXPDR)
656 .setAdministrativeState(AdminStates.InService)
657 .setOperationalState(State.InService)
660 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
662 .setTerminationPoint(tpMap)
667 private static Node createSwitch(OtnTopoNode node) {
669 Set<TpId> tpl = new HashSet<>();
670 for (int i = 1; i <= node.getNbTpClient(); i++) {
671 tpl.add(new TpId("XPDR" + node.getXpdrNb() + CLIENT + i));
673 for (int i = 1; i <= node.getNbTpNetwork(); i++) {
674 tpl.add(new TpId("XPDR" + node.getXpdrNb() + NETWORK + i));
676 Map<NonBlockingListKey, NonBlockingList> nbMap = new HashMap<>();
677 NonBlockingList nbl = new NonBlockingListBuilder()
678 .setNblNumber(Uint16.valueOf(1))
681 nbMap.put(nbl.key(),nbl);
682 OduSwitchingPools oduSwitchPool = new OduSwitchingPoolsBuilder()
683 .setSwitchingPoolNumber(Uint16.valueOf(1))
684 .setSwitchingPoolType(SwitchingPoolTypes.NonBlocking)
685 .setNonBlockingList(nbMap)
687 Map<OduSwitchingPoolsKey, OduSwitchingPools> oduSwitchPoolList = new HashMap<>();
688 oduSwitchPoolList.put(oduSwitchPool.key(),oduSwitchPool);
689 Map<TerminationPointKey, TerminationPoint> tpMap = new HashMap<>();
690 createTP(tpMap, node, OpenroadmTpType.XPONDERCLIENT, true);
691 createTP(tpMap, node, OpenroadmTpType.XPONDERNETWORK, true);
693 return new NodeBuilder()
694 .setNodeId(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
695 .withKey(new NodeKey(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())))
696 .setSupportingNode(createSupportingNodes(node))
699 .setTpBandwidthSharing(new TpBandwidthSharingBuilder().build())
701 new XpdrAttributesBuilder()
702 .setXpdrNumber(Uint16.valueOf(node.getXpdrNb()))
705 new SwitchingPoolsBuilder()
706 .setOduSwitchingPools(oduSwitchPoolList)
710 new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder()
711 .setNodeType(OpenroadmNodeType.SWITCH)
712 .setOperationalState(State.InService)
713 .setAdministrativeState(AdminStates.InService)
716 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
718 .setTerminationPoint(tpMap)
723 private static void createTP(Map<TerminationPointKey, TerminationPoint> tpMap,
724 OtnTopoNode node, OpenroadmTpType tpType, boolean withRate) {
726 List<Mapping> mappings = null;
729 mappings = node.getXpdrNetMappings();
732 mappings = node.getXpdrClMappings();
735 LOG.error("Error with Termination Point type {}", tpType);
738 fillTpMap(tpMap, node, tpType, withRate, mappings);
741 private static void fillTpMap(Map<TerminationPointKey, TerminationPoint> tpMap, OtnTopoNode node,
742 OpenroadmTpType tpType, boolean withRate, List<Mapping> mappings) {
744 for (Mapping mapping : mappings) {
745 // openroadm-otn-topoology augmentation
746 Map<SupportedInterfaceCapabilityKey, SupportedInterfaceCapability> supIfMap = new HashMap<>();
747 TerminationPoint1Builder otnTp1Bldr = new TerminationPoint1Builder();
748 if (mapping.getSupportedInterfaceCapability() == null) {
749 LOG.warn("mapping {} of node {} has no if-cap-type",
750 mapping.getLogicalConnectionPoint(), node.getNodeId());
752 XpdrTpPortConnectionAttributesBuilder xtpcaBldr = new XpdrTpPortConnectionAttributesBuilder();
753 for (SupportedIfCapability supInterCapa : mapping.getSupportedInterfaceCapability()) {
754 SupportedInterfaceCapability supIfCapa = new SupportedInterfaceCapabilityBuilder()
755 .withKey(new SupportedInterfaceCapabilityKey(supInterCapa))
756 .setIfCapType(supInterCapa)
758 supIfMap.put(supIfCapa.key(), supIfCapa);
760 otnTp1Bldr.setTpSupportedInterfaces(
761 new TpSupportedInterfacesBuilder()
762 .setSupportedInterfaceCapability(supIfMap)
765 //TODO: It is not logical to assign a priori one of the possible rate to the TP.
766 //Would be worth assigning per default "unallocated" at the tp creation step,
767 //and updating it with correct rate when it supports a specific service.
769 otnTp1Bldr.setXpdrTpPortConnectionAttributes(
770 xtpcaBldr.setRate(fixRate(mapping.getSupportedInterfaceCapability())).build());
776 new TpId(mapping.getLogicalConnectionPoint()),
783 private static void setclientNwTpAttr(Map<TerminationPointKey, TerminationPoint> tpMap, OtnTopoNode node, TpId tpId,
784 OpenroadmTpType tpType, TerminationPoint1 otnTp1, Mapping mapping) {
785 org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1Builder cnTP1BLdr
786 = new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
787 .TerminationPoint1Builder();
790 if (node.getXpdrNetConnectionMap().get(tpId.getValue()) != null) {
791 cnTP1BLdr.setAssociatedConnectionMapTp(Set.of(
792 new TpId(node.getXpdrNetConnectionMap().get(tpId.getValue()))));
794 SupportingTerminationPoint stp = new SupportingTerminationPointBuilder()
795 .setNetworkRef(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))
796 .setNodeRef(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
799 TerminationPoint ietfTpNw =
800 buildIetfTp(cnTP1BLdr, otnTp1, tpType, tpId, Map.of(stp.key(), stp), mapping);
801 tpMap.put(ietfTpNw.key(),ietfTpNw);
804 if (node.getXpdrCliConnectionMap().get(tpId.getValue()) != null) {
805 cnTP1BLdr.setAssociatedConnectionMapTp(Set.of(
806 new TpId(node.getXpdrCliConnectionMap().get(tpId.getValue()))));
808 TerminationPoint ietfTpCl = buildIetfTp(cnTP1BLdr, otnTp1, tpType, tpId, null, mapping);
809 tpMap.put(ietfTpCl.key(),ietfTpCl);
812 LOG.error("Undefined tpType for Termination point {} of {}", tpId.getValue(), node.getNodeId());
817 private static OduRateIdentity fixRate(Set<SupportedIfCapability> list) {
818 for (SupportedIfCapability supIfCap: list) {
819 String simpleName = supIfCap.toString().split("\\{")[0];
820 if (RATE_MAP.containsKey(simpleName)) {
821 return RATE_MAP.get(simpleName);
827 private static Map<SupportingNodeKey,SupportingNode> createSupportingNodes(OtnTopoNode node) {
829 SupportingNode suppNode1 = new SupportingNodeBuilder()
830 .setNetworkRef(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))
831 .setNodeRef(new NodeId(node.getNodeId()))
833 new SupportingNodeKey(
834 new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID),
835 new NodeId(node.getNodeId())))
837 SupportingNode suppNode2 = new SupportingNodeBuilder()
838 .setNetworkRef(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))
839 .setNodeRef(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
841 new SupportingNodeKey(
842 new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID),
843 new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())))
845 SupportingNode suppNode3 = new SupportingNodeBuilder()
846 .setNetworkRef(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))
847 .setNodeRef(new NodeId(node.getClli()))
849 new SupportingNodeKey(
850 new NetworkId(NetworkUtils.CLLI_NETWORK_ID),
851 new NodeId(node.getClli())))
853 Map<SupportingNodeKey,SupportingNode> suppNodeMap = new HashMap<>();
854 suppNodeMap.put(suppNode1.key(),suppNode1);
855 suppNodeMap.put(suppNode2.key(),suppNode2);
856 suppNodeMap.put(suppNode3.key(),suppNode3);
860 private static TerminationPoint buildIetfTp(
861 org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1Builder cnTP1BLdr,
862 TerminationPoint1 otnTp1, OpenroadmTpType tpType, TpId tpId,
863 Map<SupportingTerminationPointKey, SupportingTerminationPoint> supportTpMap, Mapping mapping) {
865 TerminationPointBuilder ietfTpBldr = new TerminationPointBuilder();
866 if (supportTpMap != null) {
867 ietfTpBldr.setSupportingTerminationPoint(supportTpMap);
871 .withKey(new TerminationPointKey(tpId))
872 .addAugmentation(otnTp1)
873 .addAugmentation(cnTP1BLdr.setTpType(tpType)
874 .setAdministrativeState(TopologyUtils.setNetworkAdminState(mapping.getPortAdminState()))
875 .setOperationalState(TopologyUtils.setNetworkOperState(mapping.getPortOperState()))
880 private static String formatNodeName(String nodeName, String tpName) {
882 return nodeName.contains(XPDR)
884 : new StringBuilder(nodeName).append("-").append(tpName.split("-")[0]).toString();