Fix spotbugs issues in network topologies module
[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 java.util.ArrayList;
12 import java.util.HashMap;
13 import java.util.List;
14 import java.util.Map;
15 import java.util.stream.Collectors;
16
17 import org.opendaylight.transportpce.common.NetworkUtils;
18 import org.opendaylight.transportpce.networkmodel.dto.OtnTopoNode;
19 import org.opendaylight.transportpce.networkmodel.dto.TopologyShard;
20 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev200128.network.Nodes;
21 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev200128.network.nodes.Mapping;
22 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.XpdrNodeTypes;
23 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev181130.xpdr.odu.switching.pools.OduSwitchingPools;
24 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev181130.xpdr.odu.switching.pools.OduSwitchingPoolsBuilder;
25 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev181130.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
26 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev181130.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListBuilder;
27 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev181130.OpenroadmNodeType;
28 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev181130.OpenroadmTpType;
29 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev181130.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
30 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev181130.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityBuilder;
31 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev181130.ODU0;
32 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev181130.ODU2e;
33 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev181130.ODU4;
34 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev181130.OduRateIdentity;
35 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.Node1;
36 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.Node1Builder;
37 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.TerminationPoint1;
38 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.TerminationPoint1Builder;
39 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.networks.network.node.SwitchingPools;
40 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.networks.network.node.SwitchingPoolsBuilder;
41 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.networks.network.node.TpBandwidthSharing;
42 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.networks.network.node.TpBandwidthSharingBuilder;
43 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.networks.network.node.XpdrAttributes;
44 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.networks.network.node.XpdrAttributesBuilder;
45 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.networks.network.node.termination.point.TpSupportedInterfaces;
46 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.networks.network.node.termination.point.TpSupportedInterfacesBuilder;
47 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.networks.network.node.termination.point.XpdrTpPortConnectionAttributesBuilder;
48 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev181130.If100GE;
49 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev181130.If100GEODU4;
50 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev181130.If10GEODU2e;
51 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev181130.IfOCHOTU4ODU4;
52 import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev181130.SupportedIfCapability;
53 import org.opendaylight.yang.gen.v1.http.org.openroadm.switching.pool.types.rev181130.SwitchingPoolTypes;
54 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
55 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
56 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
57 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeBuilder;
58 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeKey;
59 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNode;
60 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeBuilder;
61 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeKey;
62 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
63 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
64 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
65 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointBuilder;
66 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointKey;
67 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.termination.point.SupportingTerminationPoint;
68 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.termination.point.SupportingTerminationPointBuilder;
69 import org.opendaylight.yangtools.yang.common.Uint16;
70 import org.opendaylight.yangtools.yang.common.Uint32;
71 import org.slf4j.Logger;
72 import org.slf4j.LoggerFactory;
73
74 public final class OpenRoadmOtnTopology {
75
76     private static final Logger LOG = LoggerFactory.getLogger(OpenRoadmOtnTopology.class);
77     private static final String CLIENT = "-CLIENT";
78     private static final String NETWORK = "-NETWORK";
79     private static final String XPDR = "-XPDR";
80
81     private OpenRoadmOtnTopology() {
82     }
83
84     public static TopologyShard createTopologyShard(Nodes mappingNode) {
85         List<Node> nodes = new ArrayList<>();
86         List<Link> links = new ArrayList<>();
87         Map<Integer, OtnTopoNode> xpdrMap = convertPortMappingToOtnNodeList(mappingNode);
88         for (OtnTopoNode node : xpdrMap.values()) {
89             switch (node.getNodeType()) {
90                 case Tpdr:
91                     nodes.add(createTpdr(node));
92                     break;
93                 case Mpdr:
94                     nodes.add(createMuxpdr(node));
95                     break;
96                 case Switch:
97                     nodes.add(createSwitch(node));
98                     break;
99                 default:
100                     LOG.error("unknown otn node type {}", node.getNodeType().getName());
101                     return null;
102             }
103         }
104         return new TopologyShard(nodes, links);
105     }
106
107     private static Map<Integer, OtnTopoNode> convertPortMappingToOtnNodeList(Nodes mappingNode) {
108         List<Mapping> networkMappings = mappingNode.getMapping().stream().filter(k -> k.getLogicalConnectionPoint()
109             .contains("NETWORK")).collect(Collectors.toList());
110         Map<Integer, OtnTopoNode> xpdrMap = new HashMap<>();
111         for (Mapping mapping : networkMappings) {
112             Integer xpdrNb = Integer.parseInt(mapping.getLogicalConnectionPoint().split("XPDR")[1].split("-")[0]);
113             if (!xpdrMap.containsKey(xpdrNb)) {
114                 List<Mapping> xpdrNetMaps = mappingNode.getMapping().stream().filter(k -> k.getLogicalConnectionPoint()
115                     .contains("XPDR" + xpdrNb + NETWORK)).collect(Collectors.toList());
116                 List<Mapping> xpdrClMaps = mappingNode.getMapping().stream().filter(k -> k.getLogicalConnectionPoint()
117                     .contains("XPDR" + xpdrNb + CLIENT)).collect(Collectors.toList());
118                 OtnTopoNode otnNode = null;
119                 if (mapping.getXponderType() != null) {
120                     otnNode = new OtnTopoNode(mappingNode.getNodeId(), mappingNode.getNodeInfo().getNodeClli(), xpdrNb,
121                         mapping.getXponderType(), fillConnectionMapLcp(xpdrNetMaps), fillConnectionMapLcp(xpdrClMaps));
122                 } else {
123                     otnNode = new OtnTopoNode(mappingNode.getNodeId(), mappingNode.getNodeInfo().getNodeClli(), xpdrNb,
124                         XpdrNodeTypes.Tpdr, fillConnectionMapLcp(xpdrNetMaps), fillConnectionMapLcp(xpdrClMaps));
125                 }
126                 xpdrMap.put(xpdrNb, otnNode);
127             }
128         }
129         LOG.debug("there are {} xpdr to build", xpdrMap.size());
130         xpdrMap.forEach((k, v) -> LOG.debug("xpdr {} = {} - {} - {} - {}", k, v.getNodeId(), v.getNodeType(),
131             v.getNbTpClient(), v.getNbTpNetwork()));
132         return xpdrMap;
133     }
134
135     private static Map<String, String> fillConnectionMapLcp(List<Mapping> mappingList) {
136         Map<String, String> xpdrConnectionMap = new HashMap<>();
137         for (Mapping map : mappingList) {
138             if (map.getConnectionMapLcp() != null) {
139                 xpdrConnectionMap.put(map.getLogicalConnectionPoint(), map.getConnectionMapLcp());
140             } else {
141                 xpdrConnectionMap.put(map.getLogicalConnectionPoint(), null);
142             }
143         }
144         return xpdrConnectionMap;
145     }
146
147     private static Node createTpdr(OtnTopoNode node) {
148         //create otn-topology node augmentation
149         XpdrAttributes xpdrAttr = new XpdrAttributesBuilder()
150             .setXpdrNumber(Uint16.valueOf(node.getXpdrNb()))
151             .build();
152         Node1 otnNodeAug = new Node1Builder()
153             .setXpdrAttributes(xpdrAttr)
154             .build();
155         org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1 ocnNodeAug =
156             new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1Builder()
157             .setNodeType(OpenroadmNodeType.TPDR).build();
158         //create ietf node augmentation to add TP list
159         List<TerminationPoint> tpList = new ArrayList<>();
160         // creation of tps
161         createTP(tpList, node, OpenroadmTpType.XPONDERCLIENT, If100GE.class, false);
162         createTP(tpList, node, OpenroadmTpType.XPONDERNETWORK, IfOCHOTU4ODU4.class, true);
163
164         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1 ietfNodeAug =
165             new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder()
166             .setTerminationPoint(tpList)
167             .build();
168
169         //return ietfNode
170         return new NodeBuilder()
171             .setNodeId(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
172             .withKey(new NodeKey(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())))
173             .setSupportingNode(createSupportingNodes(node))
174             .addAugmentation(Node1.class, otnNodeAug)
175             .addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1.class,
176                 ocnNodeAug)
177             .addAugmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
178                 .Node1.class, ietfNodeAug)
179             .build();
180     }
181
182     private static Node createMuxpdr(OtnTopoNode node) {
183         // create otn-topology node augmentation
184         // TODO: will need to be completed
185         TpBandwidthSharing tpBwSh = new TpBandwidthSharingBuilder().build();
186         XpdrAttributes xpdrAttr = new XpdrAttributesBuilder()
187             .setXpdrNumber(Uint16.valueOf(node.getXpdrNb()))
188             .build();
189
190         List<NonBlockingList> nblList = new ArrayList<>();
191         for (int i = 1; i <= node.getNbTpClient(); i++) {
192             List<TpId> tpList = new ArrayList<>();
193             TpId tpId = new TpId("XPDR" + node.getXpdrNb() + CLIENT + i);
194             tpList.add(tpId);
195             tpId = new TpId("XPDR" + node.getXpdrNb() + "-NETWORK1");
196             tpList.add(tpId);
197             NonBlockingList nbl = new NonBlockingListBuilder()
198                 .setNblNumber(Uint16.valueOf(i))
199                 .setTpList(tpList)
200                 .setAvailableInterconnectBandwidth(Uint32.valueOf(node.getNbTpNetwork() * 10L))
201                 .setInterconnectBandwidthUnit(Uint32.valueOf(1000000000))
202                 .build();
203             nblList.add(nbl);
204         }
205         OduSwitchingPools oduSwitchPool = new OduSwitchingPoolsBuilder()
206             .setSwitchingPoolNumber(Uint16.valueOf(1))
207             .setSwitchingPoolType(SwitchingPoolTypes.NonBlocking)
208             .setNonBlockingList(nblList)
209             .build();
210         List<OduSwitchingPools> oduSwitchPoolList = new ArrayList<>();
211         oduSwitchPoolList.add(oduSwitchPool);
212         SwitchingPools switchingPools = new SwitchingPoolsBuilder()
213             .setOduSwitchingPools(oduSwitchPoolList)
214             .build();
215         Node1 otnNodeAug = new Node1Builder()
216             .setTpBandwidthSharing(tpBwSh)
217             .setXpdrAttributes(xpdrAttr)
218             .setSwitchingPools(switchingPools)
219             .build();
220         org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1 ocnNodeAug =
221             new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1Builder()
222             .setNodeType(OpenroadmNodeType.MUXPDR).build();
223
224         //create ietf node augmentation to add TP list
225         List<TerminationPoint> tpList = new ArrayList<>();
226         // creation of tps
227         createTP(tpList, node, OpenroadmTpType.XPONDERCLIENT, If10GEODU2e.class, true);
228         createTP(tpList, node, OpenroadmTpType.XPONDERNETWORK, IfOCHOTU4ODU4.class, true);
229
230         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1 ietfNodeAug =
231             new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder()
232             .setTerminationPoint(tpList)
233             .build();
234
235         //return ietfNode
236         return new NodeBuilder()
237             .setNodeId(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
238             .withKey(new NodeKey(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())))
239             .setSupportingNode(createSupportingNodes(node))
240             .addAugmentation(Node1.class, otnNodeAug)
241             .addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1.class,
242                 ocnNodeAug)
243             .addAugmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
244                 .Node1.class, ietfNodeAug)
245             .build();
246     }
247
248     private static Node createSwitch(OtnTopoNode node) {
249         List<TpId> tpl = new ArrayList<>();
250         TpId tpId = null;
251         for (int i = 1; i <= node.getNbTpClient(); i++) {
252             tpId = new TpId("XPDR" + node.getXpdrNb() + CLIENT + i);
253             tpl.add(tpId);
254         }
255         for (int i = 1; i <= node.getNbTpNetwork(); i++) {
256             tpId = new TpId("XPDR" + node.getXpdrNb() + NETWORK + i);
257             tpl.add(tpId);
258         }
259         List<NonBlockingList> nblList = new ArrayList<>();
260         NonBlockingList nbl = new NonBlockingListBuilder()
261             .setNblNumber(Uint16.valueOf(1))
262             .setTpList(tpl)
263             .build();
264         nblList.add(nbl);
265
266         OduSwitchingPools oduSwitchPool = new OduSwitchingPoolsBuilder()
267             .setSwitchingPoolNumber(Uint16.valueOf(1))
268             .setSwitchingPoolType(SwitchingPoolTypes.NonBlocking)
269             .setNonBlockingList(nblList)
270             .build();
271         List<OduSwitchingPools> oduSwitchPoolList = new ArrayList<>();
272         oduSwitchPoolList.add(oduSwitchPool);
273         SwitchingPools switchingPools = new SwitchingPoolsBuilder()
274             .setOduSwitchingPools(oduSwitchPoolList)
275             .build();
276
277         // create otn-topology node augmentation
278         // TODO: will need to be completed
279         TpBandwidthSharing tpBwSh = new TpBandwidthSharingBuilder().build();
280         XpdrAttributes xpdrAttr = new XpdrAttributesBuilder()
281             .setXpdrNumber(Uint16.valueOf(node.getXpdrNb()))
282             .build();
283
284         Node1 otnNodeAug = new Node1Builder()
285             .setTpBandwidthSharing(tpBwSh)
286             .setXpdrAttributes(xpdrAttr)
287             .setSwitchingPools(switchingPools)
288             .build();
289         org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1 ocnNodeAug =
290             new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1Builder()
291             .setNodeType(OpenroadmNodeType.SWITCH).build();
292
293         //create ietf node augmentation to add TP list
294         List<TerminationPoint> tpList = new ArrayList<>();
295         // creation of tps
296         createTP(tpList, node, OpenroadmTpType.XPONDERCLIENT, If100GEODU4.class, true);
297         createTP(tpList, node, OpenroadmTpType.XPONDERNETWORK, IfOCHOTU4ODU4.class, true);
298         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1 ietfNodeAug =
299             new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder()
300             .setTerminationPoint(tpList)
301             .build();
302
303         //return ietfNode
304         return new NodeBuilder()
305             .setNodeId(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
306             .withKey(new NodeKey(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())))
307             .setSupportingNode(createSupportingNodes(node))
308             .addAugmentation(Node1.class, otnNodeAug)
309             .addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1.class,
310                 ocnNodeAug)
311             .addAugmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
312                 .Node1.class, ietfNodeAug)
313             .build();
314     }
315
316     private static void createTP(List<TerminationPoint> tpList, OtnTopoNode node, OpenroadmTpType tpType,
317         Class<? extends SupportedIfCapability> ifCapType, boolean withRate) {
318         long nbTps = 0;
319         if (OpenroadmTpType.XPONDERCLIENT.equals(tpType)) {
320             nbTps = node.getNbTpClient();
321         } else if (OpenroadmTpType.XPONDERNETWORK.equals(tpType)) {
322             nbTps = node.getNbTpNetwork();
323         } else {
324             LOG.warn("Wrong tp-type {}, cannot create tp {}", tpType, tpType.getName());
325         }
326
327         for (int i = 1; i <= nbTps; i++) {
328             //openroadm-otn-topoology augmentation
329             SupportedInterfaceCapability supIfCapa = new SupportedInterfaceCapabilityBuilder()
330                 .setIfCapType(ifCapType)
331                 .build();
332             List<SupportedInterfaceCapability> supIfCapaList = new ArrayList<>();
333             supIfCapaList.add(supIfCapa);
334             TpSupportedInterfaces tpSupIf = new TpSupportedInterfacesBuilder()
335                 .setSupportedInterfaceCapability(supIfCapaList)
336                 .build();
337
338             XpdrTpPortConnectionAttributesBuilder xtpcaBldr = new XpdrTpPortConnectionAttributesBuilder();
339             if (withRate) {
340                 xtpcaBldr.setRate(fixRate(ifCapType));
341             }
342             TerminationPoint1 otnTp1 = new TerminationPoint1Builder()
343                 .setTpSupportedInterfaces(tpSupIf)
344                 .setXpdrTpPortConnectionAttributes(xtpcaBldr.build())
345                 .build();
346             org.opendaylight.yang.gen.v1.http.transportpce.topology.rev200129.TerminationPoint1Builder tpceTp1Bldr =
347                 new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev200129.TerminationPoint1Builder();
348             if (OpenroadmTpType.XPONDERNETWORK.equals(tpType)) {
349                 TpId tpId = new TpId("XPDR" + node.getXpdrNb() + NETWORK + i);
350                 if (node.getXpdrNetConnectionMap().get(tpId.getValue()) != null) {
351                     tpceTp1Bldr.setAssociatedConnectionMapPort(node.getXpdrNetConnectionMap().get(tpId.getValue()));
352                 }
353                 SupportingTerminationPoint stp = new SupportingTerminationPointBuilder()
354                     .setNetworkRef(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))
355                     .setNodeRef(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
356                     .setTpRef("XPDR" + node.getXpdrNb() + NETWORK + i)
357                     .build();
358                 List<SupportingTerminationPoint> supportTpList = new ArrayList<>();
359                 supportTpList.add(stp);
360                 tpList.add(buildIetfTp(tpceTp1Bldr, otnTp1, tpType, tpId, supportTpList));
361             } else if (OpenroadmTpType.XPONDERCLIENT.equals(tpType)) {
362                 TpId tpId = new TpId("XPDR" + node.getXpdrNb() + CLIENT + i);
363                 if (node.getXpdrCliConnectionMap().get(tpId.getValue()) != null) {
364                     tpceTp1Bldr.setAssociatedConnectionMapPort(node.getXpdrCliConnectionMap().get(tpId.getValue()));
365                 }
366                 tpList.add(buildIetfTp(tpceTp1Bldr, otnTp1, tpType, tpId, null));
367             }
368         }
369     }
370
371     private static Class<? extends OduRateIdentity> fixRate(Class<? extends SupportedIfCapability> ifCapaType) {
372         switch (ifCapaType.getSimpleName()) {
373             case "If100GEODU4":
374             case "IfOCHOTU4ODU4":
375                 return ODU4.class;
376             case "If1GEODU0":
377                 return ODU0.class;
378             case "If10GEODU2e":
379                 return ODU2e.class;
380             default:
381                 return null;
382         }
383     }
384
385     private static List<SupportingNode> createSupportingNodes(OtnTopoNode node) {
386         SupportingNode suppNode1 = new SupportingNodeBuilder()
387             .setNetworkRef(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))
388             .setNodeRef(new NodeId(node.getNodeId()))
389             .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID),
390                 new NodeId(node.getNodeId())))
391             .build();
392         SupportingNode suppNode2 = new SupportingNodeBuilder()
393             .setNetworkRef(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))
394             .setNodeRef(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
395             .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID),
396                 new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())))
397             .build();
398         SupportingNode suppNode3 = new SupportingNodeBuilder()
399             .setNetworkRef(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))
400             .setNodeRef(new NodeId(node.getClli()))
401             .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID),
402                 new NodeId(node.getClli())))
403             .build();
404         List<SupportingNode> suppNodeList = new ArrayList<>();
405         suppNodeList.add(suppNode1);
406         suppNodeList.add(suppNode2);
407         suppNodeList.add(suppNode3);
408         return suppNodeList;
409     }
410
411     private static TerminationPoint buildIetfTp(org.opendaylight.yang.gen.v1.http.transportpce.topology.rev200129
412         .TerminationPoint1Builder tpceTp1Bldr, TerminationPoint1 otnTp1, OpenroadmTpType tpType, TpId tpId,
413         List<SupportingTerminationPoint> supportTpList) {
414
415         TerminationPointBuilder ietfTpBldr = new TerminationPointBuilder();
416         if (tpceTp1Bldr.getAssociatedConnectionMapPort() != null) {
417             ietfTpBldr.addAugmentation(org.opendaylight.yang.gen.v1.http.transportpce.topology.rev200129
418                 .TerminationPoint1.class, tpceTp1Bldr.build());
419         }
420         if (supportTpList != null) {
421             ietfTpBldr.setSupportingTerminationPoint(supportTpList);
422         }
423         org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.TerminationPoint1 ocnTp =
424             new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130
425             .TerminationPoint1Builder().setTpType(tpType).build();
426
427         ietfTpBldr.setTpId(tpId)
428             .withKey(new TerminationPointKey(tpId))
429             .addAugmentation(TerminationPoint1.class, otnTp1)
430             .addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130
431                 .TerminationPoint1.class, ocnTp);
432         return ietfTpBldr.build();
433     }
434 }