fix deprecated openroadm interfaces/objects
[transportpce.git] / renderer / src / main / java / org / opendaylight / transportpce / renderer / NetworkModelWavelengthServiceImpl.java
1 /*
2  * Copyright © 2017 AT&T and others.  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.renderer;
9
10 import java.math.BigDecimal;
11 import java.util.ArrayList;
12 import java.util.List;
13 import java.util.Optional;
14 import java.util.concurrent.ExecutionException;
15 import java.util.concurrent.TimeUnit;
16 import java.util.concurrent.TimeoutException;
17 import java.util.stream.Collectors;
18 import org.opendaylight.mdsal.binding.api.DataBroker;
19 import org.opendaylight.mdsal.binding.api.ReadTransaction;
20 import org.opendaylight.mdsal.binding.api.WriteTransaction;
21 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
22 import org.opendaylight.transportpce.common.NetworkUtils;
23 import org.opendaylight.transportpce.common.Timeouts;
24 import org.opendaylight.transportpce.common.fixedflex.FixedFlexImpl;
25 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev181130.FrequencyGHz;
26 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev181130.FrequencyTHz;
27 import org.opendaylight.yang.gen.v1.http.org.openroadm.degree.rev181130.degree.node.attributes.AvailableWavelengthsKey;
28 import org.opendaylight.yang.gen.v1.http.org.openroadm.degree.rev181130.degree.used.wavelengths.UsedWavelengths;
29 import org.opendaylight.yang.gen.v1.http.org.openroadm.degree.rev181130.degree.used.wavelengths.UsedWavelengthsBuilder;
30 import org.opendaylight.yang.gen.v1.http.org.openroadm.degree.rev181130.degree.used.wavelengths.UsedWavelengthsKey;
31 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.Node1;
32 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.Node1Builder;
33 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.TerminationPoint1;
34 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.TerminationPoint1Builder;
35 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.node.DegreeAttributes;
36 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.node.DegreeAttributesBuilder;
37 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.node.SrgAttributes;
38 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.node.SrgAttributesBuilder;
39 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.node.termination.point.CpAttributes;
40 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.node.termination.point.CpAttributesBuilder;
41 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.node.termination.point.CtpAttributes;
42 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.node.termination.point.CtpAttributesBuilder;
43 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.node.termination.point.PpAttributes;
44 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.node.termination.point.PpAttributesBuilder;
45 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.node.termination.point.RxTtpAttributes;
46 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.node.termination.point.RxTtpAttributesBuilder;
47 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.node.termination.point.TxTtpAttributes;
48 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.node.termination.point.TxTtpAttributesBuilder;
49 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.node.termination.point.XpdrClientAttributes;
50 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.node.termination.point.XpdrNetworkAttributes;
51 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.node.termination.point.XpdrNetworkAttributesBuilder;
52 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.node.termination.point.XpdrPortAttributes;
53 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.node.termination.point.XpdrPortAttributesBuilder;
54 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.node.termination.point.pp.attributes.UsedWavelength;
55 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.node.termination.point.pp.attributes.UsedWavelengthBuilder;
56 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.node.termination.point.pp.attributes.UsedWavelengthKey;
57 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev181130.OpenroadmTpType;
58 import org.opendaylight.yang.gen.v1.http.org.openroadm.srg.rev181130.srg.node.attributes.AvailableWavelengthsBuilder;
59 import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev181130.xpdr.port.connection.attributes.Wavelength;
60 import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev181130.xpdr.port.connection.attributes.WavelengthBuilder;
61 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev171017.PathDescription;
62 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev171017.path.description.atoz.direction.AToZ;
63 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev171017.path.description.ztoa.direction.ZToA;
64 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev171017.pce.resource.resource.resource.TerminationPoint;
65 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
66 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
67 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
68 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
69 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey;
70 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
71 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeKey;
72 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
73 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointKey;
74 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
75 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
76 import org.slf4j.Logger;
77 import org.slf4j.LoggerFactory;
78
79 public class NetworkModelWavelengthServiceImpl implements NetworkModelWavelengthService {
80
81     private static final Logger LOG = LoggerFactory.getLogger(NetworkModelWavelengthServiceImpl.class);
82     private final DataBroker dataBroker;
83
84     public NetworkModelWavelengthServiceImpl(DataBroker dataBroker) {
85         this.dataBroker = dataBroker;
86     }
87
88     @Override
89     public void useWavelengths(PathDescription pathDescription) {
90
91         List<NodeIdPair> atozTpIds = getAToZTpList(pathDescription);
92         List<NodeIdPair> ztoaTpIds = getZToATpList(pathDescription);
93
94         deleteAvailableWL(atozTpIds.stream().map(NodeIdPair::getNodeID).distinct().collect(Collectors.toList()),
95                 pathDescription.getAToZDirection().getAToZWavelengthNumber());
96         deleteAvailableWL(ztoaTpIds.stream().map(NodeIdPair::getNodeID).distinct().collect(Collectors.toList()),
97                 pathDescription.getZToADirection().getZToAWavelengthNumber());
98
99         addUsedWL(pathDescription.getAToZDirection().getAToZWavelengthNumber(), atozTpIds);
100         addUsedWL(pathDescription.getZToADirection().getZToAWavelengthNumber(), ztoaTpIds);
101     }
102
103     @Override
104     public void freeWavelengths(PathDescription pathDescription) {
105         List<NodeIdPair> atozTpIds = getAToZTpList(pathDescription);
106         List<NodeIdPair> ztoaTpIds = getZToATpList(pathDescription);
107
108         deleteUsedWL(pathDescription.getAToZDirection().getAToZWavelengthNumber(), atozTpIds);
109         deleteUsedWL(pathDescription.getZToADirection().getZToAWavelengthNumber(), ztoaTpIds);
110
111         addAvailableWL(atozTpIds.stream().map(NodeIdPair::getNodeID).distinct().collect(Collectors.toList()),
112                 pathDescription.getAToZDirection().getAToZWavelengthNumber());
113         addAvailableWL(ztoaTpIds.stream().map(NodeIdPair::getNodeID).distinct().collect(Collectors.toList()),
114                 pathDescription.getZToADirection().getZToAWavelengthNumber());
115     }
116
117     private List<NodeIdPair> getAToZTpList(PathDescription pathDescription) {
118         List<AToZ> atozList = pathDescription.getAToZDirection().getAToZ();
119         return atozList.stream()
120                 .filter(aToZ -> {
121                     if ((aToZ.getResource() == null) || (aToZ.getResource().getResource() == null)) {
122                         LOG.warn("Resource of AToZ node {} is null! Skipping this node!", aToZ.getId());
123                         return false;
124                     }
125                     return aToZ.getResource().getResource() instanceof TerminationPoint;
126                 }).map(aToZ -> {
127                     TerminationPoint tp = (TerminationPoint) aToZ.getResource().getResource();
128                     if ((tp == null) || (tp.getTpNodeId() == null) ||  (tp.getTpId() == null)) {
129                         LOG.warn("Termination point in AToZ node {} contains nulls! Skipping this node!", aToZ.getId());
130                         return null;
131                     }
132                     return new NodeIdPair(tp.getTpNodeId(), tp.getTpId());
133                 }).collect(Collectors.toList());
134     }
135
136     private List<NodeIdPair> getZToATpList(PathDescription pathDescription) {
137         List<ZToA> ztoaList = pathDescription.getZToADirection().getZToA();
138         return ztoaList.stream()
139                 .filter(zToA -> {
140                     if ((zToA.getResource() == null) || (zToA.getResource().getResource() == null)) {
141                         LOG.warn("Resource of ZToA node {} is null! Skipping this node!", zToA.getId());
142                         return false;
143                     }
144                     return zToA.getResource().getResource() instanceof TerminationPoint;
145                 }).map(zToA -> {
146                     TerminationPoint tp = (TerminationPoint) zToA.getResource().getResource();
147                     if ((tp == null) || (tp.getTpNodeId() == null) ||  (tp.getTpId() == null)) {
148                         LOG.warn("Termination point in ZToA node {} contains nulls! Skipping this node!", zToA.getId());
149                         return null;
150                     }
151                     return new NodeIdPair(tp.getTpNodeId(), tp.getTpId());
152                 }).collect(Collectors.toList());
153     }
154
155     private InstanceIdentifier<Node1> createNode1IID(String nodeId) {
156         return InstanceIdentifier
157                 .builder(Networks.class).child(Network.class, new NetworkKey(
158                 new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
159                 .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network
160                 .Node.class, new NodeKey(new NodeId(nodeId))).augmentation(Node1.class).build();
161     }
162
163     private InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130
164         .Node1> createNode2IID(String nodeId) {
165         return InstanceIdentifier
166                 .builder(Networks.class).child(Network.class, new NetworkKey(
167                 new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
168                 .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network
169                 .Node.class, new NodeKey(new NodeId(nodeId))).augmentation(org.opendaylight.yang.gen.v1.http.org
170                 .openroadm.common.network.rev181130.Node1.class).build();
171     }
172
173     private Optional<Node1> getNode1FromDatastore(String nodeId) {
174         InstanceIdentifier<Node1>
175                 nodeIID = createNode1IID(nodeId);
176         Optional<Node1> nodeOpt;
177         try (ReadTransaction nodeReadTx = this.dataBroker.newReadOnlyTransaction()) {
178             nodeOpt = nodeReadTx.read(LogicalDatastoreType.CONFIGURATION, nodeIID)
179                     .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS);
180         } catch (InterruptedException | ExecutionException | TimeoutException e) {
181             LOG.warn("Exception while getting node from {} topology!", NetworkUtils.OVERLAY_NETWORK_ID, e);
182             nodeOpt = Optional.empty();
183         }
184         return nodeOpt;
185     }
186
187     private Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130
188         .Node1> getNode2FromDatastore(String nodeId) {
189         InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1>
190                 nodeIID = createNode2IID(nodeId);
191         Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1> nodeOpt;
192         try (ReadTransaction nodeReadTx = this.dataBroker.newReadOnlyTransaction()) {
193             nodeOpt = nodeReadTx.read(LogicalDatastoreType.CONFIGURATION, nodeIID)
194                     .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS);
195         } catch (InterruptedException | ExecutionException | TimeoutException e) {
196             LOG.warn("Exception while getting node from {} topology!", NetworkUtils.OVERLAY_NETWORK_ID, e);
197             nodeOpt = Optional.empty();
198         }
199         return nodeOpt;
200     }
201
202     private void addAvailableWL(List<String> nodeIds, Long wavelengthNumber) {
203         WriteTransaction nodeWriteTx = this.dataBroker.newWriteOnlyTransaction();
204         for (String nodeId : nodeIds) {
205             Optional<Node1> node1Opt = getNode1FromDatastore(nodeId);
206             Node1 node1;
207             Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1> node2Opt =
208                 getNode2FromDatastore(nodeId);
209             org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1 node2;
210             if (node2Opt.isPresent()) {
211                 node2 = node2Opt.get();
212             } else {
213                 LOG.error("Unable to get common-network node {} from topology {}! Skipping addition of available"
214                     + "wavelength for this node.", nodeId, NetworkUtils.OVERLAY_NETWORK_ID);
215                 continue;
216             }
217             if (node1Opt.isPresent()) {
218                 node1 = node1Opt.get();
219             } else {
220                 LOG.error("Unable to get network-topology node {} from topology {}! Skipping addition of available"
221                     + "wavelength for this node.", nodeId, NetworkUtils.OVERLAY_NETWORK_ID);
222                 continue;
223             }
224
225             Node1Builder node1Builder = new Node1Builder(node1);
226
227             switch (node2.getNodeType()) {
228                 case DEGREE:
229                     DegreeAttributes degreeAttributes = node1.getDegreeAttributes();
230                     DegreeAttributesBuilder degreeAttributesBuilder;
231                     if (degreeAttributes == null) {
232                         degreeAttributesBuilder = new DegreeAttributesBuilder();
233                     } else {
234                         degreeAttributesBuilder = new DegreeAttributesBuilder(degreeAttributes);
235                     }
236                     List<org.opendaylight.yang.gen.v1.http.org.openroadm.degree.rev181130.degree.node.attributes
237                             .AvailableWavelengths> availableDegreeWLs =
238                             degreeAttributesBuilder.getAvailableWavelengths();
239                     if (availableDegreeWLs == null) {
240                         availableDegreeWLs = new ArrayList<>();
241                         degreeAttributesBuilder.setAvailableWavelengths(availableDegreeWLs);
242                     }
243                     availableDegreeWLs.add(new org.opendaylight.yang.gen.v1.http.org.openroadm.degree.rev181130.degree
244                             .node.attributes.AvailableWavelengthsBuilder().setIndex(wavelengthNumber).build());
245                     node1Builder.setDegreeAttributes(degreeAttributesBuilder.build());
246                     break;
247                 case SRG:
248                     SrgAttributes srgAttributes = node1.getSrgAttributes();
249                     SrgAttributesBuilder srgAttributesBuilder;
250                     if (srgAttributes == null) {
251                         srgAttributesBuilder = new SrgAttributesBuilder();
252                     } else {
253                         srgAttributesBuilder = new SrgAttributesBuilder(srgAttributes);
254                     }
255                     List<org.opendaylight.yang.gen.v1.http.org.openroadm.srg.rev181130.srg.node.attributes
256                             .AvailableWavelengths> availableSrgWLs = srgAttributesBuilder.getAvailableWavelengths();
257                     if (availableSrgWLs == null) {
258                         availableSrgWLs = new ArrayList<>();
259                         srgAttributesBuilder.setAvailableWavelengths(availableSrgWLs);
260                     }
261                     availableSrgWLs.add(new AvailableWavelengthsBuilder().setIndex(wavelengthNumber).build());
262                     node1Builder.setSrgAttributes(srgAttributesBuilder.build());
263                     break;
264
265                 default:
266                     // TODO skip for now
267                     continue;
268             }
269             nodeWriteTx.put(LogicalDatastoreType.CONFIGURATION, createNode1IID(nodeId), node1Builder.build());
270         }
271         try {
272             nodeWriteTx.commit().get(Timeouts.DATASTORE_DELETE, TimeUnit.MILLISECONDS);
273         } catch (InterruptedException | ExecutionException | TimeoutException e) {
274             LOG.error("Unable to add available WL {} for nodes {}!", wavelengthNumber, String.join(", ", nodeIds), e);
275         }
276     }
277
278     private void deleteAvailableWL(List<String> nodeIds, Long wavelengthNumber) {
279         WriteTransaction nodeWriteTx = this.dataBroker.newWriteOnlyTransaction();
280         for (String nodeId : nodeIds) {
281             Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1> nodeOpt =
282                 getNode2FromDatastore(nodeId);
283             org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1 node;
284             if (nodeOpt.isPresent()) {
285                 node = nodeOpt.get();
286             } else {
287                 LOG.error(
288                     "Unable to get node {} from topology {}! Skipping addition of available wavelength for this node.",
289                          nodeId, NetworkUtils.OVERLAY_NETWORK_ID);
290                 continue;
291             }
292
293             InstanceIdentifierBuilder<Node1> nodeIIDBuilder = InstanceIdentifier.builder(Networks.class)
294                 .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
295                 .child(Node.class, new NodeKey(new NodeId(nodeId))).augmentation(Node1.class);
296             InstanceIdentifier availableWlIID;
297
298             switch (node.getNodeType()) {
299             //switch (((org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Node1) node)
300             //        .getNodeType()) {
301                 case DEGREE:
302                     availableWlIID = nodeIIDBuilder.child(DegreeAttributes.class)
303                             .child(org.opendaylight.yang.gen.v1.http.org.openroadm.degree.rev181130.degree.node
304                                     .attributes.AvailableWavelengths.class,
305                                     new AvailableWavelengthsKey(wavelengthNumber))
306                             .build();
307                     break;
308                 case SRG:
309                     availableWlIID = nodeIIDBuilder.child(SrgAttributes.class)
310                             .child(org.opendaylight.yang.gen.v1.http.org.openroadm.srg.rev181130.srg.node.attributes
311                                             .AvailableWavelengths.class,
312                                     new org.opendaylight.yang.gen.v1.http.org.openroadm.srg.rev181130.srg.node
313                                             .attributes.AvailableWavelengthsKey(wavelengthNumber))
314                             .build();
315                     break;
316
317                 default:
318                     // TODO skip for now
319                     continue;
320             }
321             nodeWriteTx.delete(LogicalDatastoreType.CONFIGURATION, availableWlIID);
322         }
323         try {
324             nodeWriteTx.commit().get(Timeouts.DATASTORE_DELETE, TimeUnit.MILLISECONDS);
325         } catch (InterruptedException | ExecutionException | TimeoutException e) {
326             LOG.error("Unable to delete available WL {} for nodes {}!", wavelengthNumber, String.join(", ", nodeIds),
327                     e);
328         }
329     }
330
331     private InstanceIdentifierBuilder<TerminationPoint1> createTerminationPoint1IIDBuilder(String nodeId, String tpId) {
332         return InstanceIdentifier
333                 .builder(Networks.class).child(Network.class, new NetworkKey(
334                 new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml
335                 .ns.yang.ietf.network.rev180226.networks.network.Node.class, new NodeKey(new NodeId(nodeId)))
336                 .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
337                 .Node1.class).child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology
338                 .rev180226.networks.network.node.TerminationPoint.class, new TerminationPointKey(new TpId(tpId)))
339                 .augmentation(TerminationPoint1.class);
340     }
341
342     private InstanceIdentifierBuilder<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130
343         .TerminationPoint1> createTerminationPoint2IIDBuilder(String nodeId, String tpId) {
344         return InstanceIdentifier
345                 .builder(Networks.class).child(Network.class, new NetworkKey(
346                 new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml
347                 .ns.yang.ietf.network.rev180226.networks.network.Node.class, new NodeKey(new NodeId(nodeId)))
348                 .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
349                 .Node1.class).child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology
350                 .rev180226.networks.network.node.TerminationPoint.class, new TerminationPointKey(new TpId(tpId)))
351                 .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130
352                     .TerminationPoint1.class);
353     }
354
355     private Optional<TerminationPoint1> getTerminationPoint1FromDatastore(String nodeId, String tpId) {
356         InstanceIdentifier<TerminationPoint1> tpIID = createTerminationPoint1IIDBuilder(nodeId, tpId).build();
357         Optional<TerminationPoint1> tpOpt;
358         try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
359             tpOpt = readTx.read(LogicalDatastoreType.CONFIGURATION, tpIID)
360                     .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS);
361         } catch (InterruptedException | ExecutionException | TimeoutException e) {
362             LOG.warn("Exception while getting termination point from {} topology!", NetworkUtils.OVERLAY_NETWORK_ID,
363                     e);
364             tpOpt = Optional.empty();
365         }
366         return tpOpt;
367     }
368
369     private Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130
370         .TerminationPoint1> getTerminationPoint2FromDatastore(String nodeId, String tpId) {
371         InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130
372             .TerminationPoint1> tpIID = createTerminationPoint2IIDBuilder(nodeId, tpId).build();
373         Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.TerminationPoint1> tpOpt;
374         try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
375             tpOpt = readTx.read(LogicalDatastoreType.CONFIGURATION, tpIID)
376                     .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS);
377         } catch (InterruptedException | ExecutionException | TimeoutException e) {
378             LOG.warn("Exception while getting termination point from {} topology!", NetworkUtils.OVERLAY_NETWORK_ID,
379                     e);
380             tpOpt = Optional.empty();
381         }
382         return tpOpt;
383     }
384
385     private void deleteUsedWL(long wavelengthIndex, List<NodeIdPair> tpIds) {
386         WriteTransaction deleteUsedWlTx = this.dataBroker.newWriteOnlyTransaction();
387         for (NodeIdPair idPair : tpIds) {
388             Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130
389                 .TerminationPoint1> tp2Opt = getTerminationPoint2FromDatastore(idPair.getNodeID(), idPair.getTpID());
390
391             OpenroadmTpType tpType;
392             if (tp2Opt.isPresent()) {
393                 tpType = tp2Opt.get().getTpType();
394                 //    ((org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.TerminationPoint1)
395                 //        tpOpt.get()).getTpType();
396             } else {
397                 LOG.error("Unable to get termination point {} from topology {}! Skipping removal of used wavelength"
398                         + " for this node.", idPair.getTpID(), NetworkUtils.OVERLAY_NETWORK_ID);
399                 continue;
400             }
401             InstanceIdentifier.InstanceIdentifierBuilder<TerminationPoint1> usedWlIIDBuilder =
402                     createTerminationPoint1IIDBuilder(idPair.getNodeID(), idPair.getTpID());
403             InstanceIdentifier usedWlIID;
404             switch (tpType) {
405                 case DEGREETXTTP:
406                 case DEGREETXRXTTP:
407                     usedWlIID = usedWlIIDBuilder.child(TxTtpAttributes.class).child(UsedWavelengths.class,
408                             new UsedWavelengthsKey(wavelengthIndex)).build();
409                     break;
410
411                 case DEGREERXTTP:
412                     usedWlIID = usedWlIIDBuilder.child(RxTtpAttributes.class).child(UsedWavelengths.class,
413                             new UsedWavelengthsKey(wavelengthIndex)).build();
414                     break;
415
416                 case DEGREETXCTP:
417                 case DEGREERXCTP:
418                 case DEGREETXRXCTP:
419                     usedWlIID = usedWlIIDBuilder.child(CtpAttributes.class).child(UsedWavelengths.class,
420                             new UsedWavelengthsKey(wavelengthIndex)).build();
421                     break;
422
423                 case SRGTXCP:
424                 case SRGRXCP:
425                 case SRGTXRXCP:
426                     usedWlIID = usedWlIIDBuilder.child(CpAttributes.class).child(org.opendaylight.yang.gen.v1.http.org
427                         .openroadm.network.topology.rev181130.networks.network.node.termination.point.cp.attributes
428                         .UsedWavelengths.class, new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology
429                         .rev181130.networks.network.node.termination.point.cp.attributes
430                         .UsedWavelengthsKey(wavelengthIndex)).build();
431                     break;
432
433                 case SRGTXRXPP:
434                 case SRGRXPP:
435                 case SRGTXPP:
436                     usedWlIID = usedWlIIDBuilder.child(PpAttributes.class).child(UsedWavelength.class,
437                             new UsedWavelengthKey(wavelengthIndex)).build();
438                     break;
439
440                 case XPONDERNETWORK:
441                     usedWlIID = usedWlIIDBuilder.child(XpdrNetworkAttributes.class).child(Wavelength.class).build();
442                     break;
443                 case XPONDERCLIENT:
444                     usedWlIID = usedWlIIDBuilder.child(XpdrClientAttributes.class).child(Wavelength.class).build();
445                     break;
446                 case XPONDERPORT:
447                     usedWlIID = usedWlIIDBuilder.child(XpdrPortAttributes.class).child(Wavelength.class).build();
448                     break;
449
450                 default:
451                     // TODO skip for now
452                     continue;
453             }
454             deleteUsedWlTx.delete(LogicalDatastoreType.CONFIGURATION, usedWlIID);
455         }
456         try {
457             deleteUsedWlTx.commit().get(Timeouts.DATASTORE_DELETE, TimeUnit.MILLISECONDS);
458         } catch (InterruptedException | ExecutionException | TimeoutException e) {
459             List<String> tpIdsString = tpIds.stream().map(NodeIdPair::toString).collect(Collectors.toList());
460             LOG.error("Unable to delete used WL {} from TPs {}!", wavelengthIndex, String.join(", ", tpIdsString), e);
461         }
462     }
463
464     private void addUsedWL(long wavelengthIndex, List<NodeIdPair> tpIds) {
465         WriteTransaction addUsedWlTx = this.dataBroker.newWriteOnlyTransaction();
466         FixedFlexImpl fixedFlex = new FixedFlexImpl(wavelengthIndex);
467         FrequencyTHz centralTHz = new FrequencyTHz(new BigDecimal(fixedFlex.getCenterFrequency()));
468         for (NodeIdPair idPair : tpIds) {
469             Optional<TerminationPoint1> tp1Opt =
470                 getTerminationPoint1FromDatastore(idPair.getNodeID(), idPair.getTpID());
471             TerminationPoint1 tp1 = null;
472             Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130
473                 .TerminationPoint1> tp2Opt = getTerminationPoint2FromDatastore(idPair.getNodeID(), idPair.getTpID());
474             org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.TerminationPoint1 tp2;
475             if (tp2Opt.isPresent()) {
476                 tp2 = tp2Opt.get();
477             } else {
478                 LOG.error(
479                     "Unable to get common-network termination point {} from topology {}! Skip removal of used"
480                     + "wavelength for the node", idPair.getTpID(), NetworkUtils.OVERLAY_NETWORK_ID);
481                 continue;
482             }
483             TerminationPoint1Builder tp1Builder;
484             if (tp1Opt.isPresent()) {
485                 tp1 = tp1Opt.get();
486                 tp1Builder = new TerminationPoint1Builder(tp1);
487             } else {
488                 tp1Builder = new TerminationPoint1Builder();
489             }
490
491             switch (tp2.getTpType()) {
492             //switch (((org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.TerminationPoint1) tp)
493             //        .getTpType()) {
494                 case DEGREETXTTP:
495                 case DEGREETXRXTTP:
496                     TxTtpAttributes txTtpAttributes = null;
497                     if (tp1 != null) {
498                         txTtpAttributes = tp1.getTxTtpAttributes();
499                     }
500                     TxTtpAttributesBuilder txTtpAttributesBuilder;
501                     if (txTtpAttributes == null) {
502                         txTtpAttributesBuilder = new TxTtpAttributesBuilder();
503                     } else {
504                         txTtpAttributesBuilder = new TxTtpAttributesBuilder(txTtpAttributes);
505                     }
506                     List<UsedWavelengths> usedDegreeTxTtpWls = txTtpAttributesBuilder.getUsedWavelengths();
507                     if (usedDegreeTxTtpWls == null) {
508                         usedDegreeTxTtpWls = new ArrayList<>();
509                         txTtpAttributesBuilder.setUsedWavelengths(usedDegreeTxTtpWls);
510                     }
511                     usedDegreeTxTtpWls.add(new UsedWavelengthsBuilder().setIndex(wavelengthIndex)
512                         .setFrequency(centralTHz).setWidth(FrequencyGHz.getDefaultInstance("40")).build());
513                     tp1Builder.setTxTtpAttributes(txTtpAttributesBuilder.build());
514                     break;
515
516                 case DEGREERXTTP:
517                     RxTtpAttributes rxTtpAttributes = null;
518                     if (tp1 != null) {
519                         rxTtpAttributes = tp1.getRxTtpAttributes();
520                     }
521                     RxTtpAttributesBuilder rxTtpAttributesBuilder;
522                     if (rxTtpAttributes == null) {
523                         rxTtpAttributesBuilder = new RxTtpAttributesBuilder();
524                     } else {
525                         rxTtpAttributesBuilder = new RxTtpAttributesBuilder(rxTtpAttributes);
526                     }
527                     List<UsedWavelengths> usedDegreeRxTtpWls = rxTtpAttributesBuilder.getUsedWavelengths();
528                     if (usedDegreeRxTtpWls == null) {
529                         usedDegreeRxTtpWls = new ArrayList<>();
530                         rxTtpAttributesBuilder.setUsedWavelengths(usedDegreeRxTtpWls);
531                     }
532                     usedDegreeRxTtpWls.add(new UsedWavelengthsBuilder().setIndex(wavelengthIndex)
533                         .setFrequency(centralTHz).setWidth(FrequencyGHz.getDefaultInstance("40")).build());
534                     tp1Builder.setRxTtpAttributes(rxTtpAttributesBuilder.build());
535                     break;
536
537                 case DEGREETXCTP:
538                 case DEGREERXCTP:
539                 case DEGREETXRXCTP:
540                     CtpAttributes ctpAttributes = null;
541                     if (tp1 != null) {
542                         ctpAttributes = tp1.getCtpAttributes();
543                     }
544                     CtpAttributesBuilder ctpAttributesBuilder;
545                     if (ctpAttributes == null) {
546                         ctpAttributesBuilder = new CtpAttributesBuilder();
547                     } else {
548                         ctpAttributesBuilder = new CtpAttributesBuilder(ctpAttributes);
549                     }
550                     List<UsedWavelengths> usedDegreeCtpWls = ctpAttributesBuilder.getUsedWavelengths();
551                     if (usedDegreeCtpWls == null) {
552                         usedDegreeCtpWls = new ArrayList<>();
553                         ctpAttributesBuilder.setUsedWavelengths(usedDegreeCtpWls);
554                     }
555                     usedDegreeCtpWls.add(new UsedWavelengthsBuilder().setIndex(wavelengthIndex)
556                         .setFrequency(centralTHz).setWidth(FrequencyGHz.getDefaultInstance("40")).build());
557                     tp1Builder.setCtpAttributes(ctpAttributesBuilder.build());
558                     break;
559
560                 case SRGTXCP:
561                 case SRGRXCP:
562                 case SRGTXRXCP:
563                     CpAttributes cpAttributes = null;
564                     if (tp1 != null) {
565                         cpAttributes = tp1.getCpAttributes();
566                     }
567                     CpAttributesBuilder cpAttributesBuilder;
568                     if (cpAttributes == null) {
569                         cpAttributesBuilder = new CpAttributesBuilder();
570                     } else {
571                         cpAttributesBuilder = new CpAttributesBuilder(cpAttributes);
572                     }
573                     List<org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network
574                         .node.termination.point.cp.attributes.UsedWavelengths> usedDegreeCpWls = cpAttributesBuilder
575                         .getUsedWavelengths();
576                     if (usedDegreeCpWls == null) {
577                         usedDegreeCpWls = new ArrayList<>();
578                         cpAttributesBuilder.setUsedWavelengths(usedDegreeCpWls);
579                     }
580                     usedDegreeCpWls.add(new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130
581                             .networks.network.node.termination.point.cp.attributes.UsedWavelengthsBuilder()
582                             .setIndex(wavelengthIndex)
583                             .setFrequency(centralTHz).setWidth(FrequencyGHz.getDefaultInstance("40")).build());
584                     tp1Builder.setCpAttributes(cpAttributesBuilder.build());
585                     break;
586
587                 case SRGTXRXPP:
588                 case SRGRXPP:
589                 case SRGTXPP:
590                     PpAttributes ppAttributes = null;
591                     if (tp1 != null) {
592                         ppAttributes = tp1.getPpAttributes();
593                     }
594                     PpAttributesBuilder ppAttributesBuilder;
595                     if (ppAttributes == null) {
596                         ppAttributesBuilder = new PpAttributesBuilder();
597                     } else {
598                         ppAttributesBuilder = new PpAttributesBuilder(ppAttributes);
599                     }
600                     List<UsedWavelength> usedDegreePpWls = ppAttributesBuilder.getUsedWavelength();
601                     if (usedDegreePpWls == null) {
602                         usedDegreePpWls = new ArrayList<>();
603                         ppAttributesBuilder.setUsedWavelength(usedDegreePpWls);
604                     }
605                     usedDegreePpWls.add(new UsedWavelengthBuilder().setIndex(wavelengthIndex)
606                         .setFrequency(centralTHz).setWidth(FrequencyGHz.getDefaultInstance("40")).build());
607                     tp1Builder.setPpAttributes(ppAttributesBuilder.build());
608                     break;
609
610                 case XPONDERNETWORK:
611                     XpdrNetworkAttributes xpdrNetworkAttributes = null;
612                     if (tp1 != null) {
613                         xpdrNetworkAttributes = tp1.getXpdrNetworkAttributes();
614                     }
615                     XpdrNetworkAttributesBuilder xpdrNetworkAttributesBuilder;
616                     if (xpdrNetworkAttributes == null) {
617                         xpdrNetworkAttributesBuilder = new XpdrNetworkAttributesBuilder();
618                     } else {
619                         xpdrNetworkAttributesBuilder = new XpdrNetworkAttributesBuilder(xpdrNetworkAttributes);
620                     }
621                     Wavelength usedXpdrNetworkWl = new WavelengthBuilder()
622                         .setWidth(FrequencyGHz.getDefaultInstance("40")).setFrequency(centralTHz).build();
623                     tp1Builder.setXpdrNetworkAttributes(xpdrNetworkAttributesBuilder.setWavelength(usedXpdrNetworkWl)
624                         .build());
625                     break;
626                 case XPONDERCLIENT:
627                     break;
628                 case XPONDERPORT:
629                     XpdrPortAttributes xpdrPortAttributes = null;
630                     if (tp1 != null) {
631                         xpdrPortAttributes = tp1.getXpdrPortAttributes();
632                     }
633                     XpdrPortAttributesBuilder xpdrPortAttributesBuilder;
634                     if (xpdrPortAttributes == null) {
635                         xpdrPortAttributesBuilder = new XpdrPortAttributesBuilder();
636                     } else {
637                         xpdrPortAttributesBuilder = new XpdrPortAttributesBuilder(xpdrPortAttributes);
638                     }
639                     Wavelength usedXpdrPortWl = new WavelengthBuilder().setWidth(FrequencyGHz.getDefaultInstance("40"))
640                         .setFrequency(centralTHz).build();
641                     tp1Builder.setXpdrPortAttributes(xpdrPortAttributesBuilder.setWavelength(usedXpdrPortWl)
642                         .build());
643                     break;
644
645                 default:
646                     // TODO skip for now
647                     continue;
648             }
649             addUsedWlTx.put(LogicalDatastoreType.CONFIGURATION, createTerminationPoint1IIDBuilder(idPair.getNodeID(),
650                     idPair.getTpID()).build(), tp1Builder.build());
651         }
652         try {
653             addUsedWlTx.commit().get(Timeouts.DATASTORE_WRITE, TimeUnit.MILLISECONDS);
654         } catch (InterruptedException | ExecutionException | TimeoutException e) {
655             List<String> tpIdsString = tpIds.stream().map(NodeIdPair::toString).collect(Collectors.toList());
656             LOG.error("Unable to add used WL {} for TPs {}!", wavelengthIndex, String.join(", ", tpIdsString), e);
657         }
658     }
659 }