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