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