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 com.google.common.util.concurrent.ListenableFuture;
13 import java.math.BigDecimal;
14 import java.util.HashMap;
16 import java.util.Optional;
17 import java.util.concurrent.ExecutionException;
18 import java.util.concurrent.Future;
19 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
20 import org.opendaylight.transportpce.common.Timeouts;
21 import org.opendaylight.transportpce.common.crossconnect.CrossConnect;
22 import org.opendaylight.transportpce.common.device.DeviceTransaction;
23 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
24 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.OpticalControlMode;
25 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.PowerDBm;
26 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.pack.Ports;
27 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.pack.PortsKey;
28 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.packs.CircuitPacks;
29 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.packs.CircuitPacksKey;
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.rev170206.interfaces.grp.InterfaceBuilder;
32 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfaces.grp.InterfaceKey;
33 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.OrgOpenroadmDevice;
34 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.RoadmConnections;
35 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.RoadmConnectionsBuilder;
36 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.RoadmConnectionsKey;
37 import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev161014.Interface1Builder;
38 import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev161014.och.container.OchBuilder;
39 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
40 import org.slf4j.Logger;
41 import org.slf4j.LoggerFactory;
43 public final class PowerMgmtVersion121 {
44 private static final Logger LOG = LoggerFactory.getLogger(PowerMgmtVersion121.class);
46 private PowerMgmtVersion121() {
50 * This method provides Transponder transmit power range.
52 * @param circuitPackName
53 * Transponder circuitPack name
55 * Transponder port name
58 * @param deviceTransactionManager
59 * Device transaction manager to read device data
60 * @return HashMap holding Min and Max transmit power for given port
62 public static Map<String, Double> getXponderPowerRange(String circuitPackName, String portName, String deviceId,
63 DeviceTransactionManager deviceTransactionManager) {
64 InstanceIdentifier<Ports> portIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
65 .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName))
66 .child(Ports.class, new PortsKey(portName));
67 Map<String, Double> powerRangeMap = new HashMap<>();
68 LOG.debug("Fetching logical Connection Point value for port {} at circuit pack {}", portName, circuitPackName);
69 Optional<Ports> portObject =
70 deviceTransactionManager.getDataFromDevice(deviceId, LogicalDatastoreType.OPERATIONAL, portIID,
71 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
72 if (portObject.isPresent()) {
73 Ports port = portObject.get();
74 if (port.getTransponderPort().getPortPowerCapabilityMaxTx() != null) {
75 powerRangeMap.put("MaxTx", port.getTransponderPort().getPortPowerCapabilityMaxTx().getValue()
77 powerRangeMap.put("MinTx", port.getTransponderPort().getPortPowerCapabilityMinTx().getValue()
80 LOG.warn("Logical Connection Point value missing for {} {}", circuitPackName, port.getPortName());
87 * This method provides Transponder transmit power range.
90 * Unique identifier for the mounted netconf- node
92 * SRG Id connected to transponder
93 * @param deviceTransactionManager
94 * Device transaction manager to read device data
95 * @param circuitPackName
96 * SRG circuitpack name
99 * @return HashMap holding Min and Max transmit power for given port
101 public static Map<String, Double> getSRGRxPowerRange(String nodeId, String srgId,
102 DeviceTransactionManager deviceTransactionManager,
103 String circuitPackName, String portName) {
104 Map<String, Double> powerRangeMap = new HashMap<>();
105 LOG.debug("Coming inside SRG power range");
106 LOG.debug("Mapping object exists.");
107 InstanceIdentifier<Ports> portIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
108 .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName))
109 .child(Ports.class, new PortsKey(portName));
110 LOG.debug("Fetching logical Connection Point value for port {} at circuit pack {}{}", portName,
111 circuitPackName, portIID);
112 Optional<Ports> portObject =
113 deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, portIID,
114 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
115 if (portObject.isPresent()) {
116 Ports port = portObject.get();
117 if (port.getRoadmPort() != null) {
118 LOG.debug("Port found on the node ID");
119 powerRangeMap.put("MinRx", port.getRoadmPort()
120 .getPortPowerCapabilityMinRx().getValue().doubleValue());
121 powerRangeMap.put("MaxRx", port.getRoadmPort()
122 .getPortPowerCapabilityMaxRx().getValue().doubleValue());
123 return powerRangeMap;
125 LOG.warn("Roadm ports power value is missing for {} {}", circuitPackName, port.getPortName());
128 LOG.info("Port not found");
130 return powerRangeMap;
134 * This method retrieves transponder OCH interface and
138 * Unique identifier for the mounted netconf- node
139 * @param interfaceName
140 * OCH interface name carrying WL
142 * Calculated transmit power
143 * @param interfaceObj
145 * @param deviceTransactionManager
146 * Device Transaction Manager
148 * @return true/false based on status of operation
150 public static boolean setTransponderPower(String nodeId, String interfaceName, BigDecimal txPower,
151 DeviceTransactionManager deviceTransactionManager,
152 Interface interfaceObj) {
153 LOG.debug("Setting target-power for transponder nodeId: {} InterfaceName: {}",
154 nodeId, interfaceName);
155 InterfaceBuilder ochInterfaceBuilder =
156 new InterfaceBuilder(interfaceObj);
157 OchBuilder ochBuilder = new OchBuilder(ochInterfaceBuilder.augmentation(
158 org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev161014
159 .Interface1.class).getOch());
160 ochBuilder.setTransmitPower(new PowerDBm(txPower));
161 ochInterfaceBuilder.addAugmentation(
162 org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev161014
163 .Interface1.class, new Interface1Builder().setOch(ochBuilder.build()).build());
164 Future<Optional<DeviceTransaction>> deviceTxFuture = deviceTransactionManager.getDeviceTransaction(nodeId);
165 DeviceTransaction deviceTx;
167 Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
168 if (deviceTxOpt.isPresent()) {
169 deviceTx = deviceTxOpt.get();
171 LOG.error("Transaction for device {} was not found during transponder"
172 + " power setup for Node:", nodeId);
175 } catch (InterruptedException | ExecutionException e) {
176 LOG.error("Unable to get transaction for device {} during transponder power "
177 + "setup!", nodeId, e);
180 InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
181 .child(Interface.class, new InterfaceKey(interfaceName));
182 deviceTx.put(LogicalDatastoreType.CONFIGURATION, interfacesIID, ochInterfaceBuilder.build());
183 ListenableFuture<Void> submit = deviceTx.submit(Timeouts.DEVICE_WRITE_TIMEOUT,
184 Timeouts.DEVICE_WRITE_TIMEOUT_UNIT);
187 LOG.info("Transponder Power update is submitted");
189 } catch (InterruptedException | ExecutionException e) {
190 LOG.error("Setting transponder power failed {}", e);
197 * This method does an edit-config on roadm connection subtree for a given
198 * connection number in order to set power level for use by the optical
204 * Optical control modelcan be off, power or gainLoss.
206 * Power value in DBm.
207 * @param connectionNumber
208 * Name of the cross connect.
209 * @param crossConnect
211 * @param deviceTransactionManager
212 * Device Transaction Manager.
214 * @return true/false based on status of operation.
216 public static boolean setPowerLevel(String deviceId, OpticalControlMode mode, BigDecimal powerValue,
217 String connectionNumber, CrossConnect crossConnect,
218 DeviceTransactionManager deviceTransactionManager) {
219 Optional<RoadmConnections> rdmConnOpt = crossConnect.getCrossConnect(deviceId, connectionNumber);
220 if (rdmConnOpt.isPresent()) {
221 RoadmConnectionsBuilder rdmConnBldr = new RoadmConnectionsBuilder(rdmConnOpt.get());
222 rdmConnBldr.setOpticalControlMode(mode);
223 if (powerValue != null) {
224 rdmConnBldr.setTargetOutputPower(new PowerDBm(powerValue));
226 RoadmConnections newRdmConn = rdmConnBldr.build();
227 Future<Optional<DeviceTransaction>> deviceTxFuture =
228 deviceTransactionManager.getDeviceTransaction(deviceId);
229 DeviceTransaction deviceTx;
231 Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
232 if (deviceTxOpt.isPresent()) {
233 deviceTx = deviceTxOpt.get();
235 LOG.error("Transaction for device {} was not found!", deviceId);
238 } catch (InterruptedException | ExecutionException e) {
239 LOG.error("Unable to get transaction for device {}!", deviceId, e);
242 // post the cross connect on the device
243 InstanceIdentifier<RoadmConnections> roadmConnIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
244 .child(RoadmConnections.class, new RoadmConnectionsKey(connectionNumber));
245 deviceTx.put(LogicalDatastoreType.CONFIGURATION, roadmConnIID, newRdmConn);
246 ListenableFuture<Void> submit = deviceTx.submit(Timeouts.DEVICE_WRITE_TIMEOUT,
247 Timeouts.DEVICE_WRITE_TIMEOUT_UNIT);
250 LOG.info("Roadm connection power level successfully set ");
252 } catch (InterruptedException | ExecutionException ex) {
253 LOG.warn("Failed to post {}", newRdmConn, ex);
256 LOG.warn("Roadm-Connection is null in set power level ({})", connectionNumber);