Manage ODU4 services over multiple OTU4
[transportpce.git] / networkmodel / src / main / java / org / opendaylight / transportpce / networkmodel / util / OpenRoadmOtnTopology.java
1 /*
2  * Copyright © 2020 Orange. All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.transportpce.networkmodel.util;
10
11 import com.google.common.collect.ImmutableMap;
12 import java.util.ArrayList;
13 import java.util.HashMap;
14 import java.util.List;
15 import java.util.Map;
16 import java.util.stream.Collectors;
17 import org.eclipse.jdt.annotation.Nullable;
18 import org.opendaylight.transportpce.common.NetworkUtils;
19 import org.opendaylight.transportpce.networkmodel.dto.OtnTopoNode;
20 import org.opendaylight.transportpce.networkmodel.dto.TopologyShard;
21 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210927.mapping.Mapping;
22 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210927.network.Nodes;
23 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
24 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.XpdrNodeTypes;
25 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
26 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.OduSwitchingPools;
27 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.OduSwitchingPoolsBuilder;
28 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.OduSwitchingPoolsKey;
29 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
30 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListBuilder;
31 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListKey;
32 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmLinkType;
33 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmNodeType;
34 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmTpType;
35 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
36 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityBuilder;
37 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityKey;
38 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODTU4TsAllocated;
39 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODTUCnTs;
40 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODU0;
41 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODU2;
42 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODU2e;
43 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODU4;
44 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.OdtuTypeIdentity;
45 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.OduRateIdentity;
46 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.Link1;
47 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.Link1Builder;
48 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.Node1;
49 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.Node1Builder;
50 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.TerminationPoint1;
51 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.TerminationPoint1Builder;
52 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.SwitchingPools;
53 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.SwitchingPoolsBuilder;
54 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.TpBandwidthSharing;
55 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.TpBandwidthSharingBuilder;
56 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.XpdrAttributes;
57 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.XpdrAttributesBuilder;
58 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.termination.point.TpSupportedInterfaces;
59 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.termination.point.TpSupportedInterfacesBuilder;
60 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.networks.network.node.termination.point.XpdrTpPortConnectionAttributesBuilder;
61 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev200327.SupportedIfCapability;
62 import org.opendaylight.yang.gen.v1.http.org.openroadm.switching.pool.types.rev191129.SwitchingPoolTypes;
63 import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev200529.xpdr.otn.tp.attributes.OdtuTpnPool;
64 import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev200529.xpdr.otn.tp.attributes.OdtuTpnPoolBuilder;
65 import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.OtnLinkType;
66 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
67 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
68 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
69 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeBuilder;
70 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeKey;
71 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNode;
72 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeBuilder;
73 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeKey;
74 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
75 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
76 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkBuilder;
77 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
78 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointBuilder;
79 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointKey;
80 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.termination.point.SupportingTerminationPoint;
81 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.termination.point.SupportingTerminationPointBuilder;
82 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.termination.point.SupportingTerminationPointKey;
83 import org.opendaylight.yangtools.yang.common.Uint16;
84 import org.opendaylight.yangtools.yang.common.Uint32;
85 import org.slf4j.Logger;
86 import org.slf4j.LoggerFactory;
87
88 public final class OpenRoadmOtnTopology {
89
90     private static final Logger LOG = LoggerFactory.getLogger(OpenRoadmOtnTopology.class);
91     private static final String CLIENT = "-CLIENT";
92     private static final String NETWORK = "-NETWORK";
93     private static final String XPDR = "-XPDR";
94     private static final int NB_TRIB_PORTS = 80;
95     private static final int NB_TRIB_SLOTS = 80;
96     private static final int NB_TRIB_SLOT_PER_10GE = 8;
97
98     private OpenRoadmOtnTopology() {
99     }
100
101     public static TopologyShard createTopologyShard(Nodes mappingNode) {
102         List<Node> nodes = new ArrayList<>();
103         List<Link> links = new ArrayList<>();
104         Map<Integer, OtnTopoNode> xpdrMap = convertPortMappingToOtnNodeList(mappingNode);
105         for (OtnTopoNode node : xpdrMap.values()) {
106             switch (node.getNodeType()) {
107                 case Tpdr:
108                     nodes.add(createTpdr(node));
109                     break;
110                 case Mpdr:
111                     nodes.add(createMuxpdr(node));
112                     break;
113                 case Switch:
114                     nodes.add(createSwitch(node));
115                     break;
116                 default:
117                     LOG.error("unknown otn node type {}", node.getNodeType().getName());
118                     return null;
119             }
120         }
121         return new TopologyShard(nodes, links);
122     }
123
124     public static TopologyShard createOtnLinks(String nodeA, String tpA, String nodeZ, String tpZ,
125         OtnLinkType linkType) {
126         List<Link> links = null;
127         if (OtnLinkType.OTU4.equals(linkType) || OtnLinkType.OTUC4.equals(linkType)) {
128             links = initialiseOtnLinks(nodeA, tpA, nodeZ, tpZ, linkType);
129         }
130         return new TopologyShard(null, links);
131     }
132
133     public static TopologyShard createOtnLinks(
134             org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.renderer.rpc.result.sp
135                 .Link notifLink,
136             OtnLinkType linkType) {
137
138         return new TopologyShard(null, initialiseOtnLinks(notifLink.getATermination().getNodeId(),
139             notifLink.getATermination().getTpId(), notifLink.getZTermination().getNodeId(),
140             notifLink.getZTermination().getTpId(), linkType));
141     }
142
143     public static TopologyShard createOtnLinks(
144             org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.renderer.rpc.result.sp
145                 .Link notifLink,
146             List<Link> supportedOtu4links,
147             List<TerminationPoint> supportedTPs,
148             OtnLinkType linkType) {
149
150         List<Link> links;
151         switch (linkType) {
152             case OTU4:
153             case OTUC4:
154                 links = initialiseOtnLinks(
155                         notifLink.getATermination().getNodeId(), notifLink.getATermination().getTpId(),
156                         notifLink.getZTermination().getNodeId(), notifLink.getZTermination().getTpId(), linkType);
157                 return new TopologyShard(null, links);
158             case ODTU4:
159             case ODUC4:
160                 links = initialiseOtnLinks(
161                     notifLink.getATermination().getNodeId(), notifLink.getATermination().getTpId(),
162                     notifLink.getZTermination().getNodeId(), notifLink.getZTermination().getTpId(), linkType);
163                 links.addAll(updateOtnLinkBwParameters(supportedOtu4links, linkType));
164                 List<TerminationPoint> updatedTPs = new ArrayList<>();
165                 for (TerminationPoint tp : supportedTPs) {
166                     updatedTPs.add(updateTp(tp, true, linkType));
167                 }
168                 return new TopologyShard(null, links, updatedTPs);
169             default:
170                 return null;
171         }
172     }
173
174     public static TopologyShard createOtnLinks(List<Link> suppOtuLinks, List<TerminationPoint> oldTps,
175             OtnLinkType linkType) {
176         List<Link> links = new ArrayList<>();
177         for (Link link : suppOtuLinks) {
178             if (OtnLinkType.ODTU4.equals(linkType) && link.augmentation(Link1.class) != null
179                 && link.augmentation(Link1.class).getAvailableBandwidth().equals(Uint32.valueOf(100000))) {
180                 links.add(updateOtnLinkBwParameters(link, 0L, 100000L));
181             } else if (OtnLinkType.ODUC4.equals(linkType) && link.augmentation(Link1.class) != null
182                 && link.augmentation(Link1.class).getAvailableBandwidth().equals(Uint32.valueOf(400000))) {
183                 links.add(updateOtnLinkBwParameters(link, 0L, 400000L));
184             } else {
185                 LOG.error("Error with otn parameters of supported link {}", link.getLinkId().getValue());
186             }
187         }
188         if (links.size() == 2) {
189             links.addAll(initialiseOtnLinks(suppOtuLinks.get(0).getSource().getSourceNode().getValue(),
190                 suppOtuLinks.get(0).getSource().getSourceTp().getValue(),
191                 suppOtuLinks.get(0).getDestination().getDestNode().getValue(),
192                 suppOtuLinks.get(0).getDestination().getDestTp().getValue(),
193                 linkType));
194         }
195         List<TerminationPoint> tps = new ArrayList<>();
196         for (TerminationPoint tp : oldTps) {
197             tps.add(updateTp(tp, true, linkType));
198         }
199         if (links.size() == 4 && tps.size() == 2) {
200             return new TopologyShard(null, links, tps);
201         } else {
202             return new TopologyShard(null, null, null);
203         }
204     }
205
206     public static TopologyShard updateOtnLinks(List<Link> suppOduLinks, List<TerminationPoint> oldTps,
207         Uint32 serviceRate, Short tribPortNb, Short minTribSlotNb, Short maxTribSlotNb, boolean isDeletion) {
208         List<Link> links = new ArrayList<>();
209         Long bwIncr;
210         switch (serviceRate.intValue()) {
211             case 1:
212                 bwIncr = 1000L;
213                 break;
214             case 10:
215                 bwIncr = 10000L;
216                 break;
217             case 100:
218                 bwIncr = 100000L;
219                 break;
220             default:
221                 LOG.warn("Error with not managed service rate {}", serviceRate.toString());
222                 return new TopologyShard(null, null, null);
223         }
224         for (Link link : suppOduLinks) {
225             if (link.augmentation(Link1.class) != null && link.augmentation(Link1.class).getAvailableBandwidth() != null
226                 && link.augmentation(Link1.class).getUsedBandwidth() != null) {
227                 Uint32 avlBw = link.augmentation(Link1.class).getAvailableBandwidth();
228                 Uint32 usedBw = link.augmentation(Link1.class).getUsedBandwidth();
229                 if (avlBw.toJava() < bwIncr) {
230                     bwIncr = 0L;
231                 }
232                 if (isDeletion) {
233                     links.add(updateOtnLinkBwParameters(link, avlBw.toJava() + bwIncr,
234                         usedBw.toJava() - bwIncr));
235                 } else {
236                     links.add(updateOtnLinkBwParameters(link, avlBw.toJava() - bwIncr,
237                         usedBw.toJava() + bwIncr));
238                 }
239             } else {
240                 LOG.error("Error with otn parameters of supported link {}", link.getLinkId().getValue());
241             }
242         }
243         List<TerminationPoint> tps = new ArrayList<>();
244         for (TerminationPoint tp : oldTps) {
245             if (bwIncr != 0) {
246                 tps.add(updateNodeTpTsPool(tp, serviceRate, tribPortNb, minTribSlotNb, maxTribSlotNb, isDeletion));
247             }
248         }
249         if (!links.isEmpty() && !tps.isEmpty()) {
250             return new TopologyShard(null, links, tps);
251         } else {
252             LOG.error("unable to update otn links");
253             return new TopologyShard(null, null, null);
254         }
255     }
256
257     public static TopologyShard updateOtnLinks(List<Link> suppOtuLinks, boolean isDeletion) {
258         List<Link> links = new ArrayList<>();
259         for (Link link : suppOtuLinks) {
260             if (link.augmentation(Link1.class) == null
261                 || link.augmentation(Link1.class).getAvailableBandwidth() == null
262                 || link.augmentation(Link1.class).getUsedBandwidth() == null) {
263                 LOG.error("Error with otn parameters of supported link {}", link.getLinkId().getValue());
264             } else {
265                 if (isDeletion) {
266                     links.add(updateOtnLinkBwParameters(link, Long.valueOf(100000), Long.valueOf(0)));
267                 } else {
268                     links.add(updateOtnLinkBwParameters(link, Long.valueOf(0), Long.valueOf(100000)));
269                 }
270             }
271         }
272         if (links.isEmpty()) {
273             LOG.error("unable to update otn links");
274             return new TopologyShard(null, null, null);
275         } else {
276             return new TopologyShard(null, links, null);
277         }
278     }
279
280     public static TopologyShard deleteOtnLinks(List<Link> suppOtuLinks, List<TerminationPoint> oldTps,
281             OtnLinkType linkType) {
282         List<Link> links = new ArrayList<>();
283         OtnLinkType otnLinkType = null;
284         for (Link link : suppOtuLinks) {
285             if (link.augmentation(Link1.class) != null && link.augmentation(
286                     org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.Link1.class) != null) {
287                 otnLinkType = link.augmentation(
288                         org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.Link1.class).getOtnLinkType();
289                 if (OtnLinkType.OTU4.equals(otnLinkType)) {
290                     links.add(updateOtnLinkBwParameters(link, 100000L, 0L));
291                 } else if (OtnLinkType.OTUC4.equals(otnLinkType)) {
292                     links.add(updateOtnLinkBwParameters(link, 400000L, 0L));
293                 } else {
294                     LOG.warn("Unexpected otn-link-type {} for link {}", otnLinkType, link.getLinkId());
295                 }
296             } else {
297                 LOG.error("Error with otn parameters of supported link {}", link.getLinkId().getValue());
298                 return new TopologyShard(null, null, null);
299             }
300         }
301         List<TerminationPoint> tps = new ArrayList<>();
302         for (TerminationPoint tp : oldTps) {
303             tps.add(updateTp(tp, false, linkType));
304         }
305         if (!links.isEmpty() && !tps.isEmpty()) {
306             return new TopologyShard(null, links, tps);
307         } else {
308             return new TopologyShard(null, null, null);
309         }
310     }
311
312     private static List<Link> initialiseOtnLinks(String nodeA, String tpA, String nodeZ, String tpZ,
313             OtnLinkType linkType) {
314         List<Link> links = new ArrayList<>();
315         String nodeATopo = formatNodeName(nodeA, tpA);
316         String nodeZTopo = formatNodeName(nodeZ, tpZ);
317         org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.Link1 tpceLink1
318             = new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.Link1Builder()
319             .setOtnLinkType(linkType).build();
320         Link1Builder otnLink1Bldr = new Link1Builder()
321             .setUsedBandwidth(Uint32.valueOf(0));
322         switch (linkType) {
323             case OTU4:
324             case ODTU4:
325                 otnLink1Bldr.setAvailableBandwidth(Uint32.valueOf(100000));
326                 break;
327             case OTUC4:
328             case ODUC4:
329                 otnLink1Bldr.setAvailableBandwidth(Uint32.valueOf(400000));
330                 break;
331             default:
332                 LOG.error("unable to set available bandwidth to unknown link type");
333                 break;
334         }
335         // create link A-Z
336         LinkBuilder ietfLinkAZBldr = TopologyUtils.createLink(nodeATopo, nodeZTopo, tpA, tpZ, linkType.getName());
337         ietfLinkAZBldr
338             .addAugmentation(tpceLink1)
339             .addAugmentation(otnLink1Bldr.build())
340             .addAugmentation(
341                 new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1Builder(
342                         ietfLinkAZBldr.augmentation(
343                             org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1.class))
344                         .setLinkType(OpenroadmLinkType.OTNLINK)
345                         .setOperationalState(State.InService)
346                         .setAdministrativeState(AdminStates.InService)
347                         .build());
348         links.add(ietfLinkAZBldr.build());
349         // create link Z-A
350         LinkBuilder ietfLinkZABldr = TopologyUtils.createLink(nodeZTopo, nodeATopo, tpZ, tpA, linkType.getName());
351         ietfLinkZABldr
352             .addAugmentation(tpceLink1)
353             .addAugmentation(otnLink1Bldr.build())
354             .addAugmentation(
355                 new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1Builder(
356                         ietfLinkZABldr.augmentation(
357                             org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1.class))
358                         .setLinkType(OpenroadmLinkType.OTNLINK)
359                         .setOperationalState(State.InService)
360                         .setAdministrativeState(AdminStates.InService)
361                         .build());
362         links.add(ietfLinkZABldr.build());
363         return links;
364     }
365
366     private static Link updateOtnLinkBwParameters(Link link, Long availBw, Long usedBw) {
367         LOG.debug("in updateOtnLinkBwParameters with availBw = {}, usedBw = {}", availBw, usedBw);
368         LinkBuilder updatedLinkBldr = new LinkBuilder(link);
369         Link1Builder updatedLink1Bldr = new Link1Builder(link.augmentation(Link1.class))
370             .setAvailableBandwidth(Uint32.valueOf(availBw))
371             .setUsedBandwidth(Uint32.valueOf(usedBw));
372         updatedLinkBldr.addAugmentation(updatedLink1Bldr.build());
373         return updatedLinkBldr.build();
374     }
375
376     private static List<Link> updateOtnLinkBwParameters(List<Link> supportedLinks, OtnLinkType linkType) {
377         LOG.debug("in updateOtnLinkBwParameters with supportedLinks = {}, linkType = {}", supportedLinks, linkType);
378         Uint32 usedBw;
379         switch (linkType) {
380             case ODTU4:
381                 usedBw = Uint32.valueOf(100000);
382                 break;
383             case ODUC4:
384                 usedBw = Uint32.valueOf(400000);
385                 break;
386             default:
387                 usedBw = Uint32.valueOf(0);
388                 break;
389         }
390         List<Link> updatedlinks = new ArrayList<>();
391         for (Link link : supportedLinks) {
392             LinkBuilder updatedLinkBldr = new LinkBuilder(link);
393             updatedLinkBldr.addAugmentation(new Link1Builder(link.augmentation(Link1.class))
394                 .setAvailableBandwidth(Uint32.valueOf(0))
395                 .setUsedBandwidth(usedBw)
396                 .build());
397             updatedlinks.add(updatedLinkBldr.build());
398         }
399         return updatedlinks;
400     }
401
402     private static TerminationPoint updateTp(TerminationPoint originalTp, boolean addingTsTpnPoolTermination,
403             OtnLinkType linkType) {
404         LOG.debug("in updateTp");
405         TerminationPointBuilder tpBldr = new TerminationPointBuilder(originalTp);
406         TerminationPoint1Builder otnTp1Bldr = new TerminationPoint1Builder(
407             tpBldr.augmentation(TerminationPoint1.class));
408         XpdrTpPortConnectionAttributesBuilder xtpcaBldr = new XpdrTpPortConnectionAttributesBuilder(otnTp1Bldr
409             .getXpdrTpPortConnectionAttributes());
410         if (addingTsTpnPoolTermination) {
411             List<Uint16> tsPool = new ArrayList<>();
412             for (int i = 1; i <= NB_TRIB_SLOTS; i++) {
413                 tsPool.add(Uint16.valueOf(i));
414             }
415             xtpcaBldr.setTsPool(tsPool);
416             List<Uint16> tpnPool = new ArrayList<>();
417             int nbTribPort = NB_TRIB_PORTS;
418             if (OtnLinkType.ODUC4.equals(linkType)) {
419                 nbTribPort = 4;
420             }
421             for (int i = 1; i <= nbTribPort; i++) {
422                 tpnPool.add(Uint16.valueOf(i));
423             }
424             OdtuTpnPool oduTpnPool = new OdtuTpnPoolBuilder().setOdtuType(ODTU4TsAllocated.class)
425                 .setTpnPool(tpnPool).build();
426             xtpcaBldr.setOdtuTpnPool(ImmutableMap.of(oduTpnPool.key(),oduTpnPool));
427         } else {
428             xtpcaBldr.setTsPool(null);
429             xtpcaBldr.setOdtuTpnPool(ImmutableMap.of());
430         }
431         return tpBldr.addAugmentation(otnTp1Bldr.setXpdrTpPortConnectionAttributes(xtpcaBldr.build()).build()).build();
432     }
433
434     private static TerminationPoint updateNodeTpTsPool(TerminationPoint tp, Uint32 serviceRate, Short tribPortNb,
435         Short minTribSlotNb, Short maxTribSlotNb, boolean isDeletion) {
436         LOG.debug("in updateNodeTpTsPool");
437         TerminationPointBuilder tpBldr = new TerminationPointBuilder(tp);
438         @Nullable
439         XpdrTpPortConnectionAttributesBuilder xtpcaBldr = new XpdrTpPortConnectionAttributesBuilder(
440             tpBldr.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes());
441         List<Uint16> tsPool = new ArrayList<>(xtpcaBldr.getTsPool());
442         if (isDeletion) {
443             for (int i = minTribSlotNb; i <= maxTribSlotNb; i++) {
444                 tsPool.add(Uint16.valueOf(i));
445             }
446         } else {
447             for (int i = minTribSlotNb; i <= maxTribSlotNb; i++) {
448                 tsPool.remove(Uint16.valueOf(i));
449             }
450         }
451         xtpcaBldr.setTsPool(tsPool);
452         List<Uint16> tpnPool;
453         List<OdtuTpnPool> odtuTpnPoolValues = new ArrayList<>(xtpcaBldr.getOdtuTpnPool().values());
454         if (odtuTpnPoolValues.get(0).getTpnPool() != null) {
455             tpnPool = new ArrayList<>(odtuTpnPoolValues.get(0).getTpnPool());
456             if (isDeletion) {
457                 tpnPool.add(Uint16.valueOf(tribPortNb));
458             } else {
459                 tpnPool.remove(Uint16.valueOf(tribPortNb));
460             }
461         } else {
462             tpnPool = new ArrayList<>();
463         }
464         Class<? extends OdtuTypeIdentity> odtuType = null;
465         switch (serviceRate.intValue()) {
466             case 1:
467             case 10:
468                 odtuType = ODTU4TsAllocated.class;
469                 break;
470             case 100:
471                 odtuType = ODTUCnTs.class;
472                 break;
473             default:
474                 LOG.warn("Unable to set the odtu-type");
475                 break;
476         }
477         OdtuTpnPool odtuTpnPool = new OdtuTpnPoolBuilder().setOdtuType(odtuType)
478             .setTpnPool(tpnPool).build();
479         xtpcaBldr.setOdtuTpnPool(ImmutableMap.of(odtuTpnPool.key(),odtuTpnPool));
480
481         tpBldr.addAugmentation(new TerminationPoint1Builder(tp.augmentation(TerminationPoint1.class))
482                 .setXpdrTpPortConnectionAttributes(xtpcaBldr.build()).build());
483         return tpBldr.build();
484     }
485
486     private static Map<Integer, OtnTopoNode> convertPortMappingToOtnNodeList(Nodes mappingNode) {
487         List<Mapping> networkMappings = mappingNode.nonnullMapping().values()
488                 .stream().filter(k -> k.getLogicalConnectionPoint()
489             .contains("NETWORK")).collect(Collectors.toList());
490         Map<Integer, OtnTopoNode> xpdrMap = new HashMap<>();
491         for (Mapping mapping : networkMappings) {
492             Integer xpdrNb = Integer.parseInt(mapping.getLogicalConnectionPoint().split("XPDR")[1].split("-")[0]);
493             if (!xpdrMap.containsKey(xpdrNb)) {
494                 List<Mapping> xpdrNetMaps = mappingNode.nonnullMapping().values()
495                         .stream().filter(k -> k.getLogicalConnectionPoint()
496                     .contains("XPDR" + xpdrNb + NETWORK)).collect(Collectors.toList());
497                 List<Mapping> xpdrClMaps = mappingNode.nonnullMapping().values()
498                         .stream().filter(k -> k.getLogicalConnectionPoint()
499                     .contains("XPDR" + xpdrNb + CLIENT)).collect(Collectors.toList());
500                 OtnTopoNode otnNode = null;
501                 if (mapping.getXponderType() != null) {
502                     otnNode = new OtnTopoNode(mappingNode.getNodeId(), mappingNode.getNodeInfo().getNodeClli(), xpdrNb,
503                         mapping.getXponderType(), fillConnectionMapLcp(xpdrNetMaps), fillConnectionMapLcp(xpdrClMaps),
504                         xpdrNetMaps, xpdrClMaps);
505                 } else {
506                     otnNode = new OtnTopoNode(mappingNode.getNodeId(), mappingNode.getNodeInfo().getNodeClli(), xpdrNb,
507                         XpdrNodeTypes.Tpdr, fillConnectionMapLcp(xpdrNetMaps), fillConnectionMapLcp(xpdrClMaps),
508                         xpdrNetMaps, xpdrClMaps);
509                 }
510                 xpdrMap.put(xpdrNb, otnNode);
511             }
512         }
513         LOG.debug("there are {} xpdr to build", xpdrMap.size());
514         xpdrMap.forEach((k, v) -> LOG.debug("xpdr {} = {} - {} - {} - {}", k, v.getNodeId(), v.getNodeType(),
515             v.getNbTpClient(), v.getNbTpNetwork()));
516         return xpdrMap;
517     }
518
519     private static Map<String, String> fillConnectionMapLcp(List<Mapping> mappingList) {
520         Map<String, String> xpdrConnectionMap = new HashMap<>();
521         for (Mapping map : mappingList) {
522             if (map.getConnectionMapLcp() != null) {
523                 xpdrConnectionMap.put(map.getLogicalConnectionPoint(), map.getConnectionMapLcp());
524             } else {
525                 xpdrConnectionMap.put(map.getLogicalConnectionPoint(), null);
526             }
527         }
528         return xpdrConnectionMap;
529     }
530
531     private static Node createTpdr(OtnTopoNode node) {
532         // create otn-topology node augmentation
533         XpdrAttributes xpdrAttr = new XpdrAttributesBuilder()
534             .setXpdrNumber(Uint16.valueOf(node.getXpdrNb()))
535             .build();
536         Node1 otnNodeAug = new Node1Builder()
537             .setXpdrAttributes(xpdrAttr)
538             .build();
539         org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 ocnNodeAug =
540             new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1Builder()
541                     .setNodeType(OpenroadmNodeType.TPDR)
542                     .setOperationalState(State.InService)
543                     .setAdministrativeState(AdminStates.InService)
544                     .build();
545         // create ietf node augmentation to add TP list
546         Map<TerminationPointKey,TerminationPoint> tpMap = new HashMap<>();
547         // creation of tps
548         createTP(tpMap, node, OpenroadmTpType.XPONDERCLIENT, false);
549         createTP(tpMap, node, OpenroadmTpType.XPONDERNETWORK, true);
550
551         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1 ietfNodeAug =
552             new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder()
553             .setTerminationPoint(tpMap)
554             .build();
555
556         // return ietfNode
557         return new NodeBuilder()
558             .setNodeId(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
559             .withKey(new NodeKey(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())))
560             .setSupportingNode(createSupportingNodes(node))
561             .addAugmentation(otnNodeAug)
562             .addAugmentation(ocnNodeAug)
563             .addAugmentation(ietfNodeAug)
564             .build();
565     }
566
567     private static Node createMuxpdr(OtnTopoNode node) {
568         // create otn-topology node augmentation
569         // TODO: will need to be completed
570         TpBandwidthSharing tpBwSh = new TpBandwidthSharingBuilder().build();
571         XpdrAttributes xpdrAttr = new XpdrAttributesBuilder()
572             .setXpdrNumber(Uint16.valueOf(node.getXpdrNb()))
573             .build();
574
575         Map<NonBlockingListKey, NonBlockingList> nbMap = new HashMap<>();
576         for (int i = 1; i <= node.getNbTpClient(); i++) {
577             List<TpId> tpList = new ArrayList<>();
578             TpId tpId = new TpId("XPDR" + node.getXpdrNb() + CLIENT + i);
579             tpList.add(tpId);
580             tpId = new TpId("XPDR" + node.getXpdrNb() + "-NETWORK1");
581             tpList.add(tpId);
582             NonBlockingList nbl = new NonBlockingListBuilder()
583                 .setNblNumber(Uint16.valueOf(i))
584                 .setTpList(tpList)
585                 .setAvailableInterconnectBandwidth(Uint32.valueOf(node.getNbTpNetwork() * 10L))
586                 .setInterconnectBandwidthUnit(Uint32.valueOf(1000000000))
587                 .build();
588             nbMap.put(nbl.key(),nbl);
589         }
590         OduSwitchingPools oduSwitchPool = new OduSwitchingPoolsBuilder()
591             .setSwitchingPoolNumber(Uint16.valueOf(1))
592             .setSwitchingPoolType(SwitchingPoolTypes.NonBlocking)
593             .setNonBlockingList(nbMap)
594             .build();
595         SwitchingPools switchingPools = new SwitchingPoolsBuilder()
596             .setOduSwitchingPools(Map.of(oduSwitchPool.key(),oduSwitchPool))
597             .build();
598         Node1 otnNodeAug = new Node1Builder()
599             .setTpBandwidthSharing(tpBwSh)
600             .setXpdrAttributes(xpdrAttr)
601             .setSwitchingPools(switchingPools)
602             .build();
603         org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 ocnNodeAug =
604             new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1Builder()
605                     .setNodeType(OpenroadmNodeType.MUXPDR)
606                     .setAdministrativeState(AdminStates.InService)
607                     .setOperationalState(State.InService)
608                     .build();
609
610         // create ietf node augmentation to add TP list
611         Map<TerminationPointKey, TerminationPoint> tpMap = new HashMap<>();
612         // creation of tps
613         createTP(tpMap, node, OpenroadmTpType.XPONDERCLIENT, true);
614         createTP(tpMap, node, OpenroadmTpType.XPONDERNETWORK, true);
615
616         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1 ietfNodeAug =
617             new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder()
618             .setTerminationPoint(tpMap)
619             .build();
620
621         // return ietfNode
622         return new NodeBuilder()
623             .setNodeId(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
624             .withKey(new NodeKey(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())))
625             .setSupportingNode(createSupportingNodes(node))
626             .addAugmentation(otnNodeAug)
627             .addAugmentation(ocnNodeAug)
628             .addAugmentation(ietfNodeAug)
629             .build();
630     }
631
632     private static Node createSwitch(OtnTopoNode node) {
633         List<TpId> tpl = new ArrayList<>();
634         TpId tpId = null;
635         for (int i = 1; i <= node.getNbTpClient(); i++) {
636             tpId = new TpId("XPDR" + node.getXpdrNb() + CLIENT + i);
637             tpl.add(tpId);
638         }
639         for (int i = 1; i <= node.getNbTpNetwork(); i++) {
640             tpId = new TpId("XPDR" + node.getXpdrNb() + NETWORK + i);
641             tpl.add(tpId);
642         }
643         Map<NonBlockingListKey, NonBlockingList> nbMap = new HashMap<>();
644         NonBlockingList nbl = new NonBlockingListBuilder()
645             .setNblNumber(Uint16.valueOf(1))
646             .setTpList(tpl)
647             .build();
648         nbMap.put(nbl.key(),nbl);
649
650         OduSwitchingPools oduSwitchPool = new OduSwitchingPoolsBuilder()
651             .setSwitchingPoolNumber(Uint16.valueOf(1))
652             .setSwitchingPoolType(SwitchingPoolTypes.NonBlocking)
653             .setNonBlockingList(nbMap)
654             .build();
655         Map<OduSwitchingPoolsKey, OduSwitchingPools> oduSwitchPoolList = new HashMap<>();
656         oduSwitchPoolList.put(oduSwitchPool.key(),oduSwitchPool);
657         SwitchingPools switchingPools = new SwitchingPoolsBuilder()
658             .setOduSwitchingPools(oduSwitchPoolList)
659             .build();
660
661         // create otn-topology node augmentation
662         // TODO: will need to be completed
663         TpBandwidthSharing tpBwSh = new TpBandwidthSharingBuilder().build();
664         XpdrAttributes xpdrAttr = new XpdrAttributesBuilder()
665             .setXpdrNumber(Uint16.valueOf(node.getXpdrNb()))
666             .build();
667
668         Node1 otnNodeAug = new Node1Builder()
669             .setTpBandwidthSharing(tpBwSh)
670             .setXpdrAttributes(xpdrAttr)
671             .setSwitchingPools(switchingPools)
672             .build();
673         org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 ocnNodeAug =
674             new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1Builder()
675                     .setNodeType(OpenroadmNodeType.SWITCH)
676                     .setOperationalState(State.InService)
677                     .setAdministrativeState(AdminStates.InService)
678                     .build();
679
680         // create ietf node augmentation to add TP list
681         Map<TerminationPointKey, TerminationPoint> tpMap = new HashMap<>();
682         // creation of tps
683         createTP(tpMap, node, OpenroadmTpType.XPONDERCLIENT, true);
684         createTP(tpMap, node, OpenroadmTpType.XPONDERNETWORK, true);
685         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1 ietfNodeAug =
686             new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder()
687             .setTerminationPoint(tpMap)
688             .build();
689
690         // return ietfNode
691         return new NodeBuilder()
692             .setNodeId(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
693             .withKey(new NodeKey(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())))
694             .setSupportingNode(createSupportingNodes(node))
695             .addAugmentation(otnNodeAug)
696             .addAugmentation(ocnNodeAug)
697             .addAugmentation(ietfNodeAug)
698             .build();
699     }
700
701     private static void createTP(Map<TerminationPointKey, TerminationPoint> tpMap,
702             OtnTopoNode node, OpenroadmTpType tpType, boolean withRate) {
703         List<Mapping> mappings = null;
704         switch (tpType) {
705             case XPONDERNETWORK:
706                 mappings = node.getXpdrNetMappings();
707                 break;
708             case XPONDERCLIENT:
709                 mappings = node.getXpdrClMappings();
710                 break;
711             default:
712                 LOG.error("Error with Termination Point type {}", tpType);
713                 return;
714         }
715         fillTpMap(tpMap, node, tpType, withRate, mappings);
716     }
717
718     private static void fillTpMap(Map<TerminationPointKey, TerminationPoint> tpMap, OtnTopoNode node,
719             OpenroadmTpType tpType, boolean withRate, List<Mapping> mappings) {
720         for (Mapping mapping : mappings) {
721             // openroadm-otn-topoology augmentation
722             Map<SupportedInterfaceCapabilityKey, SupportedInterfaceCapability> supIfMap = new HashMap<>();
723             TerminationPoint1Builder otnTp1Bldr = new TerminationPoint1Builder();
724             if (mapping.getSupportedInterfaceCapability() != null) {
725                 XpdrTpPortConnectionAttributesBuilder xtpcaBldr = new XpdrTpPortConnectionAttributesBuilder();
726                 for (Class<? extends SupportedIfCapability> supInterCapa : mapping.getSupportedInterfaceCapability()) {
727                     SupportedInterfaceCapability supIfCapa = new SupportedInterfaceCapabilityBuilder()
728                         .withKey(new SupportedInterfaceCapabilityKey(supInterCapa))
729                         .setIfCapType(supInterCapa)
730                         .build();
731                     supIfMap.put(supIfCapa.key(), supIfCapa);
732                 }
733                 TpSupportedInterfaces tpSupIf = new TpSupportedInterfacesBuilder()
734                     .setSupportedInterfaceCapability(supIfMap)
735                     .build();
736                 otnTp1Bldr.setTpSupportedInterfaces(tpSupIf);
737                 //TODO: It is not logical to assign a priori one of the possible rate to the TP.
738                 //Would be worth assigning per default "unallocated" at the tp creation step,
739                 //and updating it with correct rate when it supports a specific service.
740                 if (withRate) {
741                     xtpcaBldr.setRate(fixRate(mapping.getSupportedInterfaceCapability()));
742                     otnTp1Bldr.setXpdrTpPortConnectionAttributes(xtpcaBldr.build());
743                 }
744             } else {
745                 LOG.warn("mapping {} of node {} has no if-cap-type", mapping.getLogicalConnectionPoint(),
746                     node.getNodeId());
747             }
748             org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.TerminationPoint1Builder tpceTp1Bldr =
749                 new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.TerminationPoint1Builder();
750             TpId tpId = new TpId(mapping.getLogicalConnectionPoint());
751             setclientNwTpAttr(tpMap, node, tpId, tpType, otnTp1Bldr.build(), tpceTp1Bldr, mapping);
752         }
753     }
754
755     private static void setclientNwTpAttr(Map<TerminationPointKey, TerminationPoint> tpMap, OtnTopoNode node, TpId tpId,
756             OpenroadmTpType tpType, TerminationPoint1 otnTp1,
757             org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.TerminationPoint1Builder tpceTp1Bldr,
758             Mapping mapping) {
759         switch (tpType) {
760             case XPONDERNETWORK:
761                 if (node.getXpdrNetConnectionMap().get(tpId.getValue()) != null) {
762                     tpceTp1Bldr.setAssociatedConnectionMapPort(node.getXpdrNetConnectionMap().get(tpId.getValue()));
763                 }
764                 SupportingTerminationPoint stp = new SupportingTerminationPointBuilder()
765                     .setNetworkRef(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))
766                     .setNodeRef(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
767                     .setTpRef(tpId)
768                     .build();
769                 TerminationPoint ietfTpNw = buildIetfTp(tpceTp1Bldr, otnTp1, tpType, tpId, Map.of(stp.key(), stp),
770                     mapping);
771                 tpMap.put(ietfTpNw.key(),ietfTpNw);
772                 break;
773             case XPONDERCLIENT:
774                 if (node.getXpdrCliConnectionMap().get(tpId.getValue()) != null) {
775                     tpceTp1Bldr.setAssociatedConnectionMapPort(node.getXpdrCliConnectionMap().get(tpId.getValue()));
776                 }
777                 TerminationPoint ietfTpCl = buildIetfTp(tpceTp1Bldr, otnTp1, tpType, tpId, null, mapping);
778                 tpMap.put(ietfTpCl.key(),ietfTpCl);
779                 break;
780             default:
781                 LOG.error("Undefined tpType for Termination point {} of {}", tpId.getValue(), node.getNodeId());
782                 break;
783         }
784     }
785
786     private static Class<? extends OduRateIdentity> fixRate(List<Class<? extends SupportedIfCapability>> list) {
787         Map<String, Class<? extends OduRateIdentity>> rateMap = Map.of(
788             "If100GEODU4", ODU4.class,
789             "IfOCHOTU4ODU4", ODU4.class,
790             "If1GEODU0", ODU0.class,
791             "If10GEODU2", ODU2.class,
792             "If10GEODU2e", ODU2e.class);
793         for (Class<? extends SupportedIfCapability> class1 : list) {
794             if (rateMap.containsKey(class1.getSimpleName())) {
795                 return rateMap.get(class1.getSimpleName());
796             }
797         }
798         return null;
799     }
800
801     private static Map<SupportingNodeKey,SupportingNode> createSupportingNodes(OtnTopoNode node) {
802         SupportingNode suppNode1 = new SupportingNodeBuilder()
803             .setNetworkRef(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))
804             .setNodeRef(new NodeId(node.getNodeId()))
805             .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID),
806                 new NodeId(node.getNodeId())))
807             .build();
808         SupportingNode suppNode2 = new SupportingNodeBuilder()
809             .setNetworkRef(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))
810             .setNodeRef(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
811             .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID),
812                 new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())))
813             .build();
814         SupportingNode suppNode3 = new SupportingNodeBuilder()
815             .setNetworkRef(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))
816             .setNodeRef(new NodeId(node.getClli()))
817             .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID),
818                 new NodeId(node.getClli())))
819             .build();
820         Map<SupportingNodeKey,SupportingNode> suppNodeMap = new HashMap<>();
821         suppNodeMap.put(suppNode1.key(),suppNode1);
822         suppNodeMap.put(suppNode2.key(),suppNode2);
823         suppNodeMap.put(suppNode3.key(),suppNode3);
824         return suppNodeMap;
825     }
826
827     private static TerminationPoint buildIetfTp(
828         org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.TerminationPoint1Builder tpceTp1Bldr,
829         TerminationPoint1 otnTp1, OpenroadmTpType tpType, TpId tpId,
830         Map<SupportingTerminationPointKey, SupportingTerminationPoint> supportTpMap, Mapping mapping) {
831
832         TerminationPointBuilder ietfTpBldr = new TerminationPointBuilder();
833         if (tpceTp1Bldr.getAssociatedConnectionMapPort() != null) {
834             ietfTpBldr.addAugmentation(tpceTp1Bldr.build());
835         }
836         if (supportTpMap != null) {
837             ietfTpBldr.setSupportingTerminationPoint(supportTpMap);
838         }
839         org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1 ocnTp =
840             new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1Builder()
841                     .setTpType(tpType)
842                     .setAdministrativeState(TopologyUtils.setNetworkAdminState(mapping.getPortAdminState()))
843                     .setOperationalState(TopologyUtils.setNetworkOperState(mapping.getPortOperState()))
844                     .build();
845
846         return ietfTpBldr.setTpId(tpId)
847                 .withKey(new TerminationPointKey(tpId))
848                 .addAugmentation(otnTp1)
849                 .addAugmentation(ocnTp)
850                 .build();
851     }
852
853     private static String formatNodeName(String nodeName, String tpName) {
854         return nodeName.contains(XPDR)
855                 ? nodeName
856                 : new StringBuilder(nodeName).append("-").append(tpName.split("-")[0]).toString();
857     }
858 }