2 * Copyright © 2021 Nokia. All rights reserved.
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
8 package org.opendaylight.transportpce.tapi.topology;
10 import java.nio.charset.Charset;
11 import java.util.ArrayList;
12 import java.util.HashMap;
13 import java.util.List;
16 import java.util.UUID;
17 import java.util.stream.Collectors;
18 import org.opendaylight.transportpce.common.fixedflex.GridConstant;
19 import org.opendaylight.transportpce.tapi.TapiStringConstants;
20 import org.opendaylight.transportpce.tapi.utils.TapiLink;
21 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1;
22 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1;
23 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
24 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
25 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
26 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmTpType;
27 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.Node1;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
31 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.AdministrativeState;
32 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Direction;
33 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
34 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LifecycleState;
35 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState;
36 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.PortRole;
37 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
38 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name;
39 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameBuilder;
40 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameKey;
41 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePoint;
42 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointKey;
43 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIERMC;
44 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROMS;
45 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTS;
46 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTSiMC;
47 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.InterRuleGroup;
48 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.InterRuleGroupKey;
49 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroup;
50 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroupKey;
51 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePoint;
52 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointBuilder;
53 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointKey;
54 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.RiskParameterPacBuilder;
55 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedCepLayerProtocolQualifierInstancesBuilder;
56 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristic;
57 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristicBuilder;
58 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link;
59 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkKey;
60 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeBuilder;
61 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey;
62 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristic;
63 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristicBuilder;
64 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristic;
65 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristicBuilder;
66 import org.opendaylight.yangtools.yang.common.Uint64;
67 import org.slf4j.Logger;
68 import org.slf4j.LoggerFactory;
71 public class ConvertORTopoToTapiFullTopo {
73 private static final Logger LOG = LoggerFactory.getLogger(ConvertORTopoToTapiFullTopo.class);
74 private String ietfNodeId;
75 private OpenroadmNodeType ietfNodeType;
76 private Uuid tapiTopoUuid;
77 private Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
79 private Map<LinkKey, Link> tapiLinks;
80 private Map<ServiceInterfacePointKey, ServiceInterfacePoint> tapiSips;
81 private final TapiLink tapiLink;
82 private static String topologicalMode;
85 public ConvertORTopoToTapiFullTopo(Uuid tapiTopoUuid, TapiLink tapiLink) {
86 this.tapiTopoUuid = tapiTopoUuid;
87 this.tapiNodes = new HashMap<>();
88 this.tapiLinks = new HashMap<>();
89 this.tapiSips = new HashMap<>();
90 this.tapiLink = tapiLink;
91 if (topologicalMode == null) {
92 ConvertORTopoToTapiFullTopo.topologicalMode = "Full";
96 public void convertRdmToRdmLinks(
97 List<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
98 .networks.network.Link> rdmTordmLinkList) {
99 List<String> linksToNotConvert = new ArrayList<>();
100 LOG.info("creation of {} roadm to roadm links", rdmTordmLinkList.size() / 2);
101 for (var link : rdmTordmLinkList) {
102 if (!linksToNotConvert.contains(link.getLinkId().getValue())) {
103 var oppositeLink = rdmTordmLinkList.stream()
104 .filter(l -> l.getLinkId().equals(link.augmentation(Link1.class).getOppositeLink()))
105 .findAny().orElse(null);
106 AdminStates oppLnkAdmState = null;
107 State oppLnkOpState = null;
108 if (oppositeLink != null) {
109 oppLnkAdmState = oppositeLink.augmentation(Link1.class).getAdministrativeState();
110 oppLnkOpState = oppositeLink.augmentation(Link1.class).getOperationalState();
113 Link tapLink = this.tapiLink.createTapiLink(
115 link.getSource().getSourceNode().getValue().split("-")[0],
116 link.getSource().getSourceNode().getValue().split("-")[1]),
117 link.getSource().getSourceTp().getValue(),
119 link.getDestination().getDestNode().getValue().split("-")[0],
120 link.getDestination().getDestNode().getValue().split("-")[1]),
121 link.getDestination().getDestTp().getValue(), TapiStringConstants.OMS_RDM_RDM_LINK,
122 TapiStringConstants.PHTNC_MEDIA, TapiStringConstants.PHTNC_MEDIA,
123 TapiStringConstants.PHTNC_MEDIA_OTS, TapiStringConstants.PHTNC_MEDIA_OTS,
125 link.augmentation(Link1.class).getAdministrativeState() == null || oppLnkAdmState == null
127 : this.tapiLink.setTapiAdminState(
128 link.augmentation(Link1.class).getAdministrativeState(), oppLnkAdmState).getName(),
130 link.augmentation(Link1.class).getOperationalState() == null || oppLnkOpState == null
132 : this.tapiLink.setTapiOperationalState(
133 link.augmentation(Link1.class).getOperationalState(), oppLnkOpState).getName(),
134 Set.of(LayerProtocolName.PHOTONICMEDIA), Set.of(LayerProtocolName.PHOTONICMEDIA.getName()),
136 linksToNotConvert.add(link.augmentation(Link1.class).getOppositeLink().getValue());
137 tapiLinks.put(tapLink.key(), tapLink);
142 public void convertRoadmNode(Node roadm, Network openroadmTopo, String topoMode) {
143 setTopologicalMode(topoMode);
144 if (topoMode.equals("Full")) {
145 convertRoadmNodeFull(roadm, openroadmTopo);
147 convertRoadmNodeAbstracted(openroadmTopo);
151 private void convertRoadmNodeFull(Node roadm, Network openroadmTopo) {
152 this.ietfNodeId = roadm.getNodeId().getValue();
153 this.ietfNodeType = roadm.augmentation(
154 org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1.class)
156 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> oneplist = new HashMap<>();
157 // 1. Get degree and srg nodes to map TPs into NEPs
158 if (openroadmTopo.getNode() == null) {
159 LOG.warn("Openroadm-topology is null.");
164 List<Node> nodeList = new ArrayList<Node>(openroadmTopo.getNode().values());
165 for (Node node:nodeList) {
166 if (node.getSupportingNode().values().stream()
167 .noneMatch(sp -> sp.getNodeRef().getValue().equals(this.ietfNodeId))) {
168 LOG.debug("Abstracted node {} is not part of {}", node.getNodeId().getValue(), this.ietfNodeId);
171 if (node.augmentation(Node1.class) == null
172 && node.augmentation(
173 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
174 .Node1.class) == null) {
175 LOG.warn("Abstracted node {} doesnt have type of node or is not disaggregated",
176 node.getNodeId().getValue());
179 OpenroadmNodeType nodeType = node.augmentation(
180 org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1.class)
182 var node1 = node.augmentation(
183 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class);
184 LOG.info("TPs of node: {}", node1.getTerminationPoint().values());
185 switch (nodeType.getIntValue()) {
187 LOG.info("Degree node");
188 // Get only external TPs of the degree
189 List<TerminationPoint> degPortList = node1.getTerminationPoint().values().stream()
190 .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
191 == OpenroadmTpType.DEGREETXRXTTP.getIntValue()
192 || tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
193 == OpenroadmTpType.DEGREERXTTP.getIntValue()
194 || tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
195 == OpenroadmTpType.DEGREETXTTP.getIntValue())
196 .collect(Collectors.toList());
197 // Convert TP List in NEPs and put it in onepl
198 LOG.info("Degree port List: {}", degPortList.toString());
199 // TODO: deg port could be sip. e.g. MDONS
200 oneplist.putAll(populateNepsForRdmNode(node.getNodeId().getValue(), degPortList, false,
201 TapiStringConstants.PHTNC_MEDIA_OTS));
202 oneplist.putAll(populateNepsForRdmNode(node.getNodeId().getValue(), degPortList, false,
203 TapiStringConstants.PHTNC_MEDIA_OMS));
204 numNeps += degPortList.size() * 2;
207 LOG.info("SRG node");
208 // Get only external TPs of the srg
209 List<TerminationPoint> srgPortList = node1.getTerminationPoint().values().stream()
210 .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
211 == OpenroadmTpType.SRGTXRXPP.getIntValue()
212 || tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
213 == OpenroadmTpType.SRGRXPP.getIntValue()
214 || tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
215 == OpenroadmTpType.SRGTXPP.getIntValue())
216 .collect(Collectors.toList());
217 // Convert TP List in NEPs and put it in onepl
218 LOG.info("Srg port List: {}", srgPortList);
219 oneplist.putAll(populateNepsForRdmNode(node.getNodeId().getValue(), srgPortList, true,
220 TapiStringConstants.PHTNC_MEDIA_OTS));
221 numNeps += srgPortList.size();
222 numSips += srgPortList.size();
225 LOG.error("Node {} type not supported", nodeType.getName());
230 String nodeIdPhMed = String.join("+", roadm.getNodeId().getValue(), TapiStringConstants.PHTNC_MEDIA);
231 Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(nodeIdPhMed.getBytes(Charset.forName("UTF-8"))).toString());
232 LOG.info("Creation of PHOTONIC node for {}, of Uuid {}", roadm.getNodeId().getValue(), nodeUuid);
234 Name nodeNames = new NameBuilder().setValueName("roadm node name").setValue(nodeIdPhMed).build();
235 Name nameNodeType = new NameBuilder().setValueName("Node Type").setValue(this.ietfNodeType.getName()).build();
237 Set<LayerProtocolName> layerProtocols = Set.of(LayerProtocolName.PHOTONICMEDIA);
239 LOG.debug("CONVERTTOFULL SRG OTSNode of retrieved OnepMap {} ",
240 oneplist.entrySet().stream().filter(e -> e.getValue()
241 .getSupportedCepLayerProtocolQualifierInstances()
242 .contains(new SupportedCepLayerProtocolQualifierInstancesBuilder()
243 .setNumberOfCepInstances(Uint64.valueOf(1))
244 .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE)
246 .collect(Collectors.toList()).toString());
247 //org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node
248 var roadmNode = createRoadmTapiNode(nodeUuid,
249 Map.of(nodeNames.key(), nodeNames, nameNodeType.key(), nameNodeType), layerProtocols, oneplist, "Full");
250 // TODO add states corresponding to device config
251 LOG.info("ROADM node {} should have {} NEPs and {} SIPs", roadm.getNodeId().getValue(), numNeps, numSips);
252 LOG.info("ROADM node {} has {} NEPs and {} SIPs",
253 roadm.getNodeId().getValue(),
254 roadmNode.nonnullOwnedNodeEdgePoint().values().size(),
255 roadmNode.nonnullOwnedNodeEdgePoint().values().stream()
256 .filter(nep -> nep.getMappedServiceInterfacePoint() != null).count());
257 tapiNodes.put(roadmNode.key(), roadmNode);
260 private void convertRoadmNodeAbstracted(Network openroadmTopo) {
261 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> oneMap = new HashMap<>();
262 // 1. Get degree and srg nodes to map TPs into NEPs
263 if (openroadmTopo.getNode() == null) {
264 LOG.warn("Openroadm-topology is null.");
269 List<Node> nodeList = new ArrayList<Node>(openroadmTopo.getNode().values());
270 for (Node node:nodeList) {
271 var node1 = node.augmentation(
272 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class);
273 if (node.augmentation(Node1.class) == null && node1 == null) {
274 LOG.warn("Abstracted node {} doesnt have type of node or is not disaggregated",
275 node.getNodeId().getValue());
278 OpenroadmNodeType nodeType = node.augmentation(
279 org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1.class)
281 if (nodeType.getIntValue() != 11) {
282 // Only consider ROADMS SRG Nodes
285 LOG.debug("Handling SRG node in Topology abstraction {}", node.getNodeId().toString());
286 // Get only external TPs of the srg
287 List<TerminationPoint> srgPortList = node1.getTerminationPoint().values().stream()
288 .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
289 == OpenroadmTpType.SRGTXRXPP.getIntValue()
290 || tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
291 == OpenroadmTpType.SRGRXPP.getIntValue()
292 || tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
293 == OpenroadmTpType.SRGTXPP.getIntValue())
294 .collect(Collectors.toList());
295 // Convert TP List in NEPs and put it in onepl
296 LOG.debug("Srg port List: {}", srgPortList);
297 oneMap.putAll(populateNepsForRdmNode(node.getNodeId().getValue(), srgPortList, true,
298 TapiStringConstants.PHTNC_MEDIA_OTS));
299 numNeps += srgPortList.size();
300 numSips += srgPortList.size();
302 // create a unique ROADM tapi Node
303 LOG.info("abstraction of the ROADM infrastructure towards a photonic node");
304 Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(
305 TapiStringConstants.RDM_INFRA.getBytes(Charset.forName("UTF-8"))).toString());
307 new NameBuilder().setValueName("roadm node name").setValue(TapiStringConstants.RDM_INFRA).build();
309 new NameBuilder().setValueName("Node Type").setValue(OpenroadmNodeType.ROADM.getName()).build();
312 Set<LayerProtocolName> layerProtocols = Set.of(LayerProtocolName.PHOTONICMEDIA);
314 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node roadmNode =
315 createRoadmTapiNode(nodeUuid, Map.of(nodeName.key(), nodeName, nameNodeType.key(), nameNodeType),
316 layerProtocols, oneMap, "Abstracted");
317 // TODO add states corresponding to device config
318 LOG.info("ROADM node {} should have {} NEPs and {} SIPs", TapiStringConstants.RDM_INFRA, numNeps, numSips);
319 LOG.info("ROADM node {} has {} NEPs and {} SIPs", TapiStringConstants.RDM_INFRA,
320 roadmNode.nonnullOwnedNodeEdgePoint().values().size(),
321 roadmNode.nonnullOwnedNodeEdgePoint().values().stream()
322 .filter(nep -> nep.getMappedServiceInterfacePoint() != null).count());
324 tapiNodes.put(roadmNode.key(), roadmNode);
327 private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node
328 createRoadmTapiNode(Uuid nodeUuid, Map<NameKey, Name> nameMap, Set<LayerProtocolName> layerProtocols,
329 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap, String topoMode) {
330 // Empty random creation of mandatory fields for avoiding errors....
331 CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
332 .setCostAlgorithm("Restricted Shortest Path - RSP")
333 .setCostName("HOP_COUNT")
334 .setCostValue(TapiStringConstants.COST_HOP_VALUE)
336 LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
337 .setFixedLatencyCharacteristic(TapiStringConstants.FIXED_LATENCY_VALUE)
338 .setQueuingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
339 .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
340 .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
341 .setTrafficPropertyName("FIXED_LATENCY")
343 RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
344 .setRiskCharacteristicName("risk characteristic")
345 .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
348 var tapiFactory = new ConvertORToTapiTopology(this.tapiTopoUuid);
349 String choosenMode = topoMode.equals("Full") ? "Full" : "Abstracted";
350 Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupMap =
351 tapiFactory.createAllNodeRuleGroupForRdmNode(choosenMode, nodeUuid, this.ietfNodeId, onepMap.values());
352 Map<InterRuleGroupKey, InterRuleGroup> interRuleGroupMap =
353 tapiFactory.createInterRuleGroupForRdmNode(choosenMode, nodeUuid, this.ietfNodeId,
354 nodeRuleGroupMap.entrySet().stream().map(e -> e.getKey()).collect(Collectors.toList()));
355 return new NodeBuilder()
358 .setLayerProtocolName(layerProtocols)
359 .setAdministrativeState(AdministrativeState.UNLOCKED)
360 .setOperationalState(OperationalState.ENABLED)
361 .setLifecycleState(LifecycleState.INSTALLED)
362 .setOwnedNodeEdgePoint(onepMap)
363 .setNodeRuleGroup(nodeRuleGroupMap)
364 .setInterRuleGroup(interRuleGroupMap)
365 .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
366 .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
367 .setRiskParameterPac(
368 new RiskParameterPacBuilder()
369 .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
371 .setErrorCharacteristic("error")
372 .setLossCharacteristic("loss")
373 .setRepeatDeliveryCharacteristic("repeat delivery")
374 .setDeliveryOrderCharacteristic("delivery order")
375 .setUnavailableTimeCharacteristic("unavailable time")
376 .setServerIntegrityProcessCharacteristic("server integrity process")
380 public Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> populateNepsForRdmNode(String nodeId,
381 List<TerminationPoint> tpList, boolean withSip, String nepPhotonicSublayer) {
382 // create neps for MC and and Photonic Media OTS/OMS
383 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = new HashMap<>();
384 for (TerminationPoint tp:tpList) {
385 // Admin and oper state common for all tps
386 OpenroadmTpType tpType = tp.augmentation(TerminationPoint1.class).getTpType();
387 // PHOTONIC MEDIA nep
388 LOG.debug("PHOTO NEP = {}", String.join("+", this.ietfNodeId, nepPhotonicSublayer,
389 tp.getTpId().getValue()));
390 SupportedCepLayerProtocolQualifierInstancesBuilder sclpqiBd =
391 new SupportedCepLayerProtocolQualifierInstancesBuilder()
392 .setNumberOfCepInstances(Uint64.valueOf(1));
393 switch (nepPhotonicSublayer) {
394 case TapiStringConstants.PHTNC_MEDIA_OMS:
395 sclpqiBd.setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROMS.VALUE);
397 case TapiStringConstants.PHTNC_MEDIA_OTS:
398 sclpqiBd.setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE);
400 case TapiStringConstants.MC:
401 sclpqiBd.setLayerProtocolQualifier(PHOTONICLAYERQUALIFIERMC.VALUE);
403 case TapiStringConstants.OTSI_MC:
404 sclpqiBd.setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTSiMC.VALUE);
409 //List<SupportedCepLayerProtocolQualifierInstances> sclpqiList = new ArrayList<>(List.of(sclpqiBd.build()));
410 OwnedNodeEdgePointBuilder onepBd = new OwnedNodeEdgePointBuilder();
411 if (!nepPhotonicSublayer.equals(TapiStringConstants.MC)
412 && !nepPhotonicSublayer.equals(TapiStringConstants.OTSI_MC)) {
413 ConvertORToTapiTopology tapiFactory = new ConvertORToTapiTopology(this.tapiTopoUuid);
414 Map<Double,Double> usedFreqMap = new HashMap<>();
415 Map<Double,Double> availableFreqMap = new HashMap<>();
417 // Whatever is the TP and its type we consider that it is handled in a bidirectional way :
418 // same wavelength(s) used in both direction.
422 usedFreqMap = tapiFactory.getPPUsedWavelength(tp);
423 if (usedFreqMap == null || usedFreqMap.isEmpty()) {
424 availableFreqMap.put(GridConstant.START_EDGE_FREQUENCY * 1E09,
425 GridConstant.START_EDGE_FREQUENCY * 1E09
426 + GridConstant.GRANULARITY * GridConstant.EFFECTIVE_BITS * 1E06);
428 LOG.debug("EnteringLOOPcreateOTSiMC & MC with usedFreqMap non empty {} NEP {} for Node {}",
429 usedFreqMap.toString(), String.join("+", this.ietfNodeId, nepPhotonicSublayer,
430 tp.getTpId().getValue()), nodeId);
431 onepMap.putAll(populateNepsForRdmNode(nodeId, new ArrayList<>(List.of(tp)),
432 true, TapiStringConstants.MC));
433 onepMap.putAll(populateNepsForRdmNode(nodeId, new ArrayList<>(List.of(tp)),
434 true, TapiStringConstants.OTSI_MC));
440 usedFreqMap = tapiFactory.getTTPUsedFreqMap(tp);
441 availableFreqMap = tapiFactory.getTTPAvailableFreqMap(tp);
446 LOG.debug("calling add Photonic NEP spec for Roadm");
447 onepBd = tapiFactory.addPhotSpecToRoadmOnep(nodeId, usedFreqMap, availableFreqMap, onepBd,
448 nepPhotonicSublayer);
450 AdminStates admin = tp.augmentation(TerminationPoint1.class).getAdministrativeState();
451 State oper = tp.augmentation(TerminationPoint1.class).getOperationalState();
452 Name nepName = new NameBuilder()
453 .setValueName(nepPhotonicSublayer + "NodeEdgePoint")
454 .setValue(String.join("+", this.ietfNodeId, nepPhotonicSublayer, tp.getTpId().getValue()))
456 OwnedNodeEdgePoint onep = onepBd
457 .setUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", this.ietfNodeId,
458 nepPhotonicSublayer, tp.getTpId().getValue()))
459 .getBytes(Charset.forName("UTF-8"))).toString()))
460 .setLayerProtocolName(LayerProtocolName.PHOTONICMEDIA)
461 .setName(Map.of(nepName.key(), nepName))
462 .setSupportedCepLayerProtocolQualifierInstances(
463 new ArrayList<>(List.of(
464 new SupportedCepLayerProtocolQualifierInstancesBuilder()
465 .setLayerProtocolQualifier(
466 TapiStringConstants.PHTNC_MEDIA_OMS.equals(nepPhotonicSublayer)
467 ? PHOTONICLAYERQUALIFIEROMS.VALUE
468 : PHOTONICLAYERQUALIFIEROTS.VALUE)
469 .setNumberOfCepInstances(Uint64.valueOf(1))
471 .setDirection(Direction.BIDIRECTIONAL)
472 .setLinkPortRole(PortRole.SYMMETRIC)
473 .setAdministrativeState(this.tapiLink.setTapiAdminState(admin.getName()))
474 .setOperationalState(this.tapiLink.setTapiOperationalState(oper.getName()))
475 .setLifecycleState(LifecycleState.INSTALLED)
477 onepMap.put(onep.key(), onep);
482 public void convertXpdrToRdmLinks(
483 List<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
484 .networks.network.Link> xpdrRdmLinkList) {
485 List<String> linksToNotConvert = new ArrayList<>();
486 LOG.info("creation of {} xpdr to roadm links", xpdrRdmLinkList.size() / 2);
487 LOG.debug("Link list = {}", xpdrRdmLinkList);
488 for (var link:xpdrRdmLinkList) {
489 if (!linksToNotConvert.contains(link.getLinkId().getValue())) {
490 var oppositeLink = xpdrRdmLinkList.stream()
491 .filter(l -> l.getLinkId().equals(link.augmentation(Link1.class).getOppositeLink())).findAny()
493 AdminStates oppLnkAdmState = null;
494 State oppLnkOpState = null;
495 if (oppositeLink != null) {
496 oppLnkAdmState = oppositeLink.augmentation(Link1.class).getAdministrativeState();
497 oppLnkOpState = oppositeLink.augmentation(Link1.class).getOperationalState();
500 link.getSource().getSourceNode().getValue().contains("ROADM")
501 ? getIdBasedOnModelVersion(link.getSource().getSourceNode().getValue())
502 : link.getSource().getSourceNode().getValue();
504 link.getDestination().getDestNode().getValue().contains("ROADM")
505 ? getIdBasedOnModelVersion(link.getDestination().getDestNode().getValue())
506 : link.getDestination().getDestNode().getValue();
507 Link tapLink = this.tapiLink.createTapiLink(
508 sourceNode, link.getSource().getSourceTp().getValue(),
509 destNode, link.getDestination().getDestTp().getValue(),
510 TapiStringConstants.OMS_XPDR_RDM_LINK,
511 sourceNode.contains("ROADM") ? TapiStringConstants.PHTNC_MEDIA : TapiStringConstants.XPDR,
512 destNode.contains("ROADM") ? TapiStringConstants.PHTNC_MEDIA : TapiStringConstants.XPDR,
513 TapiStringConstants.PHTNC_MEDIA_OTS, TapiStringConstants.PHTNC_MEDIA_OTS,
515 link.augmentation(Link1.class).getAdministrativeState() == null || oppLnkAdmState == null
517 : this.tapiLink.setTapiAdminState(
518 link.augmentation(Link1.class).getAdministrativeState(), oppLnkAdmState).getName(),
520 link.augmentation(Link1.class).getOperationalState() == null || oppLnkOpState == null
522 : this.tapiLink.setTapiOperationalState(
523 link.augmentation(Link1.class).getOperationalState(), oppLnkOpState).getName(),
524 Set.of(LayerProtocolName.PHOTONICMEDIA), Set.of(LayerProtocolName.PHOTONICMEDIA.getName()),
526 linksToNotConvert.add(link.augmentation(Link1.class).getOppositeLink().getValue());
527 this.tapiLinks.put(tapLink.key(), tapLink);
532 private String getIdBasedOnModelVersion(String linknodeid) {
533 if (linknodeid.matches("[A-Z]{5}-[A-Z0-9]{2}-.*")) {
534 LOG.info("OpenROADM version > 1.2.1 {}", linknodeid);
535 return String.join("-", linknodeid.split("-")[0], linknodeid.split("-")[1]);
537 LOG.info("OpenROADM version <= 1.2.1 {}", linknodeid);
538 return linknodeid.split("-")[0];
542 public void setTapiNodes(Map<NodeKey,
543 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> nodeMap) {
544 this.tapiNodes.putAll(nodeMap);
547 public Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
552 public Map<LinkKey, Link> getTapiLinks() {
556 public void setTapiSips(Map<ServiceInterfacePointKey, ServiceInterfacePoint> tapiSip) {
557 this.tapiSips.putAll(tapiSip);
560 public Map<ServiceInterfacePointKey, ServiceInterfacePoint> getTapiSips() {
564 public static void setTopologicalMode(String topoMode) {
565 ConvertORTopoToTapiFullTopo.topologicalMode = topoMode;
568 public String getTopologicalMode() {
569 return topologicalMode;