Migration to TAPI 2.4 Step3
[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.NodeEdgePointKey;
41 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.link.ResilienceTypeBuilder;
42 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePoint;
43 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointKey;
44 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristic;
45 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristicBuilder;
46 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link;
47 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkBuilder;
48 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node;
49 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey;
50 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.Topology;
51 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.TopologyKey;
52 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristic;
53 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristicBuilder;
54 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristic;
55 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristicBuilder;
56 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.validation.pac.ValidationMechanism;
57 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.validation.pac.ValidationMechanismBuilder;
58 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
59 import org.opendaylight.yangtools.yang.common.Decimal64;
60 import org.osgi.service.component.annotations.Activate;
61 import org.osgi.service.component.annotations.Component;
62 import org.osgi.service.component.annotations.Reference;
63 import org.slf4j.Logger;
64 import org.slf4j.LoggerFactory;
65
66 @Component
67 public class TapiLinkImpl implements TapiLink {
68
69     private static final Logger LOG = LoggerFactory.getLogger(TapiLinkImpl.class);
70     private final NetworkTransactionService networkTransactionService;
71
72     @Activate
73     public TapiLinkImpl(@Reference NetworkTransactionService networkTransactionService) {
74         this.networkTransactionService = networkTransactionService;
75     }
76
77     public Link createTapiLink(String srcNodeid, String srcTpId, String dstNodeId, String dstTpId, String linkType,
78                                String srcNodeQual, String dstNodeQual, String srcTpQual, String dstTpQual,
79                                String adminState, String operState, Set<LayerProtocolName> layerProtoNameList,
80                                Set<String> transLayerNameList, Uuid tapiTopoUuid) {
81         Map<NodeEdgePointKey, NodeEdgePoint> nepList = new HashMap<>();
82         String sourceNodeKey = String.join("+", srcNodeid, srcNodeQual);
83         String sourceNepKey = String.join("+", srcNodeid, srcTpQual, srcTpId);
84         Uuid sourceUuidNode = new Uuid(UUID.nameUUIDFromBytes(sourceNodeKey.getBytes(Charset.forName("UTF-8")))
85             .toString());
86         Uuid sourceUuidTp = new Uuid(UUID.nameUUIDFromBytes(sourceNepKey.getBytes(Charset.forName("UTF-8")))
87             .toString());
88         String destNodeKey = String.join("+", dstNodeId, dstNodeQual);
89         String destNepKey = String.join("+", dstNodeId, dstTpQual, dstTpId);
90         String linkKey = String.join("to", sourceNepKey, destNepKey);
91         Uuid destUuidNode = new Uuid(UUID.nameUUIDFromBytes(destNodeKey.getBytes(Charset.forName("UTF-8"))).toString());
92         Uuid destUuidTp = new Uuid(UUID.nameUUIDFromBytes(destNepKey.getBytes(Charset.forName("UTF-8"))).toString());
93         NodeEdgePoint sourceNep = new NodeEdgePointBuilder()
94             .setTopologyUuid(tapiTopoUuid)
95             .setNodeUuid(sourceUuidNode)
96             .setNodeEdgePointUuid(sourceUuidTp)
97             .build();
98         nepList.put(sourceNep.key(), sourceNep);
99         NodeEdgePoint destNep = new NodeEdgePointBuilder()
100             .setTopologyUuid(tapiTopoUuid)
101             .setNodeUuid(destUuidNode)
102             .setNodeEdgePointUuid(destUuidTp)
103             .build();
104         nepList.put(destNep.key(), destNep);
105         NameBuilder linkName = new NameBuilder();
106         // TODO: variables for each type
107         switch (linkType) {
108             case TapiStringConstants.OMS_RDM_RDM_LINK:
109                 LOG.info("Roadm to roadm link");
110                 linkName
111                     .setValueName("OMS link name")
112                     .setValue(linkKey);
113                 break;
114             case TapiStringConstants.TRANSITIONAL_LINK:
115                 LOG.info("Transitional link");
116                 linkName
117                     .setValueName("transitional link name")
118                     .setValue(linkKey);
119                 break;
120             case TapiStringConstants.OMS_XPDR_RDM_LINK:
121                 LOG.info("Xpdr to roadm link");
122                 linkName
123                     .setValueName("XPDR-RDM link name")
124                     .setValue(linkKey);
125                 break;
126             case TapiStringConstants.OTN_XPDR_XPDR_LINK:
127                 LOG.info("OTN Xpdr to roadm link");
128                 linkName
129                     .setValueName("otn link name")
130                     .setValue(linkKey);
131                 break;
132             default:
133                 LOG.warn("Type {} not recognized", linkType);
134                 return null;
135         }
136         // Todo: common aspects of links and set all attributes
137         CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
138             .setCostAlgorithm("Restricted Shortest Path - RSP")
139             .setCostName("HOP_COUNT")
140             .setCostValue(TapiStringConstants.COST_HOP_VALUE)
141             .build();
142         LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
143             .setFixedLatencyCharacteristic(TapiStringConstants.FIXED_LATENCY_VALUE)
144             .setQueuingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
145             .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
146             .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
147             .setTrafficPropertyName("FIXED_LATENCY")
148             .build();
149         RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
150             .setRiskCharacteristicName("risk characteristic")
151             .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
152             .build();
153         ValidationMechanism validationMechanism = new ValidationMechanismBuilder()
154             .setValidationMechanism("validation mechanism")
155             .setValidationRobustness("validation robustness")
156             .setLayerProtocolAdjacencyValidated("layer protocol adjacency")
157             .build();
158         return new LinkBuilder()
159             .setUuid(new Uuid(
160                 UUID.nameUUIDFromBytes(linkKey.getBytes(Charset.forName("UTF-8"))).toString()))
161             .setName(Map.of(linkName.build().key(), linkName.build()))
162             .setTransitionedLayerProtocolName(transLayerNameList)
163             .setLayerProtocolName(layerProtoNameList)
164             .setNodeEdgePoint(nepList)
165             .setDirection(ForwardingDirection.BIDIRECTIONAL)
166             .setAvailableCapacity(new AvailableCapacityBuilder().setTotalSize(
167                     new TotalSizeBuilder().setUnit(CAPACITYUNITGBPS.VALUE).setValue(Decimal64.valueOf("100")).build())
168                 .build())
169             .setResilienceType(new ResilienceTypeBuilder().setProtectionType(ProtectionType.NOPROTECTION)
170                 .setRestorationPolicy(RestorationPolicy.NA)
171                 .build())
172             .setAdministrativeState(setTapiAdminState(adminState))
173             .setOperationalState(setTapiOperationalState(operState))
174             .setLifecycleState(LifecycleState.INSTALLED)
175             .setTotalPotentialCapacity(new TotalPotentialCapacityBuilder().setTotalSize(
176                     new TotalSizeBuilder().setUnit(CAPACITYUNITGBPS.VALUE).setValue(Decimal64.valueOf("100")).build())
177                 .build())
178             .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
179             .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
180             .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
181             .setErrorCharacteristic("error")
182             .setLossCharacteristic("loss")
183             .setRepeatDeliveryCharacteristic("repeat delivery")
184             .setDeliveryOrderCharacteristic("delivery order")
185             .setUnavailableTimeCharacteristic("unavailable time")
186             .setServerIntegrityProcessCharacteristic("server integrity process")
187             .setValidationMechanism(Map.of(validationMechanism.key(), validationMechanism))
188             .build();
189     }
190
191     @Override
192     public AdministrativeState setTapiAdminState(String adminState) {
193         if (adminState == null) {
194             return null;
195         }
196         return adminState.equals(AdminStates.InService.getName())
197             || adminState.equals(AdministrativeState.UNLOCKED.getName()) ? AdministrativeState.UNLOCKED
198                 : AdministrativeState.LOCKED;
199     }
200
201     @Override
202     public AdministrativeState setTapiAdminState(AdminStates adminState1, AdminStates adminState2) {
203         if (adminState1 == null || adminState2 == null) {
204             return null;
205         }
206         LOG.info("Admin state 1 = {}, andmin state 2 = {}", adminState1.getName(), adminState2.getName());
207         return AdminStates.InService.equals(adminState1) && AdminStates.InService.equals(adminState2)
208             ? AdministrativeState.UNLOCKED : AdministrativeState.LOCKED;
209     }
210
211     @Override
212     public OperationalState setTapiOperationalState(String operState) {
213         if (operState == null) {
214             return null;
215         }
216         return operState.equals("inService") || operState.equals(OperationalState.ENABLED.getName())
217             ? OperationalState.ENABLED : OperationalState.DISABLED;
218     }
219
220     @Override
221     public OperationalState setTapiOperationalState(State operState1, State operState2) {
222         if (operState1 == null || operState2 == null) {
223             return null;
224         }
225         return State.InService.equals(operState1) && State.InService.equals(operState2)
226             ? OperationalState.ENABLED : OperationalState.DISABLED;
227     }
228
229     @Override
230     public String getOperState(String srcNodeId, String destNodeId, String sourceTpId, String destTpId) {
231         Uuid tapiTopoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
232             .getBytes(Charset.forName("UTF-8"))).toString());
233         Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", srcNodeId,
234             TapiStringConstants.PHTNC_MEDIA).getBytes(Charset.forName("UTF-8"))).toString());
235         Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", srcNodeId,
236             TapiStringConstants.PHTNC_MEDIA_OTS, sourceTpId).getBytes(Charset.forName("UTF-8"))).toString());
237         InstanceIdentifier<OwnedNodeEdgePoint> onepIID = InstanceIdentifier.builder(Context.class)
238             .augmentation(Context1.class).child(TopologyContext.class)
239             .child(Topology.class, new TopologyKey(tapiTopoUuid)).child(Node.class, new NodeKey(nodeUuid))
240             .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(nepUuid))
241             .build();
242         Uuid node1Uuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", destNodeId,
243             TapiStringConstants.PHTNC_MEDIA).getBytes(Charset.forName("UTF-8"))).toString());
244         Uuid nep1Uuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", destNodeId,
245             TapiStringConstants.PHTNC_MEDIA_OTS, destTpId).getBytes(Charset.forName("UTF-8"))).toString());
246         InstanceIdentifier<OwnedNodeEdgePoint> onep1IID = InstanceIdentifier.builder(Context.class)
247             .augmentation(Context1.class).child(TopologyContext.class)
248             .child(Topology.class, new TopologyKey(tapiTopoUuid)).child(Node.class, new NodeKey(node1Uuid))
249             .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(nep1Uuid))
250             .build();
251         try {
252             Optional<OwnedNodeEdgePoint> optionalOnep = this.networkTransactionService.read(
253                 LogicalDatastoreType.OPERATIONAL, onepIID).get();
254             Optional<OwnedNodeEdgePoint> optionalOnep1 = this.networkTransactionService.read(
255                 LogicalDatastoreType.OPERATIONAL, onep1IID).get();
256             if (!optionalOnep.isPresent() || !optionalOnep1.isPresent()) {
257                 LOG.error("One of the 2 neps doesnt exist in the datastore: {} OR {}", nepUuid, nep1Uuid);
258                 return null;
259             }
260             return optionalOnep.orElseThrow().getOperationalState().equals(
261                         optionalOnep1.orElseThrow().getOperationalState())
262                 ? optionalOnep.orElseThrow().getOperationalState().getName() : OperationalState.DISABLED.getName();
263         } catch (InterruptedException | ExecutionException e) {
264             LOG.error("Failed getting Mapping data from portMapping",e);
265             return null;
266         }
267     }
268
269     @Override
270     public String getAdminState(String srcNodeId, String destNodeId, String sourceTpId, String destTpId) {
271         Uuid tapiTopoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
272             .getBytes(Charset.forName("UTF-8"))).toString());
273         Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", srcNodeId,
274             TapiStringConstants.PHTNC_MEDIA).getBytes(Charset.forName("UTF-8"))).toString());
275         Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", srcNodeId,
276             TapiStringConstants.PHTNC_MEDIA_OTS, sourceTpId).getBytes(Charset.forName("UTF-8"))).toString());
277         InstanceIdentifier<OwnedNodeEdgePoint> onepIID = InstanceIdentifier.builder(Context.class)
278             .augmentation(Context1.class).child(TopologyContext.class)
279             .child(Topology.class, new TopologyKey(tapiTopoUuid)).child(Node.class, new NodeKey(nodeUuid))
280             .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(nepUuid))
281             .build();
282         Uuid node1Uuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", destNodeId,
283             TapiStringConstants.PHTNC_MEDIA).getBytes(Charset.forName("UTF-8"))).toString());
284         Uuid nep1Uuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", destNodeId,
285             TapiStringConstants.PHTNC_MEDIA_OTS, destTpId).getBytes(Charset.forName("UTF-8"))).toString());
286         InstanceIdentifier<OwnedNodeEdgePoint> onep1IID = InstanceIdentifier.builder(Context.class)
287             .augmentation(Context1.class).child(TopologyContext.class)
288             .child(Topology.class, new TopologyKey(tapiTopoUuid)).child(Node.class, new NodeKey(node1Uuid))
289             .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(nep1Uuid))
290             .build();
291         try {
292             Optional<OwnedNodeEdgePoint> optionalOnep = this.networkTransactionService.read(
293                 LogicalDatastoreType.OPERATIONAL, onepIID).get();
294             Optional<OwnedNodeEdgePoint> optionalOnep1 = this.networkTransactionService.read(
295                 LogicalDatastoreType.OPERATIONAL, onep1IID).get();
296             if (!optionalOnep.isPresent() || !optionalOnep1.isPresent()) {
297                 LOG.error("One of the 2 neps doesnt exist in the datastore: {} OR {}", nepUuid, nep1Uuid);
298                 return null;
299             }
300             return optionalOnep.orElseThrow().getAdministrativeState().equals(
301                         optionalOnep1.orElseThrow().getAdministrativeState())
302                 ? optionalOnep.orElseThrow().getAdministrativeState().getName()
303                 : AdministrativeState.UNLOCKED.getName();
304         } catch (InterruptedException | ExecutionException e) {
305             LOG.error("Failed getting Mapping data from portMapping",e);
306             return null;
307         }
308     }
309 }