Update release in docs/conf.yaml
[transportpce.git] / tapi / src / main / java / org / opendaylight / transportpce / tapi / utils / TapiLinkImpl.java
1 /*
2  * Copyright © 2021 Nokia.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.transportpce.tapi.utils;
9
10 import java.nio.charset.Charset;
11 import java.util.HashMap;
12 import java.util.Map;
13 import java.util.Optional;
14 import java.util.Set;
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;
64
65 @Component
66 public class TapiLinkImpl implements TapiLink {
67
68     private static final Logger LOG = LoggerFactory.getLogger(TapiLinkImpl.class);
69     private final NetworkTransactionService networkTransactionService;
70
71     @Activate
72     public TapiLinkImpl(@Reference NetworkTransactionService networkTransactionService) {
73         this.networkTransactionService = networkTransactionService;
74     }
75
76     public Link createTapiLink(
77             String srcNodeid, String srcTpId, String dstNodeId, String dstTpId,
78             String linkType,
79             String srcNodeQual, String dstNodeQual, String srcTpQual, String dstTpQual,
80             String adminState, String operState,
81             Set<LayerProtocolName> layerProtoNameList, Set<String> transLayerNameList,
82             Uuid tapiTopoUuid) {
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)
88             .setNodeUuid(
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()))
93             .build();
94         NodeEdgePoint destNep = new NodeEdgePointBuilder()
95             .setTopologyUuid(tapiTopoUuid)
96             .setNodeUuid(
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()))
101             .build();
102         NameBuilder linkName = new NameBuilder();
103         // TODO: variables for each type
104         switch (linkType) {
105             case TapiStringConstants.OMS_RDM_RDM_LINK:
106                 LOG.info("Roadm to roadm link");
107                 linkName
108                     .setValueName(TapiStringConstants.VALUE_NAME_OMS_RDM_RDM_LINK)
109                     .setValue(linkKey);
110                 break;
111             case TapiStringConstants.TRANSITIONAL_LINK:
112                 LOG.info("Transitional link");
113                 linkName
114                     .setValueName("transitional link name")
115                     .setValue(linkKey);
116                 break;
117             case TapiStringConstants.OMS_XPDR_RDM_LINK:
118                 LOG.info(TapiStringConstants.VALUE_NAME_OTS_XPDR_RDM_LINK);
119                 linkName
120                     .setValueName("XPDR-RDM link name")
121                     .setValue(linkKey);
122                 break;
123             case TapiStringConstants.OTN_XPDR_XPDR_LINK:
124                 LOG.info("OTN Xpdr to roadm link");
125                 linkName
126                     .setValueName(TapiStringConstants.VALUE_NAME_OTN_XPDR_XPDR_LINK)
127                     .setValue(linkKey);
128                 break;
129             default:
130                 LOG.warn("Type {} not recognized", linkType);
131                 return null;
132         }
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)
138             .build();
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")
145             .build();
146         RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
147             .setRiskCharacteristicName("risk characteristic")
148             .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
149             .build();
150         ValidationMechanism validationMechanism = new ValidationMechanismBuilder()
151             .setValidationMechanism("validation mechanism")
152             .setValidationRobustness("validation robustness")
153             .setLayerProtocolAdjacencyValidated("layer protocol adjacency")
154             .build();
155         return new LinkBuilder()
156             .setUuid(new Uuid(
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)
161             .setNodeEdgePoint(
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())
166                 .build())
167             .setResilienceType(new ResilienceTypeBuilder().setProtectionType(ProtectionType.NOPROTECTION)
168                 .setRestorationPolicy(RestorationPolicy.NA)
169                 .build())
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())
175                 .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))
186             .build();
187     }
188
189     @Override
190     public AdministrativeState setTapiAdminState(String adminState) {
191         if (adminState == null) {
192             return null;
193         }
194         return adminState.equals(AdminStates.InService.getName())
195             || adminState.equals(AdministrativeState.UNLOCKED.getName()) ? AdministrativeState.UNLOCKED
196                 : AdministrativeState.LOCKED;
197     }
198
199     @Override
200     public AdministrativeState setTapiAdminState(AdminStates adminState1, AdminStates adminState2) {
201         if (adminState1 == null || adminState2 == null) {
202             return null;
203         }
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;
207     }
208
209     @Override
210     public OperationalState setTapiOperationalState(String operState) {
211         if (operState == null) {
212             return null;
213         }
214         return operState.equals("inService") || operState.equals(OperationalState.ENABLED.getName())
215             ? OperationalState.ENABLED : OperationalState.DISABLED;
216     }
217
218     @Override
219     public OperationalState setTapiOperationalState(State operState1, State operState2) {
220         if (operState1 == null || operState2 == null) {
221             return null;
222         }
223         return State.InService.equals(operState1) && State.InService.equals(operState2)
224             ? OperationalState.ENABLED : OperationalState.DISABLED;
225     }
226
227     @Override
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")))
231             .toString());
232         Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
233                 String.join("+", srcNodeId, TapiStringConstants.PHTNC_MEDIA_OTS, sourceTpId)
234                     .getBytes(Charset.forName("UTF-8")))
235             .toString());
236         try {
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")))
247                                 .toString())))
248                         .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(nepUuid))
249                         .build())
250                 .get();
251             if (optionalOnep.isEmpty()) {
252                 LOG.error("Nep {} does not exist in the datastore", nepUuid);
253                 return null;
254             }
255             Uuid nep1Uuid = new Uuid(UUID.nameUUIDFromBytes(
256                     String.join("+", destNodeId, TapiStringConstants.PHTNC_MEDIA_OTS, destTpId)
257                         .getBytes(Charset.forName("UTF-8")))
258                 .toString());
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")))
269                                 .toString())))
270                         .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(nep1Uuid))
271                         .build())
272                 .get();
273             if (optionalOnep1.isEmpty()) {
274                 LOG.error("Nep {} does not exist in the datastore", nep1Uuid);
275                 return null;
276             }
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);
282             return null;
283         }
284     }
285
286     @Override
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")))
290             .toString());
291         Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
292                 String.join("+", srcNodeId, TapiStringConstants.PHTNC_MEDIA_OTS, sourceTpId)
293                     .getBytes(Charset.forName("UTF-8")))
294             .toString());
295         try {
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(
303                             //nodeUuid
304                             new Uuid(UUID.nameUUIDFromBytes(
305                                     String.join("+", srcNodeId, TapiStringConstants.PHTNC_MEDIA)
306                                         .getBytes(Charset.forName("UTF-8")))
307                                 .toString())))
308                         .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(nepUuid))
309                         .build())
310                 .get();
311             if (optionalOnep.isEmpty()) {
312                 LOG.error("Nep {} does not exist in the datastore", nepUuid);
313                 return null;
314             }
315             Uuid nep1Uuid = new Uuid(UUID.nameUUIDFromBytes(
316                     String.join("+", destNodeId, TapiStringConstants.PHTNC_MEDIA_OTS, destTpId)
317                         .getBytes(Charset.forName("UTF-8")))
318                 .toString());
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(
326                             //node1Uuid
327                             new Uuid(UUID.nameUUIDFromBytes(
328                                     String.join("+", destNodeId, TapiStringConstants.PHTNC_MEDIA)
329                                         .getBytes(Charset.forName("UTF-8")))
330                                 .toString())))
331                         .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(nep1Uuid))
332                         .build())
333                 .get();
334             if (optionalOnep1.isEmpty()) {
335                 LOG.error("Nep {} does not exist in the datastore", nep1Uuid);
336                 return null;
337             }
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);
343             return null;
344         }
345     }
346 }