update portmapping YANG to store SAPI/DAPI hashmap
[transportpce.git] / olm / src / main / java / org / opendaylight / transportpce / olm / power / PowerMgmtImpl.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
9 package org.opendaylight.transportpce.olm.power;
10
11 import java.math.BigDecimal;
12 import java.util.HashMap;
13 import java.util.Map;
14 import java.util.Optional;
15 import org.opendaylight.mdsal.binding.api.DataBroker;
16 import org.opendaylight.transportpce.common.crossconnect.CrossConnect;
17 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
18 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
19 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaces;
20 import org.opendaylight.transportpce.olm.util.OlmUtils;
21 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev170418.ServicePowerSetupInput;
22 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev170418.ServicePowerTurndownInput;
23 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev200429.network.Nodes;
24 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev200429.network.nodes.Mapping;
25 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev200429.network.nodes.MappingKey;
26 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev200429.network.nodes.NodeInfo.OpenroadmVersion;
27 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.OpticalControlMode;
28 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.NodeTypes;
29 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfaces.grp.Interface;
30 import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev161014.Interface1;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
33
34 public class PowerMgmtImpl implements PowerMgmt {
35     private static final Logger LOG = LoggerFactory.getLogger(PowerMgmtImpl.class);
36     private final DataBroker db;
37     private final OpenRoadmInterfaces openRoadmInterfaces;
38     private final CrossConnect crossConnect;
39     private final DeviceTransactionManager deviceTransactionManager;
40
41     public PowerMgmtImpl(DataBroker db, OpenRoadmInterfaces openRoadmInterfaces,
42                          CrossConnect crossConnect, DeviceTransactionManager deviceTransactionManager) {
43         this.db = db;
44         this.openRoadmInterfaces = openRoadmInterfaces;
45         this.crossConnect = crossConnect;
46         this.deviceTransactionManager = deviceTransactionManager;
47     }
48
49     /**
50      * This methods measures power requirement for turning up a WL
51      * from the Spanloss at OTS transmit direction and update
52      * roadm-connection target-output-power.
53      *
54      * @param input
55      *            Input parameter from the olm servicePowerSetup rpc
56      *
57      * @return true/false based on status of operation.
58      */
59     //TODO Need to Case Optical Power mode/NodeType in case of 2.2 devices
60     //@SuppressFBwarnings("DM_CONVERT_CASE")
61     public Boolean setPower(ServicePowerSetupInput input) {
62         LOG.info("Olm-setPower initiated");
63         for (int i = 0; i < input.getNodes().size(); i++) {
64             String nodeId = input.getNodes().get(i).getNodeId();
65             String srcTpId =  input.getNodes().get(i).getSrcTp();
66             String destTpId = input.getNodes().get(i).getDestTp();
67             Optional<Nodes> inputNodeOptional = OlmUtils.getNode(nodeId, this.db);
68             // If node type is transponder
69             if (inputNodeOptional.isPresent()
70                     && (inputNodeOptional.get().getNodeInfo().getNodeType() != null)
71                     && inputNodeOptional.get().getNodeInfo().getNodeType().equals(NodeTypes.Xpdr)) {
72
73                 Nodes inputNode = inputNodeOptional.get();
74                 OpenroadmVersion openroadmVersion = inputNode.getNodeInfo().getOpenroadmVersion();
75                 LOG.info("Getting data from input node {}", inputNode.getNodeInfo().getNodeType());
76                 LOG.info("Getting mapping data for node is {}", inputNode.getMapping().stream().filter(o -> o.key()
77                         .equals(new MappingKey(destTpId))).findFirst().toString());
78                 // If its A-End transponder
79                 if (destTpId.toLowerCase().contains("network")) {
80                     java.util.Optional<Mapping> mappingObject = inputNode.getMapping().stream().filter(o -> o.key()
81                             .equals(new MappingKey(destTpId))).findFirst();
82                     if (mappingObject.isPresent()) {
83                         String circuitPackName = mappingObject.get().getSupportingCircuitPackName();
84                         String portName = mappingObject.get().getSupportingPort();
85                         Map<String, Double> txPowerRangeMap = new HashMap<>();
86                         if (openroadmVersion.getIntValue() == 1) {
87                             txPowerRangeMap = PowerMgmtVersion121.getXponderPowerRange(circuitPackName, portName,
88                                     nodeId, deviceTransactionManager);
89                         } else if (openroadmVersion.getIntValue() == 2) {
90                             txPowerRangeMap = PowerMgmtVersion221.getXponderPowerRange(circuitPackName, portName,
91                                     nodeId, deviceTransactionManager);
92                         }
93                         if (!txPowerRangeMap.isEmpty()) {
94                             LOG.info("Transponder range exists for nodeId: {}", nodeId);
95                             String srgId =  input.getNodes().get(i + 1).getSrcTp();
96                             String nextNodeId = input.getNodes().get(i + 1).getNodeId();
97                             Map<String, Double> rxSRGPowerRangeMap = new HashMap<>();
98                             Optional<Mapping> mappingObjectSRG = OlmUtils.getNode(nextNodeId, db)
99                                     .flatMap(node -> node.getMapping()
100                                             .stream().filter(o -> o.key()
101                                                     .equals(new MappingKey(srgId))).findFirst());
102                             if (mappingObjectSRG.isPresent()) {
103
104                                 if (openroadmVersion.getIntValue() == 1) {
105                                     rxSRGPowerRangeMap = PowerMgmtVersion121.getSRGRxPowerRange(nextNodeId, srgId,
106                                             deviceTransactionManager, mappingObjectSRG.get()
107                                             .getSupportingCircuitPackName(),
108                                             mappingObjectSRG.get().getSupportingPort());
109                                 } else if (openroadmVersion.getIntValue() == 2) {
110                                     rxSRGPowerRangeMap = PowerMgmtVersion221.getSRGRxPowerRange(nextNodeId, srgId,
111                                             deviceTransactionManager, mappingObjectSRG.get()
112                                             .getSupportingCircuitPackName(),
113                                             mappingObjectSRG.get().getSupportingPort());
114                                 }
115                             }
116                             double powerValue = 0;
117                             if (!rxSRGPowerRangeMap.isEmpty()) {
118                                 LOG.info("SRG Rx Power range exists for nodeId: {}", nodeId);
119                                 if (txPowerRangeMap.get("MaxTx")
120                                         <= rxSRGPowerRangeMap.get("MaxRx")) {
121                                     powerValue = txPowerRangeMap.get("MaxTx");
122                                 } else if (rxSRGPowerRangeMap.get("MaxRx")
123                                         < txPowerRangeMap.get("MaxTx")) {
124                                     powerValue = rxSRGPowerRangeMap.get("MaxRx");
125                                 }
126                                 LOG.info("Calculated Transponder Power value is {}" , powerValue);
127                                 String interfaceName = destTpId + "-" + input.getWaveNumber();
128                                 if (callSetTransponderPower(nodeId, interfaceName, new BigDecimal(powerValue),
129                                         openroadmVersion)) {
130                                     LOG.info("Transponder OCH connection: {} power updated ", interfaceName);
131                                     try {
132                                         LOG.info("Now going in sleep mode");
133                                         Thread.sleep(OlmUtils.OLM_TIMER_1);
134                                     } catch (InterruptedException e) {
135                                         LOG.info("Transponder warmup failed for OCH connection: {}", interfaceName, e);
136                                     }
137                                 } else {
138                                     LOG.info("Transponder OCH connection: {} power update failed ", interfaceName);
139                                 }
140                             } else {
141                                 LOG.info("SRG Power Range not found, setting the Transponder range to default");
142                                 String interfaceName = destTpId + "-" + input.getWaveNumber();
143                                 if (callSetTransponderPower(nodeId, interfaceName, new BigDecimal(-5),
144                                     openroadmVersion)) {
145                                     LOG.info("Transponder OCH connection: {} power updated ", interfaceName);
146                                     try {
147                                         Thread.sleep(OlmUtils.OLM_TIMER_1);
148                                     } catch (InterruptedException e) {
149                                         // TODO Auto-generated catch block
150                                         LOG.info("Transponder warmup failed for OCH connection: {}", interfaceName, e);
151                                     }
152                                 } else {
153                                     LOG.info("Transponder OCH connection: {} power update failed ", interfaceName);
154                                 }
155                             }
156                         } else {
157                             LOG.info("Tranponder range not available setting to default power for nodeId: {}", nodeId);
158                             String interfaceName = destTpId + "-" + input.getWaveNumber();
159                             if (callSetTransponderPower(nodeId, interfaceName, new BigDecimal(-5),openroadmVersion)) {
160                                 LOG.info("Transponder OCH connection: {} power updated ", interfaceName);
161                                 try {
162                                     Thread.sleep(OlmUtils.OLM_TIMER_1);
163                                 } catch (InterruptedException e) {
164                                     // TODO Auto-generated catch block
165                                     LOG.info("Transponder warmup failed for OCH connection: {}", interfaceName, e);
166                                 }
167                             } else {
168                                 LOG.info("Transponder OCH connection: {} power update failed ", interfaceName);
169                             }
170                         }
171                     } else {
172                         LOG.info("Mapping object not found for nodeId: {}", nodeId);
173                         return false;
174                     }
175                 } else {
176                     LOG.info("{} is a drop node. Net power settings needed", nodeId);
177                 }
178             } else if (inputNodeOptional.isPresent()
179                     && (inputNodeOptional.get().getNodeInfo().getNodeType() != null)
180                     && inputNodeOptional.get().getNodeInfo().getNodeType().equals(NodeTypes.Rdm)) {
181                 // If Degree is transmitting end then set power
182                 Nodes inputNode = inputNodeOptional.get();
183                 OpenroadmVersion openroadmVersion = inputNode.getNodeInfo().getOpenroadmVersion();
184                 LOG.info("This is a roadm {} device", openroadmVersion.getName());
185                 String connectionNumber = srcTpId + "-" + destTpId + "-" + input.getWaveNumber();
186                 LOG.info("Connection number is {}", connectionNumber);
187                 if (destTpId.toLowerCase().contains("deg")) {
188                     Optional<Mapping> mappingObjectOptional = inputNode.getMapping().stream().filter(o -> o.key()
189                             .equals(new MappingKey(destTpId))).findFirst();
190                     if (mappingObjectOptional.isPresent()) {
191                         BigDecimal spanLossTx = null;
192                         LOG.info("Dest point is Degree {}", mappingObjectOptional.get());
193                         Mapping portMapping = mappingObjectOptional.get();
194                         // debut reprise
195                         if (openroadmVersion.getIntValue() == 1) {
196                             Optional<Interface> interfaceOpt;
197                             try {
198                                 interfaceOpt =
199                                         this.openRoadmInterfaces.getInterface(nodeId, portMapping.getSupportingOts());
200                             } catch (OpenRoadmInterfaceException ex) {
201                                 LOG.error("Failed to get interface {} from node {}!", portMapping.getSupportingOts(),
202                                         nodeId, ex);
203                                 return false;
204                             } catch (IllegalArgumentException ex) {
205                                 LOG.error("Failed to get non existing interface {} from node {}!",
206                                     portMapping.getSupportingOts(), nodeId);
207                                 return false;
208                             }
209                             if (interfaceOpt.isPresent()) {
210                                 if (interfaceOpt.get().augmentation(Interface1.class).getOts()
211                                     .getSpanLossTransmit() != null) {
212                                     spanLossTx = interfaceOpt.get().augmentation(Interface1.class).getOts()
213                                             .getSpanLossTransmit().getValue();
214                                     LOG.info("Spanloss TX is {}", spanLossTx);
215                                 } else {
216                                     LOG.error("interface {} has no spanloss value", interfaceOpt.get().getName());
217                                 }
218                             } else {
219                                 LOG.error("Interface {} on node {} is not present!", portMapping.getSupportingOts(),
220                                     nodeId);
221                                 return false;
222                             }
223                         } else if (openroadmVersion.getIntValue() == 2) {
224                             Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces.grp
225                                 .Interface> interfaceOpt;
226                             try {
227                                 interfaceOpt =
228                                         this.openRoadmInterfaces.getInterface(nodeId, portMapping.getSupportingOts());
229                             } catch (OpenRoadmInterfaceException ex) {
230                                 LOG.error("Failed to get interface {} from node {}!", portMapping.getSupportingOts(),
231                                         nodeId, ex);
232                                 return false;
233                             } catch (IllegalArgumentException ex) {
234                                 LOG.error("Failed to get non existing interface {} from node {}!",
235                                     portMapping.getSupportingOts(), nodeId);
236                                 return false;
237                             }
238                             if (interfaceOpt.isPresent()) {
239                                 if (interfaceOpt.get().augmentation(org.opendaylight.yang.gen.v1.http.org
240                                         .openroadm.optical.transport.interfaces.rev181019.Interface1.class).getOts()
241                                         .getSpanLossTransmit() != null) {
242                                     spanLossTx = interfaceOpt.get().augmentation(org.opendaylight.yang.gen.v1.http.org
243                                             .openroadm.optical.transport.interfaces.rev181019.Interface1.class).getOts()
244                                             .getSpanLossTransmit().getValue();
245                                     LOG.info("Spanloss TX is {}", spanLossTx);
246                                 } else {
247                                     LOG.error("interface {} has no spanloss value", interfaceOpt.get().getName());
248                                 }
249                             } else {
250                                 LOG.error("Interface {} on node {} is not present!", portMapping.getSupportingOts(),
251                                     nodeId);
252                                 return false;
253                             }
254                         }
255
256                         BigDecimal powerValue =  null;
257                         if (spanLossTx != null &&  spanLossTx.intValue() <= 28 && spanLossTx.intValue() > 0) {
258                             powerValue = BigDecimal.valueOf(Math.min(spanLossTx.doubleValue() - 9, 2));
259                             LOG.info("Power Value is {}", powerValue);
260                         } else if (spanLossTx.intValue() > 28) {
261                             LOG.error(
262                                 "Power Value is null - spanLossTx > 28dB not compliant with openROADM specifications");
263                             return false;
264                         } else if (spanLossTx.intValue() <= 0) {
265                             LOG.error(
266                                 "Power Value is null - spanLossTx <= 0 dB not compliant with openROADM specifications");
267                             return false;
268                         } else {
269                             LOG.error("Power Value is null - spanLossTx is null");
270                             return false;
271                         }
272                         try {
273                             Boolean setXconnPowerSuccessVal = crossConnect.setPowerLevel(nodeId,
274                                 OpticalControlMode.Power.getName(), powerValue, connectionNumber);
275                             LOG.info("Success Value is {}", setXconnPowerSuccessVal);
276                             if (setXconnPowerSuccessVal) {
277                                 LOG.info("Roadm-connection: {} updated ", connectionNumber);
278                                 //The value recommended by the white paper is 20 seconds and not 60.
279                                 //TODO - commented code because one vendor is not supporting
280                                 //GainLoss with target-output-power
281                                 Thread.sleep(OlmUtils.OLM_TIMER_1);
282                                 crossConnect.setPowerLevel(nodeId, OpticalControlMode.GainLoss.getName(), powerValue,
283                                         connectionNumber);
284                             } else {
285                                 LOG.info("Set Power failed for Roadm-connection: {} on Node: {}", connectionNumber,
286                                         nodeId);
287                                 return false;
288                             }
289                         } catch (InterruptedException e) {
290                             LOG.error("Olm-setPower wait failed :", e);
291                             return false;
292                         }
293                     }
294                     // If Drop node leave node is power mode
295                 } else if (destTpId.toLowerCase().contains("srg")) {
296                     LOG.info("Setting power at drop node");
297                     crossConnect.setPowerLevel(nodeId, OpticalControlMode.Power.getName(), null, connectionNumber);
298                 }
299             } else {
300                 LOG.error("OLM-PowerMgmtImpl : Error with node type for node {}", nodeId);
301             }
302         }
303         return true;
304     }
305
306     /**
307      * This methods turns down power a WL by performing
308      * following steps:
309      *
310      * <p>
311      * 1. Pull interfaces used in service and change
312      * status to outOfService
313      *
314      * <p>
315      * 2. For each of the ROADM node set target-output-power
316      * to -60dbm, wait for 20 seconds, turn power mode to off
317      *
318      * <p>
319      * 3. Turn down power in Z to A direction and A to Z
320      *
321      * @param input
322      *            Input parameter from the olm servicePowerTurndown rpc
323      *
324      * @return true/false based on status of operation
325      */
326     public Boolean powerTurnDown(ServicePowerTurndownInput input) {
327         LOG.info("Olm-powerTurnDown initiated");
328         /*Starting with last element into the list Z -> A for
329           turning down A -> Z */
330         for (int i = input.getNodes().size() - 1; i >= 0; i--) {
331             String nodeId = input.getNodes().get(i).getNodeId();
332             String srcTpId =  input.getNodes().get(i).getSrcTp();
333             String destTpId = input.getNodes().get(i).getDestTp();
334             Long wlNumber = input.getWaveNumber().toJava();
335             String connectionNumber =  srcTpId + "-" + destTpId + "-" + wlNumber;
336             if (destTpId.toLowerCase().contains("srg")) {
337                 crossConnect.setPowerLevel(nodeId, OpticalControlMode.Off.getName(), null, connectionNumber);
338             } else if (destTpId.toLowerCase().contains("deg")) {
339                 try {
340                     if (!crossConnect.setPowerLevel(nodeId, OpticalControlMode.Power.getName(), new BigDecimal(-60),
341                             connectionNumber)) {
342                         LOG.warn("Power down failed for Roadm-connection: {}", connectionNumber);
343                         return false;
344                     }
345                     Thread.sleep(OlmUtils.OLM_TIMER_2);
346                     if (! crossConnect.setPowerLevel(nodeId, OpticalControlMode.Off.getName(), null,
347                         connectionNumber)) {
348                         LOG.warn("Setting power-control mode off failed for Roadm-connection: {}", connectionNumber);
349                         return false;
350                     }
351                 } catch (InterruptedException e) {
352                     // TODO Auto-generated catch block
353                     LOG.error("Olm-powerTurnDown wait failed: ",e);
354                     return false;
355                 }
356             }
357         }
358         return true;
359     }
360
361     /*
362      * This method does an edit-config on roadm connection subtree for a given
363      * connection number in order to set power level for use by the optical
364      * power control.
365      *
366      * @param inputNode
367      *            PortMapping network node.
368      * @param destTpId
369      *            Destination termination point.
370      * @param srgId
371      *            SRG Id to which network port is connected to.
372      * @param nextNodeId
373      *            Next roadm connect.
374      * @param waveLength
375      *            WaveLength number part of request
376      * @return true/false based on status of operation.
377      */
378     /*private boolean setTransponderPowerTx(Nodes inputNode, String destTpId, String srgId,
379                                           String nextNodeId, Long waveLength) {
380         Map<String, Double> txPowerRangeMap = null;
381         Map<String, Double> rxSRGPowerRangeMap = null;
382         OpenroadmVersion openroadmVersion;
383         Optional<Mapping> mappingObject = inputNode.getMapping().stream().filter(o -> o.key()
384                 .equals(new MappingKey(destTpId))).findFirst();
385         String nodeId = inputNode.getNodeId();
386         if (mappingObject.isPresent()) {
387             String circuitPackName = mappingObject.get().getSupportingCircuitPackName();
388             String portName = mappingObject.get().getSupportingPort();
389             openroadmVersion = inputNode.getNodeInfo().getOpenroadmVersion();
390             if (openroadmVersion.getIntValue() == 1) {
391                 txPowerRangeMap = PowerMgmtVersion121.getXponderPowerRange(circuitPackName, portName,
392                         nodeId, deviceTransactionManager);
393             } else if (openroadmVersion.getIntValue() == 2) {
394                 txPowerRangeMap = PowerMgmtVersion221.getXponderPowerRange(circuitPackName, portName,
395                         nodeId, deviceTransactionManager);
396             }
397             LOG.info("Transponder power range is fine");
398             if (!txPowerRangeMap.isEmpty()) {
399                 LOG.info("Transponder power range is not null {}, {}", nextNodeId,srgId);
400                 //Transponder range is not empty then check SRG Range
401
402                 Optional<Mapping> mappingObjectSRG = OlmUtils.getNode(nextNodeId, db)
403                         .flatMap(node -> node.getMapping()
404                                 .stream().filter(o -> o.key()
405                                         .equals(new MappingKey(srgId))).findFirst());
406                 if (mappingObjectSRG.isPresent()) {
407                     LOG.info("Transponder range exists for nodeId: {}", nodeId);
408                     if (openroadmVersion.getIntValue() == 1) {
409                         rxSRGPowerRangeMap = PowerMgmtVersion121.getSRGRxPowerRange(nextNodeId, srgId,
410                                 deviceTransactionManager, mappingObjectSRG.get().getSupportingCircuitPackName(),
411                                 mappingObjectSRG.get().getSupportingPort());
412                     } else if (openroadmVersion.getIntValue() == 2) {
413                         rxSRGPowerRangeMap = PowerMgmtVersion221.getSRGRxPowerRange(nextNodeId, srgId,
414                                 deviceTransactionManager, mappingObjectSRG.get().getSupportingCircuitPackName(),
415                                 mappingObjectSRG.get().getSupportingPort());
416                     }
417                 }
418                 double powerValue = 0;
419                 if (!rxSRGPowerRangeMap.isEmpty()) {
420                     LOG.debug("SRG Rx Power range exists for nodeId: {}", nodeId);
421                     if (txPowerRangeMap.get("MaxTx")
422                             <= rxSRGPowerRangeMap.get("MaxRx")) {
423                         powerValue = txPowerRangeMap.get("MaxTx");
424                     } else if (rxSRGPowerRangeMap.get("MaxRx")
425                             < txPowerRangeMap.get("MaxTx")) {
426                         powerValue = rxSRGPowerRangeMap.get("MaxRx");
427                     }
428                     LOG.debug("Calculated Transponder Power value is {}" , powerValue);
429                     String interfaceName = destTpId + "-" + waveLength;
430                     if (callSetTransponderPower(nodeId,interfaceName,new BigDecimal(powerValue),
431                             openroadmVersion)) {
432                         LOG.info("Transponder OCH connection: {} power updated ", interfaceName);
433                         try {
434                             LOG.info("Now going in sleep mode");
435                             Thread.sleep(90000);
436                             return true;
437                         } catch (InterruptedException e) {
438                             LOG.info("Transponder warmup failed for OCH connection: {}", interfaceName, e);
439                             return false;
440                         }
441                     } else {
442                         LOG.info("Transponder OCH connection: {} power update failed ", interfaceName);
443                         return false;
444                     }
445                 } else {
446                     LOG.info("Transponder Range exists but SRG Power Range not found");
447                     return false;
448                 }
449             } else {
450                 LOG.info("Tranponder range not available seting to default power for nodeId: {}", nodeId);
451                 String interfaceName = destTpId + "-" + waveLength;
452                 if (callSetTransponderPower(nodeId,interfaceName,new BigDecimal(-5),
453                         openroadmVersion)) {
454                     LOG.info("Transponder OCH connection: {} power updated ", interfaceName);
455                     try {
456                         Thread.sleep(OlmUtils.OLM_TIMER_1);
457                         return true;
458                     } catch (InterruptedException e) {
459                         // TODO Auto-generated catch block
460                         LOG.info("Transponder warmup failed for OCH connection: {}", interfaceName, e);
461                         return false;
462                     }
463                 } else {
464                     LOG.info("Transponder OCH connection: {} power update failed ", interfaceName);
465                     return false;
466                 }
467             }
468         } else {
469             LOG.info("Mapping object not found for nodeId: {}", nodeId);
470             return false;
471         }
472     }*/
473
474     /**
475      * This method retrieves transponder OCH interface and
476      * sets power.
477      *
478      * @param nodeId
479      *            Unique identifier for the mounted netconf- node
480      * @param interfaceName
481      *            OCH interface name carrying WL
482      * @param txPower
483      *            Calculated transmit power
484      * @param openroadmVersion
485      *            Version of openRoadm device software
486      * @return true/false based on status of operation
487      */
488     private boolean callSetTransponderPower(String nodeId, String interfaceName, BigDecimal txPower,
489                                             OpenroadmVersion openroadmVersion) {
490         boolean powerSetupResult = false;
491         try {
492             if (openroadmVersion.getIntValue() == 1) {
493                 Optional<Interface> interfaceOptional;
494                 interfaceOptional = openRoadmInterfaces.getInterface(nodeId, interfaceName);
495                 if (interfaceOptional.isPresent()) {
496                     powerSetupResult = PowerMgmtVersion121.setTransponderPower(nodeId, interfaceName,
497                             txPower, deviceTransactionManager, interfaceOptional.get());
498                 } else {
499                     LOG.error("Interface {} on node {} is not present!", interfaceName, nodeId);
500                     return false;
501                 }
502             } else if (openroadmVersion.getIntValue() == 2) {
503                 Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces.grp
504                         .Interface> interfaceOptional;
505                 interfaceOptional = openRoadmInterfaces.getInterface(nodeId, interfaceName);
506                 if (interfaceOptional.isPresent()) {
507                     powerSetupResult = PowerMgmtVersion221.setTransponderPower(nodeId, interfaceName,
508                             txPower, deviceTransactionManager, interfaceOptional.get());
509                 } else {
510                     LOG.error("Interface {} on node {} is not present!", interfaceName, nodeId);
511                     return false;
512                 }
513             }
514         } catch (OpenRoadmInterfaceException ex) {
515             LOG.error("Failed to get interface {} from node {}!", interfaceName, nodeId, ex);
516             return false;
517         }
518         if (powerSetupResult) {
519             LOG.debug("Transponder power set up completed successfully for nodeId {} and interface {}",
520                     nodeId,interfaceName);
521             return powerSetupResult;
522         } else {
523             LOG.debug("Transponder power setup failed for nodeId {} on interface {}",
524                     nodeId, interfaceName);
525             return powerSetupResult;
526         }
527     }
528
529     /*
530      * This method retrieves transponder OCH interface and
531      * sets power.
532      *
533      * @param nodeId
534      *            Unique identifier for the mounted netconf- node
535      * @param interfaceName
536      *            OCH interface name carrying WL
537      * @param openroadmVersion
538      *            Version of openRoadm device software
539      * @param wavelength
540      *            Wavelength Number    *
541      * @return true/false based on status of operation
542      */
543     /*private boolean callSetRoadmPowerTx(String nodeId, String interfaceName,
544                                         OpenroadmVersion openroadmVersion,
545                                         Long wavelength, String connectionNumber) {
546         if (interfaceName == null) {
547             crossConnect.setPowerLevel(nodeId,
548                     OpticalControlMode.Power , null,connectionNumber);
549             return true;
550         }
551         try {
552             if (openroadmVersion.getIntValue() == 1) {
553                 Optional<Interface> interfaceOpt;
554                 interfaceOpt = openRoadmInterfaces.getInterface(nodeId, interfaceName);
555                 if (interfaceOpt.isPresent()) {
556                     BigDecimal spanLossTx = interfaceOpt.get().augmentation(Interface1.class).getOts()
557                             .getSpanLossTransmit().getValue();
558                     LOG.debug("Spanloss TX is {}", spanLossTx);
559                     BigDecimal powerValue = BigDecimal.valueOf(Math.min(spanLossTx.doubleValue() - 9, 2));
560                     LOG.debug("Power Value is {}", powerValue);
561                     Boolean setXconnPowerSuccessVal = crossConnect.setPowerLevel(nodeId,
562                             OpticalControlMode.Power, powerValue,connectionNumber);
563                     if (setXconnPowerSuccessVal) {
564                         LOG.info("Roadm-connection: {} updated ");
565                         //TODO - commented code because one vendor is not supporting
566                         //GainLoss with target-output-power
567                         Thread.sleep(OlmUtils.OLM_TIMER_2);
568                         crossConnect.setPowerLevel(nodeId,
569                                 OpticalControlMode.GainLoss, powerValue,connectionNumber);
570                         return true;
571                     } else {
572                         LOG.info("Set Power failed for Roadm-connection: {} on Node: {}", connectionNumber, nodeId);
573                         return false;
574                     }
575                 } else {
576                     LOG.error("Interface {} on node {} is not present!", interfaceName, nodeId);
577                     return false;
578                 }
579             } else if (openroadmVersion.getIntValue() == 2) {
580                 Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces
581                         .grp.Interface> interfaceOpt;
582                 interfaceOpt = openRoadmInterfaces.getInterface(nodeId, interfaceName);
583                 if (interfaceOpt.isPresent()) {
584                     BigDecimal spanLossTx = interfaceOpt.get().augmentation(org.opendaylight.yang.gen.v1.http
585                             .org.openroadm.optical.transport.interfaces.rev181019.Interface1.class).getOts()
586                             .getSpanLossTransmit().getValue();
587                     LOG.debug("Spanloss TX is {}", spanLossTx);
588                     BigDecimal powerValue = BigDecimal.valueOf(Math.min(spanLossTx.doubleValue() - 9, 2));
589                     LOG.debug("Power Value is {}", powerValue);
590                     Boolean setXconnPowerSuccessVal = crossConnect.setPowerLevel(nodeId,
591                             OpticalControlMode.Power, powerValue,connectionNumber);
592                     if (setXconnPowerSuccessVal) {
593                         LOG.info("Roadm-connection: {} updated ");
594                         //TODO - commented code because one vendor is not supporting
595                         //GainLoss with target-output-power
596                         Thread.sleep(OlmUtils.OLM_TIMER_2);
597                         crossConnect.setPowerLevel(nodeId,
598                                 OpticalControlMode.GainLoss, powerValue,connectionNumber);
599                         return true;
600                     } else {
601                         LOG.info("Set Power failed for Roadm-connection: {} on Node: {}", connectionNumber, nodeId);
602                         return false;
603                     }
604                 }
605             }
606         } catch (OpenRoadmInterfaceException | InterruptedException ex) {
607             LOG.error("Error during power setup on Roadm nodeId: {} for connection: {}", nodeId, connectionNumber, ex);
608             return false;
609         }
610         return false;
611     }*/
612
613 }