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