3174b2a42e7208c0cb3ad83ceeb3fd235da0e7b4
[transportpce.git] / tapi / src / main / java / org / opendaylight / transportpce / tapi / topology / ConvertORTopoObjectToTapiTopoObject.java
1 /*
2  * Copyright © 2019 Orange, Inc. and others.  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 package org.opendaylight.transportpce.tapi.topology;
9
10 import java.math.BigInteger;
11 import java.util.ArrayList;
12 import java.util.Arrays;
13 import java.util.HashMap;
14 import java.util.List;
15 import java.util.Map;
16 import java.util.UUID;
17 import java.util.stream.Collectors;
18
19 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev181130.xpdr.odu.switching.pools.OduSwitchingPools;
20 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev181130.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
21 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev181130.OpenroadmTpType;
22 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev181130.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
23 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.Link1;
24 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.Node1;
25 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.TerminationPoint1;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
29 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.AdministrativeState;
30 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.CapacityUnit;
31 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.ForwardingDirection;
32 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LAYERPROTOCOLQUALIFIER;
33 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LayerProtocolName;
34 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LifecycleState;
35 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.OperationalState;
36 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortDirection;
37 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortRole;
38 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TerminationDirection;
39 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TerminationState;
40 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
41 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.TotalSizeBuilder;
42 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.pac.AvailableCapacityBuilder;
43 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name;
44 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameBuilder;
45 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPE100GigE;
46 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPE10GigELAN;
47 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU2E;
48 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU4;
49 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev181210.PHOTONICLAYERQUALIFIEROMS;
50 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev181210.PHOTONICLAYERQUALIFIEROTSi;
51 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.ForwardingRule;
52 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.RuleType;
53 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.link.NodeEdgePoint;
54 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.link.NodeEdgePointBuilder;
55 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroup;
56 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroupBuilder;
57 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePoint;
58 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePointBuilder;
59 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.edge.point.MappedServiceInterfacePoint;
60 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.edge.point.MappedServiceInterfacePointBuilder;
61 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.Rule;
62 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.RuleBuilder;
63 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link;
64 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.LinkBuilder;
65 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeBuilder;
66 import org.slf4j.Logger;
67 import org.slf4j.LoggerFactory;
68
69 public class ConvertORTopoObjectToTapiTopoObject {
70
71     private static final Logger LOG = LoggerFactory.getLogger(TapiTopologyImpl.class);
72     private String ietfNodeId;
73     private List<TerminationPoint> oorClientPortList;
74     private List<TerminationPoint> oorNetworkPortList;
75     private OduSwitchingPools oorOduSwitchingPool;
76     private Uuid tapiTopoUuid;
77     private List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> tapiNodes;
78     private List<Link> tapiLinks;
79     private Map<String, Uuid> uuidMap;
80
81     public ConvertORTopoObjectToTapiTopoObject(Node ietfNode, Link1 otnLink, Uuid tapiTopoUuid) {
82         this.ietfNodeId = ietfNode.getNodeId().getValue();
83         this.oorClientPortList = ietfNode.augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
84             .network.topology.rev180226.Node1.class).getTerminationPoint().stream()
85             .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
86             == OpenroadmTpType.XPONDERCLIENT.getIntValue())
87             .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
88             .collect(Collectors.toList());
89         this.oorNetworkPortList = ietfNode.augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
90             .network.topology.rev180226.Node1.class).getTerminationPoint().stream()
91             .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
92             == OpenroadmTpType.XPONDERNETWORK.getIntValue())
93             .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
94             .collect(Collectors.toList());
95         this.oorOduSwitchingPool = ietfNode.augmentation(Node1.class).getSwitchingPools().getOduSwitchingPools().get(0);
96         this.tapiTopoUuid = tapiTopoUuid;
97         this.tapiNodes = new ArrayList<>();
98         this.tapiLinks = new ArrayList<>();
99         this.uuidMap = new HashMap<>();
100     }
101
102
103     public void convertNode() {
104         //node creation [DSR/ODU]
105         LOG.info("creation of a DSR/ODU node");
106         Uuid nodeUuid = new Uuid(UUID.randomUUID().toString());
107         this.uuidMap.put(this.ietfNodeId + "+DSR", nodeUuid);
108         List<Name> dsrNodeNames = Arrays.asList(new NameBuilder().setValueName("dsr/odu node name")
109             .setValue(this.ietfNodeId).build());
110         List<LayerProtocolName> dsrLayerProtocols = Arrays.asList(LayerProtocolName.DSR, LayerProtocolName.ODU);
111         org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology
112             .Node dsrNode = createTapiNode(dsrNodeNames, dsrLayerProtocols);
113         tapiNodes.add(dsrNode);
114
115         //node creation [otsi]
116         LOG.info("creation of an OTSi node");
117         nodeUuid = new Uuid(UUID.randomUUID().toString());
118         this.uuidMap.put(this.ietfNodeId + "+OTSi", nodeUuid);
119         List<Name> otsiNodeNames = Arrays.asList(new NameBuilder().setValueName("otsi node name")
120             .setValue(this.ietfNodeId).build());
121         List<LayerProtocolName> otsiLayerProtocols = Arrays.asList(LayerProtocolName.PHOTONICMEDIA);
122         org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology
123             .Node otsiNode = createTapiNode(otsiNodeNames, otsiLayerProtocols);
124         tapiNodes.add(otsiNode);
125
126         //transitional link cration between network nep of DSR/ODU node and iNep of otsi node
127         LOG.info("creation of transitional links between DSR/ODU and OTSi nodes");
128         createTapiTransitionalLinks();
129     }
130
131     private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology
132         .Node createTapiNode(List<Name> nodeNames, List<LayerProtocolName> layerProtocols) {
133         Uuid nodeUuid = null;
134         List<OwnedNodeEdgePoint> onepl = new ArrayList<>();
135         List<NodeRuleGroup> nodeRuleGroupList = new ArrayList<>();
136         List<Rule> ruleList = new ArrayList<>();
137         Rule rule = new RuleBuilder()
138             .setLocalId("forward")
139             .setForwardingRule(ForwardingRule.MAYFORWARDACROSSGROUP)
140             .setRuleType(RuleType.FORWARDING)
141             .build();
142         ruleList.add(rule);
143         if (layerProtocols.contains(LayerProtocolName.DSR)) {
144             nodeUuid = this.uuidMap.get(this.ietfNodeId + "+DSR");
145             // client nep creation on DSR/ODU node
146             for (int i = 0; i < oorClientPortList.size(); i++) {
147                 Uuid nepUuid = new Uuid(UUID.randomUUID().toString());
148                 this.uuidMap.put("DSR+" + oorClientPortList.get(i).getTpId().getValue(), nepUuid);
149                 List<Name> onedNames = Arrays.asList(new NameBuilder().setValueName(new StringBuilder("NodeEdgePoint_C")
150                     .append(i + 1).toString()).setValue(oorClientPortList.get(i).getTpId().getValue()).build());
151                 OwnedNodeEdgePoint onep = createNep(oorClientPortList.get(i), onedNames, LayerProtocolName.ETH,
152                     LayerProtocolName.DSR, true, "DSR+");
153                 onepl.add(onep);
154             }
155             // network nep creation on DSR/ODU node
156             for (int i = 0; i < oorNetworkPortList.size(); i++) {
157                 Uuid nepUuid = new Uuid(UUID.randomUUID().toString());
158                 this.uuidMap.put("DSR+" + oorNetworkPortList.get(i).getTpId().getValue(), nepUuid);
159                 List<Name> onedNames = Arrays.asList(new NameBuilder().setValueName(new StringBuilder("NodeEdgePoint_N")
160                     .append(i + 1).toString()).setValue(oorNetworkPortList.get(i).getTpId().getValue()).build());
161                 OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), onedNames, LayerProtocolName.ODU,
162                     LayerProtocolName.DSR, true, "DSR+");
163                 onepl.add(onep);
164             }
165             // create NodeRuleGroup
166             for (NonBlockingList nbl : this.oorOduSwitchingPool.getNonBlockingList()) {
167                 List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
168                     .NodeEdgePoint> nepList = new ArrayList<>();
169                 for (TpId tp : nbl.getTpList()) {
170                     org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
171                         .NodeEdgePoint nep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology
172                         .rev181210.node.rule.group.NodeEdgePointBuilder()
173                         .setTopologyUuid(tapiTopoUuid)
174                         .setNodeUuid(this.uuidMap.get(this.ietfNodeId + "+DSR"))
175                         .setNodeEdgePointUuid(this.uuidMap.get("DSR+" + tp.getValue()))
176                         .build();
177                     nepList.add(nep);
178                 }
179                 NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
180                     .setUuid(new Uuid(UUID.randomUUID().toString()))
181                     .setRule(ruleList)
182                     .setNodeEdgePoint(nepList)
183                     .build();
184                 nodeRuleGroupList.add(nodeRuleGroup);
185             }
186         } else if (layerProtocols.contains(LayerProtocolName.PHOTONICMEDIA)) {
187             nodeUuid = this.uuidMap.get(this.ietfNodeId + "+OTSi");
188             // iNep creation on otsi node
189             for (int i = 0; i < oorNetworkPortList.size(); i++) {
190                 Uuid nepUuid1 = new Uuid(UUID.randomUUID().toString());
191                 this.uuidMap.put("iOTSi+" + oorNetworkPortList.get(i).getTpId().getValue(), nepUuid1);
192                 List<Name> onedNames = Arrays.asList(new NameBuilder().setValueName(new StringBuilder("iNodeEdgePoint_")
193                     .append(i + 1).toString()).setValue(oorNetworkPortList.get(i).getTpId().getValue()).build());
194                 OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), onedNames,
195                     LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true, "iOTSi+");
196                 onepl.add(onep);
197             }
198             // eNep creation on otsi node
199             for (int i = 0; i < oorNetworkPortList.size(); i++) {
200                 Uuid nepUuid2 = new Uuid(UUID.randomUUID().toString());
201                 this.uuidMap.put("eOTSi+" + oorNetworkPortList.get(i).getTpId().getValue(), nepUuid2);
202                 List<Name> onedNames = Arrays.asList(new NameBuilder().setValueName(new StringBuilder("eNodeEdgePoint_")
203                     .append(i + 1).toString()).setValue(oorNetworkPortList.get(i).getTpId().getValue()).build());
204                 OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), onedNames,
205                     LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true, "eOTSi+");
206                 onepl.add(onep);
207             }
208             // create NodeRuleGroup
209             for (TerminationPoint tp : this.oorNetworkPortList) {
210                 List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
211                     .NodeEdgePoint> nepList = new ArrayList<>();
212                 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
213                     .NodeEdgePoint inep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
214                     .node.rule.group.NodeEdgePointBuilder()
215                     .setTopologyUuid(tapiTopoUuid)
216                     .setNodeUuid(this.uuidMap.get(this.ietfNodeId + "+OTSi"))
217                     .setNodeEdgePointUuid(this.uuidMap.get("iOTSi+" + tp.getTpId().getValue()))
218                     .build();
219                 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
220                     .NodeEdgePoint enep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
221                     .node.rule.group.NodeEdgePointBuilder()
222                     .setTopologyUuid(tapiTopoUuid)
223                     .setNodeUuid(this.uuidMap.get(this.ietfNodeId + "+OTSi"))
224                     .setNodeEdgePointUuid(this.uuidMap.get("eOTSi+" + tp.getTpId().getValue()))
225                     .build();
226                 nepList.add(inep);
227                 nepList.add(enep);
228                 NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
229                     .setUuid(new Uuid(UUID.randomUUID().toString()))
230                     .setRule(ruleList)
231                     .setNodeEdgePoint(nepList)
232                     .build();
233                 nodeRuleGroupList.add(nodeRuleGroup);
234             }
235         } else {
236             LOG.error("Undefined LayerProtocolName for {} node {}", nodeNames.get(0).getValueName(), nodeNames.get(0)
237                 .getValue());
238         }
239
240         // create tapi node
241         org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node tapiNode =
242             new NodeBuilder()
243             .setUuid(nodeUuid)
244             .setName(nodeNames)
245             .setLayerProtocolName(layerProtocols)
246             .setAdministrativeState(AdministrativeState.UNLOCKED)
247             .setOperationalState(OperationalState.ENABLED)
248             .setLifecycleState(LifecycleState.INSTALLED)
249             .setOwnedNodeEdgePoint(onepl)
250             .setNodeRuleGroup(nodeRuleGroupList)
251             .build();
252         return tapiNode;
253     }
254
255     private OwnedNodeEdgePoint createNep(TerminationPoint oorTp, List<Name> nepNames, LayerProtocolName nepProtocol,
256         LayerProtocolName nodeProtocol, boolean withSip, String keyword) {
257         String key = keyword + oorTp.getTpId().getValue();
258         OwnedNodeEdgePointBuilder onepBldr = new OwnedNodeEdgePointBuilder()
259             .setUuid(this.uuidMap.get(key))
260             .setLayerProtocolName(nepProtocol)
261             .setName(nepNames);
262         if (withSip) {
263             onepBldr.setMappedServiceInterfacePoint(createSIP(1));
264         }
265         onepBldr.setSupportedCepLayerProtocolQualifier(createSupportedCepLayerProtocolQualifier(oorTp, nodeProtocol));
266         onepBldr.setLinkPortDirection(PortDirection.BIDIRECTIONAL).setLinkPortRole(PortRole.SYMMETRIC)
267                 .setAdministrativeState(AdministrativeState.UNLOCKED).setOperationalState(OperationalState.ENABLED)
268                 .setLifecycleState(LifecycleState.INSTALLED).setTerminationDirection(TerminationDirection.BIDIRECTIONAL)
269                 .setTerminationState(TerminationState.TERMINATEDBIDIRECTIONAL);
270         return onepBldr.build();
271     }
272
273     private List<MappedServiceInterfacePoint> createSIP(int nb) {
274         List<MappedServiceInterfacePoint> msipl = new ArrayList<>();
275         for (int i = 0; i < nb; i++) {
276             MappedServiceInterfacePoint msip = new MappedServiceInterfacePointBuilder()
277                 .setServiceInterfacePointUuid(new Uuid(UUID.randomUUID().toString())).build();
278             msipl.add(msip);
279         }
280         return msipl;
281     }
282
283     private List<Class<? extends LAYERPROTOCOLQUALIFIER>> createSupportedCepLayerProtocolQualifier(TerminationPoint tp,
284         LayerProtocolName lpn) {
285         List<Class<? extends LAYERPROTOCOLQUALIFIER>> sclpqList = new ArrayList<>();
286         List<SupportedInterfaceCapability> sicList = tp.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm
287             .otn.network.topology.rev181130.TerminationPoint1.class).getTpSupportedInterfaces()
288             .getSupportedInterfaceCapability();
289         for (SupportedInterfaceCapability sic : sicList) {
290             switch (lpn.getName()) {
291                 case "DSR" :
292                     if (sic.getIfCapType().getSimpleName().equals("If10GEODU2e")) {
293                         sclpqList.add(DIGITALSIGNALTYPE10GigELAN.class);
294                         sclpqList.add(ODUTYPEODU2E.class);
295                     } else if (sic.getIfCapType().getSimpleName().equals("IfOCHOTU4ODU4")) {
296                         sclpqList.add(ODUTYPEODU4.class);
297                     } else if (sic.getIfCapType().getSimpleName().equals("If100GEODU4")) {
298                         sclpqList.add(DIGITALSIGNALTYPE100GigE.class);
299                         sclpqList.add(ODUTYPEODU4.class);
300                     }
301                     break;
302                 case "PHOTONIC_MEDIA" :
303                     if (sic.getIfCapType().getSimpleName().equals("IfOCHOTU4ODU4")) {
304                         sclpqList.add(PHOTONICLAYERQUALIFIEROTSi.class);
305                         sclpqList.add(PHOTONICLAYERQUALIFIEROMS.class);
306                     }
307                     break;
308                 default:
309                     LOG.error("Layer Protocol Name is unknown");
310                     break;
311             }
312         }
313         return sclpqList;
314     }
315
316     private void createTapiTransitionalLinks() {
317         for (TerminationPoint tp : this.oorNetworkPortList) {
318             List<NodeEdgePoint> nepList = new ArrayList<>();
319             String sourceKey = "DSR+" + tp.getTpId().getValue();
320             Uuid sourceUuidTp = this.uuidMap.get(sourceKey);
321             String destKey = "iOTSi+" + tp.getTpId().getValue();
322             Uuid destUuidTp = this.uuidMap.get(destKey);
323             NodeEdgePoint sourceNep = new NodeEdgePointBuilder()
324                 .setTopologyUuid(this.tapiTopoUuid)
325                 .setNodeUuid(this.uuidMap.get(this.ietfNodeId + "+DSR"))
326                 .setNodeEdgePointUuid(sourceUuidTp)
327                 .build();
328             nepList.add(sourceNep);
329             NodeEdgePoint destNep = new NodeEdgePointBuilder()
330                 .setTopologyUuid(this.tapiTopoUuid)
331                 .setNodeUuid(this.uuidMap.get(this.ietfNodeId + "+OTSi"))
332                 .setNodeEdgePointUuid(destUuidTp)
333                 .build();
334             nepList.add(destNep);
335             LinkBuilder transiLinkBldr = new LinkBuilder()
336                 .setUuid(new Uuid(UUID.randomUUID().toString()))
337                 .setTransitionedLayerProtocolName(Arrays.asList(LayerProtocolName.ODU.getName(),
338                     LayerProtocolName.PHOTONICMEDIA.getName()))
339                 .setNodeEdgePoint(nepList)
340                 .setDirection(ForwardingDirection.BIDIRECTIONAL)
341                 .setAvailableCapacity(new AvailableCapacityBuilder().setTotalSize(
342                     new TotalSizeBuilder().setUnit(CapacityUnit.GBPS).setValue(new BigInteger("100")).build()).build());
343             this.tapiLinks.add(transiLinkBldr.build());
344         }
345     }
346
347     public List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> getTapiNodes() {
348         return tapiNodes;
349     }
350
351     public List<Link> getTapiLinks() {
352         return tapiLinks;
353     }
354 }