2 * Copyright © 2017 AT&T and others. All rights reserved.
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
9 package org.opendaylight.transportpce.olm.power;
11 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
12 import java.math.BigDecimal;
13 import java.util.HashMap;
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.rev201012.network.Nodes;
26 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev201012.network.nodes.Mapping;
27 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev201012.network.nodes.MappingKey;
28 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev201012.network.nodes.NodeInfo.OpenroadmVersion;
29 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.OpticalControlMode;
30 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfaces.grp.Interface;
31 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.NodeTypes;
32 import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev161014.Interface1;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
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;
44 public PowerMgmtImpl(DataBroker db, OpenRoadmInterfaces openRoadmInterfaces,
45 CrossConnect crossConnect, DeviceTransactionManager deviceTransactionManager) {
47 this.openRoadmInterfaces = openRoadmInterfaces;
48 this.crossConnect = crossConnect;
49 this.deviceTransactionManager = deviceTransactionManager;
53 * This methods measures power requirement for turning up a WL
54 * from the Spanloss at OTS transmit direction and update
55 * roadm-connection target-output-power.
58 * Input parameter from the olm servicePowerSetup rpc
60 * @return true/false based on status of operation.
62 //TODO Need to Case Optical Power mode/NodeType in case of 2.2 devices
63 //@SuppressFBwarnings("DM_CONVERT_CASE")
64 public Boolean setPower(ServicePowerSetupInput input) {
65 LOG.info("Olm-setPower initiated for input {}", input);
66 int lowerSpectralSlotNumber = input.getLowerSpectralSlotNumber().intValue();
67 int higherSpectralSlotNumber = input.getHigherSpectralSlotNumber().intValue();
68 String spectralSlotName = String.join(GridConstant.SPECTRAL_SLOT_SEPARATOR,
69 String.valueOf(lowerSpectralSlotNumber),
70 String.valueOf(higherSpectralSlotNumber));
71 for (int i = 0; i < input.getNodes().size(); i++) {
72 String nodeId = input.getNodes().get(i).getNodeId();
73 String srcTpId = input.getNodes().get(i).getSrcTp();
74 String destTpId = input.getNodes().get(i).getDestTp();
75 Optional<Nodes> inputNodeOptional = OlmUtils.getNode(nodeId, this.db);
76 // If node type is transponder
77 if (inputNodeOptional.isPresent()
78 && (inputNodeOptional.get().getNodeInfo().getNodeType() != null)
79 && inputNodeOptional.get().getNodeInfo().getNodeType().equals(NodeTypes.Xpdr)
80 && destTpId != null) {
82 Nodes inputNode = inputNodeOptional.get();
83 OpenroadmVersion openroadmVersion = inputNode.getNodeInfo().getOpenroadmVersion();
84 LOG.info("Getting data from input node {}", inputNode.getNodeInfo().getNodeType());
85 LOG.info("Getting mapping data for node is {}",
86 inputNode.nonnullMapping().values().stream().filter(o -> o.key()
87 .equals(new MappingKey(destTpId))).findFirst().toString());
88 // If its A-End transponder
89 if (destTpId.toLowerCase().contains("network")) {
90 java.util.Optional<Mapping> mappingObject = inputNode.nonnullMapping()
91 .values().stream().filter(o -> o.key()
92 .equals(new MappingKey(destTpId))).findFirst();
93 if (mappingObject.isPresent()) {
94 String circuitPackName = mappingObject.get().getSupportingCircuitPackName();
95 String portName = mappingObject.get().getSupportingPort();
96 Map<String, Double> txPowerRangeMap = new HashMap<>();
97 if (openroadmVersion.getIntValue() == 1) {
98 txPowerRangeMap = PowerMgmtVersion121.getXponderPowerRange(circuitPackName, portName,
99 nodeId, deviceTransactionManager);
100 } else if (openroadmVersion.getIntValue() == 2) {
101 txPowerRangeMap = PowerMgmtVersion221.getXponderPowerRange(circuitPackName, portName,
102 nodeId, deviceTransactionManager);
104 if (!txPowerRangeMap.isEmpty()) {
105 LOG.info("Transponder range exists for nodeId: {}", nodeId);
106 String srgId = input.getNodes().get(i + 1).getSrcTp();
107 String nextNodeId = input.getNodes().get(i + 1).getNodeId();
108 Map<String, Double> rxSRGPowerRangeMap = new HashMap<>();
109 Optional<Mapping> mappingObjectSRG = OlmUtils.getNode(nextNodeId, db)
110 .flatMap(node -> node.nonnullMapping().values()
111 .stream().filter(o -> o.key()
112 .equals(new MappingKey(srgId))).findFirst());
113 if (mappingObjectSRG.isPresent()) {
115 if (openroadmVersion.getIntValue() == 1) {
116 rxSRGPowerRangeMap = PowerMgmtVersion121.getSRGRxPowerRange(nextNodeId, srgId,
117 deviceTransactionManager, mappingObjectSRG.get()
118 .getSupportingCircuitPackName(),
119 mappingObjectSRG.get().getSupportingPort());
120 } else if (openroadmVersion.getIntValue() == 2) {
121 rxSRGPowerRangeMap = PowerMgmtVersion221.getSRGRxPowerRange(nextNodeId, srgId,
122 deviceTransactionManager, mappingObjectSRG.get()
123 .getSupportingCircuitPackName(),
124 mappingObjectSRG.get().getSupportingPort());
127 double powerValue = 0;
128 if (!rxSRGPowerRangeMap.isEmpty()) {
129 LOG.info("SRG Rx Power range exists for nodeId: {}", nodeId);
130 if (txPowerRangeMap.get("MaxTx")
131 <= rxSRGPowerRangeMap.get("MaxRx")) {
132 powerValue = txPowerRangeMap.get("MaxTx");
133 } else if (rxSRGPowerRangeMap.get("MaxRx")
134 < txPowerRangeMap.get("MaxTx")) {
135 powerValue = rxSRGPowerRangeMap.get("MaxRx");
137 LOG.info("Calculated Transponder Power value is {}" , powerValue);
138 String interfaceName = String.join(GridConstant.NAME_PARAMETERS_SEPARATOR,
139 destTpId, spectralSlotName);
140 if (callSetTransponderPower(nodeId, interfaceName, new BigDecimal(powerValue),
142 LOG.info("Transponder OCH connection: {} power updated ", interfaceName);
144 LOG.info("Now going in sleep mode");
145 Thread.sleep(OlmUtils.OLM_TIMER_1);
146 } catch (InterruptedException e) {
147 LOG.info("Transponder warmup failed for OCH connection: {}", interfaceName, e);
150 LOG.info("Transponder OCH connection: {} power update failed ", interfaceName);
153 LOG.info("SRG Power Range not found, setting the Transponder range to default");
154 String interfaceName = String.join(GridConstant.NAME_PARAMETERS_SEPARATOR,
155 destTpId, spectralSlotName);
156 if (callSetTransponderPower(nodeId, interfaceName, new BigDecimal(-5),
158 LOG.info("Transponder OCH connection: {} power updated ", interfaceName);
160 Thread.sleep(OlmUtils.OLM_TIMER_1);
161 } catch (InterruptedException e) {
162 // TODO Auto-generated catch block
163 LOG.info("Transponder warmup failed for OCH connection: {}", interfaceName, e);
166 LOG.info("Transponder OCH connection: {} power update failed ", interfaceName);
170 LOG.info("Tranponder range not available setting to default power for nodeId: {}", nodeId);
171 String interfaceName = String.join(GridConstant.NAME_PARAMETERS_SEPARATOR,
172 destTpId, spectralSlotName);
173 if (callSetTransponderPower(nodeId, interfaceName, new BigDecimal(-5),openroadmVersion)) {
174 LOG.info("Transponder OCH connection: {} power updated ", interfaceName);
176 Thread.sleep(OlmUtils.OLM_TIMER_1);
177 } catch (InterruptedException e) {
178 // TODO Auto-generated catch block
179 LOG.info("Transponder warmup failed for OCH connection: {}", interfaceName, e);
182 LOG.info("Transponder OCH connection: {} power update failed ", interfaceName);
186 LOG.info("Mapping object not found for nodeId: {}", nodeId);
190 LOG.info("{} is a drop node. Net power settings needed", nodeId);
192 } else if (inputNodeOptional.isPresent()
193 && (inputNodeOptional.get().getNodeInfo().getNodeType() != null)
194 && inputNodeOptional.get().getNodeInfo().getNodeType().equals(NodeTypes.Rdm)) {
195 // If Degree is transmitting end then set power
196 Nodes inputNode = inputNodeOptional.get();
197 OpenroadmVersion openroadmVersion = inputNode.getNodeInfo().getOpenroadmVersion();
198 LOG.info("This is a roadm {} device", openroadmVersion.getName());
199 String connectionNumber = String.join(GridConstant.NAME_PARAMETERS_SEPARATOR,srcTpId, destTpId,
201 LOG.info("Connection number is {}", connectionNumber);
202 if (destTpId.toLowerCase().contains("deg")) {
203 Optional<Mapping> mappingObjectOptional = inputNode.nonnullMapping()
204 .values().stream().filter(o -> o.key()
205 .equals(new MappingKey(destTpId))).findFirst();
206 if (mappingObjectOptional.isPresent()) {
207 BigDecimal spanLossTx = null;
208 LOG.info("Dest point is Degree {}", mappingObjectOptional.get());
209 Mapping portMapping = mappingObjectOptional.get();
211 if (openroadmVersion.getIntValue() == 1) {
212 Optional<Interface> interfaceOpt;
215 this.openRoadmInterfaces.getInterface(nodeId, portMapping.getSupportingOts());
216 } catch (OpenRoadmInterfaceException ex) {
217 LOG.error("Failed to get interface {} from node {}!", portMapping.getSupportingOts(),
220 } catch (IllegalArgumentException ex) {
221 LOG.error("Failed to get non existing interface {} from node {}!",
222 portMapping.getSupportingOts(), nodeId);
225 if (interfaceOpt.isPresent()) {
226 if (interfaceOpt.get().augmentation(Interface1.class).getOts()
227 .getSpanLossTransmit() != null) {
228 spanLossTx = interfaceOpt.get().augmentation(Interface1.class).getOts()
229 .getSpanLossTransmit().getValue();
230 LOG.info("Spanloss TX is {}", spanLossTx);
232 LOG.error("interface {} has no spanloss value", interfaceOpt.get().getName());
235 LOG.error("Interface {} on node {} is not present!", portMapping.getSupportingOts(),
239 } else if (openroadmVersion.getIntValue() == 2) {
240 Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces.grp
241 .Interface> interfaceOpt;
244 this.openRoadmInterfaces.getInterface(nodeId, portMapping.getSupportingOts());
245 } catch (OpenRoadmInterfaceException ex) {
246 LOG.error("Failed to get interface {} from node {}!", portMapping.getSupportingOts(),
249 } catch (IllegalArgumentException ex) {
250 LOG.error("Failed to get non existing interface {} from node {}!",
251 portMapping.getSupportingOts(), nodeId);
254 if (interfaceOpt.isPresent()) {
255 if (interfaceOpt.get().augmentation(org.opendaylight.yang.gen.v1.http.org
256 .openroadm.optical.transport.interfaces.rev181019.Interface1.class).getOts()
257 .getSpanLossTransmit() != null) {
258 spanLossTx = interfaceOpt.get().augmentation(org.opendaylight.yang.gen.v1.http.org
259 .openroadm.optical.transport.interfaces.rev181019.Interface1.class).getOts()
260 .getSpanLossTransmit().getValue();
261 LOG.info("Spanloss TX is {}", spanLossTx);
263 LOG.error("interface {} has no spanloss value", interfaceOpt.get().getName());
266 LOG.error("Interface {} on node {} is not present!", portMapping.getSupportingOts(),
272 if (spanLossTx == null || spanLossTx.intValue() <= 0 || spanLossTx.intValue() > 28) {
274 "Power Value is null: spanLossTx null or out of openROADM range ]0,28] {}", spanLossTx);
277 BigDecimal powerValue = spanLossTx.subtract(BigDecimal.valueOf(9));
278 powerValue = powerValue.min(BigDecimal.valueOf(2));
279 //we work at constant power spectral density (50 GHz channel width @-20dBm=37.5GHz)
280 // 87.5 GHz channel width @-20dBm=75GHz
281 if (input.getWidth() != null && GridConstant.WIDTH_80.equals(input.getWidth().getValue())) {
282 powerValue = powerValue.add(BigDecimal.valueOf(3));
284 LOG.info("Power Value is {}", powerValue);
286 Boolean setXconnPowerSuccessVal = crossConnect.setPowerLevel(nodeId,
287 OpticalControlMode.Power.getName(), powerValue, connectionNumber);
288 LOG.info("Success Value is {}", setXconnPowerSuccessVal);
289 if (setXconnPowerSuccessVal) {
290 LOG.info("Roadm-connection: {} updated ", connectionNumber);
291 //The value recommended by the white paper is 20 seconds and not 60.
292 //TODO - commented code because one vendor is not supporting
293 //GainLoss with target-output-power
294 Thread.sleep(OlmUtils.OLM_TIMER_1);
295 crossConnect.setPowerLevel(nodeId, OpticalControlMode.GainLoss.getName(), powerValue,
298 LOG.info("Set Power failed for Roadm-connection: {} on Node: {}", connectionNumber,
302 } catch (InterruptedException e) {
303 LOG.error("Olm-setPower wait failed :", e);
307 // If Drop node leave node is power mode
308 } else if (destTpId.toLowerCase().contains("srg")) {
309 LOG.info("Setting power at drop node");
310 crossConnect.setPowerLevel(nodeId, OpticalControlMode.Power.getName(), null, connectionNumber);
313 LOG.error("OLM-PowerMgmtImpl : Error with node type for node {}", nodeId);
320 * This methods turns down power a WL by performing
324 * 1. Pull interfaces used in service and change
325 * status to outOfService
328 * 2. For each of the ROADM node set target-output-power
329 * to -60dbm, wait for 20 seconds, turn power mode to off
332 * 3. Turn down power in Z to A direction and A to Z
335 * Input parameter from the olm servicePowerTurndown rpc
337 * @return true/false based on status of operation
339 public Boolean powerTurnDown(ServicePowerTurndownInput input) {
340 LOG.info("Olm-powerTurnDown initiated for input {}", input);
341 /*Starting with last element into the list Z -> A for
342 turning down A -> Z */
343 int lowerSpectralSlotNumber = input.getLowerSpectralSlotNumber().intValue();
344 int higherSpectralSlotNumber = input.getHigherSpectralSlotNumber().intValue();
345 String spectralSlotName = String.join(GridConstant.SPECTRAL_SLOT_SEPARATOR,
346 String.valueOf(lowerSpectralSlotNumber),
347 String.valueOf(higherSpectralSlotNumber));
348 for (int i = input.getNodes().size() - 1; i >= 0; i--) {
349 String nodeId = input.getNodes().get(i).getNodeId();
350 String srcTpId = input.getNodes().get(i).getSrcTp();
351 String destTpId = input.getNodes().get(i).getDestTp();
352 String connectionNumber = String.join(GridConstant.NAME_PARAMETERS_SEPARATOR,srcTpId, destTpId,
354 if (destTpId.toLowerCase().contains("srg")) {
355 crossConnect.setPowerLevel(nodeId, OpticalControlMode.Off.getName(), null, connectionNumber);
356 } else if (destTpId.toLowerCase().contains("deg")) {
358 if (!crossConnect.setPowerLevel(nodeId, OpticalControlMode.Power.getName(), new BigDecimal(-60),
360 LOG.warn("Power down failed for Roadm-connection: {}", connectionNumber);
363 Thread.sleep(OlmUtils.OLM_TIMER_2);
364 if (! crossConnect.setPowerLevel(nodeId, OpticalControlMode.Off.getName(), null,
366 LOG.warn("Setting power-control mode off failed for Roadm-connection: {}", connectionNumber);
369 } catch (InterruptedException e) {
370 // TODO Auto-generated catch block
371 LOG.error("Olm-powerTurnDown wait failed: ",e);
380 * This method does an edit-config on roadm connection subtree for a given
381 * connection number in order to set power level for use by the optical
385 * PortMapping network node.
387 * Destination termination point.
389 * SRG Id to which network port is connected to.
391 * Next roadm connect.
393 * WaveLength number part of request
394 * @return true/false based on status of operation.
396 /*private boolean setTransponderPowerTx(Nodes inputNode, String destTpId, String srgId,
397 String nextNodeId, Long waveLength) {
398 Map<String, Double> txPowerRangeMap = null;
399 Map<String, Double> rxSRGPowerRangeMap = null;
400 OpenroadmVersion openroadmVersion;
401 Optional<Mapping> mappingObject = inputNode.getMapping().stream().filter(o -> o.key()
402 .equals(new MappingKey(destTpId))).findFirst();
403 String nodeId = inputNode.getNodeId();
404 if (mappingObject.isPresent()) {
405 String circuitPackName = mappingObject.get().getSupportingCircuitPackName();
406 String portName = mappingObject.get().getSupportingPort();
407 openroadmVersion = inputNode.getNodeInfo().getOpenroadmVersion();
408 if (openroadmVersion.getIntValue() == 1) {
409 txPowerRangeMap = PowerMgmtVersion121.getXponderPowerRange(circuitPackName, portName,
410 nodeId, deviceTransactionManager);
411 } else if (openroadmVersion.getIntValue() == 2) {
412 txPowerRangeMap = PowerMgmtVersion221.getXponderPowerRange(circuitPackName, portName,
413 nodeId, deviceTransactionManager);
415 LOG.info("Transponder power range is fine");
416 if (!txPowerRangeMap.isEmpty()) {
417 LOG.info("Transponder power range is not null {}, {}", nextNodeId,srgId);
418 //Transponder range is not empty then check SRG Range
420 Optional<Mapping> mappingObjectSRG = OlmUtils.getNode(nextNodeId, db)
421 .flatMap(node -> node.getMapping()
422 .stream().filter(o -> o.key()
423 .equals(new MappingKey(srgId))).findFirst());
424 if (mappingObjectSRG.isPresent()) {
425 LOG.info("Transponder range exists for nodeId: {}", nodeId);
426 if (openroadmVersion.getIntValue() == 1) {
427 rxSRGPowerRangeMap = PowerMgmtVersion121.getSRGRxPowerRange(nextNodeId, srgId,
428 deviceTransactionManager, mappingObjectSRG.get().getSupportingCircuitPackName(),
429 mappingObjectSRG.get().getSupportingPort());
430 } else if (openroadmVersion.getIntValue() == 2) {
431 rxSRGPowerRangeMap = PowerMgmtVersion221.getSRGRxPowerRange(nextNodeId, srgId,
432 deviceTransactionManager, mappingObjectSRG.get().getSupportingCircuitPackName(),
433 mappingObjectSRG.get().getSupportingPort());
436 double powerValue = 0;
437 if (!rxSRGPowerRangeMap.isEmpty()) {
438 LOG.debug("SRG Rx Power range exists for nodeId: {}", nodeId);
439 if (txPowerRangeMap.get("MaxTx")
440 <= rxSRGPowerRangeMap.get("MaxRx")) {
441 powerValue = txPowerRangeMap.get("MaxTx");
442 } else if (rxSRGPowerRangeMap.get("MaxRx")
443 < txPowerRangeMap.get("MaxTx")) {
444 powerValue = rxSRGPowerRangeMap.get("MaxRx");
446 LOG.debug("Calculated Transponder Power value is {}" , powerValue);
447 String interfaceName = destTpId + "-" + waveLength;
448 if (callSetTransponderPower(nodeId,interfaceName,new BigDecimal(powerValue),
450 LOG.info("Transponder OCH connection: {} power updated ", interfaceName);
452 LOG.info("Now going in sleep mode");
455 } catch (InterruptedException e) {
456 LOG.info("Transponder warmup failed for OCH connection: {}", interfaceName, e);
460 LOG.info("Transponder OCH connection: {} power update failed ", interfaceName);
464 LOG.info("Transponder Range exists but SRG Power Range not found");
468 LOG.info("Tranponder range not available seting to default power for nodeId: {}", nodeId);
469 String interfaceName = destTpId + "-" + waveLength;
470 if (callSetTransponderPower(nodeId,interfaceName,new BigDecimal(-5),
472 LOG.info("Transponder OCH connection: {} power updated ", interfaceName);
474 Thread.sleep(OlmUtils.OLM_TIMER_1);
476 } catch (InterruptedException e) {
477 // TODO Auto-generated catch block
478 LOG.info("Transponder warmup failed for OCH connection: {}", interfaceName, e);
482 LOG.info("Transponder OCH connection: {} power update failed ", interfaceName);
487 LOG.info("Mapping object not found for nodeId: {}", nodeId);
493 * This method retrieves transponder OCH interface and
497 * Unique identifier for the mounted netconf- node
498 * @param interfaceName
499 * OCH interface name carrying WL
501 * Calculated transmit power
502 * @param openroadmVersion
503 * Version of openRoadm device software
504 * @return true/false based on status of operation
506 private boolean callSetTransponderPower(String nodeId, String interfaceName, BigDecimal txPower,
507 OpenroadmVersion openroadmVersion) {
508 boolean powerSetupResult = false;
510 if (openroadmVersion.getIntValue() == 1) {
511 Optional<Interface> interfaceOptional;
512 interfaceOptional = openRoadmInterfaces.getInterface(nodeId, interfaceName);
513 if (interfaceOptional.isPresent()) {
514 powerSetupResult = PowerMgmtVersion121.setTransponderPower(nodeId, interfaceName,
515 txPower, deviceTransactionManager, interfaceOptional.get());
517 LOG.error("Interface {} on node {} is not present!", interfaceName, nodeId);
520 } else if (openroadmVersion.getIntValue() == 2) {
521 Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces.grp
522 .Interface> interfaceOptional;
523 interfaceOptional = openRoadmInterfaces.getInterface(nodeId, interfaceName);
524 if (interfaceOptional.isPresent()) {
525 powerSetupResult = PowerMgmtVersion221.setTransponderPower(nodeId, interfaceName,
526 txPower, deviceTransactionManager, interfaceOptional.get());
528 LOG.error("Interface {} on node {} is not present!", interfaceName, nodeId);
532 } catch (OpenRoadmInterfaceException ex) {
533 LOG.error("Failed to get interface {} from node {}!", interfaceName, nodeId, ex);
536 if (powerSetupResult) {
537 LOG.debug("Transponder power set up completed successfully for nodeId {} and interface {}",
538 nodeId,interfaceName);
539 return powerSetupResult;
541 LOG.debug("Transponder power setup failed for nodeId {} on interface {}",
542 nodeId, interfaceName);
543 return powerSetupResult;
548 * This method retrieves transponder OCH interface and
552 * Unique identifier for the mounted netconf- node
553 * @param interfaceName
554 * OCH interface name carrying WL
555 * @param openroadmVersion
556 * Version of openRoadm device software
558 * Wavelength Number *
559 * @return true/false based on status of operation
561 /*private boolean callSetRoadmPowerTx(String nodeId, String interfaceName,
562 OpenroadmVersion openroadmVersion,
563 Long wavelength, String connectionNumber) {
564 if (interfaceName == null) {
565 crossConnect.setPowerLevel(nodeId,
566 OpticalControlMode.Power , null,connectionNumber);
570 if (openroadmVersion.getIntValue() == 1) {
571 Optional<Interface> interfaceOpt;
572 interfaceOpt = openRoadmInterfaces.getInterface(nodeId, interfaceName);
573 if (interfaceOpt.isPresent()) {
574 BigDecimal spanLossTx = interfaceOpt.get().augmentation(Interface1.class).getOts()
575 .getSpanLossTransmit().getValue();
576 LOG.debug("Spanloss TX is {}", spanLossTx);
577 BigDecimal powerValue = BigDecimal.valueOf(Math.min(spanLossTx.doubleValue() - 9, 2));
578 LOG.debug("Power Value is {}", powerValue);
579 Boolean setXconnPowerSuccessVal = crossConnect.setPowerLevel(nodeId,
580 OpticalControlMode.Power, powerValue,connectionNumber);
581 if (setXconnPowerSuccessVal) {
582 LOG.info("Roadm-connection: {} updated ");
583 //TODO - commented code because one vendor is not supporting
584 //GainLoss with target-output-power
585 Thread.sleep(OlmUtils.OLM_TIMER_2);
586 crossConnect.setPowerLevel(nodeId,
587 OpticalControlMode.GainLoss, powerValue,connectionNumber);
590 LOG.info("Set Power failed for Roadm-connection: {} on Node: {}", connectionNumber, nodeId);
594 LOG.error("Interface {} on node {} is not present!", interfaceName, nodeId);
597 } else if (openroadmVersion.getIntValue() == 2) {
598 Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces
599 .grp.Interface> interfaceOpt;
600 interfaceOpt = openRoadmInterfaces.getInterface(nodeId, interfaceName);
601 if (interfaceOpt.isPresent()) {
602 BigDecimal spanLossTx = interfaceOpt.get().augmentation(org.opendaylight.yang.gen.v1.http
603 .org.openroadm.optical.transport.interfaces.rev181019.Interface1.class).getOts()
604 .getSpanLossTransmit().getValue();
605 LOG.debug("Spanloss TX is {}", spanLossTx);
606 BigDecimal powerValue = BigDecimal.valueOf(Math.min(spanLossTx.doubleValue() - 9, 2));
607 LOG.debug("Power Value is {}", powerValue);
608 Boolean setXconnPowerSuccessVal = crossConnect.setPowerLevel(nodeId,
609 OpticalControlMode.Power, powerValue,connectionNumber);
610 if (setXconnPowerSuccessVal) {
611 LOG.info("Roadm-connection: {} updated ");
612 //TODO - commented code because one vendor is not supporting
613 //GainLoss with target-output-power
614 Thread.sleep(OlmUtils.OLM_TIMER_2);
615 crossConnect.setPowerLevel(nodeId,
616 OpticalControlMode.GainLoss, powerValue,connectionNumber);
619 LOG.info("Set Power failed for Roadm-connection: {} on Node: {}", connectionNumber, nodeId);
624 } catch (OpenRoadmInterfaceException | InterruptedException ex) {
625 LOG.error("Error during power setup on Roadm nodeId: {} for connection: {}", nodeId, connectionNumber, ex);