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 java.math.BigDecimal;
12 import java.util.HashMap;
14 import java.util.Optional;
16 import org.opendaylight.controller.md.sal.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.rev170228.network.Nodes;
25 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev170228.network.nodes.Mapping;
26 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev170228.network.nodes.MappingKey;
27 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.NodeTypes;
28 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.OpticalControlMode;
29 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfaces.grp.Interface;
30 import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev161014.Interface1;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
34 public class PowerMgmtImpl implements PowerMgmt {
35 private static final Logger LOG = LoggerFactory.getLogger(PowerMgmtImpl.class);
36 private final DataBroker db;
37 private final OpenRoadmInterfaces openRoadmInterfaces;
38 private final CrossConnect crossConnect;
39 private final DeviceTransactionManager deviceTransactionManager;
41 public PowerMgmtImpl(DataBroker db, OpenRoadmInterfaces openRoadmInterfaces,
42 CrossConnect crossConnect, DeviceTransactionManager deviceTransactionManager) {
44 this.openRoadmInterfaces = openRoadmInterfaces;
45 this.crossConnect = crossConnect;
46 this.deviceTransactionManager = deviceTransactionManager;
50 * This methods measures power requirement for turning up a WL
51 * from the Spanloss at OTS transmit direction and update
52 * roadm-connection target-output-power.
55 * Input parameter from the olm servicePowerSetup rpc
57 * @return true/false based on status of operation.
59 //TODO Need to Case Optical Power mode/NodeType in case of 2.2 devices
60 public Boolean setPower(ServicePowerSetupInput input) {
61 LOG.info("Olm-setPower initiated");
62 for (int i = 0; i < input.getNodes().size(); i++) {
63 String nodeId = input.getNodes().get(i).getNodeId();
64 String srcTpId = input.getNodes().get(i).getSrcTp();
65 String destTpId = input.getNodes().get(i).getDestTp();
66 Optional<Nodes> inputNodeOptional = OlmUtils.getNode(nodeId, this.db);
67 // If node type is transponder
68 if (inputNodeOptional.isPresent()
69 && (inputNodeOptional.get().getNodeType() != null)
70 && inputNodeOptional.get().getNodeType().equals(NodeTypes.Xpdr)) {
72 Nodes inputNode = inputNodeOptional.get();
73 Nodes.OpenroadmVersion openroadmVersion = inputNode.getOpenroadmVersion();
74 LOG.info("Getting data from input node {}", inputNode.getNodeType());
75 LOG.info("Getting mapping data for node is {}", inputNode.getMapping().stream().filter(o -> o.key()
76 .equals(new MappingKey(destTpId))).findFirst().toString());
77 // If its A-End transponder
78 if (destTpId.toLowerCase().contains("network")) {
79 java.util.Optional<Mapping> mappingObject = inputNode.getMapping().stream().filter(o -> o.key()
80 .equals(new MappingKey(destTpId))).findFirst();
81 if (mappingObject.isPresent()) {
82 String circuitPackName = mappingObject.get().getSupportingCircuitPackName();
83 String portName = mappingObject.get().getSupportingPort();
84 Map<String, Double> txPowerRangeMap = new HashMap<>();
85 if (openroadmVersion.equals(Nodes.OpenroadmVersion._121)) {
86 txPowerRangeMap = PowerMgmtVersion121.getXponderPowerRange(circuitPackName, portName,
87 nodeId, deviceTransactionManager);
88 } else if (openroadmVersion.equals(Nodes.OpenroadmVersion._221)) {
89 txPowerRangeMap = PowerMgmtVersion221.getXponderPowerRange(circuitPackName, portName,
90 nodeId, deviceTransactionManager);
92 if (!txPowerRangeMap.isEmpty()) {
93 LOG.info("Transponder range exists for nodeId: {}", nodeId);
94 String srgId = input.getNodes().get(i + 1).getSrcTp();
95 String nextNodeId = input.getNodes().get(i + 1).getNodeId();
96 Map<String, Double> rxSRGPowerRangeMap = new HashMap<>();
97 Optional<Mapping> mappingObjectSRG = OlmUtils.getNode(nextNodeId, db)
98 .flatMap(node -> node.getMapping()
99 .stream().filter(o -> o.key()
100 .equals(new MappingKey(srgId))).findFirst());
101 if (mappingObjectSRG.isPresent()) {
103 if (openroadmVersion.equals(Nodes.OpenroadmVersion._121)) {
104 rxSRGPowerRangeMap = PowerMgmtVersion121.getSRGRxPowerRange(nextNodeId, srgId,
105 deviceTransactionManager, mappingObjectSRG.get()
106 .getSupportingCircuitPackName(),
107 mappingObjectSRG.get().getSupportingPort());
108 } else if (inputNode.getOpenroadmVersion().equals(Nodes.OpenroadmVersion._221)) {
109 rxSRGPowerRangeMap = PowerMgmtVersion221.getSRGRxPowerRange(nextNodeId, srgId,
110 deviceTransactionManager, mappingObjectSRG.get()
111 .getSupportingCircuitPackName(),
112 mappingObjectSRG.get().getSupportingPort());
115 double powerValue = 0;
116 if (!rxSRGPowerRangeMap.isEmpty()) {
117 LOG.info("SRG Rx Power range exists for nodeId: {}", nodeId);
118 if (txPowerRangeMap.get("MaxTx")
119 <= rxSRGPowerRangeMap.get("MaxRx")) {
120 powerValue = txPowerRangeMap.get("MaxTx");
121 } else if (rxSRGPowerRangeMap.get("MaxRx")
122 < txPowerRangeMap.get("MaxTx")) {
123 powerValue = rxSRGPowerRangeMap.get("MaxRx");
125 LOG.info("Calculated Transponder Power value is {}" , powerValue);
126 String interfaceName = destTpId + "-" + input.getWaveNumber();
127 if (callSetTransponderPower(nodeId, interfaceName, new BigDecimal(powerValue),
129 LOG.info("Transponder OCH connection: {} power updated ", interfaceName);
131 LOG.info("Now going in sleep mode");
132 Thread.sleep(OlmUtils.OLM_TIMER_1);
133 } catch (InterruptedException e) {
134 LOG.info("Transponder warmup failed for OCH connection: {}", interfaceName, e);
137 LOG.info("Transponder OCH connection: {} power update failed ", interfaceName);
140 LOG.info("SRG Power Range not found");
143 LOG.info("Tranponder range not available setting to default power for nodeId: {}", nodeId);
144 String interfaceName = destTpId + "-" + input.getWaveNumber();
145 if (callSetTransponderPower(nodeId, interfaceName, new BigDecimal(-5),openroadmVersion)) {
146 LOG.info("Transponder OCH connection: {} power updated ", interfaceName);
148 Thread.sleep(OlmUtils.OLM_TIMER_1);
149 } catch (InterruptedException e) {
150 // TODO Auto-generated catch block
151 LOG.info("Transponder warmup failed for OCH connection: {}", interfaceName, e);
154 LOG.info("Transponder OCH connection: {} power update failed ", interfaceName);
158 LOG.info("Mapping object not found for nodeId: {}", nodeId);
162 LOG.info("{} is a drop node. Net power settings needed", nodeId);
164 } else if (inputNodeOptional.isPresent()
165 && (inputNodeOptional.get().getNodeType() != null)
166 && inputNodeOptional.get().getNodeType().equals(NodeTypes.Rdm)) {
167 // If Degree is transmitting end then set power
168 Nodes inputNode = inputNodeOptional.get();
169 Nodes.OpenroadmVersion openroadmVersion = inputNode.getOpenroadmVersion();
170 LOG.info("This is a roadm {} device", openroadmVersion.getName());
171 String connectionNumber = srcTpId + "-" + destTpId + "-" + input.getWaveNumber();
172 LOG.info("Connection number is {}", connectionNumber);
173 if (destTpId.toLowerCase().contains("deg")) {
174 Optional<Mapping> mappingObjectOptional = inputNode.getMapping().stream().filter(o -> o.key()
175 .equals(new MappingKey(destTpId))).findFirst();
176 if (mappingObjectOptional.isPresent()) {
177 BigDecimal spanLossTx = null;
178 LOG.info("Dest point is Degree {}", mappingObjectOptional.get());
179 Mapping portMapping = mappingObjectOptional.get();
181 if (openroadmVersion.equals(Nodes.OpenroadmVersion._121)) {
182 Optional<Interface> interfaceOpt;
185 this.openRoadmInterfaces.getInterface(nodeId, portMapping.getSupportingOts());
186 } catch (OpenRoadmInterfaceException ex) {
187 LOG.error("Failed to get interface {} from node {}!", portMapping.getSupportingOts(),
190 } catch (IllegalArgumentException ex) {
191 LOG.error("Failed to get non existing interface {} from node {}!",
192 portMapping.getSupportingOts(), nodeId);
195 if (interfaceOpt.isPresent()) {
196 if (interfaceOpt.get().augmentation(Interface1.class).getOts()
197 .getSpanLossTransmit() != null) {
198 spanLossTx = interfaceOpt.get().augmentation(Interface1.class).getOts()
199 .getSpanLossTransmit().getValue();
200 LOG.info("Spanloss TX is {}", spanLossTx);
202 LOG.error("interface {} has no spanloss value", interfaceOpt.get().getName());
205 LOG.error("Interface {} on node {} is not present!", portMapping.getSupportingOts(),
209 } else if (openroadmVersion.equals(Nodes.OpenroadmVersion._221)) {
210 Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces.grp
211 .Interface> interfaceOpt;
214 this.openRoadmInterfaces.getInterface(nodeId, portMapping.getSupportingOts());
215 } catch (OpenRoadmInterfaceException ex) {
216 LOG.error("Failed to get interface {} from node {}!", portMapping.getSupportingOts(),
219 } catch (IllegalArgumentException ex) {
220 LOG.error("Failed to get non existing interface {} from node {}!",
221 portMapping.getSupportingOts(), nodeId);
224 if (interfaceOpt.isPresent()) {
225 if (interfaceOpt.get().augmentation(org.opendaylight.yang.gen.v1.http.org
226 .openroadm.optical.transport.interfaces.rev181019.Interface1.class).getOts()
227 .getSpanLossTransmit() != null) {
228 spanLossTx = interfaceOpt.get().augmentation(org.opendaylight.yang.gen.v1.http.org
229 .openroadm.optical.transport.interfaces.rev181019.Interface1.class).getOts()
230 .getSpanLossTransmit().getValue();
231 LOG.info("Spanloss TX is {}", spanLossTx);
233 LOG.error("interface {} has no spanloss value", interfaceOpt.get().getName());
236 LOG.error("Interface {} on node {} is not present!", portMapping.getSupportingOts(),
242 BigDecimal powerValue = null;
243 if (spanLossTx != null && spanLossTx.intValue() <= 28 && spanLossTx.intValue() > 0) {
244 powerValue = BigDecimal.valueOf(Math.min(spanLossTx.doubleValue() - 9, 2));
245 LOG.info("Power Value is {}", powerValue);
246 } else if (spanLossTx.intValue() > 28) {
248 "Power Value is null - spanLossTx > 28dB not compliant with openROADM specifications");
250 } else if (spanLossTx.intValue() <= 0) {
252 "Power Value is null - spanLossTx <= 0 dB not compliant with openROADM specifications");
255 LOG.error("Power Value is null - spanLossTx is null");
259 Boolean setXconnPowerSuccessVal = crossConnect.setPowerLevel(nodeId,
260 OpticalControlMode.Power, powerValue, connectionNumber);
261 LOG.info("Success Value is {}", setXconnPowerSuccessVal);
262 if (setXconnPowerSuccessVal) {
263 LOG.info("Roadm-connection: {} updated ");
264 //The value recommended by the white paper is 20 seconds and not 60.
265 //TODO - commented code because one vendor is not supporting
266 //GainLoss with target-output-power
267 Thread.sleep(OlmUtils.OLM_TIMER_1);
268 crossConnect.setPowerLevel(nodeId, OpticalControlMode.GainLoss, powerValue,
271 LOG.info("Set Power failed for Roadm-connection: {} on Node: {}", connectionNumber,
275 } catch (InterruptedException e) {
276 LOG.error("Olm-setPower wait failed {}", e);
280 // If Drop node leave node is power mode
281 } else if (destTpId.toLowerCase().contains("srg")) {
282 LOG.info("Setting power at drop node");
283 crossConnect.setPowerLevel(nodeId, OpticalControlMode.Power, null, connectionNumber);
291 * This methods turns down power a WL by performing
295 * 1. Pull interfaces used in service and change
296 * status to outOfService
299 * 2. For each of the ROADM node set target-output-power
300 * to -60dbm, wait for 20 seconds, turn power mode to off
303 * 3. Turn down power in Z to A direction and A to Z
306 * Input parameter from the olm servicePowerTurndown rpc
308 * @return true/false based on status of operation
310 public Boolean powerTurnDown(ServicePowerTurndownInput input) {
311 LOG.info("Olm-powerTurnDown initiated");
312 /*Starting with last element into the list Z -> A for
313 turning down A -> Z */
314 for (int i = input.getNodes().size() - 1; i >= 0; i--) {
315 String nodeId = input.getNodes().get(i).getNodeId();
316 String srcTpId = input.getNodes().get(i).getSrcTp();
317 String destTpId = input.getNodes().get(i).getDestTp();
318 Long wlNumber = input.getWaveNumber();
319 String connectionNumber = srcTpId + "-" + destTpId + "-" + wlNumber;
320 if (destTpId.toLowerCase().contains("srg")) {
321 crossConnect.setPowerLevel(nodeId, OpticalControlMode.Off, null, connectionNumber);
322 } else if (destTpId.toLowerCase().contains("deg")) {
324 if (!crossConnect.setPowerLevel(nodeId, OpticalControlMode.Power , new BigDecimal(-60),
326 LOG.warn("Power down failed for Roadm-connection: {}", connectionNumber);
329 Thread.sleep(OlmUtils.OLM_TIMER_2);
330 if (! crossConnect.setPowerLevel(nodeId, OpticalControlMode.Off , null, connectionNumber)) {
331 LOG.warn("Setting power-control mode off failed for Roadm-connection: {}", connectionNumber);
334 } catch (InterruptedException e) {
335 // TODO Auto-generated catch block
336 LOG.error("Olm-powerTurnDown wait failed {}",e);
345 * This method does an edit-config on roadm connection subtree for a given
346 * connection number in order to set power level for use by the optical
350 * PortMapping network node.
352 * Destination termination point.
354 * SRG Id to which network port is connected to.
356 * Next roadm connect.
358 * WaveLength number part of request
359 * @return true/false based on status of operation.
361 private boolean setTransponderPowerTx(Nodes inputNode, String destTpId, String srgId,
362 String nextNodeId, Long waveLength) {
363 Map<String, Double> txPowerRangeMap = null;
364 Map<String, Double> rxSRGPowerRangeMap = null;
365 Nodes.OpenroadmVersion openroadmVersion;
366 Optional<Mapping> mappingObject = inputNode.getMapping().stream().filter(o -> o.key()
367 .equals(new MappingKey(destTpId))).findFirst();
368 String nodeId = inputNode.getNodeId();
369 if (mappingObject.isPresent()) {
370 String circuitPackName = mappingObject.get().getSupportingCircuitPackName();
371 String portName = mappingObject.get().getSupportingPort();
372 openroadmVersion = inputNode.getOpenroadmVersion();
373 if (inputNode.getOpenroadmVersion().equals(Nodes.OpenroadmVersion._121)) {
374 txPowerRangeMap = PowerMgmtVersion121.getXponderPowerRange(circuitPackName, portName,
375 nodeId, deviceTransactionManager);
376 } else if (inputNode.getOpenroadmVersion().equals(Nodes.OpenroadmVersion._221)) {
377 txPowerRangeMap = PowerMgmtVersion221.getXponderPowerRange(circuitPackName, portName,
378 nodeId, deviceTransactionManager);
380 LOG.info("Transponder power range is fine");
381 if (!txPowerRangeMap.isEmpty()) {
382 LOG.info("Transponder power range is not null {}, {}", nextNodeId,srgId);
383 //Transponder range is not empty then check SRG Range
385 Optional<Mapping> mappingObjectSRG = OlmUtils.getNode(nextNodeId, db)
386 .flatMap(node -> node.getMapping()
387 .stream().filter(o -> o.key()
388 .equals(new MappingKey(srgId))).findFirst());
389 if (mappingObjectSRG.isPresent()) {
390 LOG.info("Transponder range exists for nodeId: {}", nodeId);
391 if (inputNode.getOpenroadmVersion().equals(Nodes.OpenroadmVersion._121)) {
392 rxSRGPowerRangeMap = PowerMgmtVersion121.getSRGRxPowerRange(nextNodeId, srgId,
393 deviceTransactionManager, mappingObjectSRG.get().getSupportingCircuitPackName(),
394 mappingObjectSRG.get().getSupportingPort());
395 } else if (inputNode.getOpenroadmVersion().equals(Nodes.OpenroadmVersion._221)) {
396 rxSRGPowerRangeMap = PowerMgmtVersion221.getSRGRxPowerRange(nextNodeId, srgId,
397 deviceTransactionManager, mappingObjectSRG.get().getSupportingCircuitPackName(),
398 mappingObjectSRG.get().getSupportingPort());
401 double powerValue = 0;
402 if (!rxSRGPowerRangeMap.isEmpty()) {
403 LOG.debug("SRG Rx Power range exists for nodeId: {}", nodeId);
404 if (txPowerRangeMap.get("MaxTx")
405 <= rxSRGPowerRangeMap.get("MaxRx")) {
406 powerValue = txPowerRangeMap.get("MaxTx");
407 } else if (rxSRGPowerRangeMap.get("MaxRx")
408 < txPowerRangeMap.get("MaxTx")) {
409 powerValue = rxSRGPowerRangeMap.get("MaxRx");
411 LOG.debug("Calculated Transponder Power value is {}" , powerValue);
412 String interfaceName = destTpId + "-" + waveLength;
413 if (callSetTransponderPower(nodeId,interfaceName,new BigDecimal(powerValue),
415 LOG.info("Transponder OCH connection: {} power updated ", interfaceName);
417 LOG.info("Now going in sleep mode");
420 } catch (InterruptedException e) {
421 LOG.info("Transponder warmup failed for OCH connection: {}", interfaceName, e);
425 LOG.info("Transponder OCH connection: {} power update failed ", interfaceName);
429 LOG.info("Transponder Range exists but SRG Power Range not found");
433 LOG.info("Tranponder range not available seting to default power for nodeId: {}", nodeId);
434 String interfaceName = destTpId + "-" + waveLength;
435 if (callSetTransponderPower(nodeId,interfaceName,new BigDecimal(-5),
437 LOG.info("Transponder OCH connection: {} power updated ", interfaceName);
439 Thread.sleep(OlmUtils.OLM_TIMER_1);
441 } catch (InterruptedException e) {
442 // TODO Auto-generated catch block
443 LOG.info("Transponder warmup failed for OCH connection: {}", interfaceName, e);
447 LOG.info("Transponder OCH connection: {} power update failed ", interfaceName);
452 LOG.info("Mapping object not found for nodeId: {}", nodeId);
458 * This method retrieves transponder OCH interface and
462 * Unique identifier for the mounted netconf- node
463 * @param interfaceName
464 * OCH interface name carrying WL
466 * Calculated transmit power
467 * @param openroadmVersion
468 * Version of openRoadm device software
469 * @return true/false based on status of operation
471 private boolean callSetTransponderPower(String nodeId, String interfaceName, BigDecimal txPower,
472 Nodes.OpenroadmVersion openroadmVersion) {
473 boolean powerSetupResult = false;
475 if (openroadmVersion.equals(Nodes.OpenroadmVersion._121)) {
476 Optional<Interface> interfaceOptional;
477 interfaceOptional = openRoadmInterfaces.getInterface(nodeId, interfaceName);
478 if (interfaceOptional.isPresent()) {
479 powerSetupResult = PowerMgmtVersion121.setTransponderPower(nodeId, interfaceName,
480 txPower, deviceTransactionManager, interfaceOptional.get());
482 LOG.error("Interface {} on node {} is not present!", interfaceName, nodeId);
485 } else if (openroadmVersion.equals(Nodes.OpenroadmVersion._221)) {
486 Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces.grp
487 .Interface> interfaceOptional;
488 interfaceOptional = openRoadmInterfaces.getInterface(nodeId, interfaceName);
489 if (interfaceOptional.isPresent()) {
490 powerSetupResult = PowerMgmtVersion221.setTransponderPower(nodeId, interfaceName,
491 txPower, deviceTransactionManager, interfaceOptional.get());
493 LOG.error("Interface {} on node {} is not present!", interfaceName, nodeId);
497 } catch (OpenRoadmInterfaceException ex) {
498 LOG.error("Failed to get interface {} from node {}!", interfaceName, nodeId, ex);
501 if (powerSetupResult) {
502 LOG.debug("Transponder power set up completed successfully for nodeId {} and interface {}",
503 nodeId,interfaceName);
504 return powerSetupResult;
506 LOG.debug("Transponder power setup failed for nodeId {} on interface {}",
507 nodeId, interfaceName);
508 return powerSetupResult;
513 * This method retrieves transponder OCH interface and
517 * Unique identifier for the mounted netconf- node
518 * @param interfaceName
519 * OCH interface name carrying WL
520 * @param openroadmVersion
521 * Version of openRoadm device software
523 * Wavelength Number *
524 * @return true/false based on status of operation
526 private boolean callSetRoadmPowerTx(String nodeId, String interfaceName,
527 Nodes.OpenroadmVersion openroadmVersion,
528 Long wavelength, String connectionNumber) {
529 if (interfaceName == null) {
530 crossConnect.setPowerLevel(nodeId,
531 OpticalControlMode.Power , null,connectionNumber);
535 if (openroadmVersion.equals(Nodes.OpenroadmVersion._121)) {
536 Optional<Interface> interfaceOpt;
537 interfaceOpt = openRoadmInterfaces.getInterface(nodeId, interfaceName);
538 if (interfaceOpt.isPresent()) {
539 BigDecimal spanLossTx = interfaceOpt.get().augmentation(Interface1.class).getOts()
540 .getSpanLossTransmit().getValue();
541 LOG.debug("Spanloss TX is {}", spanLossTx);
542 BigDecimal powerValue = BigDecimal.valueOf(Math.min(spanLossTx.doubleValue() - 9, 2));
543 LOG.debug("Power Value is {}", powerValue);
544 Boolean setXconnPowerSuccessVal = crossConnect.setPowerLevel(nodeId,
545 OpticalControlMode.Power, powerValue,connectionNumber);
546 if (setXconnPowerSuccessVal) {
547 LOG.info("Roadm-connection: {} updated ");
548 //TODO - commented code because one vendor is not supporting
549 //GainLoss with target-output-power
550 Thread.sleep(OlmUtils.OLM_TIMER_2);
551 crossConnect.setPowerLevel(nodeId,
552 OpticalControlMode.GainLoss, powerValue,connectionNumber);
555 LOG.info("Set Power failed for Roadm-connection: {} on Node: {}", connectionNumber, nodeId);
559 LOG.error("Interface {} on node {} is not present!", interfaceName, nodeId);
562 } else if (openroadmVersion.equals(Nodes.OpenroadmVersion._221)) {
563 Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces
564 .grp.Interface> interfaceOpt;
565 interfaceOpt = openRoadmInterfaces.getInterface(nodeId, interfaceName);
566 if (interfaceOpt.isPresent()) {
567 BigDecimal spanLossTx = interfaceOpt.get().augmentation(org.opendaylight.yang.gen.v1.http
568 .org.openroadm.optical.transport.interfaces.rev181019.Interface1.class).getOts()
569 .getSpanLossTransmit().getValue();
570 LOG.debug("Spanloss TX is {}", spanLossTx);
571 BigDecimal powerValue = BigDecimal.valueOf(Math.min(spanLossTx.doubleValue() - 9, 2));
572 LOG.debug("Power Value is {}", powerValue);
573 Boolean setXconnPowerSuccessVal = crossConnect.setPowerLevel(nodeId,
574 OpticalControlMode.Power, powerValue,connectionNumber);
575 if (setXconnPowerSuccessVal) {
576 LOG.info("Roadm-connection: {} updated ");
577 //TODO - commented code because one vendor is not supporting
578 //GainLoss with target-output-power
579 Thread.sleep(OlmUtils.OLM_TIMER_2);
580 crossConnect.setPowerLevel(nodeId,
581 OpticalControlMode.GainLoss, powerValue,connectionNumber);
584 LOG.info("Set Power failed for Roadm-connection: {} on Node: {}", connectionNumber, nodeId);
589 } catch (OpenRoadmInterfaceException | InterruptedException ex) {
590 LOG.error("Error during power setup on Roadm nodeId: {} for connection: {}", nodeId, connectionNumber, ex);