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.topology;
10 import java.nio.charset.Charset;
11 import java.util.HashMap;
12 import java.util.List;
15 import java.util.UUID;
16 import java.util.stream.Collectors;
17 import org.opendaylight.transportpce.tapi.TapiStringConstants;
18 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
19 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.AdministrativeState;
20 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
21 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LifecycleState;
22 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState;
23 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
24 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name;
25 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameBuilder;
26 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameKey;
27 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePoint;
28 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointKey;
29 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroup;
30 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroupKey;
31 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePoint;
32 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointKey;
33 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.RiskParameterPacBuilder;
34 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristic;
35 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristicBuilder;
36 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link;
37 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkKey;
38 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node;
39 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeBuilder;
40 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey;
41 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristic;
42 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristicBuilder;
43 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristic;
44 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristicBuilder;
45 import org.slf4j.Logger;
46 import org.slf4j.LoggerFactory;
49 public class ConvertTapiTopoToAbstracted {
51 private static final Logger LOG = LoggerFactory.getLogger(ConvertTapiTopoToAbstracted.class);
52 private Map<NodeKey, Node> tapiNodes;
53 private Map<LinkKey, Link> tapiLinks;
54 private Map<ServiceInterfacePointKey, ServiceInterfacePoint> tapiSips;
55 private Uuid refTopoUuid;
57 public ConvertTapiTopoToAbstracted(Uuid reftopoUuid) {
58 this.tapiNodes = new HashMap<>();
59 this.tapiLinks = new HashMap<>();
60 this.tapiSips = new HashMap<>();
61 this.refTopoUuid = reftopoUuid;
64 public void convertRoadmInfrastructure() {
65 LOG.info("abstraction of the ROADM infrastructure towards a photonic node");
66 Uuid nodeUuid = new Uuid(
67 UUID.nameUUIDFromBytes(TapiStringConstants.RDM_INFRA.getBytes(Charset.forName("UTF-8"))).toString());
69 new NameBuilder().setValueName("otsi node name").setValue(TapiStringConstants.RDM_INFRA).build();
71 new NameBuilder().setValueName("Node Type").setValue(OpenroadmNodeType.ROADM.getName()).build();
72 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = pruneTapiRoadmNeps();
73 var tapiFactory = new ConvertORToTapiTopology(this.refTopoUuid);
74 Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupMap =
75 tapiFactory.createAllNodeRuleGroupForRdmNode("Abstracted", nodeUuid, null, onepMap.values());
76 // Empty random creation of mandatory fields for avoiding errors....
77 CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
78 .setCostAlgorithm("Restricted Shortest Path - RSP")
79 .setCostName("HOP_COUNT")
80 .setCostValue(TapiStringConstants.COST_HOP_VALUE)
82 LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
83 .setFixedLatencyCharacteristic(TapiStringConstants.FIXED_LATENCY_VALUE)
84 .setQueuingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
85 .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
86 .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
87 .setTrafficPropertyName("FIXED_LATENCY")
89 RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
90 .setRiskCharacteristicName("risk characteristic")
91 .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
93 // build RDM infra node abstraction
94 Node rdmNode = new NodeBuilder()
96 .setName(Map.of(nodeName.key(), nodeName, nameNodeType.key(), nameNodeType))
97 .setLayerProtocolName(Set.of(LayerProtocolName.PHOTONICMEDIA))
98 .setAdministrativeState(AdministrativeState.UNLOCKED)
99 .setOperationalState(OperationalState.ENABLED)
100 .setLifecycleState(LifecycleState.INSTALLED)
101 .setOwnedNodeEdgePoint(onepMap)
102 .setNodeRuleGroup(nodeRuleGroupMap)
104 tapiFactory.createInterRuleGroupForRdmNode(
105 "Abstracted", nodeUuid, null,
106 nodeRuleGroupMap.entrySet().stream().map(e -> e.getKey()).collect(Collectors.toList())))
107 .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
108 .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
109 .setRiskParameterPac(new RiskParameterPacBuilder()
110 .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
114 tapiNodes.put(rdmNode.key(), rdmNode);
118 private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> pruneTapiRoadmNeps() {
119 List<Node> tapiPhotonicNodes = this.tapiNodes.values().stream()
120 .filter(n -> n.getLayerProtocolName().contains(LayerProtocolName.PHOTONICMEDIA)
121 && !n.getLayerProtocolName().contains(LayerProtocolName.DIGITALOTN)
122 && !n.getLayerProtocolName().contains(LayerProtocolName.DSR)
123 && !n.getLayerProtocolName().contains(LayerProtocolName.ODU))
124 .collect(Collectors.toList());
125 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = new HashMap<>();
126 for (Node node : tapiPhotonicNodes) {
127 for (Map.Entry<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> entry : node.getOwnedNodeEdgePoint().entrySet()) {
128 var valStream = entry.getValue().getName().values().stream();
129 if ((valStream.filter(name -> name.getValueName().equals("PHOTONIC_MEDIA_OTSNodeEdgePoint")).count() > 0
130 && valStream.filter(name -> name.getValue().contains("DEG")).count() == 0)
131 || (valStream.filter(name -> name.getValueName().equals("OTSI_MCNodeEdgePoint")).count() > 0
132 && valStream.filter(name -> name.getValue().contains("DEG")).count() == 0)) {
133 onepMap.put(entry.getKey(), entry.getValue());
140 private void purgeTapiLinks() {
141 this.tapiLinks = this.tapiLinks.values().stream()
142 .filter(l -> l.getName().containsKey(new NameKey(TapiStringConstants.VALUE_NAME_OTS_XPDR_RDM_LINK))
143 || l.getName().containsKey(new NameKey(TapiStringConstants.VALUE_NAME_OTN_XPDR_XPDR_LINK)))
144 .collect(Collectors.toMap(Link::key, link -> link));
147 private void purgeTapiNodes() {
148 this.tapiNodes = this.tapiNodes.values().stream()
149 .filter(n -> !n.getName().containsKey(new NameKey(TapiStringConstants.VALUE_NAME_ROADM_NODE)))
150 .collect(Collectors.toMap(Node::key, node -> node));
154 public void setTapiNodes(Map<NodeKey, Node> nodeMap) {
155 this.tapiNodes.putAll(nodeMap);
158 public Map<NodeKey, Node> getTapiNodes() {
162 public void setTapiLinks(Map<LinkKey, Link> linkMap) {
163 this.tapiLinks.putAll(linkMap);
166 public Map<LinkKey, Link> getTapiLinks() {
170 public Map<ServiceInterfacePointKey, ServiceInterfacePoint> getTapiSips() {
174 public void setTapiSips(Map<ServiceInterfacePointKey, ServiceInterfacePoint> tapiSip) {
175 this.tapiSips.putAll(tapiSip);