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