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