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