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.utils;
10 import java.nio.charset.Charset;
11 import java.util.HashMap;
13 import java.util.Optional;
15 import java.util.UUID;
16 import java.util.concurrent.ExecutionException;
17 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
18 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
19 import org.opendaylight.transportpce.tapi.TapiStringConstants;
20 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
21 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
22 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.AdministrativeState;
23 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.CAPACITYUNITGBPS;
24 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Context;
25 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.ForwardingDirection;
26 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
27 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LifecycleState;
28 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState;
29 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
30 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.capacity.TotalSizeBuilder;
31 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.capacity.pac.AvailableCapacityBuilder;
32 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.capacity.pac.TotalPotentialCapacityBuilder;
33 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameBuilder;
34 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.Context1;
35 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.ProtectionType;
36 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.RestorationPolicy;
37 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.context.TopologyContext;
38 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.link.NodeEdgePoint;
39 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.link.NodeEdgePointBuilder;
40 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.link.ResilienceTypeBuilder;
41 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePoint;
42 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointKey;
43 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristic;
44 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristicBuilder;
45 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link;
46 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkBuilder;
47 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node;
48 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey;
49 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.Topology;
50 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.TopologyKey;
51 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristic;
52 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristicBuilder;
53 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristic;
54 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristicBuilder;
55 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.validation.pac.ValidationMechanism;
56 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.validation.pac.ValidationMechanismBuilder;
57 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
58 import org.opendaylight.yangtools.yang.common.Decimal64;
59 import org.osgi.service.component.annotations.Activate;
60 import org.osgi.service.component.annotations.Component;
61 import org.osgi.service.component.annotations.Reference;
62 import org.slf4j.Logger;
63 import org.slf4j.LoggerFactory;
66 public class TapiLinkImpl implements TapiLink {
68 private static final Logger LOG = LoggerFactory.getLogger(TapiLinkImpl.class);
69 private final NetworkTransactionService networkTransactionService;
72 public TapiLinkImpl(@Reference NetworkTransactionService networkTransactionService) {
73 this.networkTransactionService = networkTransactionService;
76 public Link createTapiLink(
77 String srcNodeid, String srcTpId, String dstNodeId, String dstTpId,
79 String srcNodeQual, String dstNodeQual, String srcTpQual, String dstTpQual,
80 String adminState, String operState,
81 Set<LayerProtocolName> layerProtoNameList, Set<String> transLayerNameList,
83 String sourceNepKey = String.join("+", srcNodeid, srcTpQual, srcTpId);
84 String destNepKey = String.join("+", dstNodeId, dstTpQual, dstTpId);
85 String linkKey = String.join("to", sourceNepKey, destNepKey);
86 NodeEdgePoint sourceNep = new NodeEdgePointBuilder()
87 .setTopologyUuid(tapiTopoUuid)
89 new Uuid(UUID.nameUUIDFromBytes(
90 String.join("+", srcNodeid, srcNodeQual).getBytes(Charset.forName("UTF-8"))).toString()))
91 .setNodeEdgePointUuid(
92 new Uuid(UUID.nameUUIDFromBytes(sourceNepKey.getBytes(Charset.forName("UTF-8"))).toString()))
94 NodeEdgePoint destNep = new NodeEdgePointBuilder()
95 .setTopologyUuid(tapiTopoUuid)
97 new Uuid(UUID.nameUUIDFromBytes(
98 String.join("+", dstNodeId, dstNodeQual).getBytes(Charset.forName("UTF-8"))).toString()))
99 .setNodeEdgePointUuid(
100 new Uuid(UUID.nameUUIDFromBytes(destNepKey.getBytes(Charset.forName("UTF-8"))).toString()))
102 NameBuilder linkName = new NameBuilder();
103 // TODO: variables for each type
105 case TapiStringConstants.OMS_RDM_RDM_LINK:
106 LOG.info("Roadm to roadm link");
108 .setValueName(TapiStringConstants.VALUE_NAME_OMS_RDM_RDM_LINK)
111 case TapiStringConstants.TRANSITIONAL_LINK:
112 LOG.info("Transitional link");
114 .setValueName("transitional link name")
117 case TapiStringConstants.OMS_XPDR_RDM_LINK:
118 LOG.info(TapiStringConstants.VALUE_NAME_OTS_XPDR_RDM_LINK);
120 .setValueName("XPDR-RDM link name")
123 case TapiStringConstants.OTN_XPDR_XPDR_LINK:
124 LOG.info("OTN Xpdr to roadm link");
126 .setValueName(TapiStringConstants.VALUE_NAME_OTN_XPDR_XPDR_LINK)
130 LOG.warn("Type {} not recognized", linkType);
133 // Todo: common aspects of links and set all attributes
134 CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
135 .setCostAlgorithm("Restricted Shortest Path - RSP")
136 .setCostName("HOP_COUNT")
137 .setCostValue(TapiStringConstants.COST_HOP_VALUE)
139 LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
140 .setFixedLatencyCharacteristic(TapiStringConstants.FIXED_LATENCY_VALUE)
141 .setQueuingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
142 .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
143 .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
144 .setTrafficPropertyName("FIXED_LATENCY")
146 RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
147 .setRiskCharacteristicName("risk characteristic")
148 .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
150 ValidationMechanism validationMechanism = new ValidationMechanismBuilder()
151 .setValidationMechanism("validation mechanism")
152 .setValidationRobustness("validation robustness")
153 .setLayerProtocolAdjacencyValidated("layer protocol adjacency")
155 return new LinkBuilder()
157 UUID.nameUUIDFromBytes(linkKey.getBytes(Charset.forName("UTF-8"))).toString()))
158 .setName(Map.of(linkName.build().key(), linkName.build()))
159 .setTransitionedLayerProtocolName(transLayerNameList)
160 .setLayerProtocolName(layerProtoNameList)
162 new HashMap<>(Map.of(sourceNep.key(), sourceNep, destNep.key(), destNep)))
163 .setDirection(ForwardingDirection.BIDIRECTIONAL)
164 .setAvailableCapacity(new AvailableCapacityBuilder().setTotalSize(
165 new TotalSizeBuilder().setUnit(CAPACITYUNITGBPS.VALUE).setValue(Decimal64.valueOf("100")).build())
167 .setResilienceType(new ResilienceTypeBuilder().setProtectionType(ProtectionType.NOPROTECTION)
168 .setRestorationPolicy(RestorationPolicy.NA)
170 .setAdministrativeState(setTapiAdminState(adminState))
171 .setOperationalState(setTapiOperationalState(operState))
172 .setLifecycleState(LifecycleState.INSTALLED)
173 .setTotalPotentialCapacity(new TotalPotentialCapacityBuilder().setTotalSize(
174 new TotalSizeBuilder().setUnit(CAPACITYUNITGBPS.VALUE).setValue(Decimal64.valueOf("100")).build())
176 .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
177 .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
178 .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
179 .setErrorCharacteristic("error")
180 .setLossCharacteristic("loss")
181 .setRepeatDeliveryCharacteristic("repeat delivery")
182 .setDeliveryOrderCharacteristic("delivery order")
183 .setUnavailableTimeCharacteristic("unavailable time")
184 .setServerIntegrityProcessCharacteristic("server integrity process")
185 .setValidationMechanism(Map.of(validationMechanism.key(), validationMechanism))
190 public AdministrativeState setTapiAdminState(String adminState) {
191 if (adminState == null) {
194 return adminState.equals(AdminStates.InService.getName())
195 || adminState.equals(AdministrativeState.UNLOCKED.getName()) ? AdministrativeState.UNLOCKED
196 : AdministrativeState.LOCKED;
200 public AdministrativeState setTapiAdminState(AdminStates adminState1, AdminStates adminState2) {
201 if (adminState1 == null || adminState2 == null) {
204 LOG.info("Admin state 1 = {}, andmin state 2 = {}", adminState1.getName(), adminState2.getName());
205 return AdminStates.InService.equals(adminState1) && AdminStates.InService.equals(adminState2)
206 ? AdministrativeState.UNLOCKED : AdministrativeState.LOCKED;
210 public OperationalState setTapiOperationalState(String operState) {
211 if (operState == null) {
214 return operState.equals("inService") || operState.equals(OperationalState.ENABLED.getName())
215 ? OperationalState.ENABLED : OperationalState.DISABLED;
219 public OperationalState setTapiOperationalState(State operState1, State operState2) {
220 if (operState1 == null || operState2 == null) {
223 return State.InService.equals(operState1) && State.InService.equals(operState2)
224 ? OperationalState.ENABLED : OperationalState.DISABLED;
228 public String getOperState(String srcNodeId, String destNodeId, String sourceTpId, String destTpId) {
229 Uuid tapiTopoUuid = new Uuid(UUID.nameUUIDFromBytes(
230 TapiStringConstants.T0_FULL_MULTILAYER.getBytes(Charset.forName("UTF-8")))
232 Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
233 String.join("+", srcNodeId, TapiStringConstants.PHTNC_MEDIA_OTS, sourceTpId)
234 .getBytes(Charset.forName("UTF-8")))
237 Optional<OwnedNodeEdgePoint> optionalOnep = this.networkTransactionService.read(
238 LogicalDatastoreType.OPERATIONAL,
239 InstanceIdentifier.builder(Context.class)
240 .augmentation(Context1.class)
241 .child(TopologyContext.class)
242 .child(Topology.class, new TopologyKey(tapiTopoUuid))
243 .child(Node.class, new NodeKey(
244 new Uuid(UUID.nameUUIDFromBytes(
245 String.join("+", srcNodeId, TapiStringConstants.PHTNC_MEDIA)
246 .getBytes(Charset.forName("UTF-8")))
248 .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(nepUuid))
251 if (optionalOnep.isEmpty()) {
252 LOG.error("Nep {} does not exist in the datastore", nepUuid);
255 Uuid nep1Uuid = new Uuid(UUID.nameUUIDFromBytes(
256 String.join("+", destNodeId, TapiStringConstants.PHTNC_MEDIA_OTS, destTpId)
257 .getBytes(Charset.forName("UTF-8")))
259 Optional<OwnedNodeEdgePoint> optionalOnep1 = this.networkTransactionService.read(
260 LogicalDatastoreType.OPERATIONAL,
261 InstanceIdentifier.builder(Context.class)
262 .augmentation(Context1.class)
263 .child(TopologyContext.class)
264 .child(Topology.class, new TopologyKey(tapiTopoUuid))
265 .child(Node.class, new NodeKey(
266 new Uuid(UUID.nameUUIDFromBytes(
267 String.join("+", destNodeId, TapiStringConstants.PHTNC_MEDIA)
268 .getBytes(Charset.forName("UTF-8")))
270 .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(nep1Uuid))
273 if (optionalOnep1.isEmpty()) {
274 LOG.error("Nep {} does not exist in the datastore", nep1Uuid);
277 OperationalState onepOperState = optionalOnep.orElseThrow().getOperationalState();
278 return onepOperState.equals(optionalOnep1.orElseThrow().getOperationalState())
279 ? onepOperState.getName() : OperationalState.DISABLED.getName();
280 } catch (InterruptedException | ExecutionException e) {
281 LOG.error("Failed getting Mapping data from portMapping",e);
287 public String getAdminState(String srcNodeId, String destNodeId, String sourceTpId, String destTpId) {
288 Uuid tapiTopoUuid = new Uuid(UUID.nameUUIDFromBytes(
289 TapiStringConstants.T0_FULL_MULTILAYER.getBytes(Charset.forName("UTF-8")))
291 Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
292 String.join("+", srcNodeId, TapiStringConstants.PHTNC_MEDIA_OTS, sourceTpId)
293 .getBytes(Charset.forName("UTF-8")))
296 Optional<OwnedNodeEdgePoint> optionalOnep = this.networkTransactionService.read(
297 LogicalDatastoreType.OPERATIONAL,
298 InstanceIdentifier.builder(Context.class)
299 .augmentation(Context1.class)
300 .child(TopologyContext.class)
301 .child(Topology.class, new TopologyKey(tapiTopoUuid))
302 .child(Node.class, new NodeKey(
304 new Uuid(UUID.nameUUIDFromBytes(
305 String.join("+", srcNodeId, TapiStringConstants.PHTNC_MEDIA)
306 .getBytes(Charset.forName("UTF-8")))
308 .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(nepUuid))
311 if (optionalOnep.isEmpty()) {
312 LOG.error("Nep {} does not exist in the datastore", nepUuid);
315 Uuid nep1Uuid = new Uuid(UUID.nameUUIDFromBytes(
316 String.join("+", destNodeId, TapiStringConstants.PHTNC_MEDIA_OTS, destTpId)
317 .getBytes(Charset.forName("UTF-8")))
319 Optional<OwnedNodeEdgePoint> optionalOnep1 = this.networkTransactionService.read(
320 LogicalDatastoreType.OPERATIONAL,
321 InstanceIdentifier.builder(Context.class)
322 .augmentation(Context1.class)
323 .child(TopologyContext.class)
324 .child(Topology.class, new TopologyKey(tapiTopoUuid))
325 .child(Node.class, new NodeKey(
327 new Uuid(UUID.nameUUIDFromBytes(
328 String.join("+", destNodeId, TapiStringConstants.PHTNC_MEDIA)
329 .getBytes(Charset.forName("UTF-8")))
331 .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(nep1Uuid))
334 if (optionalOnep1.isEmpty()) {
335 LOG.error("Nep {} does not exist in the datastore", nep1Uuid);
338 AdministrativeState onepAdminState = optionalOnep.orElseThrow().getAdministrativeState();
339 return onepAdminState.equals(optionalOnep1.orElseThrow().getAdministrativeState())
340 ? onepAdminState.getName() : AdministrativeState.UNLOCKED.getName();
341 } catch (InterruptedException | ExecutionException e) {
342 LOG.error("Failed getting Mapping data from portMapping",e);