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