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.InterRuleGroup;
30 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.InterRuleGroupKey;
31 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroup;
32 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroupKey;
33 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePoint;
34 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointKey;
35 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.RiskParameterPac;
36 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.RiskParameterPacBuilder;
37 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristic;
38 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristicBuilder;
39 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link;
40 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkKey;
41 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node;
42 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeBuilder;
43 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey;
44 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristic;
45 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristicBuilder;
46 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristic;
47 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristicBuilder;
48 import org.slf4j.Logger;
49 import org.slf4j.LoggerFactory;
52 public class ConvertTapiTopoToAbstracted {
54 private static final Logger LOG = LoggerFactory.getLogger(ConvertTapiTopoToAbstracted.class);
55 private Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
57 private Map<LinkKey, Link> tapiLinks;
58 private Map<ServiceInterfacePointKey, ServiceInterfacePoint> tapiSips;
59 private Uuid refTopoUuid;
61 public ConvertTapiTopoToAbstracted(Uuid reftopoUuid) {
62 this.tapiNodes = new HashMap<>();
63 this.tapiLinks = new HashMap<>();
64 this.tapiSips = new HashMap<>();
65 this.refTopoUuid = reftopoUuid;
68 public void convertRoadmInfrastructure() {
69 LOG.info("abstraction of the ROADM infrastructure towards a photonic node");
70 Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.RDM_INFRA
71 .getBytes(Charset.forName("UTF-8"))).toString());
72 Name nodeName = new NameBuilder().setValueName("otsi node name").setValue(TapiStringConstants.RDM_INFRA)
74 Name nameNodeType = new NameBuilder().setValueName("Node Type")
75 .setValue(OpenroadmNodeType.ROADM.getName()).build();
76 Set<LayerProtocolName> nodeLayerProtocols = Set.of(LayerProtocolName.PHOTONICMEDIA);
77 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = pruneTapiRoadmNeps();
78 var tapiFactory = new ConvertORToTapiTopology(this.refTopoUuid);
79 Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupMap
80 = tapiFactory.createAllNodeRuleGroupForRdmNode("Abstracted", nodeUuid, null, onepMap.values());
81 Map<InterRuleGroupKey, InterRuleGroup> interRuleGroupMap
82 = tapiFactory.createInterRuleGroupForRdmNode("Abstracted", nodeUuid, null,
83 nodeRuleGroupMap.entrySet().stream().map(e -> e.getKey()).collect(Collectors.toList()));
84 // Empty random creation of mandatory fields for avoiding errors....
85 CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
86 .setCostAlgorithm("Restricted Shortest Path - RSP")
87 .setCostName("HOP_COUNT")
88 .setCostValue(TapiStringConstants.COST_HOP_VALUE)
90 LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
91 .setFixedLatencyCharacteristic(TapiStringConstants.FIXED_LATENCY_VALUE)
92 .setQueuingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
93 .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
94 .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
95 .setTrafficPropertyName("FIXED_LATENCY")
97 RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
98 .setRiskCharacteristicName("risk characteristic")
99 .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
101 RiskParameterPac riskParamPac = new RiskParameterPacBuilder()
102 .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
104 // build RDM infra node abstraction
105 Node rdmNode = new NodeBuilder()
107 .setName(Map.of(nodeName.key(), nodeName, nameNodeType.key(), nameNodeType))
108 .setLayerProtocolName(nodeLayerProtocols)
109 .setAdministrativeState(AdministrativeState.UNLOCKED)
110 .setOperationalState(OperationalState.ENABLED)
111 .setLifecycleState(LifecycleState.INSTALLED)
112 .setOwnedNodeEdgePoint(onepMap)
113 .setNodeRuleGroup(nodeRuleGroupMap)
114 .setInterRuleGroup(interRuleGroupMap)
115 .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
116 .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
117 .setRiskParameterPac(riskParamPac)
120 tapiNodes.put(rdmNode.key(), rdmNode);
124 private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> pruneTapiRoadmNeps() {
125 List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> tapiPhotonicNodes
126 = this.tapiNodes.values().stream()
127 .filter(n -> n.getLayerProtocolName().contains(LayerProtocolName.PHOTONICMEDIA)
128 && !n.getLayerProtocolName().contains(LayerProtocolName.DIGITALOTN)
129 && !n.getLayerProtocolName().contains(LayerProtocolName.DSR)
130 && !n.getLayerProtocolName().contains(LayerProtocolName.ODU))
131 .collect(Collectors.toList());
132 Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = new HashMap<>();
133 for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node node
134 : tapiPhotonicNodes) {
135 for (Map.Entry<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> entry : node.getOwnedNodeEdgePoint().entrySet()) {
136 if (entry.getValue().getName().values().stream()
137 .filter(name -> name.getValueName().equals("PHOTONIC_MEDIA_OTSNodeEdgePoint")).count() > 0
138 && !(entry.getValue().getName().values().stream()
139 .filter(name -> name.getValue().contains("DEG")).count() > 0)) {
140 onepMap.put(entry.getKey(), entry.getValue());
142 if (entry.getValue().getName().values().stream()
143 .filter(name -> name.getValueName().equals("OTSI_MCNodeEdgePoint")).count() > 0
144 && !(entry.getValue().getName().values().stream()
145 .filter(name -> name.getValue().contains("DEG")).count() > 0)) {
146 onepMap.put(entry.getKey(), entry.getValue());
153 private void purgeTapiLinks() {
154 this.tapiLinks = this.tapiLinks.values().stream()
155 .filter(l -> l.getName().containsKey(new NameKey(TapiStringConstants.VALUE_NAME_OTS_XPDR_RDM_LINK))
156 || l.getName().containsKey(new NameKey(TapiStringConstants.VALUE_NAME_OTN_XPDR_XPDR_LINK)))
157 .collect(Collectors.toMap(Link::key, link -> link));
160 private void purgeTapiNodes() {
161 this.tapiNodes = this.tapiNodes.values().stream()
162 .filter(n -> !n.getName().containsKey(new NameKey(TapiStringConstants.VALUE_NAME_ROADM_NODE)))
163 .collect(Collectors.toMap(Node::key, node -> node));
167 public void setTapiNodes(Map<NodeKey,
168 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> nodeMap) {
169 this.tapiNodes.putAll(nodeMap);
172 public Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
177 public void setTapiLinks(Map<LinkKey,
178 org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link> linkMap) {
179 this.tapiLinks.putAll(linkMap);
182 public Map<LinkKey, Link> getTapiLinks() {
186 public Map<ServiceInterfacePointKey, ServiceInterfacePoint> getTapiSips() {
190 public void setTapiSips(Map<ServiceInterfacePointKey, ServiceInterfacePoint> tapiSip) {
191 this.tapiSips.putAll(tapiSip);