Merge changes Ifd9a205e,I5d358413,I4f693297
[transportpce.git] / tapi / src / main / java / org / opendaylight / transportpce / tapi / topology / ConvertORTopoToTapiTopo.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.Collection;
14 import java.util.Collections;
15 import java.util.HashMap;
16 import java.util.HashSet;
17 import java.util.Iterator;
18 import java.util.List;
19 import java.util.Map;
20 import java.util.Map.Entry;
21 import java.util.Set;
22 import java.util.UUID;
23 import java.util.stream.Collectors;
24 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1;
25 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
26 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
27 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.OduSwitchingPools;
28 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.OduSwitchingPoolsBuilder;
29 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
30 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListBuilder;
31 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev200327.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListKey;
32 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmNodeType;
33 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmTpType;
34 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
35 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.Link1;
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.Node;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
40 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.AdministrativeState;
41 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.CapacityUnit;
42 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.ForwardingDirection;
43 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LAYERPROTOCOLQUALIFIER;
44 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LayerProtocolName;
45 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LifecycleState;
46 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.OperationalState;
47 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortDirection;
48 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortRole;
49 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TerminationDirection;
50 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TerminationState;
51 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
52 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.TotalSizeBuilder;
53 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.pac.AvailableCapacityBuilder;
54 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.pac.TotalPotentialCapacityBuilder;
55 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name;
56 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameBuilder;
57 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameKey;
58 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPE100GigE;
59 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPE10GigELAN;
60 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU2;
61 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU2E;
62 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU4;
63 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev181210.PHOTONICLAYERQUALIFIEROMS;
64 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev181210.PHOTONICLAYERQUALIFIEROTSi;
65 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.ForwardingRule;
66 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.RuleType;
67 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.link.NodeEdgePoint;
68 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.link.NodeEdgePointBuilder;
69 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.link.NodeEdgePointKey;
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.topology.Link;
83 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.LinkBuilder;
84 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.LinkKey;
85 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeBuilder;
86 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey;
87 import org.opendaylight.yangtools.yang.common.Uint16;
88 import org.opendaylight.yangtools.yang.common.Uint64;
89 import org.slf4j.Logger;
90 import org.slf4j.LoggerFactory;
91
92
93 public class ConvertORTopoToTapiTopo {
94
95     private static final String DSR = "DSR";
96     private static final String OTSI = "OTSi";
97     private static final String E_OTSI = "eOTSi";
98     private static final String I_OTSI = "iOTSi";
99     private static final String RDM_INFRA = "ROADM-infra";
100     private static final Logger LOG = LoggerFactory.getLogger(ConvertORTopoToTapiTopo.class);
101     private String ietfNodeId;
102     private OpenroadmNodeType ietfNodeType;
103     private AdminStates ietfNodeAdminState;
104     private State ietfNodeOperState;
105     private List<TerminationPoint> oorClientPortList;
106     private List<TerminationPoint> oorNetworkPortList;
107     private OduSwitchingPools oorOduSwitchingPool;
108     private Uuid tapiTopoUuid;
109     private Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node>
110         tapiNodes;
111     private Map<LinkKey, Link> tapiLinks;
112     private Map<String, Uuid> uuidMap;
113
114
115     public ConvertORTopoToTapiTopo(Uuid tapiTopoUuid) {
116         this.tapiTopoUuid = tapiTopoUuid;
117         this.tapiNodes = new HashMap<>();
118         this.tapiLinks = new HashMap<>();
119         this.uuidMap = new HashMap<>();
120     }
121
122     public void convertNode(Node ietfNode, List<String> networkPorts) {
123         this.ietfNodeId = ietfNode.getNodeId().getValue();
124         if (ietfNode.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1.class)
125             == null) {
126             return;
127         }
128         this.ietfNodeType = ietfNode.augmentation(
129             org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1.class).getNodeType();
130         this.ietfNodeAdminState = ietfNode.augmentation(
131                 org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1.class)
132             .getAdministrativeState();
133         this.ietfNodeOperState = ietfNode.augmentation(
134                 org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1.class)
135             .getOperationalState();
136         this.oorNetworkPortList = ietfNode.augmentation(
137                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
138             .getTerminationPoint().values().stream()
139             .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
140             == OpenroadmTpType.XPONDERNETWORK.getIntValue()
141             && networkPorts.contains(tp.getTpId().getValue()))
142             .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
143             .collect(Collectors.toList());
144         if (!OpenroadmNodeType.TPDR.equals(this.ietfNodeType)) {
145             this.oorOduSwitchingPool = ietfNode.augmentation(Node1.class).getSwitchingPools().getOduSwitchingPools()
146                 .values().stream().findFirst().get();
147             this.oorClientPortList = ietfNode.augmentation(
148                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
149             .getTerminationPoint().values().stream()
150             .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
151             == OpenroadmTpType.XPONDERCLIENT.getIntValue())
152             .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
153             .collect(Collectors.toList());
154         } else {
155             this.oorOduSwitchingPool = createOduSwitchingPoolForTp100G();
156             List<TpId> tpList = this.oorOduSwitchingPool.getNonBlockingList().values().stream()
157                 .flatMap(nbl -> nbl.getTpList().stream())
158                 .collect(Collectors.toList());
159             this.oorClientPortList = ietfNode.augmentation(
160                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
161                 .getTerminationPoint().values().stream()
162                 .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
163                     == OpenroadmTpType.XPONDERCLIENT.getIntValue() && tpList.contains(tp.getTpId()))
164                 .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
165                 .collect(Collectors.toList());
166             this.oorClientPortList.forEach(tp -> LOG.info("tp = {}", tp.getTpId()));
167         }
168
169         // node creation [DSR/ODU]
170         LOG.info("creation of a DSR/ODU node for {}", this.ietfNodeId);
171         Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", this.ietfNodeId, DSR))
172             .getBytes(Charset.forName("UTF-8"))).toString());
173         this.uuidMap.put(String.join("+", this.ietfNodeId, DSR), nodeUuid);
174         Name nameDsr = new NameBuilder().setValueName("dsr/odu node name").setValue(this.ietfNodeId).build();
175         List<LayerProtocolName> dsrLayerProtocols = Arrays.asList(LayerProtocolName.DSR, LayerProtocolName.ODU);
176         org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology
177             .Node dsrNode = createTapiNode(Map.of(nameDsr.key(), nameDsr), dsrLayerProtocols);
178         tapiNodes.put(dsrNode.key(), dsrNode);
179
180         // node creation [otsi]
181         LOG.info("creation of an OTSi node for {}", this.ietfNodeId);
182         nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", this.ietfNodeId, OTSI))
183             .getBytes(Charset.forName("UTF-8"))).toString());
184         this.uuidMap.put(String.join("+", this.ietfNodeId, OTSI), nodeUuid);
185         Name nameOtsi =  new NameBuilder().setValueName("otsi node name").setValue(this.ietfNodeId).build();
186         List<LayerProtocolName> otsiLayerProtocols = Arrays.asList(LayerProtocolName.PHOTONICMEDIA);
187         org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology
188             .Node otsiNode = createTapiNode(Map.of(nameOtsi.key(), nameOtsi), otsiLayerProtocols);
189         tapiNodes.put(otsiNode.key(), otsiNode);
190
191         // transitional link cration between network nep of DSR/ODU node and iNep of otsi node
192         LOG.info("creation of transitional links between DSR/ODU and OTSi nodes");
193         createTapiTransitionalLinks();
194     }
195
196     public void convertLinks(Map<
197             org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
198                 .LinkKey,
199             org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
200                 .Link> otnLinkMap) {
201         List<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
202             .Link> otnLinkList = new ArrayList<>(otnLinkMap.values());
203         Collections.sort(otnLinkList, (l1, l2) -> l1.getLinkId().getValue()
204             .compareTo(l2.getLinkId().getValue()));
205         List<String> linksToNotConvert = new ArrayList<>();
206         LOG.info("creation of {} otn links", otnLinkMap.size() / 2);
207         for (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
208             .Link otnlink : otnLinkList) {
209             if (!linksToNotConvert.contains(otnlink.getLinkId().getValue())) {
210                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks
211                     .network.Link oppositeLink = otnLinkMap.get(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns
212                         .yang.ietf.network.topology.rev180226.networks.network.LinkKey(otnlink.augmentation(
213                                 org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1.class)
214                             .getOppositeLink()));
215                 Link tapiLink = createTapiLink(otnlink, oppositeLink);
216                 linksToNotConvert.add(oppositeLink.getLinkId().getValue());
217                 tapiLinks.put(tapiLink.key(), tapiLink);
218             }
219         }
220     }
221
222     public void convertRoadmInfrastructure() {
223         LOG.info("abstraction of the ROADM infrastructure towards a photonic node");
224         Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(RDM_INFRA.getBytes(Charset.forName("UTF-8"))).toString());
225         Name nodeName =  new NameBuilder().setValueName("otsi node name").setValue(RDM_INFRA).build();
226         List<LayerProtocolName> nodeLayerProtocols = Arrays.asList(LayerProtocolName.PHOTONICMEDIA);
227
228         List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> tapiPhotonicNodes
229             = pruneTapiPhotonicNodes();
230         Map<String, String> photonicNepUuisMap = convertListNodeWithListNepToMapForUuidAndName(tapiPhotonicNodes);
231         // nep creation for rdm infra abstraction node
232         Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = createNepForRdmNode(photonicNepUuisMap.size());
233         // node rule group creation
234         Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList
235             = createNodeRuleGroupForRdmNode(nodeUuid, onepMap.values());
236         // build RDM infra node abstraction
237         org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node rdmNode = new NodeBuilder()
238             .setUuid(nodeUuid)
239             .setName(Map.of(nodeName.key(), nodeName))
240             .setLayerProtocolName(nodeLayerProtocols)
241             .setAdministrativeState(AdministrativeState.UNLOCKED)
242             .setOperationalState(OperationalState.ENABLED)
243             .setLifecycleState(LifecycleState.INSTALLED)
244             .setOwnedNodeEdgePoint(onepMap)
245             .setNodeRuleGroup(nodeRuleGroupList)
246             .build();
247         tapiNodes.put(rdmNode.key(), rdmNode);
248
249         // OMS link creation between photonoci nodes and RDM infra abstraction node
250         Map<String, String> rdmInfraNepUuisMap = convertListNodeWithListNepToMapForUuidAndName(List.of(rdmNode));
251         if (photonicNepUuisMap.size() != rdmInfraNepUuisMap.size()) {
252             LOG.warn("Unable to build OMS links between photonics nodes and RDM infrasctructure abstraction");
253         } else {
254             createTapiOmsLinks(photonicNepUuisMap, rdmInfraNepUuisMap);
255         }
256     }
257
258     private OduSwitchingPools createOduSwitchingPoolForTp100G() {
259         Map<NonBlockingListKey, NonBlockingList> nblMap = new HashMap<>();
260         int count = 1;
261         for (TerminationPoint tp : this.oorNetworkPortList) {
262             TpId tpid1 = tp.getTpId();
263             TpId tpid2 = new TpId(tp.augmentation(
264                     org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1.class)
265                 .getAssociatedConnectionMapPort());
266             List<TpId> tpList = new ArrayList<>();
267             tpList.add(tpid1);
268             tpList.add(tpid2);
269             NonBlockingList nbl = new NonBlockingListBuilder()
270                 .setNblNumber(Uint16.valueOf(count))
271                 .setTpList(tpList)
272                 .build();
273             nblMap.put(nbl.key(), nbl);
274             count++;
275         }
276         return new OduSwitchingPoolsBuilder()
277             .setNonBlockingList(nblMap)
278             .setSwitchingPoolNumber(Uint16.valueOf(1))
279             .build();
280     }
281
282     private List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node>
283         pruneTapiPhotonicNodes() {
284         List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node>
285             prunedTapiPhotonicNodes = new ArrayList<>();
286         List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> tapiPhotonicNodes
287             = this.tapiNodes.values().stream()
288                 .filter(n -> LayerProtocolName.PHOTONICMEDIA.equals(n.getLayerProtocolName().get(0)))
289                 .collect(Collectors.toList());
290         for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node node
291             : tapiPhotonicNodes) {
292             Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepM = new HashMap<>();
293             for (Map.Entry<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> entry : node.getOwnedNodeEdgePoint().entrySet()) {
294                 if (entry.getValue().getName().values().stream()
295                     .filter(name -> name.getValueName().startsWith("eNodeEdgePoint"))
296                     .count() > 0) {
297                     onepM.put(entry.getKey(), entry.getValue());
298                 }
299             }
300             org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node prunedNode
301                 = new NodeBuilder(node).setOwnedNodeEdgePoint(onepM).build();
302             prunedTapiPhotonicNodes.add(prunedNode);
303         }
304         return prunedTapiPhotonicNodes;
305     }
306
307     private Map<String, String> convertListNodeWithListNepToMapForUuidAndName(
308         List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> nodes) {
309         Map<String, String> uuidNameMap = new HashMap<>();
310         for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node node : nodes) {
311             for (OwnedNodeEdgePoint nep : node.nonnullOwnedNodeEdgePoint().values()) {
312                 String nodeUuid = node.getUuid().getValue();
313                 String nepUuid = nep.getUuid().getValue();
314                 String nodeName = node.getName().get(new NameKey("otsi node name")).getValue();
315                 String nepName = nep.getName().get(new NameKey(nep.getName().keySet().stream().findFirst().get()))
316                     .getValue();
317                 uuidNameMap.put(String.join("--", nodeUuid, nepUuid), String.join("--", nodeName, nepName));
318             }
319         }
320         return uuidNameMap;
321     }
322
323     private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node
324         createTapiNode(Map<NameKey, Name> nodeNames, List<LayerProtocolName> layerProtocols) {
325         Uuid nodeUuid = null;
326         Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl = new HashMap<>();
327         Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList = new HashMap<>();
328         Map<RuleKey, Rule> ruleList = new HashMap<>();
329         Rule rule = new RuleBuilder()
330             .setLocalId("forward")
331             .setForwardingRule(ForwardingRule.MAYFORWARDACROSSGROUP)
332             .setRuleType(RuleType.FORWARDING)
333             .build();
334         ruleList.put(rule.key(), rule);
335         if (layerProtocols.contains(LayerProtocolName.DSR)) {
336             nodeUuid = getNodeUuid4Dsr(onepl, nodeRuleGroupList, ruleList);
337         } else if (layerProtocols.contains(LayerProtocolName.PHOTONICMEDIA)) {
338             nodeUuid = getNodeUuid4Photonic(onepl, nodeRuleGroupList, ruleList);
339         } else {
340             LOG.error("Undefined LayerProtocolName for {} node {}", nodeNames.get(nodeNames.keySet().iterator().next())
341                 .getValueName(), nodeNames.get(nodeNames.keySet().iterator().next()).getValue());
342         }
343         return new NodeBuilder()
344                 .setUuid(nodeUuid)
345                 .setName(nodeNames)
346                 .setLayerProtocolName(layerProtocols)
347                 .setAdministrativeState(setTapiAdminState(this.ietfNodeAdminState))
348                 .setOperationalState(setTapiOperationalState(this.ietfNodeOperState))
349                 .setLifecycleState(LifecycleState.INSTALLED)
350                 .setOwnedNodeEdgePoint(onepl)
351                 .setNodeRuleGroup(nodeRuleGroupList)
352                 .build();
353     }
354
355     private AdministrativeState setTapiAdminState(AdminStates adminState) {
356         if (adminState == null) {
357             return null;
358         }
359         return adminState.equals(AdminStates.InService)
360             ? AdministrativeState.UNLOCKED : AdministrativeState.LOCKED;
361     }
362
363     private AdministrativeState setTapiAdminState(AdminStates adminState1, AdminStates adminState2) {
364         if (adminState1 == null || adminState2 == null) {
365             return null;
366         }
367         if (AdminStates.InService.equals(adminState1) && AdminStates.InService.equals(adminState2)) {
368             return AdministrativeState.UNLOCKED;
369         } else {
370             return AdministrativeState.LOCKED;
371         }
372     }
373
374     private OperationalState setTapiOperationalState(State operState) {
375         if (operState == null) {
376             return null;
377         }
378         return operState.getName().equals("inService") ? OperationalState.ENABLED : OperationalState.DISABLED;
379     }
380
381     private OperationalState setTapiOperationalState(State operState1, State operState2) {
382         if (operState1 == null || operState2 == null) {
383             return null;
384         }
385         if (State.InService.equals(operState1) && State.InService.equals(operState2)) {
386             return OperationalState.ENABLED;
387         } else {
388             return OperationalState.DISABLED;
389         }
390     }
391
392     private Uuid getNodeUuid4Photonic(Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl,
393         Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList, Map<RuleKey, Rule> ruleList) {
394         Uuid nodeUuid;
395         nodeUuid = this.uuidMap.get(String.join("+", this.ietfNodeId, OTSI));
396         // iNep creation on otsi node
397         for (int i = 0; i < oorNetworkPortList.size(); i++) {
398             Uuid nepUuid1 = new Uuid(UUID.nameUUIDFromBytes(
399                     (String.join("+", this.ietfNodeId, I_OTSI, oorNetworkPortList.get(i).getTpId().getValue()))
400                     .getBytes(Charset.forName("UTF-8")))
401                 .toString());
402             this.uuidMap.put(String.join("+", this.ietfNodeId, I_OTSI, oorNetworkPortList.get(i).getTpId().getValue()),
403                 nepUuid1);
404             Name onedName = new NameBuilder()
405                 .setValueName("iNodeEdgePoint")
406                 .setValue(oorNetworkPortList.get(i).getTpId().getValue())
407                 .build();
408
409             OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), Map.of(onedName.key(), onedName),
410                 LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true,
411                 String.join("+", this.ietfNodeId, I_OTSI));
412             onepl.put(onep.key(), onep);
413         }
414         // eNep creation on otsi node
415         for (int i = 0; i < oorNetworkPortList.size(); i++) {
416             Uuid nepUuid2 = new Uuid(UUID.nameUUIDFromBytes(
417                     (String.join("+", this.ietfNodeId, E_OTSI, oorNetworkPortList.get(i).getTpId().getValue()))
418                     .getBytes(Charset.forName("UTF-8")))
419                 .toString());
420             this.uuidMap.put(String.join("+", this.ietfNodeId, E_OTSI, oorNetworkPortList.get(i).getTpId().getValue()),
421                 nepUuid2);
422             Name onedName = new NameBuilder()
423                 .setValueName("eNodeEdgePoint")
424                 .setValue(oorNetworkPortList.get(i).getTpId().getValue())
425                 .build();
426
427             OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), Map.of(onedName.key(), onedName),
428                 LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true,
429                 String.join("+", this.ietfNodeId, E_OTSI));
430             onepl.put(onep.key(), onep);
431         }
432         // create NodeRuleGroup
433         int count = 1;
434         for (TerminationPoint tp : this.oorNetworkPortList) {
435             Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePointKey,
436                 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint>
437                 nepList = new HashMap<>();
438             org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
439                 .NodeEdgePoint inep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
440                 .node.rule.group.NodeEdgePointBuilder()
441                 .setTopologyUuid(tapiTopoUuid)
442                 .setNodeUuid(this.uuidMap.get(String.join("+", this.ietfNodeId, OTSI)))
443                 .setNodeEdgePointUuid(
444                     this.uuidMap.get(String.join("+", this.ietfNodeId, I_OTSI, tp.getTpId().getValue())))
445                 .build();
446             org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
447                 .NodeEdgePoint enep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
448                 .node.rule.group.NodeEdgePointBuilder()
449                 .setTopologyUuid(tapiTopoUuid)
450                 .setNodeUuid(this.uuidMap.get(String.join("+", this.ietfNodeId, OTSI)))
451                 .setNodeEdgePointUuid(
452                     this.uuidMap.get(String.join("+", this.ietfNodeId, E_OTSI, tp.getTpId().getValue())))
453                 .build();
454             nepList.put(inep.key(), inep);
455             nepList.put(enep.key(), enep);
456             NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
457                 .setUuid(new Uuid(
458                         UUID.nameUUIDFromBytes(("otsi node rule group " + count).getBytes(Charset.forName("UTF-8")))
459                     .toString()))
460                 .setRule(ruleList)
461                 .setNodeEdgePoint(nepList)
462                 .build();
463             nodeRuleGroupList.put(nodeRuleGroup.key(), nodeRuleGroup);
464             count++;
465         }
466         return nodeUuid;
467     }
468
469     private Uuid getNodeUuid4Dsr(Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl,
470         Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList, Map<RuleKey, Rule> ruleList) {
471         Uuid nodeUuid;
472         nodeUuid = this.uuidMap.get(String.join("+", this.ietfNodeId, DSR));
473         // client nep creation on DSR/ODU node
474         for (int i = 0; i < oorClientPortList.size(); i++) {
475             Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
476                 (String.join("+", this.ietfNodeId, DSR, oorClientPortList.get(i).getTpId().getValue()))
477                 .getBytes(Charset.forName("UTF-8"))).toString());
478             this.uuidMap.put(String.join("+", this.ietfNodeId, DSR, oorClientPortList.get(i).getTpId().getValue()),
479                 nepUuid);
480             NameBuilder nameBldr = new NameBuilder().setValue(oorClientPortList.get(i).getTpId().getValue());
481             Name name;
482             if (OpenroadmNodeType.TPDR.equals(this.ietfNodeType)) {
483                 name = nameBldr.setValueName("100G-tpdr").build();
484             } else {
485                 name = nameBldr.setValueName("NodeEdgePoint_C").build();
486             }
487
488             OwnedNodeEdgePoint onep = createNep(oorClientPortList.get(i), Map.of(name.key(), name),
489                 LayerProtocolName.ETH, LayerProtocolName.DSR, true, String.join("+", this.ietfNodeId, DSR));
490             onepl.put(onep.key(), onep);
491         }
492         // network nep creation on DSR/ODU node
493         for (int i = 0; i < oorNetworkPortList.size(); i++) {
494             Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
495                 (String.join("+", this.ietfNodeId, DSR, oorNetworkPortList.get(i).getTpId().getValue()))
496                 .getBytes(Charset.forName("UTF-8"))).toString());
497             this.uuidMap.put(String.join("+", this.ietfNodeId, DSR, oorNetworkPortList.get(i).getTpId().getValue()),
498                 nepUuid);
499             Name onedName = new NameBuilder()
500                 .setValueName("NodeEdgePoint_N")
501                 .setValue(oorNetworkPortList.get(i).getTpId().getValue())
502                 .build();
503
504             OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), Map.of(onedName.key(), onedName),
505                 LayerProtocolName.ODU, LayerProtocolName.DSR, true, String.join("+", this.ietfNodeId, DSR));
506             onepl.put(onep.key(), onep);
507         }
508         // create NodeRuleGroup
509         int count = 1;
510         for (NonBlockingList nbl : this.oorOduSwitchingPool.nonnullNonBlockingList().values()) {
511             Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePointKey,
512                 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint>
513                 nepList = new HashMap<>();
514             for (TpId tp : nbl.getTpList()) {
515                 if (this.uuidMap.containsKey(String.join("+", this.ietfNodeId, DSR, tp.getValue()))) {
516                     org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint
517                         nep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
518                         .NodeEdgePointBuilder()
519                         .setTopologyUuid(tapiTopoUuid)
520                         .setNodeUuid(this.uuidMap.get(String.join("+", this.ietfNodeId, DSR)))
521                         .setNodeEdgePointUuid(this.uuidMap.get(String.join("+", this.ietfNodeId, DSR, tp.getValue())))
522                         .build();
523                     nepList.put(nep.key(), nep);
524                 }
525             }
526             NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
527                 .setUuid(new Uuid(
528                         UUID.nameUUIDFromBytes(("dsr node rule group " + count).getBytes(Charset.forName("UTF-8")))
529                     .toString()))
530                 .setRule(ruleList)
531                 .setNodeEdgePoint(nepList)
532                 .build();
533             nodeRuleGroupList.put(nodeRuleGroup.key(), nodeRuleGroup);
534             count++;
535         }
536         return nodeUuid;
537     }
538
539     private OwnedNodeEdgePoint createNep(TerminationPoint oorTp, Map<NameKey, Name> nepNames,
540         LayerProtocolName nepProtocol, LayerProtocolName nodeProtocol, boolean withSip, String keyword) {
541         String key = String.join("+", keyword, oorTp.getTpId().getValue());
542         OwnedNodeEdgePointBuilder onepBldr = new OwnedNodeEdgePointBuilder()
543             .setUuid(this.uuidMap.get(key))
544             .setLayerProtocolName(nepProtocol)
545             .setName(nepNames);
546         if (withSip) {
547             onepBldr.setMappedServiceInterfacePoint(createSIP(this.uuidMap.get(key), 1));
548         }
549         onepBldr.setSupportedCepLayerProtocolQualifier(createSupportedCepLayerProtocolQualifier(oorTp, nodeProtocol))
550             .setLinkPortDirection(PortDirection.BIDIRECTIONAL)
551             .setLinkPortRole(PortRole.SYMMETRIC)
552             .setAdministrativeState(setTapiAdminState(
553                     oorTp.augmentation(TerminationPoint1.class).getAdministrativeState()))
554             .setOperationalState(setTapiOperationalState(
555                     oorTp.augmentation(TerminationPoint1.class).getOperationalState()))
556             .setLifecycleState(LifecycleState.INSTALLED)
557             .setTerminationDirection(TerminationDirection.BIDIRECTIONAL)
558             .setTerminationState(TerminationState.TERMINATEDBIDIRECTIONAL);
559         return onepBldr.build();
560     }
561
562     private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> createNepForRdmNode(int nbNep) {
563         Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = new HashMap<>();
564         for (int i = 1; i <= nbNep; i++) {
565             Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "roadm node", "nep", String.valueOf(i)))
566                 .getBytes(Charset.forName("UTF-8"))).toString());
567             Name nepName = new NameBuilder()
568                 .setValueName("NodeEdgePoint name")
569                 .setValue(new StringBuilder("NodeEdgePoint_").append(i).toString())
570                 .build();
571             OwnedNodeEdgePoint onep = new OwnedNodeEdgePointBuilder()
572                 .setUuid(nepUuid)
573                 .setLayerProtocolName(LayerProtocolName.PHOTONICMEDIA)
574                 .setName(Map.of(nepName.key(), nepName))
575                 .setSupportedCepLayerProtocolQualifier(List.of(PHOTONICLAYERQUALIFIEROMS.class))
576                 .setLinkPortDirection(PortDirection.BIDIRECTIONAL).setLinkPortRole(PortRole.SYMMETRIC)
577                 .setAdministrativeState(AdministrativeState.UNLOCKED).setOperationalState(OperationalState.ENABLED)
578                 .setLifecycleState(LifecycleState.INSTALLED).setTerminationDirection(TerminationDirection.BIDIRECTIONAL)
579                 .setTerminationState(TerminationState.TERMINATEDBIDIRECTIONAL)
580                 .build();
581             onepMap.put(onep.key(), onep);
582         }
583         return onepMap;
584     }
585
586     private Map<NodeRuleGroupKey, NodeRuleGroup> createNodeRuleGroupForRdmNode(Uuid nodeUuid,
587         Collection<OwnedNodeEdgePoint> onepl) {
588         Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePointKey,
589             org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint>
590             nepMap = new HashMap<>();
591         for (OwnedNodeEdgePoint onep : onepl) {
592             org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint
593                 nep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
594                     .NodeEdgePointBuilder()
595                 .setTopologyUuid(tapiTopoUuid)
596                 .setNodeUuid(nodeUuid)
597                 .setNodeEdgePointUuid(onep.key().getUuid())
598                 .build();
599             nepMap.put(nep.key(), nep);
600         }
601         Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupMap = new HashMap<>();
602         Map<RuleKey, Rule> ruleList = new HashMap<>();
603         Rule rule = new RuleBuilder()
604             .setLocalId("forward")
605             .setForwardingRule(ForwardingRule.MAYFORWARDACROSSGROUP)
606             .setRuleType(RuleType.FORWARDING)
607             .build();
608         ruleList.put(rule.key(), rule);
609         NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
610             .setUuid(new Uuid(UUID.nameUUIDFromBytes(("rdm infra node rule group").getBytes(Charset.forName("UTF-8")))
611                 .toString()))
612             .setRule(ruleList)
613             .setNodeEdgePoint(nepMap)
614             .build();
615         nodeRuleGroupMap.put(nodeRuleGroup.key(), nodeRuleGroup);
616         return nodeRuleGroupMap;
617     }
618
619     private Map<MappedServiceInterfacePointKey, MappedServiceInterfacePoint> createSIP(Uuid nepUuid, int nb) {
620         Map<MappedServiceInterfacePointKey, MappedServiceInterfacePoint> msipl = new HashMap<>();
621         for (int i = 0; i < nb; i++) {
622             MappedServiceInterfacePoint msip = new MappedServiceInterfacePointBuilder()
623                 .setServiceInterfacePointUuid(new Uuid(UUID.nameUUIDFromBytes(nepUuid.getValue()
624                     .getBytes(Charset.forName("UTF-8"))).toString()))
625                 .build();
626             msipl.put(msip.key(), msip);
627         }
628         return msipl;
629     }
630
631     private List<Class<? extends LAYERPROTOCOLQUALIFIER>> createSupportedCepLayerProtocolQualifier(TerminationPoint tp,
632         LayerProtocolName lpn) {
633         Set<Class<? extends LAYERPROTOCOLQUALIFIER>> sclpqSet = new HashSet<>();
634         List<SupportedInterfaceCapability> sicList = new ArrayList<>(
635             tp.augmentation(org.opendaylight.yang.gen.v1.http
636                     .org.openroadm.otn.network.topology.rev200529.TerminationPoint1.class).getTpSupportedInterfaces()
637             .getSupportedInterfaceCapability().values());
638         for (SupportedInterfaceCapability sic : sicList) {
639             switch (lpn.getName()) {
640                 case "DSR":
641                     switch (sic.getIfCapType().getSimpleName()) {
642                         case "If10GEODU2e":
643                             sclpqSet.add(ODUTYPEODU2E.class);
644                             sclpqSet.add(DIGITALSIGNALTYPE10GigELAN.class);
645                             break;
646                         case "If10GEODU2":
647                             sclpqSet.add(ODUTYPEODU2.class);
648                             sclpqSet.add(DIGITALSIGNALTYPE10GigELAN.class);
649                             break;
650                         case "If10GE":
651                             sclpqSet.add(DIGITALSIGNALTYPE10GigELAN.class);
652                             break;
653                         case "If100GEODU4":
654                             sclpqSet.add(DIGITALSIGNALTYPE100GigE.class);
655                             sclpqSet.add(ODUTYPEODU4.class);
656                             break;
657                         case "If100GE":
658                             sclpqSet.add(DIGITALSIGNALTYPE100GigE.class);
659                             break;
660                         case "IfOCHOTU4ODU4":
661                         case "IfOCH":
662                             sclpqSet.add(ODUTYPEODU4.class);
663                             break;
664                         default:
665                             LOG.error("IfCapability type not managed");
666                             break;
667                     }
668                     break;
669                 case "PHOTONIC_MEDIA":
670                     if (sic.getIfCapType().getSimpleName().equals("IfOCHOTU4ODU4")
671                         || sic.getIfCapType().getSimpleName().equals("IfOCH")) {
672                         sclpqSet.add(PHOTONICLAYERQUALIFIEROTSi.class);
673                         sclpqSet.add(PHOTONICLAYERQUALIFIEROMS.class);
674                     }
675                     break;
676                 default:
677                     LOG.error("Layer Protocol Name is unknown");
678                     break;
679             }
680         }
681         return new ArrayList<>(sclpqSet);
682     }
683
684     private void createTapiTransitionalLinks() {
685         for (TerminationPoint tp : this.oorNetworkPortList) {
686             Map<NodeEdgePointKey, NodeEdgePoint> nepList = new HashMap<>();
687             String sourceKey = String.join("+", this.ietfNodeId, DSR, tp.getTpId().getValue());
688             Uuid sourceUuidTp = this.uuidMap.get(sourceKey);
689             String destKey = String.join("+", this.ietfNodeId, I_OTSI, tp.getTpId().getValue());
690             Uuid destUuidTp = this.uuidMap.get(destKey);
691             NodeEdgePoint sourceNep = new NodeEdgePointBuilder()
692                 .setTopologyUuid(this.tapiTopoUuid)
693                 .setNodeUuid(this.uuidMap.get(String.join("+", this.ietfNodeId, DSR)))
694                 .setNodeEdgePointUuid(sourceUuidTp)
695                 .build();
696             nepList.put(sourceNep.key(), sourceNep);
697             NodeEdgePoint destNep = new NodeEdgePointBuilder()
698                 .setTopologyUuid(this.tapiTopoUuid)
699                 .setNodeUuid(this.uuidMap.get(String.join("+", this.ietfNodeId, OTSI)))
700                 .setNodeEdgePointUuid(destUuidTp)
701                 .build();
702             nepList.put(destNep.key(), destNep);
703             Name linkName = new NameBuilder().setValueName("transitional link name")
704                 .setValue(String.join("--", this.ietfNodeId, sourceKey, destKey))
705                 .build();
706             Link transiLink = new LinkBuilder()
707                 .setUuid(new Uuid(
708                         UUID.nameUUIDFromBytes((String.join("--", this.ietfNodeId, sourceKey, destKey))
709                             .getBytes(Charset.forName("UTF-8")))
710                     .toString()))
711                 .setName(Map.of(linkName.key(), linkName))
712                 .setTransitionedLayerProtocolName(Arrays.asList(LayerProtocolName.ODU.getName(),
713                     LayerProtocolName.PHOTONICMEDIA.getName()))
714                 .setNodeEdgePoint(nepList)
715                 .setDirection(ForwardingDirection.BIDIRECTIONAL)
716                 .setAvailableCapacity(new AvailableCapacityBuilder().setTotalSize(
717                     new TotalSizeBuilder().setUnit(CapacityUnit.GBPS).setValue(Uint64.valueOf(100)).build()).build())
718                 .build();
719             this.tapiLinks.put(transiLink.key(), transiLink);
720         }
721     }
722
723     private Link createTapiLink(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
724             .networks.network.Link link,
725         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link
726             oppositeLink) {
727         String prefix = link.getLinkId().getValue().split("-")[0];
728         String sourceNode = link.getSource().getSourceNode().getValue();
729         String sourceTp = link.getSource().getSourceTp().toString();
730         String destNode = link.getDestination().getDestNode().getValue();
731         String destTp = link.getDestination().getDestTp().toString();
732         Map<NodeEdgePointKey, NodeEdgePoint> nepList = new HashMap<>();
733         Uuid sourceUuidTp;
734         Uuid sourceUuidNode;
735         Uuid destUuidTp;
736         Uuid destUuidNode;
737         Name linkName;
738         AdminStates oppositeLinkAdminState = null;
739         State oppositeLinkOperState = null;
740         if (oppositeLink != null) {
741             oppositeLinkAdminState = oppositeLink.augmentation(
742                 org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1.class)
743                 .getAdministrativeState();
744             oppositeLinkOperState = oppositeLink.augmentation(
745                 org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1.class)
746                 .getOperationalState();
747         }
748         switch (prefix) {
749             case "OTU4":
750                 sourceUuidTp = this.uuidMap.get(String.join("+", sourceNode, I_OTSI, sourceTp));
751                 sourceUuidNode = this.uuidMap.get(String.join("+", sourceNode, OTSI));
752                 NodeEdgePoint sourceNep = new NodeEdgePointBuilder()
753                     .setTopologyUuid(this.tapiTopoUuid)
754                     .setNodeUuid(sourceUuidNode)
755                     .setNodeEdgePointUuid(sourceUuidTp)
756                     .build();
757                 nepList.put(sourceNep.key(), sourceNep);
758                 destUuidTp = this.uuidMap.get(String.join("+", destNode, I_OTSI, destTp));
759                 destUuidNode = this.uuidMap.get(String.join("+", destNode, OTSI));
760                 NodeEdgePoint destNep = new NodeEdgePointBuilder()
761                     .setTopologyUuid(this.tapiTopoUuid)
762                     .setNodeUuid(destUuidNode)
763                     .setNodeEdgePointUuid(destUuidTp)
764                     .build();
765                 nepList.put(destNep.key(), destNep);
766                 linkName = new NameBuilder().setValueName("otn link name")
767                     .setValue(link.getLinkId().getValue())
768                     .build();
769                 return new LinkBuilder()
770                     .setUuid(new Uuid(
771                         UUID.nameUUIDFromBytes((link.getLinkId().getValue())
772                             .getBytes(Charset.forName("UTF-8")))
773                     .toString()))
774                 .setName(Map.of(linkName.key(), linkName))
775                 .setLayerProtocolName(Arrays.asList(LayerProtocolName.PHOTONICMEDIA))
776                 .setAdministrativeState(setTapiAdminState(link
777                     .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1.class)
778                     .getAdministrativeState(), oppositeLinkAdminState))
779                 .setOperationalState(setTapiOperationalState(link
780                     .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1.class)
781                     .getOperationalState(), oppositeLinkOperState))
782                 .setDirection(ForwardingDirection.BIDIRECTIONAL)
783                 .setNodeEdgePoint(nepList)
784                 .setTotalPotentialCapacity(new TotalPotentialCapacityBuilder().setTotalSize(
785                     new TotalSizeBuilder().setUnit(CapacityUnit.GBPS)
786                         .setValue(Uint64.valueOf(100)).build()).build())
787                 .setAvailableCapacity(new AvailableCapacityBuilder().setTotalSize(
788                     new TotalSizeBuilder().setUnit(CapacityUnit.MBPS)
789                         .setValue(Uint64.valueOf(link.augmentation(Link1.class).getAvailableBandwidth())).build())
790                     .build())
791                 .build();
792             case "ODU4":
793                 sourceUuidTp = this.uuidMap.get(String.join("+", sourceNode, DSR, sourceTp));
794                 sourceUuidNode = this.uuidMap.get(String.join("+", sourceNode, DSR));
795                 NodeEdgePoint sourceNep2 = new NodeEdgePointBuilder()
796                     .setTopologyUuid(this.tapiTopoUuid)
797                     .setNodeUuid(sourceUuidNode)
798                     .setNodeEdgePointUuid(sourceUuidTp)
799                     .build();
800                 nepList.put(sourceNep2.key(), sourceNep2);
801                 destUuidTp = this.uuidMap.get(String.join("+", destNode, DSR, destTp));
802                 destUuidNode = this.uuidMap.get(String.join("+", destNode, DSR));
803                 NodeEdgePoint destNep2 = new NodeEdgePointBuilder()
804                     .setTopologyUuid(this.tapiTopoUuid)
805                     .setNodeUuid(destUuidNode)
806                     .setNodeEdgePointUuid(destUuidTp)
807                     .build();
808                 nepList.put(destNep2.key(), destNep2);
809                 linkName = new NameBuilder().setValueName("otn link name")
810                     .setValue(link.getLinkId().getValue())
811                     .build();
812                 return new LinkBuilder()
813                     .setUuid(new Uuid(
814                         UUID.nameUUIDFromBytes((link.getLinkId().getValue())
815                             .getBytes(Charset.forName("UTF-8")))
816                     .toString()))
817                 .setName(Map.of(linkName.key(), linkName))
818                 .setLayerProtocolName(Arrays.asList(LayerProtocolName.ODU))
819                 .setAdministrativeState(setTapiAdminState(link
820                     .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1.class)
821                     .getAdministrativeState(), oppositeLinkAdminState))
822                 .setOperationalState(setTapiOperationalState(link
823                     .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1.class)
824                     .getOperationalState(), oppositeLinkOperState))
825                 .setDirection(ForwardingDirection.BIDIRECTIONAL)
826                 .setNodeEdgePoint(nepList)
827                 .setTotalPotentialCapacity(new TotalPotentialCapacityBuilder().setTotalSize(
828                     new TotalSizeBuilder().setUnit(CapacityUnit.GBPS)
829                         .setValue(Uint64.valueOf(100)).build()).build())
830                 .setAvailableCapacity(new AvailableCapacityBuilder().setTotalSize(
831                     new TotalSizeBuilder().setUnit(CapacityUnit.MBPS)
832                         .setValue(Uint64.valueOf(link.augmentation(Link1.class).getAvailableBandwidth())).build())
833                     .build())
834                 .build();
835             default:
836                 LOG.error("OTN link of type {} not managed yet", prefix);
837                 return null;
838         }
839     }
840
841     private void createTapiOmsLinks(Map<String, String> photonicNepUuisMap, Map<String, String> rdmInfraNepUuisMap) {
842         Iterator<Entry<String, String>> it1 = photonicNepUuisMap.entrySet().iterator();
843         Iterator<Entry<String, String>> it2 = rdmInfraNepUuisMap.entrySet().iterator();
844         while (it1.hasNext()) {
845             Map<NodeEdgePointKey, NodeEdgePoint> nepMap = new HashMap<>();
846             Map.Entry<String, String> photonicEntry = it1.next();
847             Map.Entry<String, String> rdmEntry = it2.next();
848             Uuid sourceUuidTp = new Uuid(photonicEntry.getKey().split("--")[1]);
849             Uuid sourceUuidNode = new Uuid(photonicEntry.getKey().split("--")[0]);
850             Uuid destUuidTp = new Uuid(rdmEntry.getKey().split("--")[1]);
851             Uuid destUuidNode = new Uuid(rdmEntry.getKey().split("--")[0]);
852             NodeEdgePoint sourceNep = new NodeEdgePointBuilder()
853                 .setTopologyUuid(this.tapiTopoUuid)
854                 .setNodeUuid(sourceUuidNode)
855                 .setNodeEdgePointUuid(sourceUuidTp)
856                 .build();
857             nepMap.put(sourceNep.key(), sourceNep);
858             NodeEdgePoint destNep = new NodeEdgePointBuilder()
859                 .setTopologyUuid(this.tapiTopoUuid)
860                 .setNodeUuid(destUuidNode)
861                 .setNodeEdgePointUuid(destUuidTp)
862                 .build();
863             nepMap.put(destNep.key(), destNep);
864             Name linkName = new NameBuilder().setValueName("OMS link name")
865                 .setValue(String.join(" and ", photonicEntry.getValue(), rdmEntry.getValue()))
866                 .build();
867             Link omsLink = new LinkBuilder()
868                 .setUuid(new Uuid(
869                       UUID.nameUUIDFromBytes((String.join(" and ", photonicEntry.getValue(), rdmEntry.getValue()))
870                           .getBytes(Charset.forName("UTF-8")))
871                   .toString()))
872                 .setName(Map.of(linkName.key(), linkName))
873                 .setLayerProtocolName(List.of(LayerProtocolName.PHOTONICMEDIA))
874                 .setNodeEdgePoint(nepMap)
875                 .setDirection(ForwardingDirection.BIDIRECTIONAL)
876                 .build();
877             this.tapiLinks.put(omsLink.key(), omsLink);
878         }
879     }
880
881     public Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node>
882         getTapiNodes() {
883         return tapiNodes;
884     }
885
886     public Map<LinkKey, Link> getTapiLinks() {
887         return tapiLinks;
888     }
889 }