2 * Copyright © 2024 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.impl.rpc;
10 import com.google.common.util.concurrent.ListenableFuture;
11 import java.nio.charset.Charset;
12 import java.util.ArrayList;
13 import java.util.Collection;
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;
20 import java.util.Optional;
22 import java.util.UUID;
23 import java.util.concurrent.ExecutionException;
24 import java.util.stream.Collectors;
25 import org.eclipse.jdt.annotation.NonNull;
26 import org.eclipse.jdt.annotation.Nullable;
27 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
28 import org.opendaylight.transportpce.common.InstanceIdentifiers;
29 import org.opendaylight.transportpce.common.NetworkUtils;
30 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
31 import org.opendaylight.transportpce.tapi.TapiStringConstants;
32 import org.opendaylight.transportpce.tapi.topology.ConvertORToTapiTopology;
33 import org.opendaylight.transportpce.tapi.topology.ConvertORTopoToTapiTopo;
34 import org.opendaylight.transportpce.tapi.topology.ConvertTapiTopoToAbstracted;
35 import org.opendaylight.transportpce.tapi.topology.TapiTopologyException;
36 import org.opendaylight.transportpce.tapi.topology.TopologyUtils;
37 import org.opendaylight.transportpce.tapi.utils.TapiContext;
38 import org.opendaylight.transportpce.tapi.utils.TapiLink;
39 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
40 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingKey;
41 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
42 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.NodesKey;
43 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1;
44 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1;
45 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmLinkType;
46 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
47 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmTpType;
48 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
49 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
50 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
51 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1;
52 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1;
53 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
54 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
55 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.AdministrativeState;
56 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Context;
57 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
58 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LifecycleState;
59 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState;
60 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
61 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name;
62 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameBuilder;
63 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameKey;
64 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePoint;
65 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointKey;
66 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.Context1;
67 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.FORWARDINGRULEMAYFORWARDACROSSGROUP;
68 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetTopologyDetails;
69 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetTopologyDetailsInput;
70 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetTopologyDetailsOutput;
71 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetTopologyDetailsOutputBuilder;
72 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.RuleType;
73 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroup;
74 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroupBuilder;
75 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroupKey;
76 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePoint;
77 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointKey;
78 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.Rule;
79 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.RuleBuilder;
80 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.RuleKey;
81 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkKey;
82 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeBuilder;
83 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey;
84 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.TopologyKey;
85 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
86 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
87 import org.opendaylight.yangtools.yang.common.ErrorType;
88 import org.opendaylight.yangtools.yang.common.RpcResult;
89 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
90 import org.slf4j.Logger;
91 import org.slf4j.LoggerFactory;
94 public class GetTopologyDetailsImpl implements GetTopologyDetails {
95 private static final Logger LOG = LoggerFactory.getLogger(GetTopologyDetailsImpl.class);
97 private final TapiContext tapiContext;
98 private final TopologyUtils topologyUtils;
99 private final TapiLink tapiLink;
100 private final NetworkTransactionService networkTransactionService;
101 private Map<ServiceInterfacePointKey, ServiceInterfacePoint> tapiSips;
103 public GetTopologyDetailsImpl(TapiContext tapiContext, TopologyUtils topologyUtils, TapiLink tapiLink,
104 NetworkTransactionService networkTransactionService) {
105 this.tapiContext = tapiContext;
106 this.topologyUtils = topologyUtils;
107 this.tapiLink = tapiLink;
108 this.tapiSips = new HashMap<>();
109 this.networkTransactionService = networkTransactionService;
113 public ListenableFuture<RpcResult<GetTopologyDetailsOutput>> invoke(GetTopologyDetailsInput input) {
114 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.Topology topology;
115 Uuid topologyUuidFull = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER.getBytes(
116 Charset.forName("UTF-8"))).toString());
117 if (input.getTopologyId().equals(topologyUuidFull)) {
118 Context context = this.tapiContext.getTapiContext();
120 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.Topology>
121 topologyMap = context.augmentation(Context1.class).getTopologyContext().getTopology();
122 if (topologyMap == null || !topologyMap.containsKey(new TopologyKey(topologyUuidFull))) {
123 LOG.error("Topology {} not found in datastore", input.getTopologyId());
124 return RpcResultBuilder.<GetTopologyDetailsOutput>failed()
125 .withError(ErrorType.RPC, "Invalid Topology name")
128 topology = topologyMap.get(new TopologyKey(input.getTopologyId()));
129 return RpcResultBuilder.success(new GetTopologyDetailsOutputBuilder()
130 .setTopology(this.topologyUtils.transformTopology(topology))
134 Uuid topologyUuidTapiAbs = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_TAPI_MULTILAYER.getBytes(
135 Charset.forName("UTF-8"))).toString());
136 if (input.getTopologyId().equals(topologyUuidTapiAbs)) {
138 LOG.info("Building TAPI Topology abstraction for {}", input.getTopologyId());
139 topology = createAbsTopologyFromTapiTopo();
140 return RpcResultBuilder.success(new GetTopologyDetailsOutputBuilder()
141 .setTopology(this.topologyUtils.transformTopology(topology)).build())
143 } catch (TapiTopologyException e) {
144 LOG.error("error building TAPI topology");
145 return RpcResultBuilder.<GetTopologyDetailsOutput>failed()
146 .withError(ErrorType.RPC, "Error building topology")
150 Uuid topologyUuid100G = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.TPDR_100G.getBytes(
151 Charset.forName("UTF-8"))).toString());
152 Uuid topologyUuidAbs = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_MULTILAYER.getBytes(
153 Charset.forName("UTF-8"))).toString());
154 if (topologyUuid100G.equals(input.getTopologyId()) || topologyUuidAbs.equals(input.getTopologyId())) {
156 LOG.info("Building TAPI Topology abstraction for {}", input.getTopologyId());
157 topology = createAbstractedOtnTopology();
158 if (input.getTopologyId().equals(topologyUuidAbs)) {
159 return RpcResultBuilder.success(new GetTopologyDetailsOutputBuilder()
160 .setTopology(this.topologyUtils.transformTopology(topology)).build())
163 topology = createAbstracted100GTpdrTopology(topology);
164 return RpcResultBuilder.success(new GetTopologyDetailsOutputBuilder()
165 .setTopology(this.topologyUtils.transformTopology(topology)).build())
167 } catch (TapiTopologyException e) {
168 LOG.error("error building TAPI topology");
169 return RpcResultBuilder.<GetTopologyDetailsOutput>failed()
170 .withError(ErrorType.RPC, "Error building topology")
174 return RpcResultBuilder.<GetTopologyDetailsOutput>failed()
175 .withError(ErrorType.RPC, "Invalid Topology name")
179 public org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.Topology
180 createAbstracted100GTpdrTopology(org.opendaylight.yang.gen.v1.urn
181 .onf.otcc.yang.tapi.topology.rev221121.topology.context.Topology topology) {
182 List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> dsrNodes = topology
183 .nonnullNode().values().stream()
184 .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.DSR))
185 .collect(Collectors.toList());
186 List<OwnedNodeEdgePoint> nep100GTpdrList = new ArrayList<>();
187 for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node node2 : dsrNodes) {
188 List<OwnedNodeEdgePoint> nepList = node2.getOwnedNodeEdgePoint().values().stream()
189 .filter(nep -> nep.getName().containsKey(new NameKey("100G-tpdr")))
190 .collect(Collectors.toList());
191 nep100GTpdrList.addAll(nepList);
193 Name topoName = new NameBuilder().setValue(TapiStringConstants.TPDR_100G).setValueName("TAPI Topology Name")
195 Uuid topoUuid = new Uuid(
196 UUID.nameUUIDFromBytes(TapiStringConstants.TPDR_100G.getBytes(Charset.forName("UTF-8"))).toString());
197 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node node =
198 createTapiNode(nep100GTpdrList, topoUuid);
199 return new org.opendaylight.yang.gen.v1.urn
200 .onf.otcc.yang.tapi.topology.rev221121.topology.context.TopologyBuilder()
201 .setName(Map.of(topoName.key(), topoName)).setUuid(topoUuid).setNode(Map.of(node.key(), node))
202 .setLayerProtocolName(Set.of(LayerProtocolName.DSR, LayerProtocolName.ETH)).build();
205 public org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.Topology
206 createAbstractedOtnTopology() throws TapiTopologyException {
207 // read openroadm-topology
208 Network openroadmTopo = readTopology(InstanceIdentifiers.OVERLAY_NETWORK_II);
209 List<Link> linkList = new ArrayList<>();
210 if (openroadmTopo.augmentation(Network1.class) != null) {
211 linkList.addAll(openroadmTopo.augmentation(Network1.class).getLink().values());
213 List<Link> xponderOutLinkList = linkList.stream()
214 .filter(lk -> lk.augmentation(Link1.class).getLinkType().equals(OpenroadmLinkType.XPONDEROUTPUT))
215 .collect(Collectors.toList());
216 List<Link> xponderInLinkList = linkList.stream()
217 .filter(lk -> lk.augmentation(Link1.class).getLinkType().equals(OpenroadmLinkType.XPONDERINPUT))
218 .collect(Collectors.toList());
220 Network otnTopo = readTopology(InstanceIdentifiers.OTN_NETWORK_II);
221 Map<NodeId, Node> otnNodeMap = otnTopo.nonnullNode().values().stream()
222 .collect(Collectors.toMap(Node::getNodeId, node -> node));
224 Map<String, List<String>> networkPortMap = new HashMap<>();
225 Iterator<Entry<NodeId, Node>> itOtnNodeMap = otnNodeMap.entrySet().iterator();
226 while (itOtnNodeMap.hasNext()) {
227 Entry<NodeId, Node> entry = itOtnNodeMap.next();
228 String portMappingNodeId = entry.getValue().getSupportingNode().values().stream()
229 .filter(sn -> sn.getNetworkRef().getValue().equals(NetworkUtils.UNDERLAY_NETWORK_ID))
231 .orElseThrow().getNodeRef().getValue();
232 List<String> networkPortList = new ArrayList<>();
233 for (TerminationPoint tp : entry.getValue().augmentation(Node1.class).getTerminationPoint().values()) {
234 if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)
235 && checkTp(entry.getKey().getValue(), portMappingNodeId, tp, xponderOutLinkList,
236 xponderInLinkList)) {
237 networkPortList.add(tp.getTpId().getValue());
240 if (!networkPortList.isEmpty()) {
241 networkPortMap.put(entry.getKey().getValue(), networkPortList);
244 Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> tapiNodeList
246 Map<LinkKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link> tapiLinkList
248 Uuid topoUuid = new Uuid(UUID
249 .nameUUIDFromBytes(TapiStringConstants.T0_MULTILAYER.getBytes(Charset.forName("UTF-8"))).toString());
250 ConvertORTopoToTapiTopo tapiAbstractFactory = new ConvertORTopoToTapiTopo(topoUuid, this.tapiLink);
251 ConvertORToTapiTopology tapiFactory = new ConvertORToTapiTopology(topoUuid);
252 Iterator<Entry<String, List<String>>> it = networkPortMap.entrySet().iterator();
253 while (it.hasNext()) {
254 String nodeId = it.next().getKey();
255 tapiFactory.convertNode(otnNodeMap.get(new NodeId(nodeId)), networkPortMap.get(nodeId));
256 tapiAbstractFactory.setTapiNodes(tapiFactory.getTapiNodes());
257 tapiAbstractFactory.setTapiSips(tapiFactory.getTapiSips());
258 tapiNodeList.putAll(tapiAbstractFactory.getTapiNodes());
259 tapiLinkList.putAll(tapiAbstractFactory.getTapiLinks());
261 if (openroadmTopo.nonnullNode().values().stream().filter(nt -> nt
262 .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1.class)
263 .getNodeType().equals(OpenroadmNodeType.SRG)).count() > 0) {
264 tapiAbstractFactory.convertRoadmInfrastructure();
265 tapiNodeList.putAll(tapiAbstractFactory.getTapiNodes());
266 tapiLinkList.putAll(tapiAbstractFactory.getTapiLinks());
268 LOG.warn("Unable to abstract an ROADM infrasctructure from openroadm-topology");
270 if (otnTopo.augmentation(Network1.class) != null) {
271 Map<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
272 .ietf.network.topology.rev180226.networks.network.LinkKey, Link> otnLinkMap =
273 otnTopo.augmentation(Network1.class).getLink();
274 tapiAbstractFactory.convertLinks(otnLinkMap);
275 tapiLinkList.putAll(tapiAbstractFactory.getTapiLinks());
277 Name name = new NameBuilder().setValue(TapiStringConstants.T0_MULTILAYER).setValueName("TAPI Topology Name")
279 LOG.info("TOPOABSTRACTED : the list of node is as follows {}", tapiNodeList.toString());
280 this.tapiSips.putAll(tapiAbstractFactory.getTapiSips());
281 return new org.opendaylight.yang.gen.v1.urn
282 .onf.otcc.yang.tapi.topology.rev221121.topology.context.TopologyBuilder()
283 .setName(Map.of(name.key(), name)).setUuid(topoUuid).setNode(tapiNodeList)
284 .setLayerProtocolName(Set.of(LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.DIGITALOTN))
285 .setLink(tapiLinkList)
289 public org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.Topology
290 createAbsTopologyFromTapiTopo() throws TapiTopologyException {
291 Uuid refTopoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
292 .getBytes(Charset.forName("UTF-8"))).toString());
293 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.Topology tapiFullTopo =
295 .getTopologyContext().entrySet().stream().filter(topo -> topo.getKey().getUuid().equals(refTopoUuid))
296 .findAny().orElseThrow().getValue();
297 ConvertTapiTopoToAbstracted absTapiTopo = new ConvertTapiTopoToAbstracted(refTopoUuid);
298 absTapiTopo.setTapiLinks(tapiFullTopo.getLink());
299 absTapiTopo.setTapiNodes(tapiFullTopo.getNode());
300 absTapiTopo.convertRoadmInfrastructure();
302 Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
303 tapiNodeList = new HashMap<>();
304 Map<LinkKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link>
305 tapiLinkList = new HashMap<>();
306 tapiNodeList.putAll(absTapiTopo.getTapiNodes());
307 tapiLinkList.putAll(absTapiTopo.getTapiLinks());
308 Name name = new NameBuilder()
309 .setValue(TapiStringConstants.T0_MULTILAYER)
310 .setValueName("TAPI Topology Name")
312 Uuid topoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_TAPI_MULTILAYER
313 .getBytes(Charset.forName("UTF-8"))).toString());
314 LOG.info("ABSTRACTED TAPI TOPOLOGY : the list of node is as follows {}", tapiNodeList);
315 return new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context
317 .setName(Map.of(name.key(), name))
319 .setNode(tapiNodeList)
320 .setLayerProtocolName(Set.of(LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.DIGITALOTN))
321 .setLink(tapiLinkList)
325 private Network readTopology(InstanceIdentifier<Network> networkIID) throws TapiTopologyException {
326 Network topology = null;
327 ListenableFuture<Optional<Network>> topologyFuture = networkTransactionService
328 .read(LogicalDatastoreType.CONFIGURATION, networkIID);
330 topology = topologyFuture.get().orElseThrow();
331 } catch (InterruptedException e) {
332 Thread.currentThread().interrupt();
333 throw new TapiTopologyException("Unable to get from mdsal topology: "
334 + networkIID.firstKeyOf(Network.class).getNetworkId().getValue(), e);
335 } catch (ExecutionException e) {
336 throw new TapiTopologyException("Unable to get from mdsal topology: "
337 + networkIID.firstKeyOf(Network.class).getNetworkId().getValue(), e);
342 private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node createTapiNode(
343 List<OwnedNodeEdgePoint> nepList, Uuid topoUuid) {
344 Name name = new NameBuilder().setValueName("Tpdr100g node name").setValue("Tpdr100g over WDM node").build();
345 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = new HashMap<>();
346 for (OwnedNodeEdgePoint ownedNodeEdgePoint : nepList) {
347 onepMap.put(ownedNodeEdgePoint.key(), ownedNodeEdgePoint);
349 Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(name.getValue().getBytes(Charset.forName("UTF-8"))).toString());
350 return new NodeBuilder().setUuid(nodeUuid).setName(Map.of(name.key(), name))
351 .setLayerProtocolName(Set.of(LayerProtocolName.ETH))
352 .setAdministrativeState(AdministrativeState.UNLOCKED).setOperationalState(OperationalState.ENABLED)
353 .setLifecycleState(LifecycleState.INSTALLED).setOwnedNodeEdgePoint(onepMap)
354 .setNodeRuleGroup(createNodeRuleGroupFor100gTpdrNode(topoUuid, nodeUuid, nepList)).build();
357 private boolean checkTp(String nodeIdTopo, String nodeIdPortMap, TerminationPoint tp, List<Link> xpdOut,
360 if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERCLIENT)) {
361 networkLcp = tp.augmentation(
362 org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1.class)
363 .getAssociatedConnectionMapTp().iterator().next().getValue();
365 networkLcp = tp.getTpId().getValue();
368 KeyedInstanceIdentifier<Mapping, MappingKey> pmIID = InstanceIdentifier.create(
369 org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.Network.class)
370 .child(Nodes.class, new NodesKey(nodeIdPortMap)).child(Mapping.class, new MappingKey(networkLcp));
371 ListenableFuture<Optional<Mapping>> mappingOpt = networkTransactionService
372 .read(LogicalDatastoreType.CONFIGURATION, pmIID);
373 Mapping mapping = null;
374 if (mappingOpt.isDone()) {
376 mapping = mappingOpt.get().orElseThrow();
377 } catch (InterruptedException | ExecutionException e) {
378 LOG.error("Error getting mapping for {}", networkLcp, e);
382 LOG.error("Impossible to get mapping of associated network port {} of tp {}", networkLcp,
383 tp.getTpId().getValue());
386 String networkPortDirection = mapping.getPortDirection();
388 switch (networkPortDirection) {
389 case "bidirectional":
390 count += xpdOut.stream().filter(lk -> lk.getSource().getSourceNode().getValue().equals(nodeIdTopo)
391 && lk.getSource().getSourceTp().getValue().equals(networkLcp)).count();
392 count += xpdIn.stream().filter(lk -> lk.getDestination().getDestNode().getValue().equals(nodeIdTopo)
393 && lk.getDestination().getDestTp().getValue().equals(networkLcp)).count();
398 String partnerLcp = mapping.getPartnerLcp();
399 if (mapping.getPortQual().equals("tx")) {
400 count += xpdOut.stream().filter(lk -> lk.getSource().getSourceNode().getValue().equals(nodeIdTopo)
401 && lk.getSource().getSourceTp().getValue().equals(networkLcp)).count();
402 count += xpdIn.stream().filter(lk -> lk.getDestination().getDestNode().getValue().equals(nodeIdTopo)
403 && lk.getDestination().getDestTp().getValue().equals(partnerLcp)).count();
405 if (mapping.getPortQual().equals("rx")) {
406 count += xpdIn.stream().filter(lk -> lk.getDestination().getDestNode().getValue().equals(nodeIdTopo)
407 && lk.getDestination().getDestTp().getValue().equals(networkLcp)).count();
408 count += xpdOut.stream().filter(lk -> lk.getSource().getSourceNode().getValue().equals(nodeIdTopo)
409 && lk.getSource().getSourceTp().getValue().equals(partnerLcp)).count();
413 LOG.error("Invalid port direction for {}", networkLcp);
418 private Map<NodeRuleGroupKey, NodeRuleGroup> createNodeRuleGroupFor100gTpdrNode(Uuid topoUuid, Uuid nodeUuid,
419 Collection<OwnedNodeEdgePoint> onepl) {
421 Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePointKey,
422 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePoint> nepMap
424 for (OwnedNodeEdgePoint onep : onepl) {
425 var nep = new org.opendaylight.yang.gen.v1.urn
426 .onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePointBuilder()
427 .setTopologyUuid(topoUuid)
428 .setNodeUuid(nodeUuid)
429 .setNodeEdgePointUuid(onep.key().getUuid())
431 nepMap.put(nep.key(), nep);
433 Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupMap = new HashMap<>();
434 Map<RuleKey, Rule> ruleList = new HashMap<>();
435 Set<RuleType> ruleTypes = new HashSet<>();
436 ruleTypes.add(RuleType.FORWARDING);
437 Rule rule = new RuleBuilder().setLocalId("forward").setForwardingRule(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE)
438 .setRuleType(ruleTypes).build();
439 ruleList.put(rule.key(), rule);
440 NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder().setUuid(new Uuid(
441 UUID.nameUUIDFromBytes(("rdm infra node rule group").getBytes(Charset.forName("UTF-8"))).toString()))
442 .setRule(ruleList).setNodeEdgePoint(nepMap).build();
443 nodeRuleGroupMap.put(nodeRuleGroup.key(), nodeRuleGroup);
444 return nodeRuleGroupMap;