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