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