2 * Copyright © 2019 Orange, Inc. and others. 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.Collection;
13 import java.util.Collections;
14 import java.util.HashMap;
15 import java.util.HashSet;
16 import java.util.Iterator;
17 import java.util.List;
19 import java.util.Map.Entry;
21 import java.util.UUID;
22 import java.util.stream.Collectors;
23 import org.opendaylight.transportpce.tapi.TapiStringConstants;
24 import org.opendaylight.transportpce.tapi.utils.TapiLink;
25 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1;
26 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1;
27 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
28 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
29 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.OduSwitchingPools;
30 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.OduSwitchingPoolsBuilder;
31 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
32 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListBuilder;
33 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListKey;
34 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
35 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmTpType;
36 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
37 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.Node1;
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.rev221121.AdministrativeState;
42 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Direction;
43 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.ForwardingDirection;
44 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
45 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LifecycleState;
46 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState;
47 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.PortRole;
48 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
49 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name;
50 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameBuilder;
51 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameKey;
52 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODU0;
53 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODU2;
54 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODU2E;
55 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODU4;
56 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev221121.DIGITALSIGNALTYPE100GigE;
57 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev221121.DIGITALSIGNALTYPE10GigELAN;
58 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev221121.DIGITALSIGNALTYPEGigE;
59 //import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROMS;
60 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTS;
61 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTSiMC;
62 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.FORWARDINGRULEMAYFORWARDACROSSGROUP;
63 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.RuleType;
64 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.link.NodeEdgePoint;
65 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.link.NodeEdgePointBuilder;
66 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.link.NodeEdgePointKey;
67 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroup;
68 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroupBuilder;
69 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroupKey;
70 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePoint;
71 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointBuilder;
72 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointKey;
73 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.RiskParameterPac;
74 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.RiskParameterPacBuilder;
75 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.MappedServiceInterfacePoint;
76 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.MappedServiceInterfacePointBuilder;
77 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.MappedServiceInterfacePointKey;
78 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedCepLayerProtocolQualifierInstances;
79 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedCepLayerProtocolQualifierInstancesBuilder;
80 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.Rule;
81 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.RuleBuilder;
82 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.RuleKey;
83 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristic;
84 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristicBuilder;
85 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link;
86 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkBuilder;
87 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkKey;
88 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeBuilder;
89 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey;
90 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristic;
91 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristicBuilder;
92 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristic;
93 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristicBuilder;
94 import org.opendaylight.yangtools.yang.common.Uint16;
95 import org.opendaylight.yangtools.yang.common.Uint64;
96 import org.slf4j.Logger;
97 import org.slf4j.LoggerFactory;
100 public class ConvertORTopoToTapiTopo {
102 private static final Logger LOG = LoggerFactory.getLogger(ConvertORTopoToTapiTopo.class);
103 private String ietfNodeId;
104 private OpenroadmNodeType ietfNodeType;
105 private AdminStates ietfNodeAdminState = null;
106 private State ietfNodeOperState = null;
107 private List<TerminationPoint> oorClientPortList = null;
108 private List<TerminationPoint> oorNetworkPortList = null;
109 private OduSwitchingPools oorOduSwitchingPool = null;
110 private Uuid tapiTopoUuid;
111 private Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
113 private Map<LinkKey, Link> tapiLinks;
114 private Map<String, Uuid> uuidMap;
115 private final TapiLink tapiLink;
118 public ConvertORTopoToTapiTopo(Uuid tapiTopoUuid, TapiLink tapiLink) {
119 this.tapiTopoUuid = tapiTopoUuid;
120 this.tapiNodes = new HashMap<>();
121 this.tapiLinks = new HashMap<>();
122 this.uuidMap = new HashMap<>();
123 this.tapiLink = tapiLink;
126 public void convertNode(Node ietfNode, List<String> networkPorts) {
127 this.ietfNodeId = ietfNode.getNodeId().getValue();
128 if (ietfNode.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1.class)
132 this.ietfNodeType = ietfNode.augmentation(
133 org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1.class).getNodeType();
134 this.ietfNodeAdminState = ietfNode.augmentation(
135 org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1.class)
136 .getAdministrativeState();
137 this.ietfNodeOperState = ietfNode.augmentation(
138 org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1.class)
139 .getOperationalState();
140 this.oorNetworkPortList = ietfNode.augmentation(
141 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
142 .getTerminationPoint().values().stream()
143 .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
144 == OpenroadmTpType.XPONDERNETWORK.getIntValue()
145 && networkPorts.contains(tp.getTpId().getValue()))
146 .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
147 .collect(Collectors.toList());
148 if (!OpenroadmNodeType.TPDR.equals(this.ietfNodeType)) {
149 this.oorOduSwitchingPool = ietfNode.augmentation(Node1.class).getSwitchingPools().getOduSwitchingPools()
150 .values().stream().findFirst().orElseThrow();
151 this.oorClientPortList = ietfNode.augmentation(
152 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
153 .getTerminationPoint().values().stream()
154 .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
155 == OpenroadmTpType.XPONDERCLIENT.getIntValue())
156 .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
157 .collect(Collectors.toList());
159 this.oorOduSwitchingPool = createOduSwitchingPoolForTp100G();
160 List<TpId> tpList = this.oorOduSwitchingPool.getNonBlockingList().values().stream()
161 .flatMap(nbl -> nbl.getTpList().stream())
162 .collect(Collectors.toList());
163 this.oorClientPortList = ietfNode.augmentation(
164 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
165 .getTerminationPoint().values().stream()
166 .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
167 == OpenroadmTpType.XPONDERCLIENT.getIntValue() && tpList.contains(tp.getTpId()))
168 .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
169 .collect(Collectors.toList());
170 this.oorClientPortList.forEach(tp -> LOG.info("tp = {}", tp.getTpId()));
173 // node creation [DSR/ODU]
174 LOG.info("creation of a DSR/ODU node for {}", this.ietfNodeId);
175 Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", this.ietfNodeId,
176 TapiStringConstants.XPDR)).getBytes(Charset.forName("UTF-8"))).toString());
177 this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.XPDR), nodeUuid);
178 Name nameDsr = new NameBuilder().setValueName("dsr/odu node name")
179 .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.XPDR)).build();
180 Name namePhot = new NameBuilder().setValueName("otsi node name")
181 .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.XPDR)).build();
182 Name nameNodeType = new NameBuilder().setValueName("Node Type")
183 .setValue(this.ietfNodeType.getName()).build();
184 Set<LayerProtocolName> dsrLayerProtocols = Set.of(LayerProtocolName.DSR, LayerProtocolName.ODU,
185 LayerProtocolName.DIGITALOTN,LayerProtocolName.PHOTONICMEDIA);
186 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology
187 .Node dsrNode = createTapiNode(Map.of(nameDsr.key(), nameDsr, namePhot.key(), namePhot,nameNodeType.key(),
190 tapiNodes.put(dsrNode.key(), dsrNode);
193 public void convertLinks(Map<
194 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
196 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
198 List<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
199 .Link> otnLinkList = new ArrayList<>(otnLinkMap.values());
200 Collections.sort(otnLinkList, (l1, l2) -> l1.getLinkId().getValue()
201 .compareTo(l2.getLinkId().getValue()));
202 List<String> linksToNotConvert = new ArrayList<>();
203 LOG.info("creation of {} otn links", otnLinkMap.size() / 2);
204 for (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
205 .Link otnlink : otnLinkList) {
206 if (!linksToNotConvert.contains(otnlink.getLinkId().getValue())) {
207 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks
208 .network.Link oppositeLink = otnLinkMap.get(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns
209 .yang.ietf.network.topology.rev180226.networks.network.LinkKey(otnlink.augmentation(Link1.class)
210 .getOppositeLink()));
212 AdminStates oppLnkAdmState = null;
213 State oppLnkOpState = null;
214 String oppositeLinkId = null;
215 if (oppositeLink != null) {
216 oppLnkAdmState = oppositeLink.augmentation(Link1.class).getAdministrativeState();
217 oppLnkOpState = oppositeLink.augmentation(Link1.class).getOperationalState();
218 oppositeLinkId = oppositeLink.getLinkId().getValue();
221 otnlink.augmentation(Link1.class).getAdministrativeState() == null
222 || oppLnkAdmState == null
224 : this.tapiLink.setTapiAdminState(
225 otnlink.augmentation(Link1.class).getAdministrativeState(), oppLnkAdmState).getName();
226 String operState = otnlink.augmentation(Link1.class).getOperationalState() == null
227 || oppLnkOpState == null
229 : this.tapiLink.setTapiOperationalState(
230 otnlink.augmentation(Link1.class).getOperationalState(), oppLnkOpState).getName();
231 // TODO: Handle not only OTU4 but also other cases
232 String prefix = otnlink.getLinkId().getValue().split("-")[0];
233 String nodesQual = TapiStringConstants.XPDR;
234 String tpsQual = prefix.equals("OTU4") ? TapiStringConstants.I_OTSI : TapiStringConstants.E_ODU;
235 LayerProtocolName layerProtocolName = prefix.equals("OTU4") ? LayerProtocolName.PHOTONICMEDIA
236 : LayerProtocolName.ODU;
238 Link tapLink = this.tapiLink.createTapiLink(otnlink.getSource().getSourceNode().getValue(),
239 otnlink.getSource().getSourceTp().getValue(), otnlink.getDestination().getDestNode().getValue(),
240 otnlink.getDestination().getDestTp().getValue(), TapiStringConstants.OTN_XPDR_XPDR_LINK, nodesQual,
241 nodesQual, tpsQual, tpsQual, adminState, operState, Set.of(layerProtocolName),
242 Set.of(layerProtocolName.getName()), this.tapiTopoUuid);
243 linksToNotConvert.add(oppositeLinkId);
244 tapiLinks.put(tapLink.key(), tapLink);
245 LOG.debug("Links converted are as follow {}", tapiLinks.toString());
250 public void convertRoadmInfrastructure() {
251 LOG.info("abstraction of the ROADM infrastructure towards a photonic node");
252 Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.RDM_INFRA
253 .getBytes(Charset.forName("UTF-8"))).toString());
254 Name nodeName = new NameBuilder().setValueName("otsi node name").setValue(TapiStringConstants.RDM_INFRA)
256 Name nameNodeType = new NameBuilder().setValueName("Node Type")
257 .setValue(OpenroadmNodeType.ROADM.getName()).build();
258 Set<LayerProtocolName> nodeLayerProtocols = Set.of(LayerProtocolName.PHOTONICMEDIA);
259 List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> tapiPhotonicNodes
260 = pruneTapiPhotonicNodes();
261 //At that stage, there is no Roadm in the tapiPhotonicNodes Map / only the transponders
262 Map<String, String> photonicNepUuisMap = convertListNodeWithListNepToMapForUuidAndName(tapiPhotonicNodes);
263 // nep creation for rdm infra abstraction node
264 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = createNepForRdmNode(photonicNepUuisMap.size());
265 // node rule group creation
266 Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList
267 = createNodeRuleGroupForRdmNode(nodeUuid, onepMap.values());
268 // Empty random creation of mandatory fields for avoiding errors....
269 CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
270 .setCostAlgorithm("Restricted Shortest Path - RSP")
271 .setCostName("HOP_COUNT")
272 .setCostValue(TapiStringConstants.COST_HOP_VALUE)
274 LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
275 .setFixedLatencyCharacteristic(TapiStringConstants.FIXED_LATENCY_VALUE)
276 .setQueuingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
277 .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
278 .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
279 .setTrafficPropertyName("FIXED_LATENCY")
281 RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
282 .setRiskCharacteristicName("risk characteristic")
283 .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
285 RiskParameterPac riskParamPac = new RiskParameterPacBuilder()
286 .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
288 // build RDM infra node abstraction
289 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node rdmNode = new NodeBuilder()
291 .setName(Map.of(nodeName.key(), nodeName, nameNodeType.key(), nameNodeType))
292 .setLayerProtocolName(nodeLayerProtocols)
293 .setAdministrativeState(AdministrativeState.UNLOCKED)
294 .setOperationalState(OperationalState.ENABLED)
295 .setLifecycleState(LifecycleState.INSTALLED)
296 .setOwnedNodeEdgePoint(onepMap)
297 .setNodeRuleGroup(nodeRuleGroupList)
298 .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
299 .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
300 .setRiskParameterPac(riskParamPac)
302 tapiNodes.put(rdmNode.key(), rdmNode);
303 // OTS link creation between photonic nodes and RDM infra abstraction node :
304 //onepMap is a list of nep which Uuid is formed from THE ROADM node name, "nep" and an integer (order of the nep)
305 // It has absolutely no relationship with the real ROADM infrastructure (SRG ports)
306 //rdmInfraNepUuisMap is a Map <ROADMnodeUuuid--NepUuid; ROADMnodeName--nepName> built from onepMap
307 //photonicNepUuisMap is a Map <TSPnodeUuuid--eNepUuid; TSPnodeName--nepName> built from TapiPhotonicNode
308 Map<String, String> rdmInfraNepUuisMap = convertListNodeWithListNepToMapForUuidAndName(List.of(rdmNode));
309 if (photonicNepUuisMap.size() != rdmInfraNepUuisMap.size()) {
310 LOG.warn("Unable to build OTS links between photonics nodes and RDM infrasctructure abstraction");
312 //Tapi OtsLinks are created between Neps corresponding to the eNEPs of transponders (existing network ports)
313 //and Generic NEPS with abstracted names created in the ROADM infrastructure corresponding to tps mirroring
314 //transponders NETWORK PORTs. There is a simplification here considering that any network port of
315 //transponders will have a mirroring SRG client port in the ROADM infrastructure.
316 // TODO: Do not understand that we build OTS link without checking that existing transponder ports
317 //are effectively connected. Need some consolidation
318 createTapiOtsLinks(photonicNepUuisMap, rdmInfraNepUuisMap);
322 private OduSwitchingPools createOduSwitchingPoolForTp100G() {
323 Map<NonBlockingListKey, NonBlockingList> nblMap = new HashMap<>();
325 for (TerminationPoint tp : this.oorNetworkPortList) {
326 TpId tpid1 = tp.getTpId();
327 TpId tpid2 = tp.augmentation(
328 org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1.class)
329 .getAssociatedConnectionMapTp().iterator().next();
330 Set<TpId> tpList = new HashSet<>();
333 NonBlockingList nbl = new NonBlockingListBuilder()
334 .setNblNumber(Uint16.valueOf(count))
337 nblMap.put(nbl.key(), nbl);
340 return new OduSwitchingPoolsBuilder()
341 .setNonBlockingList(nblMap)
342 .setSwitchingPoolNumber(Uint16.valueOf(1))
346 private List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
347 pruneTapiPhotonicNodes() {
348 List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
349 prunedTapiPhotonicNodes = new ArrayList<>();
350 List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> tapiPhotonicNodes
351 = this.tapiNodes.values().stream()
352 .filter(n -> n.getLayerProtocolName().contains(LayerProtocolName.PHOTONICMEDIA))
353 .collect(Collectors.toList());
354 for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node node
355 : tapiPhotonicNodes) {
356 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepM = new HashMap<>();
357 for (Map.Entry<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> entry : node.getOwnedNodeEdgePoint().entrySet()) {
358 if (entry.getValue().getName().values().stream()
359 .filter(name -> name.getValueName().startsWith("eNodeEdgePoint")).count() > 0) {
360 onepM.put(entry.getKey(), entry.getValue());
363 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node prunedNode
364 = new NodeBuilder(node).setOwnedNodeEdgePoint(onepM).build();
365 prunedTapiPhotonicNodes.add(prunedNode);
367 return prunedTapiPhotonicNodes;
370 private Map<String, String> convertListNodeWithListNepToMapForUuidAndName(
371 List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> nodes) {
372 Map<String, String> uuidNameMap = new HashMap<>();
373 for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node node : nodes) {
374 for (OwnedNodeEdgePoint nep : node.nonnullOwnedNodeEdgePoint().values()) {
375 String nodeUuid = node.getUuid().getValue();
376 String nepUuid = nep.getUuid().getValue();
377 String nodeName = node.getName().get(new NameKey("otsi node name")).getValue();
378 String nepName = nep.getName().get(new NameKey(nep.getName().keySet().stream().findFirst()
381 uuidNameMap.put(String.join("--", nodeUuid, nepUuid), String.join("--", nodeName, nepName));
387 private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node
388 createTapiNode(Map<NameKey, Name> nodeNames, Set<LayerProtocolName> layerProtocols) {
389 Uuid nodeUuid = null;
390 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl = new HashMap<>();
391 Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList = new HashMap<>();
392 Map<RuleKey, Rule> ruleList = new HashMap<>();
393 Set<RuleType> ruleTypes = new HashSet<>();
394 ruleTypes.add(RuleType.FORWARDING);
395 Rule rule = new RuleBuilder()
396 .setLocalId("forward")
397 .setForwardingRule(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE)
398 .setRuleType(ruleTypes)
400 ruleList.put(rule.key(), rule);
401 if (layerProtocols.contains(LayerProtocolName.DSR)
402 || layerProtocols.contains(LayerProtocolName.PHOTONICMEDIA)) {
403 nodeUuid = getNodeUuid4Dsr(onepl, nodeRuleGroupList, ruleList);
405 LOG.error("Undefined LayerProtocolName for {} node {}", nodeNames.get(nodeNames.keySet().iterator().next())
406 .getValueName(), nodeNames.get(nodeNames.keySet().iterator().next()).getValue());
408 // Empty random creation of mandatory fields for avoiding errors....
409 CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
410 .setCostAlgorithm("Restricted Shortest Path - RSP")
411 .setCostName("HOP_COUNT")
412 .setCostValue(TapiStringConstants.COST_HOP_VALUE)
414 LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
415 .setFixedLatencyCharacteristic(TapiStringConstants.FIXED_LATENCY_VALUE)
416 .setQueuingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
417 .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
418 .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
419 .setTrafficPropertyName("FIXED_LATENCY")
421 RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
422 .setRiskCharacteristicName("risk characteristic")
423 .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
425 RiskParameterPac riskParamPac = new RiskParameterPacBuilder()
426 .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
428 return new NodeBuilder()
431 .setLayerProtocolName(layerProtocols)
432 .setAdministrativeState(this.tapiLink.setTapiAdminState(this.ietfNodeAdminState.getName()))
433 .setOperationalState(this.tapiLink.setTapiOperationalState(this.ietfNodeOperState.getName()))
434 .setLifecycleState(LifecycleState.INSTALLED)
435 .setOwnedNodeEdgePoint(onepl)
436 .setNodeRuleGroup(nodeRuleGroupList)
437 .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
438 .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
439 .setRiskParameterPac(riskParamPac)
443 private Uuid getNodeUuid4Dsr(Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl,
444 Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList, Map<RuleKey, Rule> ruleList) {
446 nodeUuid = this.uuidMap.get(String.join("+", this.ietfNodeId, TapiStringConstants.XPDR));
447 // client nep creation on DSR/ODU node
448 for (int i = 0; i < oorClientPortList.size(); i++) {
449 Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
450 (String.join("+", this.ietfNodeId, TapiStringConstants.DSR,
451 oorClientPortList.get(i).getTpId().getValue())).getBytes(Charset.forName("UTF-8"))).toString());
452 this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.DSR,
453 oorClientPortList.get(i).getTpId().getValue()), nepUuid);
454 NameBuilder nameBldr = new NameBuilder().setValue(String.join("+", this.ietfNodeId, TapiStringConstants.DSR,
455 oorClientPortList.get(i).getTpId().getValue()));
457 if (OpenroadmNodeType.TPDR.equals(this.ietfNodeType)) {
458 name = nameBldr.setValueName("100G-tpdr").build();
460 name = nameBldr.setValueName("NodeEdgePoint_C").build();
463 OwnedNodeEdgePoint onep = createNep(oorClientPortList.get(i), Map.of(name.key(), name),
464 LayerProtocolName.ETH, LayerProtocolName.DSR, true, String.join("+", this.ietfNodeId,
465 TapiStringConstants.DSR));
466 onepl.put(onep.key(), onep);
468 // network nep creation on DSR/ODU node
469 for (int i = 0; i < oorNetworkPortList.size(); i++) {
470 Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
471 (String.join("+", this.ietfNodeId, TapiStringConstants.I_ODU,
472 oorNetworkPortList.get(i).getTpId().getValue())).getBytes(Charset.forName("UTF-8"))).toString());
473 this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.I_ODU,
474 oorNetworkPortList.get(i).getTpId().getValue()), nepUuid);
475 Name onedName = new NameBuilder()
476 .setValueName("iNodeEdgePoint_N")
477 .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.I_ODU,
478 oorNetworkPortList.get(i).getTpId().getValue()))
481 OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), Map.of(onedName.key(), onedName),
482 LayerProtocolName.ODU, LayerProtocolName.DSR, true, String.join("+", this.ietfNodeId,
483 TapiStringConstants.I_ODU));
484 onepl.put(onep.key(), onep);
486 // eNep creation on otsi node
487 for (int i = 0; i < oorNetworkPortList.size(); i++) {
488 Uuid nepUuid2 = new Uuid(UUID.nameUUIDFromBytes(
489 (String.join("+", this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA_OTS,
490 oorNetworkPortList.get(i).getTpId().getValue())).getBytes(Charset.forName("UTF-8")))
492 this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA_OTS,
493 oorNetworkPortList.get(i).getTpId().getValue()), nepUuid2);
494 Name onedName = new NameBuilder()
495 .setValueName("eNodeEdgePoint")
496 .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA_OTS,
497 oorNetworkPortList.get(i).getTpId().getValue()))
500 OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), Map.of(onedName.key(), onedName),
501 LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true,
502 String.join("+", this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA_OTS));
503 onepl.put(onep.key(), onep);
505 // create NodeRuleGroup
507 for (NonBlockingList nbl : this.oorOduSwitchingPool.nonnullNonBlockingList().values()) {
508 Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePointKey,
509 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePoint>
510 nepList = new HashMap<>();
511 for (TpId tp : nbl.getTpList()) {
512 if (this.uuidMap.containsKey(String.join("+", this.ietfNodeId, TapiStringConstants.DSR,
513 tp.getValue())) || this.uuidMap.containsKey(String.join(
514 "+", this.ietfNodeId, TapiStringConstants.I_ODU, tp.getValue()))) {
515 String qual = tp.getValue().contains("CLIENT") ? TapiStringConstants.DSR
516 : TapiStringConstants.I_ODU;
517 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePoint
518 nep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group
519 .NodeEdgePointBuilder()
520 .setTopologyUuid(tapiTopoUuid)
521 .setNodeUuid(this.uuidMap.get(String.join("+", this.ietfNodeId,
522 TapiStringConstants.XPDR)))
523 .setNodeEdgePointUuid(this.uuidMap.get(String.join("+", this.ietfNodeId,
524 qual, tp.getValue())))
526 nepList.put(nep.key(), nep);
529 NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
531 UUID.nameUUIDFromBytes(("dsr node rule group " + count).getBytes(Charset.forName("UTF-8")))
534 .setNodeEdgePoint(nepList)
536 nodeRuleGroupList.put(nodeRuleGroup.key(), nodeRuleGroup);
542 private OwnedNodeEdgePoint createNep(TerminationPoint oorTp, Map<NameKey, Name> nepNames,
543 LayerProtocolName nepProtocol, LayerProtocolName nodeProtocol,
544 boolean withSip, String keyword) {
545 String key = String.join("+", keyword, oorTp.getTpId().getValue());
546 AdministrativeState adminState = (oorTp.augmentation(TerminationPoint1.class).getAdministrativeState() != null)
547 ? this.tapiLink.setTapiAdminState(oorTp.augmentation(TerminationPoint1.class).getAdministrativeState()
550 OperationalState operState = (oorTp.augmentation(TerminationPoint1.class).getOperationalState() != null)
551 ? this.tapiLink.setTapiOperationalState(oorTp.augmentation(TerminationPoint1.class).getOperationalState()
554 OwnedNodeEdgePointBuilder onepBldr = new OwnedNodeEdgePointBuilder()
555 .setUuid(this.uuidMap.get(key))
556 .setLayerProtocolName(nepProtocol)
558 .setSupportedCepLayerProtocolQualifierInstances(createSupportedCepLayerProtocolQualifier(oorTp,
560 .setDirection(Direction.BIDIRECTIONAL)
561 .setLinkPortRole(PortRole.SYMMETRIC)
562 .setAdministrativeState(adminState)
563 .setOperationalState(operState)
564 .setLifecycleState(LifecycleState.INSTALLED);
566 onepBldr.setMappedServiceInterfacePoint(createSIP(1, oorTp, keyword));
568 return onepBldr.build();
571 private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> createNepForRdmNode(int nbNep) {
572 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = new HashMap<>();
573 for (int i = 1; i <= nbNep; i++) {
574 Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "roadm node", "nep", String.valueOf(i)))
575 .getBytes(Charset.forName("UTF-8"))).toString());
576 Name nepName = new NameBuilder()
577 .setValueName("NodeEdgePoint name")
578 .setValue(new StringBuilder("NodeEdgePoint_").append(i).toString())
580 List<SupportedCepLayerProtocolQualifierInstances> sclpqiList = new ArrayList<>();
581 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
582 .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE)
583 .setNumberOfCepInstances(Uint64.valueOf(1))
585 OwnedNodeEdgePoint onep = new OwnedNodeEdgePointBuilder()
587 .setLayerProtocolName(LayerProtocolName.PHOTONICMEDIA)
588 .setName(Map.of(nepName.key(), nepName))
589 .setSupportedCepLayerProtocolQualifierInstances(sclpqiList)
590 .setDirection(Direction.BIDIRECTIONAL).setLinkPortRole(PortRole.SYMMETRIC)
591 .setAdministrativeState(AdministrativeState.UNLOCKED).setOperationalState(OperationalState.ENABLED)
592 .setLifecycleState(LifecycleState.INSTALLED)
594 onepMap.put(onep.key(), onep);
599 private Map<NodeRuleGroupKey, NodeRuleGroup> createNodeRuleGroupForRdmNode(Uuid nodeUuid,
600 Collection<OwnedNodeEdgePoint> onepl) {
601 Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePointKey,
602 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePoint>
603 nepMap = new HashMap<>();
604 for (OwnedNodeEdgePoint onep : onepl) {
605 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePoint
606 nep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group
607 .NodeEdgePointBuilder()
608 .setTopologyUuid(tapiTopoUuid)
609 .setNodeUuid(nodeUuid)
610 .setNodeEdgePointUuid(onep.key().getUuid())
612 nepMap.put(nep.key(), nep);
614 Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupMap = new HashMap<>();
615 Set<RuleType> ruleTypes = new HashSet<>();
616 ruleTypes.add(RuleType.FORWARDING);
617 Map<RuleKey, Rule> ruleList = new HashMap<>();
618 Rule rule = new RuleBuilder()
619 .setLocalId("forward")
620 .setForwardingRule(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE)
621 .setRuleType(ruleTypes)
623 ruleList.put(rule.key(), rule);
624 NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
625 .setUuid(new Uuid(UUID.nameUUIDFromBytes(("rdm infra node rule group").getBytes(Charset.forName("UTF-8")))
628 .setNodeEdgePoint(nepMap)
630 nodeRuleGroupMap.put(nodeRuleGroup.key(), nodeRuleGroup);
631 return nodeRuleGroupMap;
634 private Map<MappedServiceInterfacePointKey, MappedServiceInterfacePoint> createSIP(int nb, TerminationPoint tp,
636 Map<MappedServiceInterfacePointKey, MappedServiceInterfacePoint> msipl = new HashMap<>();
637 for (int i = 0; i < nb; i++) {
638 //TODO : verify why i is not included to proceed Uuid
639 MappedServiceInterfacePoint msip = new MappedServiceInterfacePointBuilder()
640 .setServiceInterfacePointUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP", nodeId,
641 tp.getTpId().getValue())).getBytes(Charset.forName("UTF-8"))).toString()))
643 msipl.put(msip.key(), msip);
648 private List<SupportedCepLayerProtocolQualifierInstances> createSupportedCepLayerProtocolQualifier(
649 TerminationPoint tp, LayerProtocolName lpn) {
650 List<SupportedCepLayerProtocolQualifierInstances> sclpqiList = new ArrayList<>();
651 org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.TerminationPoint1 tp1 =
652 tp.augmentation(org.opendaylight.yang.gen.v1.http
653 .org.openroadm.otn.network.topology.rev230526.TerminationPoint1.class);
655 return new ArrayList<>(sclpqiList);
657 if (tp1.getTpSupportedInterfaces() == null) {
658 LOG.warn("Tp supported interface doesnt exist on TP {}", tp.getTpId().getValue());
659 return new ArrayList<>(sclpqiList);
661 Collection<SupportedInterfaceCapability> sicList = tp1.getTpSupportedInterfaces()
662 .getSupportedInterfaceCapability().values();
663 for (SupportedInterfaceCapability sic : sicList) {
664 String ifCapType = sic.getIfCapType().toString().split("\\{")[0];
665 switch (lpn.getName()) {
668 // TODO: it may be needed to add more cases clauses if the interface capabilities of a
669 // port are extended in the config file
671 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
672 .setLayerProtocolQualifier(ODUTYPEODU0.VALUE)
673 .setNumberOfCepInstances(Uint64.valueOf(0))
675 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
676 .setLayerProtocolQualifier(DIGITALSIGNALTYPEGigE.VALUE)
677 .setNumberOfCepInstances(Uint64.valueOf(0))
681 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
682 .setLayerProtocolQualifier(ODUTYPEODU2E.VALUE)
683 .setNumberOfCepInstances(Uint64.valueOf(0))
685 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
686 .setLayerProtocolQualifier(DIGITALSIGNALTYPE10GigELAN.VALUE)
687 .setNumberOfCepInstances(Uint64.valueOf(0))
691 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
692 .setLayerProtocolQualifier(ODUTYPEODU2.VALUE)
693 .setNumberOfCepInstances(Uint64.valueOf(0))
695 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
696 .setLayerProtocolQualifier(DIGITALSIGNALTYPE10GigELAN.VALUE)
697 .setNumberOfCepInstances(Uint64.valueOf(0))
701 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
702 .setLayerProtocolQualifier(DIGITALSIGNALTYPE10GigELAN.VALUE)
703 .setNumberOfCepInstances(Uint64.valueOf(0))
707 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
708 .setLayerProtocolQualifier(DIGITALSIGNALTYPE100GigE.VALUE)
709 .setNumberOfCepInstances(Uint64.valueOf(0))
711 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
712 .setLayerProtocolQualifier(ODUTYPEODU4.VALUE)
713 .setNumberOfCepInstances(Uint64.valueOf(0))
717 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
718 .setLayerProtocolQualifier(DIGITALSIGNALTYPE100GigE.VALUE)
719 .setNumberOfCepInstances(Uint64.valueOf(0))
722 case "IfOCHOTU4ODU4":
724 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
725 .setLayerProtocolQualifier(ODUTYPEODU4.VALUE)
726 .setNumberOfCepInstances(Uint64.valueOf(0))
730 LOG.error("IfCapability type not managed");
734 //TODO: verify that in the new scope it makes sense to include ODU in the abstracted topology
737 // TODO: it may be needed to add more cases clauses if the interface capabilities of a
738 // port are extended in the config file
740 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
741 .setLayerProtocolQualifier(ODUTYPEODU0.VALUE)
742 .setNumberOfCepInstances(Uint64.valueOf(0))
746 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
747 .setLayerProtocolQualifier(ODUTYPEODU2E.VALUE)
748 .setNumberOfCepInstances(Uint64.valueOf(0))
753 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
754 .setLayerProtocolQualifier(ODUTYPEODU2.VALUE)
755 .setNumberOfCepInstances(Uint64.valueOf(0))
760 case "IfOCHOTU4ODU4":
762 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
763 .setLayerProtocolQualifier(ODUTYPEODU4.VALUE)
764 .setNumberOfCepInstances(Uint64.valueOf(0))
768 LOG.error("IfCapability type not managed");
772 case "PHOTONIC_MEDIA":
773 if (ifCapType.equals("IfOCHOTU4ODU4") || ifCapType.equals("IfOCH")) {
774 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
775 .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTSiMC.VALUE)
776 .setNumberOfCepInstances(Uint64.valueOf(0))
778 sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
779 .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE)
780 .setNumberOfCepInstances(Uint64.valueOf(0))
785 LOG.error("Layer Protocol Name is unknown");
789 return sclpqiList.stream().distinct().toList();
792 private void createTapiOtsLinks(Map<String, String> photonicNepUuisMap, Map<String, String> rdmInfraNepUuisMap) {
793 Iterator<Entry<String, String>> it1 = photonicNepUuisMap.entrySet().iterator();
794 Iterator<Entry<String, String>> it2 = rdmInfraNepUuisMap.entrySet().iterator();
795 while (it1.hasNext()) {
796 Map<NodeEdgePointKey, NodeEdgePoint> nepMap = new HashMap<>();
797 Map.Entry<String, String> photonicEntry = it1.next();
798 Map.Entry<String, String> rdmEntry = it2.next();
799 Uuid sourceUuidTp = new Uuid(photonicEntry.getKey().split("--")[1]);
800 Uuid sourceUuidNode = new Uuid(photonicEntry.getKey().split("--")[0]);
801 Uuid destUuidTp = new Uuid(rdmEntry.getKey().split("--")[1]);
802 Uuid destUuidNode = new Uuid(rdmEntry.getKey().split("--")[0]);
803 NodeEdgePoint sourceNep = new NodeEdgePointBuilder()
804 .setTopologyUuid(this.tapiTopoUuid)
805 .setNodeUuid(sourceUuidNode)
806 .setNodeEdgePointUuid(sourceUuidTp)
808 nepMap.put(sourceNep.key(), sourceNep);
809 NodeEdgePoint destNep = new NodeEdgePointBuilder()
810 .setTopologyUuid(this.tapiTopoUuid)
811 .setNodeUuid(destUuidNode)
812 .setNodeEdgePointUuid(destUuidTp)
814 nepMap.put(destNep.key(), destNep);
815 Name linkName = new NameBuilder().setValueName("OTS link name")
816 .setValue(String.join(" and ", photonicEntry.getValue(), rdmEntry.getValue()))
818 Link otsLink = new LinkBuilder()
820 UUID.nameUUIDFromBytes((String.join(" and ", photonicEntry.getValue(), rdmEntry.getValue()))
821 .getBytes(Charset.forName("UTF-8")))
823 .setName(Map.of(linkName.key(), linkName))
824 .setLayerProtocolName(Set.of(LayerProtocolName.PHOTONICMEDIA))
825 .setNodeEdgePoint(nepMap)
826 .setDirection(ForwardingDirection.BIDIRECTIONAL)
828 this.tapiLinks.put(otsLink.key(), otsLink);
832 public Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
837 public Map<LinkKey, Link> getTapiLinks() {