Fix bug in PceOtnNode
[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 = BigDecimal.valueOf(Math.min(spanLossTx.doubleValue() - 9, 2));
264                         LOG.info("Power Value is {}", powerValue);
265
266                         try {
267                             Boolean setXconnPowerSuccessVal = crossConnect.setPowerLevel(nodeId,
268                                 OpticalControlMode.Power.getName(), powerValue, connectionNumber);
269                             LOG.info("Success Value is {}", setXconnPowerSuccessVal);
270                             if (setXconnPowerSuccessVal) {
271                                 LOG.info("Roadm-connection: {} updated ", connectionNumber);
272                                 //The value recommended by the white paper is 20 seconds and not 60.
273                                 //TODO - commented code because one vendor is not supporting
274                                 //GainLoss with target-output-power
275                                 Thread.sleep(OlmUtils.OLM_TIMER_1);
276                                 crossConnect.setPowerLevel(nodeId, OpticalControlMode.GainLoss.getName(), powerValue,
277                                         connectionNumber);
278                             } else {
279                                 LOG.info("Set Power failed for Roadm-connection: {} on Node: {}", connectionNumber,
280                                         nodeId);
281                                 return false;
282                             }
283                         } catch (InterruptedException e) {
284                             LOG.error("Olm-setPower wait failed :", e);
285                             return false;
286                         }
287                     }
288                     // If Drop node leave node is power mode
289                 } else if (destTpId.toLowerCase().contains("srg")) {
290                     LOG.info("Setting power at drop node");
291                     crossConnect.setPowerLevel(nodeId, OpticalControlMode.Power.getName(), null, connectionNumber);
292                 }
293             } else {
294                 LOG.error("OLM-PowerMgmtImpl : Error with node type for node {}", nodeId);
295             }
296         }
297         return true;
298     }
299
300     /**
301      * This methods turns down power a WL by performing
302      * following steps:
303      *
304      * <p>
305      * 1. Pull interfaces used in service and change
306      * status to outOfService
307      *
308      * <p>
309      * 2. For each of the ROADM node set target-output-power
310      * to -60dbm, wait for 20 seconds, turn power mode to off
311      *
312      * <p>
313      * 3. Turn down power in Z to A direction and A to Z
314      *
315      * @param input
316      *            Input parameter from the olm servicePowerTurndown rpc
317      *
318      * @return true/false based on status of operation
319      */
320     public Boolean powerTurnDown(ServicePowerTurndownInput input) {
321         LOG.info("Olm-powerTurnDown initiated");
322         /*Starting with last element into the list Z -> A for
323           turning down A -> Z */
324         for (int i = input.getNodes().size() - 1; i >= 0; i--) {
325             String nodeId = input.getNodes().get(i).getNodeId();
326             String srcTpId =  input.getNodes().get(i).getSrcTp();
327             String destTpId = input.getNodes().get(i).getDestTp();
328             Long wlNumber = input.getWaveNumber().toJava();
329             String connectionNumber =  srcTpId + "-" + destTpId + "-" + wlNumber;
330             if (destTpId.toLowerCase().contains("srg")) {
331                 crossConnect.setPowerLevel(nodeId, OpticalControlMode.Off.getName(), null, connectionNumber);
332             } else if (destTpId.toLowerCase().contains("deg")) {
333                 try {
334                     if (!crossConnect.setPowerLevel(nodeId, OpticalControlMode.Power.getName(), new BigDecimal(-60),
335                             connectionNumber)) {
336                         LOG.warn("Power down failed for Roadm-connection: {}", connectionNumber);
337                         return false;
338                     }
339                     Thread.sleep(OlmUtils.OLM_TIMER_2);
340                     if (! crossConnect.setPowerLevel(nodeId, OpticalControlMode.Off.getName(), null,
341                         connectionNumber)) {
342                         LOG.warn("Setting power-control mode off failed for Roadm-connection: {}", connectionNumber);
343                         return false;
344                     }
345                 } catch (InterruptedException e) {
346                     // TODO Auto-generated catch block
347                     LOG.error("Olm-powerTurnDown wait failed: ",e);
348                     return false;
349                 }
350             }
351         }
352         return true;
353     }
354
355     /*
356      * This method does an edit-config on roadm connection subtree for a given
357      * connection number in order to set power level for use by the optical
358      * power control.
359      *
360      * @param inputNode
361      *            PortMapping network node.
362      * @param destTpId
363      *            Destination termination point.
364      * @param srgId
365      *            SRG Id to which network port is connected to.
366      * @param nextNodeId
367      *            Next roadm connect.
368      * @param waveLength
369      *            WaveLength number part of request
370      * @return true/false based on status of operation.
371      */
372     /*private boolean setTransponderPowerTx(Nodes inputNode, String destTpId, String srgId,
373                                           String nextNodeId, Long waveLength) {
374         Map<String, Double> txPowerRangeMap = null;
375         Map<String, Double> rxSRGPowerRangeMap = null;
376         OpenroadmVersion openroadmVersion;
377         Optional<Mapping> mappingObject = inputNode.getMapping().stream().filter(o -> o.key()
378                 .equals(new MappingKey(destTpId))).findFirst();
379         String nodeId = inputNode.getNodeId();
380         if (mappingObject.isPresent()) {
381             String circuitPackName = mappingObject.get().getSupportingCircuitPackName();
382             String portName = mappingObject.get().getSupportingPort();
383             openroadmVersion = inputNode.getNodeInfo().getOpenroadmVersion();
384             if (openroadmVersion.getIntValue() == 1) {
385                 txPowerRangeMap = PowerMgmtVersion121.getXponderPowerRange(circuitPackName, portName,
386                         nodeId, deviceTransactionManager);
387             } else if (openroadmVersion.getIntValue() == 2) {
388                 txPowerRangeMap = PowerMgmtVersion221.getXponderPowerRange(circuitPackName, portName,
389                         nodeId, deviceTransactionManager);
390             }
391             LOG.info("Transponder power range is fine");
392             if (!txPowerRangeMap.isEmpty()) {
393                 LOG.info("Transponder power range is not null {}, {}", nextNodeId,srgId);
394                 //Transponder range is not empty then check SRG Range
395
396                 Optional<Mapping> mappingObjectSRG = OlmUtils.getNode(nextNodeId, db)
397                         .flatMap(node -> node.getMapping()
398                                 .stream().filter(o -> o.key()
399                                         .equals(new MappingKey(srgId))).findFirst());
400                 if (mappingObjectSRG.isPresent()) {
401                     LOG.info("Transponder range exists for nodeId: {}", nodeId);
402                     if (openroadmVersion.getIntValue() == 1) {
403                         rxSRGPowerRangeMap = PowerMgmtVersion121.getSRGRxPowerRange(nextNodeId, srgId,
404                                 deviceTransactionManager, mappingObjectSRG.get().getSupportingCircuitPackName(),
405                                 mappingObjectSRG.get().getSupportingPort());
406                     } else if (openroadmVersion.getIntValue() == 2) {
407                         rxSRGPowerRangeMap = PowerMgmtVersion221.getSRGRxPowerRange(nextNodeId, srgId,
408                                 deviceTransactionManager, mappingObjectSRG.get().getSupportingCircuitPackName(),
409                                 mappingObjectSRG.get().getSupportingPort());
410                     }
411                 }
412                 double powerValue = 0;
413                 if (!rxSRGPowerRangeMap.isEmpty()) {
414                     LOG.debug("SRG Rx Power range exists for nodeId: {}", nodeId);
415                     if (txPowerRangeMap.get("MaxTx")
416                             <= rxSRGPowerRangeMap.get("MaxRx")) {
417                         powerValue = txPowerRangeMap.get("MaxTx");
418                     } else if (rxSRGPowerRangeMap.get("MaxRx")
419                             < txPowerRangeMap.get("MaxTx")) {
420                         powerValue = rxSRGPowerRangeMap.get("MaxRx");
421                     }
422                     LOG.debug("Calculated Transponder Power value is {}" , powerValue);
423                     String interfaceName = destTpId + "-" + waveLength;
424                     if (callSetTransponderPower(nodeId,interfaceName,new BigDecimal(powerValue),
425                             openroadmVersion)) {
426                         LOG.info("Transponder OCH connection: {} power updated ", interfaceName);
427                         try {
428                             LOG.info("Now going in sleep mode");
429                             Thread.sleep(90000);
430                             return true;
431                         } catch (InterruptedException e) {
432                             LOG.info("Transponder warmup failed for OCH connection: {}", interfaceName, e);
433                             return false;
434                         }
435                     } else {
436                         LOG.info("Transponder OCH connection: {} power update failed ", interfaceName);
437                         return false;
438                     }
439                 } else {
440                     LOG.info("Transponder Range exists but SRG Power Range not found");
441                     return false;
442                 }
443             } else {
444                 LOG.info("Tranponder range not available seting to default power for nodeId: {}", nodeId);
445                 String interfaceName = destTpId + "-" + waveLength;
446                 if (callSetTransponderPower(nodeId,interfaceName,new BigDecimal(-5),
447                         openroadmVersion)) {
448                     LOG.info("Transponder OCH connection: {} power updated ", interfaceName);
449                     try {
450                         Thread.sleep(OlmUtils.OLM_TIMER_1);
451                         return true;
452                     } catch (InterruptedException e) {
453                         // TODO Auto-generated catch block
454                         LOG.info("Transponder warmup failed for OCH connection: {}", interfaceName, e);
455                         return false;
456                     }
457                 } else {
458                     LOG.info("Transponder OCH connection: {} power update failed ", interfaceName);
459                     return false;
460                 }
461             }
462         } else {
463             LOG.info("Mapping object not found for nodeId: {}", nodeId);
464             return false;
465         }
466     }*/
467
468     /**
469      * This method retrieves transponder OCH interface and
470      * sets power.
471      *
472      * @param nodeId
473      *            Unique identifier for the mounted netconf- node
474      * @param interfaceName
475      *            OCH interface name carrying WL
476      * @param txPower
477      *            Calculated transmit power
478      * @param openroadmVersion
479      *            Version of openRoadm device software
480      * @return true/false based on status of operation
481      */
482     private boolean callSetTransponderPower(String nodeId, String interfaceName, BigDecimal txPower,
483                                             OpenroadmVersion openroadmVersion) {
484         boolean powerSetupResult = false;
485         try {
486             if (openroadmVersion.getIntValue() == 1) {
487                 Optional<Interface> interfaceOptional;
488                 interfaceOptional = openRoadmInterfaces.getInterface(nodeId, interfaceName);
489                 if (interfaceOptional.isPresent()) {
490                     powerSetupResult = PowerMgmtVersion121.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             } else if (openroadmVersion.getIntValue() == 2) {
497                 Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces.grp
498                         .Interface> interfaceOptional;
499                 interfaceOptional = openRoadmInterfaces.getInterface(nodeId, interfaceName);
500                 if (interfaceOptional.isPresent()) {
501                     powerSetupResult = PowerMgmtVersion221.setTransponderPower(nodeId, interfaceName,
502                             txPower, deviceTransactionManager, interfaceOptional.get());
503                 } else {
504                     LOG.error("Interface {} on node {} is not present!", interfaceName, nodeId);
505                     return false;
506                 }
507             }
508         } catch (OpenRoadmInterfaceException ex) {
509             LOG.error("Failed to get interface {} from node {}!", interfaceName, nodeId, ex);
510             return false;
511         }
512         if (powerSetupResult) {
513             LOG.debug("Transponder power set up completed successfully for nodeId {} and interface {}",
514                     nodeId,interfaceName);
515             return powerSetupResult;
516         } else {
517             LOG.debug("Transponder power setup failed for nodeId {} on interface {}",
518                     nodeId, interfaceName);
519             return powerSetupResult;
520         }
521     }
522
523     /*
524      * This method retrieves transponder OCH interface and
525      * sets power.
526      *
527      * @param nodeId
528      *            Unique identifier for the mounted netconf- node
529      * @param interfaceName
530      *            OCH interface name carrying WL
531      * @param openroadmVersion
532      *            Version of openRoadm device software
533      * @param wavelength
534      *            Wavelength Number    *
535      * @return true/false based on status of operation
536      */
537     /*private boolean callSetRoadmPowerTx(String nodeId, String interfaceName,
538                                         OpenroadmVersion openroadmVersion,
539                                         Long wavelength, String connectionNumber) {
540         if (interfaceName == null) {
541             crossConnect.setPowerLevel(nodeId,
542                     OpticalControlMode.Power , null,connectionNumber);
543             return true;
544         }
545         try {
546             if (openroadmVersion.getIntValue() == 1) {
547                 Optional<Interface> interfaceOpt;
548                 interfaceOpt = openRoadmInterfaces.getInterface(nodeId, interfaceName);
549                 if (interfaceOpt.isPresent()) {
550                     BigDecimal spanLossTx = interfaceOpt.get().augmentation(Interface1.class).getOts()
551                             .getSpanLossTransmit().getValue();
552                     LOG.debug("Spanloss TX is {}", spanLossTx);
553                     BigDecimal powerValue = BigDecimal.valueOf(Math.min(spanLossTx.doubleValue() - 9, 2));
554                     LOG.debug("Power Value is {}", powerValue);
555                     Boolean setXconnPowerSuccessVal = crossConnect.setPowerLevel(nodeId,
556                             OpticalControlMode.Power, powerValue,connectionNumber);
557                     if (setXconnPowerSuccessVal) {
558                         LOG.info("Roadm-connection: {} updated ");
559                         //TODO - commented code because one vendor is not supporting
560                         //GainLoss with target-output-power
561                         Thread.sleep(OlmUtils.OLM_TIMER_2);
562                         crossConnect.setPowerLevel(nodeId,
563                                 OpticalControlMode.GainLoss, powerValue,connectionNumber);
564                         return true;
565                     } else {
566                         LOG.info("Set Power failed for Roadm-connection: {} on Node: {}", connectionNumber, nodeId);
567                         return false;
568                     }
569                 } else {
570                     LOG.error("Interface {} on node {} is not present!", interfaceName, nodeId);
571                     return false;
572                 }
573             } else if (openroadmVersion.getIntValue() == 2) {
574                 Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces
575                         .grp.Interface> interfaceOpt;
576                 interfaceOpt = openRoadmInterfaces.getInterface(nodeId, interfaceName);
577                 if (interfaceOpt.isPresent()) {
578                     BigDecimal spanLossTx = interfaceOpt.get().augmentation(org.opendaylight.yang.gen.v1.http
579                             .org.openroadm.optical.transport.interfaces.rev181019.Interface1.class).getOts()
580                             .getSpanLossTransmit().getValue();
581                     LOG.debug("Spanloss TX is {}", spanLossTx);
582                     BigDecimal powerValue = BigDecimal.valueOf(Math.min(spanLossTx.doubleValue() - 9, 2));
583                     LOG.debug("Power Value is {}", powerValue);
584                     Boolean setXconnPowerSuccessVal = crossConnect.setPowerLevel(nodeId,
585                             OpticalControlMode.Power, powerValue,connectionNumber);
586                     if (setXconnPowerSuccessVal) {
587                         LOG.info("Roadm-connection: {} updated ");
588                         //TODO - commented code because one vendor is not supporting
589                         //GainLoss with target-output-power
590                         Thread.sleep(OlmUtils.OLM_TIMER_2);
591                         crossConnect.setPowerLevel(nodeId,
592                                 OpticalControlMode.GainLoss, powerValue,connectionNumber);
593                         return true;
594                     } else {
595                         LOG.info("Set Power failed for Roadm-connection: {} on Node: {}", connectionNumber, nodeId);
596                         return false;
597                     }
598                 }
599             }
600         } catch (OpenRoadmInterfaceException | InterruptedException ex) {
601             LOG.error("Error during power setup on Roadm nodeId: {} for connection: {}", nodeId, connectionNumber, ex);
602             return false;
603         }
604         return false;
605     }*/
606
607 }