TapiLink creation refactoring
[transportpce.git] / tapi / src / main / java / org / opendaylight / transportpce / tapi / topology / ConvertORTopoToTapiFullTopo.java
1 /*
2  * Copyright © 2021 Nokia.  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.Collection;
14 import java.util.Collections;
15 import java.util.HashMap;
16 import java.util.HashSet;
17 import java.util.List;
18 import java.util.Map;
19 import java.util.Set;
20 import java.util.UUID;
21 import java.util.stream.Collectors;
22 import org.opendaylight.transportpce.tapi.TapiStringConstants;
23 import org.opendaylight.transportpce.tapi.utils.TapiLink;
24 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1;
25 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1;
26 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
27 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
28 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.OduSwitchingPools;
29 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.OduSwitchingPoolsBuilder;
30 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
31 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListBuilder;
32 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListKey;
33 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmNodeType;
34 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmTpType;
35 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
36 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.Node1;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
41 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.AdministrativeState;
42 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LAYERPROTOCOLQUALIFIER;
43 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LayerProtocolName;
44 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LifecycleState;
45 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.OperationalState;
46 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortDirection;
47 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortRole;
48 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TerminationDirection;
49 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TerminationState;
50 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
51 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.pac.AvailableCapacityBuilder;
52 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.pac.TotalPotentialCapacityBuilder;
53 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name;
54 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameBuilder;
55 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameKey;
56 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.tapi.context.ServiceInterfacePoint;
57 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.tapi.context.ServiceInterfacePointBuilder;
58 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.tapi.context.ServiceInterfacePointKey;
59 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPE100GigE;
60 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPE10GigELAN;
61 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPEGigE;
62 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU0;
63 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU2;
64 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU2E;
65 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU4;
66 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev181210.PHOTONICLAYERQUALIFIEROMS;
67 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev181210.PHOTONICLAYERQUALIFIEROTSi;
68 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.ForwardingRule;
69 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.RuleType;
70 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroup;
71 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroupBuilder;
72 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroupKey;
73 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePoint;
74 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePointBuilder;
75 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePointKey;
76 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.edge.point.MappedServiceInterfacePoint;
77 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.edge.point.MappedServiceInterfacePointBuilder;
78 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.edge.point.MappedServiceInterfacePointKey;
79 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.Rule;
80 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.RuleBuilder;
81 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.RuleKey;
82 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.risk.parameter.pac.RiskCharacteristic;
83 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.risk.parameter.pac.RiskCharacteristicBuilder;
84 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link;
85 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.LinkKey;
86 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeBuilder;
87 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey;
88 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.transfer.cost.pac.CostCharacteristic;
89 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.transfer.cost.pac.CostCharacteristicBuilder;
90 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.transfer.timing.pac.LatencyCharacteristic;
91 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.transfer.timing.pac.LatencyCharacteristicBuilder;
92 import org.opendaylight.yangtools.yang.common.Uint16;
93 import org.slf4j.Logger;
94 import org.slf4j.LoggerFactory;
95
96
97 public class ConvertORTopoToTapiFullTopo {
98
99     private static final Logger LOG = LoggerFactory.getLogger(ConvertORTopoToTapiFullTopo.class);
100     private String ietfNodeId;
101     private OpenroadmNodeType ietfNodeType;
102     private AdminStates ietfNodeAdminState;
103     private State ietfNodeOperState;
104     private List<TerminationPoint> oorClientPortList;
105     private List<TerminationPoint> oorNetworkPortList;
106     private OduSwitchingPools oorOduSwitchingPool;
107     private Uuid tapiTopoUuid;
108     private Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node>
109         tapiNodes;
110     private Map<LinkKey, Link> tapiLinks;
111     private Map<ServiceInterfacePointKey, ServiceInterfacePoint> tapiSips;
112     private Map<String, Uuid> uuidMap;
113     private final TapiLink tapiLink;
114
115
116     public ConvertORTopoToTapiFullTopo(Uuid tapiTopoUuid, TapiLink tapiLink) {
117         this.tapiTopoUuid = tapiTopoUuid;
118         this.tapiNodes = new HashMap<>();
119         this.tapiLinks = new HashMap<>();
120         this.uuidMap = new HashMap<>();
121         this.tapiSips = new HashMap<>();
122         this.tapiLink = tapiLink;
123     }
124
125     public void convertNode(Node ietfNode, List<String> networkPorts) {
126         this.ietfNodeId = ietfNode.getNodeId().getValue();
127         if (ietfNode.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1.class)
128                 == null) {
129             return;
130         }
131         this.ietfNodeType = ietfNode.augmentation(
132             org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1.class).getNodeType();
133         this.ietfNodeAdminState = ietfNode.augmentation(
134             org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1.class)
135                 .getAdministrativeState();
136         this.ietfNodeOperState = ietfNode.augmentation(
137             org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1.class)
138                 .getOperationalState();
139         this.oorNetworkPortList = ietfNode.augmentation(
140             org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
141                 .getTerminationPoint().values().stream()
142                 .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
143                     == OpenroadmTpType.XPONDERNETWORK.getIntValue()
144                     && networkPorts.contains(tp.getTpId().getValue()))
145                 .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
146                 .collect(Collectors.toList());
147         if (!OpenroadmNodeType.TPDR.equals(this.ietfNodeType)) {
148             this.oorOduSwitchingPool = ietfNode.augmentation(Node1.class).getSwitchingPools().getOduSwitchingPools()
149                 .values().stream().findFirst().get();
150             this.oorClientPortList = ietfNode.augmentation(
151                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
152                     .getTerminationPoint().values().stream()
153                     .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
154                         == OpenroadmTpType.XPONDERCLIENT.getIntValue())
155                     .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
156                     .collect(Collectors.toList());
157         } else {
158             this.oorOduSwitchingPool = createOduSwitchingPoolForTp100G();
159             List<TpId> tpList = this.oorOduSwitchingPool.getNonBlockingList().values().stream()
160                 .flatMap(nbl -> nbl.getTpList().stream())
161                 .collect(Collectors.toList());
162             this.oorClientPortList = ietfNode.augmentation(
163                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
164                     .getTerminationPoint().values().stream()
165                     .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
166                         == OpenroadmTpType.XPONDERCLIENT.getIntValue() && tpList.contains(tp.getTpId()))
167                     .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
168                     .collect(Collectors.toList());
169             this.oorClientPortList.forEach(tp -> LOG.info("tp = {}", tp.getTpId()));
170         }
171
172         // node creation [DSR/ODU]
173         LOG.info("creation of a DSR/ODU node for {}", this.ietfNodeId);
174         Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", this.ietfNodeId,
175             TapiStringConstants.DSR)).getBytes(Charset.forName("UTF-8"))).toString());
176         this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.DSR), nodeUuid);
177         Name nameDsr = new NameBuilder().setValueName("dsr/odu node name").setValue(
178             String.join("+", this.ietfNodeId, TapiStringConstants.DSR)).build();
179         List<LayerProtocolName> dsrLayerProtocols = Arrays.asList(LayerProtocolName.DSR, LayerProtocolName.ODU);
180         org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology
181             .Node dsrNode = createTapiNode(Map.of(nameDsr.key(), nameDsr), dsrLayerProtocols);
182         LOG.info("DSR Node {} should have {} NEPs and {} SIPs", this.ietfNodeId,
183             this.oorClientPortList.size() + 2 * this.oorNetworkPortList.size(),
184             this.oorClientPortList.size() + this.oorNetworkPortList.size());
185         LOG.info("DSR Node {} has {} NEPs and {} SIPs", this.ietfNodeId,
186             dsrNode.getOwnedNodeEdgePoint().values().size(), dsrNode.getOwnedNodeEdgePoint().values().stream()
187                 .filter(nep -> nep.getMappedServiceInterfacePoint() != null).count());
188         tapiNodes.put(dsrNode.key(), dsrNode);
189
190         // node creation [otsi]
191         LOG.info("creation of an OTSi node for {}", this.ietfNodeId);
192         nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", this.ietfNodeId, TapiStringConstants.OTSI))
193             .getBytes(Charset.forName("UTF-8"))).toString());
194         this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.OTSI), nodeUuid);
195         Name nameOtsi =  new NameBuilder().setValueName("otsi node name").setValue(
196             String.join("+", this.ietfNodeId, TapiStringConstants.OTSI)).build();
197         List<LayerProtocolName> otsiLayerProtocols = Arrays.asList(LayerProtocolName.PHOTONICMEDIA);
198         org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology
199             .Node otsiNode = createTapiNode(Map.of(nameOtsi.key(), nameOtsi), otsiLayerProtocols);
200         LOG.info("OTSi Node {} should have {} NEPs and {} SIPs", this.ietfNodeId, 3 * this.oorNetworkPortList.size(),
201             this.oorNetworkPortList.size());
202         LOG.info("OTSi Node {} has {} NEPs and {} SIPs", this.ietfNodeId,
203             otsiNode.getOwnedNodeEdgePoint().values().size(), otsiNode.getOwnedNodeEdgePoint().values().stream()
204                 .filter(nep -> nep.getMappedServiceInterfacePoint() != null).count());
205         tapiNodes.put(otsiNode.key(), otsiNode);
206
207         // transitional link cration between network nep of DSR/ODU node and iNep of otsi node
208         LOG.info("creation of transitional links between DSR/ODU and OTSi nodes");
209         createTapiTransitionalLinks();
210     }
211
212     public void convertLinks(
213             Map<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
214                 .ietf.network.topology.rev180226.networks.network.LinkKey,
215             org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
216                 .ietf.network.topology.rev180226.networks.network.Link> otnLinkMap) {
217         List<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
218             .Link> otnLinkList = new ArrayList<>(otnLinkMap.values());
219         Collections.sort(otnLinkList, (l1, l2) -> l1.getLinkId().getValue()
220             .compareTo(l2.getLinkId().getValue()));
221         List<String> linksToNotConvert = new ArrayList<>();
222         LOG.info("creation of {} otn links", otnLinkMap.size() / 2);
223         for (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
224             .Link otnlink : otnLinkList) {
225             if (!linksToNotConvert.contains(otnlink.getLinkId().getValue())) {
226                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks
227                     .network.Link oppositeLink = otnLinkMap.get(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns
228                     .yang.ietf.network.topology.rev180226.networks.network.LinkKey(otnlink.augmentation(Link1.class)
229                     .getOppositeLink()));
230
231                 AdminStates oppLnkAdmState = null;
232                 State oppLnkOpState = null;
233                 String oppositeLinkId = null;
234                 if (oppositeLink != null) {
235                     oppLnkAdmState = oppositeLink.augmentation(Link1.class).getAdministrativeState();
236                     oppLnkOpState = oppositeLink.augmentation(Link1.class).getOperationalState();
237                     oppositeLinkId = oppositeLink.getLinkId().getValue();
238                 }
239                 String adminState =
240                     otnlink.augmentation(Link1.class).getAdministrativeState() == null
241                         || oppLnkAdmState == null
242                     ? null
243                     : this.tapiLink.setTapiAdminState(
244                         otnlink.augmentation(Link1.class).getAdministrativeState(), oppLnkAdmState).getName();
245                 String operState =
246                     otnlink.augmentation(Link1.class).getOperationalState() == null
247                         || oppLnkOpState == null
248                     ? null
249                     : this.tapiLink.setTapiOperationalState(
250                         otnlink.augmentation(Link1.class).getOperationalState(), oppLnkOpState).getName();
251
252                 String prefix = otnlink.getLinkId().getValue().split("-")[0];
253                 String nodesQual = prefix.equals("OTU4") ? TapiStringConstants.OTSI : TapiStringConstants.DSR;
254                 String tpsQual = prefix.equals("OTU4") ? TapiStringConstants.I_OTSI : TapiStringConstants.E_ODU;
255                 LayerProtocolName layerProtocolName = prefix.equals("OTU4") ? LayerProtocolName.PHOTONICMEDIA
256                     : LayerProtocolName.ODU;
257
258                 Link tapLink = this.tapiLink.createTapiLink(otnlink.getSource().getSourceNode().getValue(),
259                     otnlink.getSource().getSourceTp().getValue(), otnlink.getDestination().getDestNode().getValue(),
260                     otnlink.getDestination().getDestTp().getValue(), TapiStringConstants.OTN_XPDR_XPDR_LINK, nodesQual,
261                     nodesQual, tpsQual, tpsQual, adminState, operState, List.of(layerProtocolName),
262                     List.of(layerProtocolName.getName()), this.tapiTopoUuid);
263                 linksToNotConvert.add(oppositeLinkId);
264                 tapiLinks.put(tapLink.key(), tapLink);
265             }
266         }
267     }
268
269     public void convertRdmToRdmLinks(List<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
270             .ietf.network.topology.rev180226.networks.network.Link> rdmTordmLinkList) {
271         List<String> linksToNotConvert = new ArrayList<>();
272         LOG.info("creation of {} roadm to roadm links", rdmTordmLinkList.size() / 2);
273         for (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
274             .Link link : rdmTordmLinkList) {
275             if (!linksToNotConvert.contains(link.getLinkId().getValue())) {
276                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
277                         .ietf.network.topology.rev180226.networks.network.Link oppositeLink = rdmTordmLinkList.stream()
278                     .filter(l -> l.getLinkId().equals(link.augmentation(Link1.class).getOppositeLink()))
279                     .findAny().orElse(null);
280
281                 AdminStates oppLnkAdmState = null;
282                 State oppLnkOpState = null;
283                 if (oppositeLink != null) {
284                     oppLnkAdmState = oppositeLink.augmentation(Link1.class).getAdministrativeState();
285                     oppLnkOpState = oppositeLink.augmentation(Link1.class).getOperationalState();
286                 }
287                 String adminState =
288                     link.augmentation(Link1.class).getAdministrativeState() == null
289                         || oppLnkAdmState == null
290                     ? null
291                     : this.tapiLink.setTapiAdminState(
292                         link.augmentation(Link1.class).getAdministrativeState(), oppLnkAdmState).getName();
293                 String operState =
294                     link.augmentation(Link1.class).getOperationalState() == null
295                         || oppLnkOpState == null
296                     ? null
297                     : this.tapiLink.setTapiOperationalState(
298                         link.augmentation(Link1.class).getOperationalState(), oppLnkOpState).getName();
299
300                 Link tapLink = this.tapiLink.createTapiLink(String.join("-",
301                         link.getSource().getSourceNode().getValue().split("-")[0],
302                         link.getSource().getSourceNode().getValue().split("-")[1]),
303                     link.getSource().getSourceTp().getValue(), String.join("-",
304                         link.getDestination().getDestNode().getValue().split("-")[0],
305                         link.getDestination().getDestNode().getValue().split("-")[1]),
306                     link.getDestination().getDestTp().getValue(), TapiStringConstants.OMS_RDM_RDM_LINK,
307                     TapiStringConstants.PHTNC_MEDIA, TapiStringConstants.PHTNC_MEDIA, TapiStringConstants.PHTNC_MEDIA,
308                     TapiStringConstants.PHTNC_MEDIA, adminState, operState, List.of(LayerProtocolName.PHOTONICMEDIA),
309                     List.of(LayerProtocolName.PHOTONICMEDIA.getName()), this.tapiTopoUuid);
310                 linksToNotConvert.add(link
311                     .augmentation(Link1.class)
312                     .getOppositeLink().getValue());
313                 tapiLinks.put(tapLink.key(), tapLink);
314             }
315         }
316     }
317
318     public void convertRoadmNode(Node roadm, Network openroadmTopo) {
319         this.ietfNodeId = roadm.getNodeId().getValue();
320         Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> oneplist = new HashMap<>();
321         // 1. Get degree and srg nodes to map TPs into NEPs
322         if (openroadmTopo.getNode() == null) {
323             LOG.warn("Openroadm-topology is null.");
324             return;
325         }
326         int numNeps = 0;
327         int numSips = 0;
328         List<Node> nodeList = new ArrayList<Node>(openroadmTopo.getNode().values());
329         for (Node node:nodeList) {
330             if (node.getSupportingNode().values().stream().noneMatch(sp -> sp.getNodeRef().getValue()
331                 .equals(this.ietfNodeId))) {
332                 LOG.warn("Abstracted node {} is not part of {}",
333                     node.getNodeId().getValue(), this.ietfNodeId);
334                 continue;
335             }
336             if (node.augmentation(Node1.class) == null
337                 && node.augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
338                 .ietf.network.topology.rev180226.Node1.class) == null) {
339                 LOG.warn("Abstracted node {} doesnt have type of node or is not disaggregated",
340                     node.getNodeId().getValue());
341                 continue;
342             }
343             OpenroadmNodeType nodeType = node.augmentation(org.opendaylight.yang.gen.v1.http
344                 .org.openroadm.common.network.rev200529.Node1.class).getNodeType();
345             org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1 node1 =
346                 node.augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
347                     .ietf.network.topology.rev180226.Node1.class);
348             LOG.info("TPs of node: {}", node1.getTerminationPoint().values());
349             switch (nodeType.getIntValue()) {
350                 case 11:
351                     LOG.info("Degree node");
352                     // Get only external TPs of the degree
353                     List<TerminationPoint> degPortList = node1.getTerminationPoint().values().stream()
354                         .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
355                             == OpenroadmTpType.DEGREETXRXTTP.getIntValue()
356                             || tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
357                             == OpenroadmTpType.DEGREERXTTP.getIntValue()
358                             || tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
359                             == OpenroadmTpType.DEGREETXTTP.getIntValue())
360                         .collect(Collectors.toList());
361                     // Convert TP List in NEPs and put it in onepl
362                     LOG.info("Degree port List: {}", degPortList);
363                     // TODO: deg port could be sip. e.g. MDONS
364                     oneplist.putAll(populateNepsForRdmNode(degPortList, false));
365                     // oneplist.putAll(populateNepsForRdmNode(node.getNodeId().getValue(), degPortList, false));
366                     numNeps += degPortList.size() * 3;
367                     break;
368                 case 12:
369                     LOG.info("SRG node");
370                     // Get only external TPs of the srg
371                     List<TerminationPoint> srgPortList = node1.getTerminationPoint().values().stream()
372                         .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
373                             == OpenroadmTpType.SRGTXRXPP.getIntValue()
374                             || tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
375                             == OpenroadmTpType.SRGRXPP.getIntValue()
376                             || tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
377                             == OpenroadmTpType.SRGTXPP.getIntValue())
378                         .collect(Collectors.toList());
379                     // Convert TP List in NEPs and put it in onepl
380                     LOG.info("Srg port List: {}", srgPortList);
381                     oneplist.putAll(populateNepsForRdmNode(srgPortList, true));
382                     // oneplist.putAll(populateNepsForRdmNode(node.getNodeId().getValue(), srgPortList, true));
383                     numNeps += srgPortList.size() * 3;
384                     numSips += srgPortList.size();
385                     break;
386                 default:
387                     LOG.error("Node {} tyoe not supported", nodeType.getName());
388             }
389         }
390         // create tapi Node
391         // UUID
392         LOG.info("Creation of PHOTONIC node for {}", roadm.getNodeId().getValue());
393         Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", roadm.getNodeId().getValue(),
394             TapiStringConstants.PHTNC_MEDIA)).getBytes(Charset.forName("UTF-8"))).toString());
395         // Names
396         Name nodeNames =  new NameBuilder().setValueName("roadm node name")
397             .setValue(String.join("+", roadm.getNodeId().getValue(), TapiStringConstants.PHTNC_MEDIA)).build();
398         // Protocol Layer
399         List<LayerProtocolName> layerProtocols = Arrays.asList(LayerProtocolName.PHOTONICMEDIA);
400         // Build tapi node
401         org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology
402             .Node roadmNode = createRoadmTapiNode(nodeUuid, nodeNames, layerProtocols, oneplist);
403         // TODO add states corresponding to device config
404         LOG.info("ROADM node {} should have {} NEPs and {} SIPs", roadm.getNodeId().getValue(), numNeps, numSips);
405         LOG.info("ROADM node {} has {} NEPs and {} SIPs", roadm.getNodeId().getValue(),
406             roadmNode.getOwnedNodeEdgePoint().values().size(),
407             roadmNode.getOwnedNodeEdgePoint().values().stream()
408                 .filter(nep -> nep.getMappedServiceInterfacePoint() != null).count());
409
410         tapiNodes.put(roadmNode.key(), roadmNode);
411     }
412
413     private OduSwitchingPools createOduSwitchingPoolForTp100G() {
414         Map<NonBlockingListKey, NonBlockingList> nblMap = new HashMap<>();
415         int count = 1;
416         for (TerminationPoint tp : this.oorNetworkPortList) {
417             TpId tpid1 = tp.getTpId();
418             TpId tpid2 = new TpId(tp.augmentation(
419                 org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.TerminationPoint1.class)
420                 .getAssociatedConnectionMapPort());
421             List<TpId> tpList = new ArrayList<>();
422             tpList.add(tpid1);
423             tpList.add(tpid2);
424             NonBlockingList nbl = new NonBlockingListBuilder()
425                 .setNblNumber(Uint16.valueOf(count))
426                 .setTpList(tpList)
427                 .build();
428             nblMap.put(nbl.key(), nbl);
429             count++;
430         }
431         return new OduSwitchingPoolsBuilder()
432             .setNonBlockingList(nblMap)
433             .setSwitchingPoolNumber(Uint16.valueOf(1))
434             .build();
435     }
436
437     private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node
438             createTapiNode(Map<NameKey, Name> nodeNames, List<LayerProtocolName> layerProtocols) {
439         Uuid nodeUuid = null;
440         Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl = new HashMap<>();
441         Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList = new HashMap<>();
442         Map<RuleKey, Rule> ruleList = new HashMap<>();
443         Rule rule = new RuleBuilder()
444             .setLocalId("forward")
445             .setForwardingRule(ForwardingRule.MAYFORWARDACROSSGROUP)
446             .setRuleType(RuleType.FORWARDING)
447             .build();
448         ruleList.put(rule.key(), rule);
449         if (layerProtocols.contains(LayerProtocolName.DSR)) {
450             nodeUuid = getNodeUuid4Dsr(onepl, nodeRuleGroupList, ruleList);
451         } else if (layerProtocols.contains(LayerProtocolName.PHOTONICMEDIA)) {
452             nodeUuid = getNodeUuid4Photonic(onepl, nodeRuleGroupList, ruleList);
453         } else {
454             LOG.error("Undefined LayerProtocolName for {} node {}", nodeNames.get(nodeNames.keySet().iterator().next())
455                 .getValueName(), nodeNames.get(nodeNames.keySet().iterator().next()).getValue());
456         }
457         // Empty random creation of mandatory fields for avoiding errors....
458         CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
459             .setCostAlgorithm("Restricted Shortest Path - RSP")
460             .setCostName("HOP_COUNT")
461             .setCostValue("12345678")
462             .build();
463         LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
464             .setFixedLatencyCharacteristic("12345678")
465             .setQueingLatencyCharacteristic("12345678")
466             .setJitterCharacteristic("12345678")
467             .setWanderCharacteristic("12345678")
468             .setTrafficPropertyName("FIXED_LATENCY")
469             .build();
470         return new NodeBuilder()
471             .setUuid(nodeUuid)
472             .setName(nodeNames)
473             .setLayerProtocolName(layerProtocols)
474             .setAdministrativeState(this.tapiLink.setTapiAdminState(this.ietfNodeAdminState.getName()))
475             .setOperationalState(this.tapiLink.setTapiOperationalState(this.ietfNodeOperState.getName()))
476             .setLifecycleState(LifecycleState.INSTALLED)
477             .setOwnedNodeEdgePoint(onepl)
478             .setNodeRuleGroup(nodeRuleGroupList)
479             .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
480             .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
481             .setErrorCharacteristic("error")
482             .setLossCharacteristic("loss")
483             .setRepeatDeliveryCharacteristic("repeat delivery")
484             .setDeliveryOrderCharacteristic("delivery order")
485             .setUnavailableTimeCharacteristic("unavailable time")
486             .setServerIntegrityProcessCharacteristic("server integrity process")
487             .build();
488     }
489
490     private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node
491             createRoadmTapiNode(Uuid nodeUuid, Name nodeNames, List<LayerProtocolName> layerProtocols,
492                         Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> oneplist) {
493         // Empty random creation of mandatory fields for avoiding errors....
494         CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
495             .setCostAlgorithm("Restricted Shortest Path - RSP")
496             .setCostName("HOP_COUNT")
497             .setCostValue("12345678")
498             .build();
499         LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
500             .setFixedLatencyCharacteristic("12345678")
501             .setQueingLatencyCharacteristic("12345678")
502             .setJitterCharacteristic("12345678")
503             .setWanderCharacteristic("12345678")
504             .setTrafficPropertyName("FIXED_LATENCY")
505             .build();
506         return new NodeBuilder()
507             .setUuid(nodeUuid)
508             .setName(Map.of(nodeNames.key(), nodeNames))
509             .setLayerProtocolName(layerProtocols)
510             .setAdministrativeState(AdministrativeState.UNLOCKED)
511             .setOperationalState(OperationalState.ENABLED)
512             .setLifecycleState(LifecycleState.INSTALLED)
513             .setOwnedNodeEdgePoint(oneplist)
514             .setNodeRuleGroup(createNodeRuleGroupForRdmNode(nodeUuid, oneplist.values()))
515             .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
516             .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
517             .setErrorCharacteristic("error")
518             .setLossCharacteristic("loss")
519             .setRepeatDeliveryCharacteristic("repeat delivery")
520             .setDeliveryOrderCharacteristic("delivery order")
521             .setUnavailableTimeCharacteristic("unavailable time")
522             .setServerIntegrityProcessCharacteristic("server integrity process")
523             .build();
524     }
525
526     private Uuid getNodeUuid4Photonic(Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl,
527                                       Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList,
528                                       Map<RuleKey, Rule> ruleList) {
529         Uuid nodeUuid;
530         nodeUuid = this.uuidMap.get(String.join("+", this.ietfNodeId, TapiStringConstants.OTSI));
531         // iNep creation on otsi node
532         for (int i = 0; i < oorNetworkPortList.size(); i++) {
533             LOG.info("NEP = {}", String.join("+", this.ietfNodeId, TapiStringConstants.I_OTSI,
534                 oorNetworkPortList.get(i).getTpId().getValue()));
535             Uuid nepUuid1 = new Uuid(UUID.nameUUIDFromBytes(
536                 (String.join("+", this.ietfNodeId, TapiStringConstants.I_OTSI,
537                     oorNetworkPortList.get(i).getTpId().getValue())).getBytes(Charset.forName("UTF-8")))
538                 .toString());
539             this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.I_OTSI,
540                 oorNetworkPortList.get(i).getTpId().getValue()), nepUuid1);
541             Name onedName = new NameBuilder()
542                 .setValueName("iNodeEdgePoint")
543                 .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.I_OTSI,
544                     oorNetworkPortList.get(i).getTpId().getValue()))
545                 .build();
546
547             OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), Map.of(onedName.key(), onedName),
548                 LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true,
549                 String.join("+", this.ietfNodeId, TapiStringConstants.I_OTSI));
550             onepl.put(onep.key(), onep);
551         }
552         // eNep creation on otsi node
553         for (int i = 0; i < oorNetworkPortList.size(); i++) {
554             LOG.info("NEP = {}", String.join("+", this.ietfNodeId, TapiStringConstants.E_OTSI,
555                 oorNetworkPortList.get(i).getTpId().getValue()));
556             Uuid nepUuid2 = new Uuid(UUID.nameUUIDFromBytes(
557                 (String.join("+", this.ietfNodeId, TapiStringConstants.E_OTSI,
558                     oorNetworkPortList.get(i).getTpId().getValue())).getBytes(Charset.forName("UTF-8")))
559                 .toString());
560             this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.E_OTSI,
561                 oorNetworkPortList.get(i).getTpId().getValue()), nepUuid2);
562             Name onedName = new NameBuilder()
563                 .setValueName("eNodeEdgePoint")
564                 .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.E_OTSI,
565                     oorNetworkPortList.get(i).getTpId().getValue()))
566                 .build();
567
568             OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), Map.of(onedName.key(), onedName),
569                 LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, false,
570                 String.join("+", this.ietfNodeId, TapiStringConstants.E_OTSI));
571             onepl.put(onep.key(), onep);
572         }
573         // Photonic Media Nep creation on otsi node
574         for (int i = 0; i < oorNetworkPortList.size(); i++) {
575             LOG.info("NEP = {}", String.join("+", this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA,
576                 oorNetworkPortList.get(i).getTpId().getValue()));
577             Uuid nepUuid3 = new Uuid(UUID.nameUUIDFromBytes(
578                 (String.join("+", this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA,
579                     oorNetworkPortList.get(i).getTpId().getValue())).getBytes(Charset.forName("UTF-8")))
580                 .toString());
581             this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA,
582                 oorNetworkPortList.get(i).getTpId().getValue()), nepUuid3);
583             Name onedName = new NameBuilder()
584                 .setValueName("PhotMedNodeEdgePoint")
585                 .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA,
586                     oorNetworkPortList.get(i).getTpId().getValue()))
587                 .build();
588
589             OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), Map.of(onedName.key(), onedName),
590                 LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, false,
591                 String.join("+", this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA));
592             onepl.put(onep.key(), onep);
593         }
594         // create NodeRuleGroup
595         int count = 1;
596         LOG.info("OTSi switching pool = {}", this.oorOduSwitchingPool.nonnullNonBlockingList().values());
597         for (TerminationPoint tp : this.oorNetworkPortList) {
598             Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePointKey,
599                 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint>
600                 nepList = new HashMap<>();
601             org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
602                 .NodeEdgePoint inep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
603                 .node.rule.group.NodeEdgePointBuilder()
604                 .setTopologyUuid(tapiTopoUuid)
605                 .setNodeUuid(this.uuidMap.get(String.join("+", this.ietfNodeId, TapiStringConstants.OTSI)))
606                 .setNodeEdgePointUuid(
607                     this.uuidMap.get(String.join("+", this.ietfNodeId, TapiStringConstants.I_OTSI,
608                         tp.getTpId().getValue())))
609                 .build();
610             org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
611                 .NodeEdgePoint enep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
612                 .node.rule.group.NodeEdgePointBuilder()
613                 .setTopologyUuid(tapiTopoUuid)
614                 .setNodeUuid(this.uuidMap.get(String.join("+", this.ietfNodeId, TapiStringConstants.OTSI)))
615                 .setNodeEdgePointUuid(
616                     this.uuidMap.get(String.join("+", this.ietfNodeId, TapiStringConstants.E_OTSI,
617                         tp.getTpId().getValue())))
618                 .build();
619             nepList.put(inep.key(), inep);
620             nepList.put(enep.key(), enep);
621             // Empty random creation of mandatory fields for avoiding errors....
622             CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
623                 .setCostAlgorithm("Restricted Shortest Path - RSP")
624                 .setCostName("HOP_COUNT")
625                 .setCostValue("12345678")
626                 .build();
627             LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
628                 .setFixedLatencyCharacteristic("12345678")
629                 .setQueingLatencyCharacteristic("12345678")
630                 .setJitterCharacteristic("12345678")
631                 .setWanderCharacteristic("12345678")
632                 .setTrafficPropertyName("FIXED_LATENCY")
633                 .build();
634             RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
635                 .setRiskCharacteristicName("risk characteristic")
636                 .setRiskIdentifierList(List.of("risk identifier1", "risk identifier2"))
637                 .build();
638             NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
639                 .setUuid(new Uuid(
640                     UUID.nameUUIDFromBytes(("otsi node rule group " + count).getBytes(Charset.forName("UTF-8")))
641                         .toString()))
642                 .setRule(ruleList)
643                 .setNodeEdgePoint(nepList)
644                 .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
645                 .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
646                 .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
647                 .build();
648             nodeRuleGroupList.put(nodeRuleGroup.key(), nodeRuleGroup);
649             count++;
650         }
651         return nodeUuid;
652     }
653
654     private Uuid getNodeUuid4Dsr(Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl,
655                                  Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList, Map<RuleKey, Rule> ruleList) {
656         Uuid nodeUuid;
657         nodeUuid = this.uuidMap.get(String.join("+", this.ietfNodeId, TapiStringConstants.DSR));
658         // client nep creation on DSR node
659         for (int i = 0; i < oorClientPortList.size(); i++) {
660             LOG.info("NEP = {}", String.join("+", this.ietfNodeId, TapiStringConstants.DSR,
661                 oorClientPortList.get(i).getTpId().getValue()));
662             Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
663                 (String.join("+", this.ietfNodeId, TapiStringConstants.DSR,
664                     oorClientPortList.get(i).getTpId().getValue())).getBytes(Charset.forName("UTF-8"))).toString());
665             this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.DSR,
666                     oorClientPortList.get(i).getTpId().getValue()), nepUuid);
667             NameBuilder nameBldr = new NameBuilder().setValue(
668                 String.join("+", this.ietfNodeId, TapiStringConstants.DSR,
669                     oorClientPortList.get(i).getTpId().getValue()));
670             Name name;
671             if (OpenroadmNodeType.TPDR.equals(this.ietfNodeType)) {
672                 name = nameBldr.setValueName("100G-tpdr").build();
673             } else {
674                 name = nameBldr.setValueName("NodeEdgePoint_C").build();
675             }
676
677             OwnedNodeEdgePoint onep = createNep(oorClientPortList.get(i), Map.of(name.key(), name),
678                 LayerProtocolName.DSR, LayerProtocolName.DSR, true, String.join("+", this.ietfNodeId,
679                     TapiStringConstants.DSR));
680             onepl.put(onep.key(), onep);
681         }
682         // network nep creation on I_ODU node
683         for (int i = 0; i < oorNetworkPortList.size(); i++) {
684             LOG.info("NEP = {}", String.join("+", this.ietfNodeId, TapiStringConstants.I_ODU,
685                 oorNetworkPortList.get(i).getTpId().getValue()));
686             Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
687                 (String.join("+", this.ietfNodeId, TapiStringConstants.I_ODU,
688                     oorNetworkPortList.get(i).getTpId().getValue())).getBytes(Charset.forName("UTF-8"))).toString());
689             this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.I_ODU,
690                 oorNetworkPortList.get(i).getTpId().getValue()), nepUuid);
691             Name onedName = new NameBuilder()
692                 .setValueName("iNodeEdgePoint_N")
693                 .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.I_ODU,
694                     oorNetworkPortList.get(i).getTpId().getValue()))
695                 .build();
696
697             OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), Map.of(onedName.key(), onedName),
698                 LayerProtocolName.ODU, LayerProtocolName.DSR, false, String.join("+", this.ietfNodeId,
699                     TapiStringConstants.I_ODU));
700             onepl.put(onep.key(), onep);
701         }
702         // network nep creation on E_ODU node
703         for (int i = 0; i < oorNetworkPortList.size(); i++) {
704             LOG.info("NEP = {}", String.join("+", this.ietfNodeId, TapiStringConstants.E_ODU,
705                 oorNetworkPortList.get(i).getTpId().getValue()));
706             Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
707                 (String.join("+", this.ietfNodeId, TapiStringConstants.E_ODU,
708                     oorNetworkPortList.get(i).getTpId().getValue())).getBytes(Charset.forName("UTF-8"))).toString());
709             this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.E_ODU,
710                 oorNetworkPortList.get(i).getTpId().getValue()), nepUuid);
711             Name onedName = new NameBuilder()
712                 .setValueName("eNodeEdgePoint_N")
713                 .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.E_ODU,
714                     oorNetworkPortList.get(i).getTpId().getValue()))
715                 .build();
716
717             OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), Map.of(onedName.key(), onedName),
718                 LayerProtocolName.ODU, LayerProtocolName.DSR, true, String.join("+", this.ietfNodeId,
719                     TapiStringConstants.E_ODU));
720             onepl.put(onep.key(), onep);
721         }
722         // create NodeRuleGroup
723         int count = 1;
724         LOG.info("ODU switching pool = {}", this.oorOduSwitchingPool.nonnullNonBlockingList().values());
725         for (NonBlockingList nbl : this.oorOduSwitchingPool.nonnullNonBlockingList().values()) {
726             Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePointKey,
727                 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint>
728                 nepList = new HashMap<>();
729             LOG.info("UUidMap={}", this.uuidMap.keySet());
730             LOG.info("TP list = {}", nbl.getTpList());
731             for (TpId tp : nbl.getTpList()) {
732                 LOG.info("TP={}", tp.getValue());
733                 LOG.info("UuidKey={}", String.join("+", this.ietfNodeId,
734                     TapiStringConstants.E_ODU, tp.getValue()));
735                 if (this.uuidMap.containsKey(String.join("+", this.ietfNodeId,
736                             TapiStringConstants.E_ODU, tp.getValue()))
737                         || this.uuidMap.containsKey(String.join("+", this.ietfNodeId,
738                             TapiStringConstants.DSR, tp.getValue()))) {
739                     org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint
740                         nep = new org.opendaylight.yang.gen.v1.urn
741                         .onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePointBuilder()
742                         .setTopologyUuid(tapiTopoUuid)
743                         .setNodeUuid(this.uuidMap.get(String.join("+", this.ietfNodeId,
744                             TapiStringConstants.DSR)))
745                         .setNodeEdgePointUuid((tp.getValue().contains("CLIENT")) ? this.uuidMap.get(String.join(
746                             "+", this.ietfNodeId, TapiStringConstants.DSR, tp.getValue()))
747                             : this.uuidMap.get(String.join(
748                             "+", this.ietfNodeId, TapiStringConstants.E_ODU, tp.getValue())))
749                         .build();
750                     nepList.put(nep.key(), nep);
751                 }
752             }
753             // Empty random creation of mandatory fields for avoiding errors....
754             CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
755                 .setCostAlgorithm("Restricted Shortest Path - RSP")
756                 .setCostName("HOP_COUNT")
757                 .setCostValue("12345678")
758                 .build();
759             LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
760                 .setFixedLatencyCharacteristic("12345678")
761                 .setQueingLatencyCharacteristic("12345678")
762                 .setJitterCharacteristic("12345678")
763                 .setWanderCharacteristic("12345678")
764                 .setTrafficPropertyName("FIXED_LATENCY")
765                 .build();
766             RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
767                 .setRiskCharacteristicName("risk characteristic")
768                 .setRiskIdentifierList(List.of("risk identifier1", "risk identifier2"))
769                 .build();
770             NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
771                 .setUuid(new Uuid(UUID.nameUUIDFromBytes(("dsr node rule group " + count)
772                     .getBytes(Charset.forName("UTF-8"))).toString()))
773                 .setRule(ruleList)
774                 .setNodeEdgePoint(nepList)
775                 .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
776                 .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
777                 .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
778                 .build();
779             nodeRuleGroupList.put(nodeRuleGroup.key(), nodeRuleGroup);
780             count++;
781         }
782         return nodeUuid;
783     }
784
785     private OwnedNodeEdgePoint createNep(TerminationPoint oorTp, Map<NameKey, Name> nepNames,
786                                          LayerProtocolName nepProtocol, LayerProtocolName nodeProtocol, boolean withSip,
787                                          String keyword) {
788         String key = String.join("+", keyword, oorTp.getTpId().getValue());
789         OwnedNodeEdgePointBuilder onepBldr = new OwnedNodeEdgePointBuilder()
790             .setUuid(this.uuidMap.get(key))
791             .setLayerProtocolName(nepProtocol)
792             .setName(nepNames);
793         if (withSip) {
794             onepBldr.setMappedServiceInterfacePoint(createMSIP(1, nepProtocol, oorTp, keyword));
795         }
796         AdministrativeState adminState = null;
797         OperationalState operState = null;
798         if (oorTp.augmentation(TerminationPoint1.class).getAdministrativeState() != null) {
799             adminState = this.tapiLink.setTapiAdminState(oorTp.augmentation(TerminationPoint1.class)
800                 .getAdministrativeState().getName());
801         }
802         if (oorTp.augmentation(TerminationPoint1.class).getOperationalState() != null) {
803             operState = this.tapiLink.setTapiOperationalState(oorTp.augmentation(TerminationPoint1.class)
804                 .getOperationalState().getName());
805         }
806         onepBldr.setSupportedCepLayerProtocolQualifier(createSupportedLayerProtocolQualifier(oorTp, nodeProtocol))
807             .setLinkPortDirection(PortDirection.BIDIRECTIONAL)
808             .setLinkPortRole(PortRole.SYMMETRIC)
809             .setAdministrativeState(adminState)
810             .setOperationalState(operState)
811             .setLifecycleState(LifecycleState.INSTALLED)
812             .setTerminationDirection(TerminationDirection.BIDIRECTIONAL)
813             .setTerminationState(TerminationState.TERMINATEDBIDIRECTIONAL);
814         return onepBldr.build();
815     }
816
817     private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> populateNepsForRdmNode(List<TerminationPoint> tpList,
818                                                                                   boolean withSip) {
819         // create neps for MC and OTSiMC and Photonic Media
820         Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = new HashMap<>();
821         for (TerminationPoint tp:tpList) {
822             // Admin and oper state common for all tps
823             AdminStates admin = tp.augmentation(TerminationPoint1.class).getAdministrativeState();
824             State oper = tp.augmentation(TerminationPoint1.class).getOperationalState();
825             // PHOTONIC MEDIA nep
826             LOG.info("PHOTO NEP = {}", String.join("+", this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA,
827                 tp.getTpId().getValue()));
828             Name nepName = new NameBuilder()
829                 .setValueName(TapiStringConstants.PHTNC_MEDIA + "NodeEdgePoint")
830                 .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA,
831                     tp.getTpId().getValue()))
832                 .build();
833
834             OwnedNodeEdgePoint onep = new OwnedNodeEdgePointBuilder()
835                 .setUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", this.ietfNodeId,
836                     TapiStringConstants.PHTNC_MEDIA, tp.getTpId().getValue()))
837                     .getBytes(Charset.forName("UTF-8"))).toString()))
838                 .setLayerProtocolName(LayerProtocolName.PHOTONICMEDIA)
839                 .setName(Map.of(nepName.key(), nepName))
840                 .setSupportedCepLayerProtocolQualifier(List.of(PHOTONICLAYERQUALIFIEROMS.class))
841                 .setLinkPortDirection(PortDirection.BIDIRECTIONAL)
842                 .setLinkPortRole(PortRole.SYMMETRIC)
843                 .setAdministrativeState(this.tapiLink.setTapiAdminState(admin.getName()))
844                 .setOperationalState(this.tapiLink.setTapiOperationalState(oper.getName()))
845                 .setLifecycleState(LifecycleState.INSTALLED)
846                 .setTerminationDirection(TerminationDirection.BIDIRECTIONAL)
847                 .setTerminationState(TerminationState.TERMINATEDBIDIRECTIONAL)
848                 .build();
849             onepMap.put(onep.key(), onep);
850
851             // MC nep
852             LOG.info("MC NEP = {}", String.join("+", this.ietfNodeId, TapiStringConstants.MC,
853                 tp.getTpId().getValue()));
854             Name nepName1 = new NameBuilder()
855                 .setValueName(TapiStringConstants.MC + "NodeEdgePoint")
856                 .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.MC, tp.getTpId().getValue()))
857                 .build();
858             OwnedNodeEdgePointBuilder onepBldr1 = new OwnedNodeEdgePointBuilder()
859                 .setUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", this.ietfNodeId,
860                     TapiStringConstants.MC, tp.getTpId().getValue())).getBytes(Charset.forName("UTF-8"))).toString()))
861                 .setLayerProtocolName(LayerProtocolName.PHOTONICMEDIA)
862                 .setName(Map.of(nepName1.key(), nepName1))
863                 .setSupportedCepLayerProtocolQualifier(List.of(PHOTONICLAYERQUALIFIEROMS.class))
864                 .setLinkPortDirection(PortDirection.BIDIRECTIONAL)
865                 .setLinkPortRole(PortRole.SYMMETRIC)
866                 .setAdministrativeState(this.tapiLink.setTapiAdminState(admin.getName()))
867                 .setOperationalState(this.tapiLink.setTapiOperationalState(oper.getName()))
868                 .setLifecycleState(LifecycleState.INSTALLED)
869                 .setTerminationDirection(TerminationDirection.BIDIRECTIONAL)
870                 .setTerminationState(TerminationState.TERMINATEDBIDIRECTIONAL);
871             if (withSip) {
872                 onepBldr1.setMappedServiceInterfacePoint(createMSIP(1, LayerProtocolName.PHOTONICMEDIA,
873                     tp, String.join("+", this.ietfNodeId, TapiStringConstants.MC)));
874             }
875             OwnedNodeEdgePoint onep1 = onepBldr1.build();
876             onepMap.put(onep1.key(), onep1);
877
878             // OTSiMC nep
879             LOG.info("OTSi NEP = {}", String.join("+", this.ietfNodeId, TapiStringConstants.OTSI_MC,
880                 tp.getTpId().getValue()));
881             Name nepName2 = new NameBuilder()
882                 .setValueName(TapiStringConstants.OTSI_MC + "NodeEdgePoint")
883                 .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.OTSI_MC,
884                     tp.getTpId().getValue()))
885                 .build();
886
887             OwnedNodeEdgePoint onep2 = new OwnedNodeEdgePointBuilder()
888                 .setUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", this.ietfNodeId,
889                         TapiStringConstants.OTSI_MC, tp.getTpId().getValue())).getBytes(Charset.forName("UTF-8")))
890                     .toString()))
891                 .setLayerProtocolName(LayerProtocolName.PHOTONICMEDIA)
892                 .setName(Map.of(nepName2.key(), nepName2))
893                 .setSupportedCepLayerProtocolQualifier(List.of(PHOTONICLAYERQUALIFIEROMS.class))
894                 .setLinkPortDirection(PortDirection.BIDIRECTIONAL)
895                 .setLinkPortRole(PortRole.SYMMETRIC)
896                 .setAdministrativeState(this.tapiLink.setTapiAdminState(admin.getName()))
897                 .setOperationalState(this.tapiLink.setTapiOperationalState(oper.getName()))
898                 .setLifecycleState(LifecycleState.INSTALLED)
899                 .setTerminationDirection(TerminationDirection.BIDIRECTIONAL)
900                 .setTerminationState(TerminationState.TERMINATEDBIDIRECTIONAL)
901                 .build();
902             onepMap.put(onep2.key(), onep2);
903         }
904         return onepMap;
905     }
906
907     private Map<NodeRuleGroupKey, NodeRuleGroup> createNodeRuleGroupForRdmNode(Uuid nodeUuid,
908                                                                                Collection<OwnedNodeEdgePoint> onepl) {
909         Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePointKey,
910             org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint>
911             nepMap = new HashMap<>();
912         for (OwnedNodeEdgePoint onep : onepl) {
913             org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint
914                 nep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
915                 .NodeEdgePointBuilder()
916                 .setTopologyUuid(tapiTopoUuid)
917                 .setNodeUuid(nodeUuid)
918                 .setNodeEdgePointUuid(onep.key().getUuid())
919                 .build();
920             nepMap.put(nep.key(), nep);
921         }
922         Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupMap = new HashMap<>();
923         Map<RuleKey, Rule> ruleList = new HashMap<>();
924         Rule rule = new RuleBuilder()
925             .setLocalId("forward")
926             .setForwardingRule(ForwardingRule.MAYFORWARDACROSSGROUP)
927             .setRuleType(RuleType.FORWARDING)
928             .build();
929         ruleList.put(rule.key(), rule);
930         NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
931             .setUuid(new Uuid(UUID.nameUUIDFromBytes((this.ietfNodeId + " node rule group")
932                 .getBytes(Charset.forName("UTF-8"))).toString()))
933             .setRule(ruleList)
934             .setNodeEdgePoint(nepMap)
935             .build();
936         nodeRuleGroupMap.put(nodeRuleGroup.key(), nodeRuleGroup);
937         return nodeRuleGroupMap;
938     }
939
940     private Map<MappedServiceInterfacePointKey, MappedServiceInterfacePoint> createMSIP(int nb,
941                                                                                         LayerProtocolName layerProtocol,
942                                                                                         TerminationPoint tp,
943                                                                                         String nodeid) {
944         // add them to SIP context
945         Map<MappedServiceInterfacePointKey, MappedServiceInterfacePoint> msipl = new HashMap<>();
946         for (int i = 0; i < nb; i++) {
947             LOG.info("SIP = {}", String.join("+", "SIP", nodeid, tp.getTpId().getValue()));
948             Uuid sipUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP", nodeid,
949                 tp.getTpId().getValue())).getBytes(Charset.forName("UTF-8"))).toString());
950             MappedServiceInterfacePoint msip = new MappedServiceInterfacePointBuilder()
951                 .setServiceInterfacePointUuid(sipUuid).build();
952             ServiceInterfacePoint sip = createSIP(sipUuid, layerProtocol, tp, nodeid);
953             this.tapiSips.put(sip.key(), sip);
954             msipl.put(msip.key(), msip);
955         }
956         return msipl;
957     }
958
959     private ServiceInterfacePoint createSIP(Uuid sipUuid, LayerProtocolName layerProtocol, TerminationPoint tp,
960                                             String nodeid) {
961         // TODO: what value should be set in total capacity and available capacity??
962         // LOG.info("SIP name = {}", String.join("+", nodeid, tp.getTpId().getValue()));
963         Name sipName = new NameBuilder()
964             .setValueName("SIP name")
965             .setValue(String.join("+", nodeid, tp.getTpId().getValue()))
966             .build();
967         AdministrativeState adminState = null;
968         OperationalState operState = null;
969         if (tp.augmentation(TerminationPoint1.class).getAdministrativeState() != null) {
970             adminState = this.tapiLink.setTapiAdminState(tp.augmentation(TerminationPoint1.class)
971                 .getAdministrativeState().getName());
972         }
973         if (tp.augmentation(TerminationPoint1.class).getOperationalState() != null) {
974             operState = this.tapiLink.setTapiOperationalState(tp.augmentation(TerminationPoint1.class)
975                 .getOperationalState().getName());
976         }
977         return new ServiceInterfacePointBuilder()
978             .setUuid(sipUuid)
979             .setName(Map.of(sipName.key(), sipName))
980             .setLayerProtocolName(layerProtocol)
981             .setAdministrativeState(adminState)
982             .setOperationalState(operState)
983             .setLifecycleState(LifecycleState.INSTALLED)
984             .setAvailableCapacity(new AvailableCapacityBuilder().build())
985             .setTotalPotentialCapacity(new TotalPotentialCapacityBuilder().build())
986             .setSupportedLayerProtocolQualifier(createSupportedLayerProtocolQualifier(tp, layerProtocol))
987             .build();
988     }
989
990     private List<Class<? extends LAYERPROTOCOLQUALIFIER>> createSupportedLayerProtocolQualifier(TerminationPoint tp,
991                                                                                                 LayerProtocolName lpn) {
992         Set<Class<? extends LAYERPROTOCOLQUALIFIER>> sclpqSet = new HashSet<>();
993         List<SupportedInterfaceCapability> sicList;
994         org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.TerminationPoint1 tp1 =
995             tp.augmentation(org.opendaylight.yang.gen.v1.http
996                 .org.openroadm.otn.network.topology.rev200529.TerminationPoint1.class);
997         if (tp1 == null) {
998             return new ArrayList<>(sclpqSet);
999         }
1000         if (tp1.getTpSupportedInterfaces() == null) {
1001             LOG.warn("Tp supported interface doesnt exist on TP {}", tp.getTpId().getValue());
1002             return new ArrayList<>(sclpqSet);
1003         }
1004         sicList = new ArrayList<>(tp1.getTpSupportedInterfaces().getSupportedInterfaceCapability().values());
1005         for (SupportedInterfaceCapability sic : sicList) {
1006             switch (lpn.getName()) {
1007                 case "DSR":
1008                 case "ODU":
1009                     switch (sic.getIfCapType().getSimpleName()) {
1010                         // TODO: it may be needed to add more cases clauses if the interface capabilities of a
1011                         //  port are extended in the config file
1012                         case "If1GEODU0":
1013                             sclpqSet.add(ODUTYPEODU0.class);
1014                             sclpqSet.add(DIGITALSIGNALTYPEGigE.class);
1015                             break;
1016                         case "If10GEODU2e":
1017                             sclpqSet.add(ODUTYPEODU2E.class);
1018                             sclpqSet.add(DIGITALSIGNALTYPE10GigELAN.class);
1019                             break;
1020                         case "If10GEODU2":
1021                             sclpqSet.add(ODUTYPEODU2.class);
1022                             sclpqSet.add(DIGITALSIGNALTYPE10GigELAN.class);
1023                             break;
1024                         case "If10GE":
1025                             sclpqSet.add(DIGITALSIGNALTYPE10GigELAN.class);
1026                             break;
1027                         case "If100GEODU4":
1028                             sclpqSet.add(DIGITALSIGNALTYPE100GigE.class);
1029                             sclpqSet.add(ODUTYPEODU4.class);
1030                             break;
1031                         case "If100GE":
1032                             sclpqSet.add(DIGITALSIGNALTYPE100GigE.class);
1033                             break;
1034                         case "IfOCHOTU4ODU4":
1035                         case "IfOCH":
1036                             sclpqSet.add(ODUTYPEODU4.class);
1037                             break;
1038                         default:
1039                             LOG.error("IfCapability type not managed");
1040                             break;
1041                     }
1042                     break;
1043                 case "PHOTONIC_MEDIA":
1044                     if (sic.getIfCapType().getSimpleName().equals("IfOCHOTU4ODU4")
1045                         || sic.getIfCapType().getSimpleName().equals("IfOCH")) {
1046                         sclpqSet.add(PHOTONICLAYERQUALIFIEROTSi.class);
1047                         sclpqSet.add(PHOTONICLAYERQUALIFIEROMS.class);
1048                     }
1049                     break;
1050                 default:
1051                     LOG.error("Layer Protocol Name is unknown");
1052                     break;
1053             }
1054         }
1055         return new ArrayList<>(sclpqSet);
1056     }
1057
1058     private void createTapiTransitionalLinks() {
1059         for (TerminationPoint tp : this.oorNetworkPortList) {
1060             Link transiLink = tapiLink.createTapiLink(this.ietfNodeId, tp.getTpId().getValue(), this.ietfNodeId,
1061                 tp.getTpId().getValue(), TapiStringConstants.TRANSITIONAL_LINK, TapiStringConstants.DSR,
1062                 TapiStringConstants.OTSI, TapiStringConstants.I_ODU, TapiStringConstants.I_OTSI,
1063                 "inService", "inService", Arrays.asList(LayerProtocolName.ODU,
1064                     LayerProtocolName.PHOTONICMEDIA),
1065                 Arrays.asList(LayerProtocolName.ODU.getName(), LayerProtocolName.PHOTONICMEDIA.getName()),
1066                 this.tapiTopoUuid);
1067             this.tapiLinks.put(transiLink.key(), transiLink);
1068         }
1069     }
1070
1071     public void convertXpdrToRdmLinks(List<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
1072             .ietf.network.topology.rev180226.networks.network.Link> xpdrRdmLinkList) {
1073         List<String> linksToNotConvert = new ArrayList<>();
1074         LOG.info("creation of {} xpdr to roadm links", xpdrRdmLinkList.size() / 2);
1075         // LOG.info("Link list = {}", xpdrRdmLinkList.toString());
1076         for (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
1077             .ietf.network.topology.rev180226.networks.network.Link link:xpdrRdmLinkList) {
1078             if (!linksToNotConvert.contains(link.getLinkId().getValue())) {
1079                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
1080                     .ietf.network.topology.rev180226.networks.network.Link oppositeLink = xpdrRdmLinkList.stream()
1081                     .filter(l -> l.getLinkId().equals(link.augmentation(Link1.class).getOppositeLink())).findAny()
1082                     .orElse(null);
1083
1084                 AdminStates oppLnkAdmState = null;
1085                 State oppLnkOpState = null;
1086                 if (oppositeLink != null) {
1087                     oppLnkAdmState = oppositeLink.augmentation(Link1.class).getAdministrativeState();
1088                     oppLnkOpState = oppositeLink.augmentation(Link1.class).getOperationalState();
1089                 }
1090                 String adminState =
1091                     link.augmentation(Link1.class).getAdministrativeState() == null
1092                         || oppLnkAdmState == null
1093                     ? null
1094                     : this.tapiLink.setTapiAdminState(
1095                         link.augmentation(Link1.class).getAdministrativeState(), oppLnkAdmState).getName();
1096                 String operState =
1097                     link.augmentation(Link1.class).getOperationalState() == null
1098                         || oppLnkOpState == null
1099                     ? null
1100                     : this.tapiLink.setTapiOperationalState(
1101                         link.augmentation(Link1.class).getOperationalState(), oppLnkOpState).getName();
1102
1103                 String sourceNode = (link.getSource().getSourceNode().getValue().contains("ROADM"))
1104                     ? getIdBasedOnModelVersion(link.getSource().getSourceNode().getValue())
1105                     : link.getSource().getSourceNode().getValue();
1106                 String sourceTp = link.getSource().getSourceTp().getValue();
1107                 String sourceNodeQual = sourceNode.contains("ROADM") ? TapiStringConstants.PHTNC_MEDIA
1108                     : TapiStringConstants.OTSI;
1109                 String destNode = (link.getDestination().getDestNode().getValue().contains("ROADM"))
1110                     ? getIdBasedOnModelVersion(link.getDestination().getDestNode().getValue())
1111                     : link.getDestination().getDestNode().getValue();
1112                 String destTp = link.getDestination().getDestTp().getValue();
1113                 String destNodeQual = destNode.contains("ROADM") ? TapiStringConstants.PHTNC_MEDIA
1114                     : TapiStringConstants.OTSI;
1115                 Link tapLink = this.tapiLink.createTapiLink(sourceNode, sourceTp, destNode, destTp,
1116                     TapiStringConstants.OMS_XPDR_RDM_LINK, sourceNodeQual, destNodeQual,
1117                     TapiStringConstants.PHTNC_MEDIA, TapiStringConstants.PHTNC_MEDIA, adminState,
1118                     operState, List.of(LayerProtocolName.PHOTONICMEDIA),
1119                     List.of(LayerProtocolName.PHOTONICMEDIA.getName()), this.tapiTopoUuid);
1120                 linksToNotConvert.add(link.augmentation(Link1.class).getOppositeLink().getValue());
1121                 this.tapiLinks.put(tapLink.key(), tapLink);
1122             }
1123         }
1124     }
1125
1126     private String getIdBasedOnModelVersion(String linknodeid) {
1127         if (linknodeid.matches("[A-Z]{5}-[A-Z0-9]{2}-.*")) {
1128             LOG.info("OpenROADM version > 1.2.1 {}", linknodeid);
1129             return String.join("-", linknodeid.split("-")[0], linknodeid.split("-")[1]);
1130         } else {
1131             LOG.info("OpenROADM version <= 1.2.1 {}", linknodeid);
1132             return linknodeid.split("-")[0];
1133         }
1134     }
1135
1136     public Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node>
1137             getTapiNodes() {
1138         return tapiNodes;
1139     }
1140
1141     public Map<LinkKey, Link> getTapiLinks() {
1142         return tapiLinks;
1143     }
1144
1145     public Map<ServiceInterfacePointKey, ServiceInterfacePoint> getTapiSips() {
1146         return tapiSips;
1147     }
1148 }