c47acc9d9d5afc664b7fd9f5d69cd72d6517cd67
[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.HashSet;
15 import java.util.List;
16 import java.util.Map;
17 import java.util.Set;
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;
84
85 public final class OpenRoadmOtnTopology {
86
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;
94
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);
117
118     private OpenRoadmOtnTopology() {
119     }
120
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()) {
127                 case Tpdr:
128                     nodes.add(createTpdr(node));
129                     break;
130                 case Mpdr:
131                     nodes.add(createMuxpdr(node));
132                     break;
133                 case Switch:
134                     nodes.add(createSwitch(node));
135                     break;
136                 case Regen:
137                 case RegenUni:
138                     // TODO: Need to revisit this method
139                     nodes.add(createRegen(node));
140                     break;
141                 default:
142                     LOG.error("unknown otn node type {}", node.getNodeType().getName());
143                     return null;
144             }
145         }
146         return new TopologyShard(nodes, links);
147     }
148
149     public static TopologyShard createOtnLinks(String nodeA, String tpA, String nodeZ, String tpZ,
150             OtnLinkType linkType) {
151
152         return new TopologyShard(
153             null,
154             OTNLINKTYPE_OTU_BW_MAP.containsKey(linkType)
155                 ? initialiseOtnLinks(nodeA, tpA, nodeZ, tpZ, linkType)
156                 : null);
157     }
158
159     public static TopologyShard createOtnLinks(
160             org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.renderer.rpc.result.sp
161                 .Link notifLink,
162             OtnLinkType linkType) {
163
164         return new TopologyShard(
165             null,
166             initialiseOtnLinks(notifLink.getATermination().getNodeId(),
167             notifLink.getATermination().getTpId(),
168             notifLink.getZTermination().getNodeId(),
169             notifLink.getZTermination().getTpId(),
170             linkType));
171     }
172
173     public static TopologyShard createOtnLinks(
174             org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.renderer.rpc.result.sp
175                 .Link notifLink,
176             List<Link> supportedOtu4links, List<TerminationPoint> supportedTPs, OtnLinkType linkType) {
177
178         if (OTNLINKTYPE_OTU_BW_MAP.containsKey(linkType)) {
179             return new TopologyShard(
180                 null,
181                 initialiseOtnLinks(
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));
192             }
193             return new TopologyShard(null, links, updatedTPs);
194         } else {
195             return null;
196         }
197     }
198
199     public static TopologyShard createOtnLinks(List<Link> suppOtuLinks, List<TerminationPoint> oldTps,
200             OtnLinkType linkType) {
201
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());
206                 continue;
207             }
208             if (!OTNLINKTYPE_BW_MAP.containsKey(linkType)) {
209                 LOG.error("Error with link {} : unsupported OTN link type", link.getLinkId().getValue());
210                 continue;
211             }
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());
214                 continue;
215             }
216             links.add(updateOtnLinkBwParameters(link, 0L, OTNLINKTYPE_BW_MAP.get(linkType)));
217         }
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(),
223                 linkType));
224         }
225         List<TerminationPoint> tps = new ArrayList<>();
226         for (TerminationPoint tp : oldTps) {
227             tps.add(updateTp(tp, true, linkType));
228         }
229         return links.size() == 4 && tps.size() == 2
230             ?  new TopologyShard(null, links, tps)
231             :  new TopologyShard(null, null, null);
232     }
233
234     public static TopologyShard updateOtnLinks(List<Link> suppOduLinks, List<TerminationPoint> oldTps,
235             Uint32 serviceRate, Short tribPortNb, Short minTribSlotNb, Short maxTribSlotNb, boolean isDeletion) {
236
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);
241         }
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());
248             } else {
249                 Uint32 avlBw = link.augmentation(Link1.class).getAvailableBandwidth();
250                 Uint32 usedBw = link.augmentation(Link1.class).getUsedBandwidth();
251                 if (avlBw.toJava() < bwIncr) {
252                     bwIncr = 0L;
253                 }
254                 links.add(
255                     isDeletion
256                         ? updateOtnLinkBwParameters(link, avlBw.toJava() + bwIncr, usedBw.toJava() - bwIncr)
257                         : updateOtnLinkBwParameters(link, avlBw.toJava() - bwIncr, usedBw.toJava() + bwIncr)
258                 );
259             }
260         }
261         List<TerminationPoint> tps = new ArrayList<>();
262         for (TerminationPoint tp : oldTps) {
263             if (bwIncr > 0L) {
264                 tps.add(updateNodeTpTsPool(tp, serviceRate, tribPortNb, minTribSlotNb, maxTribSlotNb, isDeletion));
265             }
266         }
267         if (links.isEmpty() || tps.isEmpty()) {
268             LOG.error("unable to update otn links");
269             return new TopologyShard(null, null, null);
270         } else {
271             return new TopologyShard(null, links, tps);
272         }
273     }
274
275     public static TopologyShard updateOtnLinks(List<Link> suppOtuLinks, boolean isDeletion) {
276
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());
283             } else {
284                 links.add(
285                     isDeletion
286                         ? updateOtnLinkBwParameters(link, Long.valueOf(100000), Long.valueOf(0))
287                         : updateOtnLinkBwParameters(link, Long.valueOf(0), Long.valueOf(100000))
288                 );
289             }
290         }
291         if (links.isEmpty()) {
292             LOG.error("unable to update otn links");
293             return new TopologyShard(null, null, null);
294         } else {
295             return new TopologyShard(null, links, null);
296         }
297     }
298
299     public static TopologyShard deleteOtnLinks(List<Link> suppOtuLinks, List<TerminationPoint> oldTps,
300             OtnLinkType linkType) {
301
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);
310             }
311             OtnLinkType otnLinkType = link.augmentation(
312                     org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.Link1.class)
313                     .getOtnLinkType();
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());
317                 continue;
318             }
319             links.add(updateOtnLinkBwParameters(link, OTNLINKTYPE_OTU_BW_MAP.get(otnLinkType) , 0L));
320         }
321         List<TerminationPoint> tps = new ArrayList<>();
322         for (TerminationPoint tp : oldTps) {
323             tps.add(updateTp(tp, false, linkType));
324         }
325         return
326             links.isEmpty() || tps.isEmpty()
327                 ? new TopologyShard(null, null, null)
328                 : new TopologyShard(null, links, tps);
329     }
330
331     private static List<Link> initialiseOtnLinks(String nodeA, String tpA, String nodeZ, String tpZ,
332             OtnLinkType linkType) {
333
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)));
346         } else {
347             LOG.error("unable to set available bandwidth to unknown link type");
348         }
349         // create link A-Z
350         LinkBuilder ietfLinkAZBldr = TopologyUtils.createLink(nodeATopo, nodeZTopo, tpA, tpZ, linkType.getName());
351         links.add(ietfLinkAZBldr
352             .addAugmentation(tpceLink1)
353             .addAugmentation(otnLink1Bldr.build())
354             .addAugmentation(
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)
361                     .build())
362             .build());
363         // create link Z-A
364         LinkBuilder ietfLinkZABldr = TopologyUtils.createLink(nodeZTopo, nodeATopo, tpZ, tpA, linkType.getName());
365         links.add(ietfLinkZABldr
366             .addAugmentation(tpceLink1)
367             .addAugmentation(otnLink1Bldr.build())
368             .addAugmentation(
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)
375                     .build())
376             .build());
377         return links;
378     }
379
380     private static Link updateOtnLinkBwParameters(Link link, Long availBw, Long usedBw) {
381
382         LOG.debug("in updateOtnLinkBwParameters with availBw = {}, usedBw = {}", availBw, usedBw);
383         return new LinkBuilder(link)
384             .addAugmentation(
385                 new Link1Builder(link.augmentation(Link1.class))
386                     .setAvailableBandwidth(Uint32.valueOf(availBw))
387                     .setUsedBandwidth(Uint32.valueOf(usedBw))
388                     .build())
389             .build();
390     }
391
392     private static List<Link> updateOtnLinkBwParameters(List<Link> supportedLinks, OtnLinkType linkType) {
393
394         LOG.debug("in updateOtnLinkBwParameters with supportedLinks = {}, linkType = {}", supportedLinks, linkType);
395         List<Link> updatedlinks = new ArrayList<>();
396         for (Link link : supportedLinks) {
397             updatedlinks.add(
398                 new LinkBuilder(link)
399                     .addAugmentation(new Link1Builder(link.augmentation(Link1.class))
400                         .setAvailableBandwidth(Uint32.valueOf(0))
401                         .setUsedBandwidth(
402                             OTNLINKTYPE_BW_MAP.containsKey(linkType)
403                                 ? Uint32.valueOf(OTNLINKTYPE_BW_MAP.get(linkType))
404                                 : Uint32.valueOf(0))
405                         .build())
406                     .build());
407         }
408         return updatedlinks;
409     }
410
411     private static TerminationPoint updateTp(TerminationPoint originalTp, boolean addingTsTpnPoolTermination,
412             OtnLinkType linkType) {
413
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));
424             }
425             xtpcaBldr.setTsPool(tsPool);
426             Set<Uint16> tpnPool = new HashSet<>();
427             int nbTribPort = NB_TRIB_PORTS;
428             if (OtnLinkType.ODUC4.equals(linkType)) {
429                 nbTribPort = 4;
430             }
431             for (int i = 1; i <= nbTribPort; i++) {
432                 tpnPool.add(Uint16.valueOf(i));
433             }
434             OdtuTpnPool oduTpnPool = new OdtuTpnPoolBuilder()
435                 .setOdtuType(ODTU4TsAllocated.VALUE)
436                 .setTpnPool(tpnPool)
437                 .build();
438             xtpcaBldr.setOdtuTpnPool(ImmutableMap.of(oduTpnPool.key(),oduTpnPool));
439         } else {
440             xtpcaBldr.setTsPool(null);
441             xtpcaBldr.setOdtuTpnPool(ImmutableMap.of());
442         }
443         return tpBldr.addAugmentation(otnTp1Bldr.setXpdrTpPortConnectionAttributes(xtpcaBldr.build()).build()).build();
444     }
445
446     private static TerminationPoint updateNodeTpTsPool(TerminationPoint tp, Uint32 serviceRate, Short tribPortNb,
447             Short minTribSlotNb, Short maxTribSlotNb, boolean isDeletion) {
448
449         LOG.debug("in updateNodeTpTsPool");
450         TerminationPointBuilder tpBldr = new TerminationPointBuilder(tp);
451         @Nullable
452         XpdrTpPortConnectionAttributesBuilder xtpcaBldr =
453             new XpdrTpPortConnectionAttributesBuilder(
454                 tpBldr.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes());
455         Set<Uint16> tsPool = new HashSet<>(xtpcaBldr.getTsPool());
456         if (isDeletion) {
457             for (int i = minTribSlotNb; i <= maxTribSlotNb; i++) {
458                 tsPool.add(Uint16.valueOf(i));
459             }
460         } else {
461             for (int i = minTribSlotNb; i <= maxTribSlotNb; i++) {
462                 tsPool.remove(Uint16.valueOf(i));
463             }
464         }
465         xtpcaBldr.setTsPool(tsPool);
466         Set<Uint16> tpnPool;
467         List<OdtuTpnPool> odtuTpnPoolValues = new ArrayList<>(xtpcaBldr.getOdtuTpnPool().values());
468         if (odtuTpnPoolValues.get(0).getTpnPool() == null) {
469             tpnPool = new HashSet<>();
470         } else {
471             tpnPool = new HashSet<>(odtuTpnPoolValues.get(0).getTpnPool());
472             if (isDeletion) {
473                 tpnPool.add(Uint16.valueOf(tribPortNb));
474             } else {
475                 tpnPool.remove(Uint16.valueOf(tribPortNb));
476             }
477         }
478         OdtuTypeIdentity odtuType;
479         if (SERVICERATE_ODTUTYPECLASS_MAP.containsKey(serviceRate)) {
480             odtuType = SERVICERATE_ODTUTYPECLASS_MAP.get(serviceRate);
481         } else {
482             odtuType = null;
483             LOG.warn("Unable to set the odtu-type");
484         }
485         OdtuTpnPool odtuTpnPool = new OdtuTpnPoolBuilder()
486             .setOdtuType(odtuType)
487             .setTpnPool(tpnPool)
488             .build();
489         return tpBldr
490             .addAugmentation(
491                 new TerminationPoint1Builder(tp.augmentation(TerminationPoint1.class))
492                     .setXpdrTpPortConnectionAttributes(
493                         xtpcaBldr
494                             .setOdtuTpnPool(ImmutableMap.of(odtuTpnPool.key(),odtuTpnPool))
495                             .build())
496                     .build())
497             .build();
498     }
499
500     private static Map<Integer, OtnTopoNode> convertPortMappingToOtnNodeList(Nodes mappingNode) {
501
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());
518                 xpdrMap.put(
519                     xpdrNb,
520                     new OtnTopoNode(
521                         mappingNode.getNodeId(),
522                         mappingNode.getNodeInfo().getNodeClli(),
523                         xpdrNb,
524                         mapping.getXpdrType() == null
525                             ? XpdrNodeTypes.Tpdr
526                             : mapping.getXpdrType(),
527                         fillConnectionMapLcp(xpdrNetMaps),
528                         fillConnectionMapLcp(xpdrClMaps),
529                         xpdrNetMaps,
530                         xpdrClMaps
531                     ));
532             }
533         }
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()));
537         return xpdrMap;
538     }
539
540     private static Map<String, String> fillConnectionMapLcp(List<Mapping> mappingList) {
541
542         Map<String, String> xpdrConnectionMap = new HashMap<>();
543         for (Mapping map : mappingList) {
544             xpdrConnectionMap.put(map.getLogicalConnectionPoint(), map.getConnectionMapLcp());
545         }
546         return xpdrConnectionMap;
547     }
548
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);
553         // return ietfNode
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))
558             .addAugmentation(
559                 new Node1Builder()
560                     .setXpdrAttributes(
561                         new XpdrAttributesBuilder()
562                             .setXpdrNumber(Uint16.valueOf(node.getXpdrNb()))
563                             .build())
564                     .build())
565             .addAugmentation(
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)
570                     .build())
571             .addAugmentation(
572                 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
573                     .Node1Builder()
574                         .setTerminationPoint(tpMap)
575                         .build())
576             .build();
577     }
578
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);
585         // return ietfNode
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))
590                 .addAugmentation(
591                         new Node1Builder()
592                                 .setXpdrAttributes(
593                                         new XpdrAttributesBuilder()
594                                                 .setXpdrNumber(Uint16.valueOf(node.getXpdrNb()))
595                                                 .build())
596                                 .build())
597                 .addAugmentation(
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)
602                                 .build())
603                 .addAugmentation(
604                         new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
605                                 .Node1Builder()
606                                 .setTerminationPoint(tpMap)
607                                 .build())
608                 .build();
609     }
610
611     private static Node createMuxpdr(OtnTopoNode node) {
612
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))
622                 .setTpList(tpList)
623                 .setAvailableInterconnectBandwidth(Uint32.valueOf(node.getNbTpNetwork() * 10L))
624                 .setInterconnectBandwidthUnit(Uint32.valueOf(1000000000))
625                 .build();
626             nbMap.put(nbl.key(),nbl);
627         }
628         OduSwitchingPools oduSwitchPool = new OduSwitchingPoolsBuilder()
629             .setSwitchingPoolNumber(Uint16.valueOf(1))
630             .setSwitchingPoolType(SwitchingPoolTypes.NonBlocking)
631             .setNonBlockingList(nbMap)
632             .build();
633         Map<TerminationPointKey, TerminationPoint> tpMap = new HashMap<>();
634         createTP(tpMap, node, OpenroadmTpType.XPONDERCLIENT, true);
635         createTP(tpMap, node, OpenroadmTpType.XPONDERNETWORK, true);
636         // return ietfNode
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))
641             .addAugmentation(
642                 new Node1Builder()
643                     .setTpBandwidthSharing(new TpBandwidthSharingBuilder().build())
644                     .setXpdrAttributes(
645                         new XpdrAttributesBuilder()
646                             .setXpdrNumber(Uint16.valueOf(node.getXpdrNb()))
647                             .build())
648                     .setSwitchingPools(
649                         new SwitchingPoolsBuilder()
650                             .setOduSwitchingPools(Map.of(oduSwitchPool.key(),oduSwitchPool))
651                             .build())
652                     .build())
653             .addAugmentation(
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)
658                     .build())
659             .addAugmentation(
660                 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
661                     .Node1Builder()
662                         .setTerminationPoint(tpMap)
663                         .build())
664             .build();
665     }
666
667     private static Node createSwitch(OtnTopoNode node) {
668
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));
672         }
673         for (int i = 1; i <= node.getNbTpNetwork(); i++) {
674             tpl.add(new TpId("XPDR" + node.getXpdrNb() + NETWORK + i));
675         }
676         Map<NonBlockingListKey, NonBlockingList> nbMap = new HashMap<>();
677         NonBlockingList nbl = new NonBlockingListBuilder()
678             .setNblNumber(Uint16.valueOf(1))
679             .setTpList(tpl)
680             .build();
681         nbMap.put(nbl.key(),nbl);
682         OduSwitchingPools oduSwitchPool = new OduSwitchingPoolsBuilder()
683             .setSwitchingPoolNumber(Uint16.valueOf(1))
684             .setSwitchingPoolType(SwitchingPoolTypes.NonBlocking)
685             .setNonBlockingList(nbMap)
686             .build();
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);
692         // return ietfNode
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))
697             .addAugmentation(
698                 new Node1Builder()
699                     .setTpBandwidthSharing(new TpBandwidthSharingBuilder().build())
700                     .setXpdrAttributes(
701                         new XpdrAttributesBuilder()
702                             .setXpdrNumber(Uint16.valueOf(node.getXpdrNb()))
703                             .build())
704                     .setSwitchingPools(
705                         new SwitchingPoolsBuilder()
706                             .setOduSwitchingPools(oduSwitchPoolList)
707                             .build())
708                     .build())
709             .addAugmentation(
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)
714                     .build())
715             .addAugmentation(
716                 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
717                     .Node1Builder()
718                         .setTerminationPoint(tpMap)
719                         .build())
720             .build();
721     }
722
723     private static void createTP(Map<TerminationPointKey, TerminationPoint> tpMap,
724             OtnTopoNode node, OpenroadmTpType tpType, boolean withRate) {
725
726         List<Mapping> mappings = null;
727         switch (tpType) {
728             case XPONDERNETWORK:
729                 mappings = node.getXpdrNetMappings();
730                 break;
731             case XPONDERCLIENT:
732                 mappings = node.getXpdrClMappings();
733                 break;
734             default:
735                 LOG.error("Error with Termination Point type {}", tpType);
736                 return;
737         }
738         fillTpMap(tpMap, node, tpType, withRate, mappings);
739     }
740
741     private static void fillTpMap(Map<TerminationPointKey, TerminationPoint> tpMap, OtnTopoNode node,
742             OpenroadmTpType tpType, boolean withRate, List<Mapping> mappings) {
743
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());
751             } else {
752                 XpdrTpPortConnectionAttributesBuilder xtpcaBldr = new XpdrTpPortConnectionAttributesBuilder();
753                 for (SupportedIfCapability supInterCapa : mapping.getSupportedInterfaceCapability()) {
754                     SupportedInterfaceCapability supIfCapa = new SupportedInterfaceCapabilityBuilder()
755                         .withKey(new SupportedInterfaceCapabilityKey(supInterCapa))
756                         .setIfCapType(supInterCapa)
757                         .build();
758                     supIfMap.put(supIfCapa.key(), supIfCapa);
759                 }
760                 otnTp1Bldr.setTpSupportedInterfaces(
761                     new TpSupportedInterfacesBuilder()
762                         .setSupportedInterfaceCapability(supIfMap)
763                         .build()
764                 );
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.
768                 if (withRate) {
769                     otnTp1Bldr.setXpdrTpPortConnectionAttributes(
770                         xtpcaBldr.setRate(fixRate(mapping.getSupportedInterfaceCapability())).build());
771                 }
772             }
773             setclientNwTpAttr(
774                 tpMap,
775                 node,
776                 new TpId(mapping.getLogicalConnectionPoint()),
777                 tpType,
778                 otnTp1Bldr.build(),
779                 mapping);
780         }
781     }
782
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();
788         switch (tpType) {
789             case XPONDERNETWORK:
790                 if (node.getXpdrNetConnectionMap().get(tpId.getValue()) != null) {
791                     cnTP1BLdr.setAssociatedConnectionMapTp(Set.of(
792                             new TpId(node.getXpdrNetConnectionMap().get(tpId.getValue()))));
793                 }
794                 SupportingTerminationPoint stp = new SupportingTerminationPointBuilder()
795                     .setNetworkRef(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))
796                     .setNodeRef(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
797                     .setTpRef(tpId)
798                     .build();
799                 TerminationPoint ietfTpNw =
800                     buildIetfTp(cnTP1BLdr, otnTp1, tpType, tpId, Map.of(stp.key(), stp), mapping);
801                 tpMap.put(ietfTpNw.key(),ietfTpNw);
802                 break;
803             case XPONDERCLIENT:
804                 if (node.getXpdrCliConnectionMap().get(tpId.getValue()) != null) {
805                     cnTP1BLdr.setAssociatedConnectionMapTp(Set.of(
806                             new TpId(node.getXpdrCliConnectionMap().get(tpId.getValue()))));
807                 }
808                 TerminationPoint ietfTpCl = buildIetfTp(cnTP1BLdr, otnTp1, tpType, tpId, null, mapping);
809                 tpMap.put(ietfTpCl.key(),ietfTpCl);
810                 break;
811             default:
812                 LOG.error("Undefined tpType for Termination point {} of {}", tpId.getValue(), node.getNodeId());
813                 break;
814         }
815     }
816
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);
822             }
823         }
824         return null;
825     }
826
827     private static Map<SupportingNodeKey,SupportingNode> createSupportingNodes(OtnTopoNode node) {
828
829         SupportingNode suppNode1 = new SupportingNodeBuilder()
830             .setNetworkRef(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))
831             .setNodeRef(new NodeId(node.getNodeId()))
832             .withKey(
833                 new SupportingNodeKey(
834                     new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID),
835                     new NodeId(node.getNodeId())))
836             .build();
837         SupportingNode suppNode2 = new SupportingNodeBuilder()
838             .setNetworkRef(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))
839             .setNodeRef(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
840             .withKey(
841                 new SupportingNodeKey(
842                     new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID),
843                     new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())))
844             .build();
845         SupportingNode suppNode3 = new SupportingNodeBuilder()
846             .setNetworkRef(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))
847             .setNodeRef(new NodeId(node.getClli()))
848             .withKey(
849                 new SupportingNodeKey(
850                     new NetworkId(NetworkUtils.CLLI_NETWORK_ID),
851                     new NodeId(node.getClli())))
852             .build();
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);
857         return suppNodeMap;
858     }
859
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) {
864
865         TerminationPointBuilder ietfTpBldr = new TerminationPointBuilder();
866         if (supportTpMap != null) {
867             ietfTpBldr.setSupportingTerminationPoint(supportTpMap);
868         }
869         return ietfTpBldr
870             .setTpId(tpId)
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()))
876                     .build())
877                 .build();
878     }
879
880     private static String formatNodeName(String nodeName, String tpName) {
881
882         return nodeName.contains(XPDR)
883                 ? nodeName
884                 : new StringBuilder(nodeName).append("-").append(tpName.split("-")[0]).toString();
885     }
886
887 }