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