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