X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=olm%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Ftransportpce%2Folm%2Fpower%2FPowerMgmt.java;h=e7ab4f6ccf46ad6faa97604eedee6f6a99652e9e;hb=80f9070187cb60c40f057df83bd2ecd123b84b5d;hp=789d2fb9c52cdc91936da776230f70fbb181d324;hpb=74d11927047a7b6ace072a208ee7b1d9a3769d9d;p=transportpce.git diff --git a/olm/src/main/java/org/opendaylight/transportpce/olm/power/PowerMgmt.java b/olm/src/main/java/org/opendaylight/transportpce/olm/power/PowerMgmt.java index 789d2fb9c..e7ab4f6cc 100644 --- a/olm/src/main/java/org/opendaylight/transportpce/olm/power/PowerMgmt.java +++ b/olm/src/main/java/org/opendaylight/transportpce/olm/power/PowerMgmt.java @@ -8,22 +8,24 @@ package org.opendaylight.transportpce.olm.power; -import com.google.common.base.Optional; -import com.google.common.util.concurrent.CheckedFuture; +import com.google.common.util.concurrent.ListenableFuture; + import java.math.BigDecimal; import java.util.HashMap; import java.util.Map; +import java.util.Optional; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; + import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.controller.md.sal.binding.api.MountPoint; -import org.opendaylight.controller.md.sal.binding.api.MountPointService; -import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; -import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; -import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; -import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterfaces; -import org.opendaylight.transportpce.renderer.provisiondevice.CrossConnect; +import org.opendaylight.transportpce.common.Timeouts; +import org.opendaylight.transportpce.common.crossconnect.CrossConnect; +import org.opendaylight.transportpce.common.device.DeviceTransaction; +import org.opendaylight.transportpce.common.device.DeviceTransactionManager; +import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException; +import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaces; +import org.opendaylight.transportpce.olm.util.OlmUtils; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.NodeTypes; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.OpticalControlMode; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.PowerDBm; @@ -35,42 +37,36 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfac import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfaces.grp.InterfaceBuilder; import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfaces.grp.InterfaceKey; import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.OrgOpenroadmDevice; +import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.RoadmConnections; +import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.RoadmConnectionsBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.RoadmConnectionsKey; import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev161014.AdminStates; import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev161014.Interface1Builder; import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev161014.och.container.OchBuilder; import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev161014.Interface1; -import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.network.topology.topology.topology.types.TopologyNetconf; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.olm.rev170418.ServicePowerSetupInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.olm.rev170418.ServicePowerTurndownInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.portmapping.rev170228.Network; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.portmapping.rev170228.network.Nodes; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.portmapping.rev170228.network.NodesKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.portmapping.rev170228.network.nodes.Mapping; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.portmapping.rev170228.network.nodes.MappingKey; -import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology; -import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; -import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId; -import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology; -import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey; -import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; -import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class PowerMgmt { private static final Logger LOG = LoggerFactory.getLogger(PowerMgmt.class); + private static final long DATA_STORE_READ_TIMEOUT = 120; private final DataBroker db; - private final MountPointService mps; - public static final InstanceIdentifier NETCONF_TOPO_IID = - InstanceIdentifier - .create(NetworkTopology.class) - .child(Topology.class, - new TopologyKey(new TopologyId(TopologyNetconf.QNAME.getLocalName()))); + private final OpenRoadmInterfaces openRoadmInterfaces; + private final CrossConnect crossConnect; + private final DeviceTransactionManager deviceTransactionManager; - public PowerMgmt(DataBroker db, MountPointService mps) { + public PowerMgmt(DataBroker db, OpenRoadmInterfaces openRoadmInterfaces, + CrossConnect crossConnect, DeviceTransactionManager deviceTransactionManager) { this.db = db; - this.mps = mps; + this.openRoadmInterfaces = openRoadmInterfaces; + this.crossConnect = crossConnect; + this.deviceTransactionManager = deviceTransactionManager; } /** @@ -89,52 +85,51 @@ public class PowerMgmt { String nodeId = input.getNodes().get(i).getNodeId(); String srcTpId = input.getNodes().get(i).getSrcTp(); String destTpId = input.getNodes().get(i).getDestTp(); - DataBroker deviceDb = getDeviceDataBroker(nodeId , mps); - Nodes inputNode = getNode(nodeId, mps, db); - LOG.info("Getting data from input node {}",inputNode.getNodeType()); - LOG.info("Getting mapping data for node is {}",inputNode.getMapping().stream().filter(o -> o.getKey() - .equals(new MappingKey(destTpId))).findFirst().toString()); + Optional inputNodeOptional = OlmUtils.getNode(nodeId, db); // If node type is transponder - if (inputNode.getNodeType() != null && inputNode.getNodeType().equals(NodeTypes.Xpdr)) { + if (inputNodeOptional.isPresent() + && inputNodeOptional.get().getNodeType() != null + && inputNodeOptional.get().getNodeType().equals(NodeTypes.Xpdr)) { + + Nodes inputNode = inputNodeOptional.get(); + LOG.info("Getting data from input node {}", inputNode.getNodeType()); + LOG.info("Getting mapping data for node is {}", inputNode.getMapping().stream().filter(o -> o.getKey() + .equals(new MappingKey(destTpId))).findFirst().toString()); // If its A-End transponder if (destTpId.toLowerCase().contains("network")) { java.util.Optional mappingObject = inputNode.getMapping().stream().filter(o -> o.getKey() .equals(new MappingKey(destTpId))).findFirst(); if (mappingObject.isPresent()) { - Map txPowerRangeMap = getXponderPowerRange(nodeId, mappingObject.get() - .getSupportingCircuitPackName(), - mappingObject.get().getSupportingPort(),deviceDb); + Map txPowerRangeMap = getXponderPowerRange(mappingObject.get() + .getSupportingCircuitPackName(), mappingObject.get().getSupportingPort(), nodeId); if (!txPowerRangeMap.isEmpty()) { LOG.info("Transponder range exists for nodeId: {}", nodeId); String srgId = input.getNodes().get(i + 1).getSrcTp(); String nextNodeId = input.getNodes().get(i + 1).getNodeId(); - DataBroker deviceDbSRG = getDeviceDataBroker(nextNodeId , mps); - Map rxSRGPowerRangeMap = getSRGRxPowerRange(nextNodeId, srgId, deviceDbSRG); - Double powerValue = new Double(0); + + Map rxSRGPowerRangeMap = getSRGRxPowerRange(nextNodeId, srgId); + double powerValue = 0; if (!rxSRGPowerRangeMap.isEmpty()) { LOG.info("SRG Rx Power range exists for nodeId: {}", nodeId); - if (txPowerRangeMap.get("MaxTx").doubleValue() - <= rxSRGPowerRangeMap.get("MaxRx").doubleValue()) { - powerValue = txPowerRangeMap.get("MaxTx").doubleValue(); - } else if (rxSRGPowerRangeMap.get("MaxRx").doubleValue() - < txPowerRangeMap.get("MaxTx").doubleValue()) { - powerValue = rxSRGPowerRangeMap.get("MaxRx").doubleValue(); + if (txPowerRangeMap.get("MaxTx") + <= rxSRGPowerRangeMap.get("MaxRx")) { + powerValue = txPowerRangeMap.get("MaxTx"); + } else if (rxSRGPowerRangeMap.get("MaxRx") + < txPowerRangeMap.get("MaxTx")) { + powerValue = rxSRGPowerRangeMap.get("MaxRx"); } LOG.info("Calculated Transponder Power value is {}" , powerValue); - if (setTransponderPower(nodeId, destTpId, destTpId + "-" + input.getWaveNumber(), - new BigDecimal(powerValue), deviceDb)) { - LOG.info("Transponder OCH connection: {} power updated ", - destTpId + "-" + input.getWaveNumber()); + String interfaceName = destTpId + "-" + input.getWaveNumber(); + if (setTransponderPower(nodeId, interfaceName, new BigDecimal(powerValue))) { + LOG.info("Transponder OCH connection: {} power updated ", interfaceName); try { LOG.info("Now going in sleep mode"); - Thread.sleep(180000); + Thread.sleep(120000); } catch (InterruptedException e) { - LOG.info("Transponder warmup failed for OCH connection: {}", - destTpId + "-" + input.getWaveNumber(), e); + LOG.info("Transponder warmup failed for OCH connection: {}", interfaceName, e); } } else { - LOG.info("Transponder OCH connection: {} power update failed ", - destTpId + "-" + input.getWaveNumber()); + LOG.info("Transponder OCH connection: {} power update failed ", interfaceName); } } else { LOG.info("SRG Power Range not found"); @@ -142,20 +137,17 @@ public class PowerMgmt { } else { LOG.info("Tranponder range not available seting to default " + "power for nodeId: {}", nodeId); - if (setTransponderPower(nodeId, destTpId, destTpId + "-" + input.getWaveNumber(), - new BigDecimal(-5), deviceDb)) { - LOG.info("Transponder OCH connection: {} power updated ", - destTpId + "-" + input.getWaveNumber()); + String interfaceName = destTpId + "-" + input.getWaveNumber(); + if (setTransponderPower(nodeId, interfaceName, new BigDecimal(-5))) { + LOG.info("Transponder OCH connection: {} power updated ", interfaceName); try { - Thread.sleep(180000); + Thread.sleep(120000); } catch (InterruptedException e) { // TODO Auto-generated catch block - LOG.info("Transponder warmup failed for OCH connection: {}", - destTpId + "-" + input.getWaveNumber(), e); + LOG.info("Transponder warmup failed for OCH connection: {}", interfaceName, e); } } else { - LOG.info("Transponder OCH connection: {} power update failed ", - destTpId + "-" + input.getWaveNumber()); + LOG.info("Transponder OCH connection: {} power update failed ", interfaceName); } } } else { @@ -165,45 +157,64 @@ public class PowerMgmt { } else { LOG.info("{} is a drop node. Net power settings needed", nodeId); } - } else if (inputNode.getNodeType() != null && inputNode.getNodeType().equals(NodeTypes.Rdm)) { - // If Degree is transmitting end then set power + } else if (inputNodeOptional.isPresent() + && inputNodeOptional.get().getNodeType() != null + && inputNodeOptional.get().getNodeType().equals(NodeTypes.Rdm)) { + // If Degree is transmitting end then set power + Nodes inputNode = inputNodeOptional.get(); + LOG.info("This is a roadm device "); + String connectionNumber = srcTpId + "-" + destTpId + "-" + input.getWaveNumber(); + LOG.info("Connection number is {}", connectionNumber); if (destTpId.toLowerCase().contains("deg")) { - java.util.Optional mappingObject = inputNode.getMapping().stream().filter(o -> o.getKey() + Optional mappingObjectOptional = inputNode.getMapping().stream().filter(o -> o.getKey() .equals(new MappingKey(destTpId))).findFirst(); - Mapping portMapping = mappingObject.get(); - if (portMapping != null && deviceDb != null) { - BigDecimal spanLossTx = new OpenRoadmInterfaces(db, mps, nodeId, destTpId) - .getInterface(portMapping.getSupportingOts()).getAugmentation(Interface1.class).getOts() - .getSpanLossTransmit().getValue(); - Double powerValue = Math.min(spanLossTx.doubleValue() - 9 , 2); - CrossConnect roadmCrossConnect = new CrossConnect(deviceDb, srcTpId - + "-" + destTpId + "-" + input.getWaveNumber()); + if (mappingObjectOptional.isPresent()) { + LOG.info("Dest point is Degree {}", mappingObjectOptional.get()); + Mapping portMapping = mappingObjectOptional.get(); + Optional interfaceOpt; try { - Boolean setXconnPowerSuccessVal = roadmCrossConnect.setPowerLevel(OpticalControlMode.Power, - new PowerDBm(BigDecimal.valueOf(powerValue))); - if (setXconnPowerSuccessVal) { - LOG.info("Roadm-connection: {} updated "); - //TODO - commented code because one vendor is not supporting - //GainLoss with target-output-power - Thread.sleep(20000); - roadmCrossConnect.setPowerLevel(OpticalControlMode.GainLoss, - new PowerDBm(BigDecimal.valueOf(powerValue))); - } else { - LOG.info("Set Power failed for Roadm-connection: {} on Node: {}", - srcTpId + "-" + destTpId + "-" + input.getWaveNumber(), nodeId); + interfaceOpt = openRoadmInterfaces.getInterface(nodeId, portMapping.getSupportingOts()); + } catch (OpenRoadmInterfaceException ex) { + LOG.error("Failed to get interface {} from node {}!", portMapping.getSupportingOts(), + nodeId, ex); + return false; + } + if (interfaceOpt.isPresent()) { + BigDecimal spanLossTx = interfaceOpt.get().getAugmentation(Interface1.class).getOts() + .getSpanLossTransmit().getValue(); + LOG.info("Spanloss TX is {}", spanLossTx); + BigDecimal powerValue = BigDecimal.valueOf(Math.min(spanLossTx.doubleValue() - 9, 2)); + LOG.info("Power Value is {}", powerValue); + try { + Boolean setXconnPowerSuccessVal = setPowerLevel(nodeId, + OpticalControlMode.Power, powerValue, connectionNumber); + LOG.info("Success Value is {}", setXconnPowerSuccessVal); + if (setXconnPowerSuccessVal) { + LOG.info("Roadm-connection: {} updated "); + //TODO - commented code because one vendor is not supporting + //GainLoss with target-output-power + Thread.sleep(20000); + setPowerLevel(nodeId, OpticalControlMode.GainLoss, powerValue, + connectionNumber); + } else { + LOG.info("Set Power failed for Roadm-connection: {} on Node: {}", connectionNumber, + nodeId); + return false; + } + } catch (InterruptedException e) { + LOG.error("Olm-setPower wait failed {}", e); return false; } - } catch (InterruptedException e) { - LOG.error("Olm-setPower wait failed {}",e); + } else { + LOG.error("Interface {} on node {} is not present!", portMapping.getSupportingOts(), + nodeId); return false; } } // If Drop node leave node is power mode } else if (destTpId.toLowerCase().contains("srg")) { LOG.info("Setting power at drop node"); - CrossConnect roadmDropCrossConnect = new CrossConnect(deviceDb, srcTpId + "-" - + destTpId + "-" + input.getWaveNumber()); - roadmDropCrossConnect.setPowerLevel(OpticalControlMode.Power, null); + setPowerLevel(nodeId, OpticalControlMode.Power, null, connectionNumber); } } } @@ -232,43 +243,36 @@ public class PowerMgmt { */ public Boolean powerTurnDown(ServicePowerTurndownInput input) { LOG.info("Olm-powerTurnDown initiated"); - /**Starting with last element into the list Z -> A for - turning down A -> Z **/ + /*Starting with last element into the list Z -> A for + turning down A -> Z */ for (int i = input.getNodes().size() - 1; i >= 0; i--) { String nodeId = input.getNodes().get(i).getNodeId(); String srcTpId = input.getNodes().get(i).getSrcTp(); String destTpId = input.getNodes().get(i).getDestTp(); Long wlNumber = input.getWaveNumber(); - DataBroker deviceDb = getDeviceDataBroker(nodeId , mps); - if (!setInterfaceOutOfService(nodeId, srcTpId, - srcTpId + "-" + wlNumber, deviceDb)) { - LOG.warn("Out of service status update failed for interface {} ", - srcTpId + "-" + wlNumber); - return false; - } - if (!setInterfaceOutOfService(nodeId, destTpId, - destTpId + "-" + wlNumber, deviceDb)) { - LOG.warn("Out of service status update failed for interface {} ", - destTpId + "-" + wlNumber); - return false; - } - CrossConnect roadmCrossConnect = new CrossConnect(deviceDb, srcTpId - + "-" + destTpId + "-" + wlNumber); + String srcInterfaceName = srcTpId + "-" + wlNumber; + //if (!setInterfaceOutOfService(nodeId, srcTpId, srcInterfaceName, deviceDb)) { + // LOG.warn("Out of service status update failed for interface {} ", srcInterfaceName); + // return false; + //} + String destInterfaceName = destTpId + "-" + wlNumber; + //if (!setInterfaceOutOfService(nodeId, destTpId, destInterfaceName, deviceDb)) { + // LOG.warn("Out of service status update failed for interface {} ", destInterfaceName); + // return false; + //} + String connectionNumber = srcTpId + "-" + destTpId + "-" + wlNumber; if (destTpId.toLowerCase().contains("srg")) { - roadmCrossConnect.setPowerLevel(OpticalControlMode.Off, null); + setPowerLevel(nodeId, OpticalControlMode.Off, null, connectionNumber); } else if (destTpId.toLowerCase().contains("deg")) { try { - if (!roadmCrossConnect.setPowerLevel(OpticalControlMode.Power, - new PowerDBm(new BigDecimal(-60)))) { - LOG.warn("Power down failed for Roadm-connection: {}", srcTpId - + "-" + destTpId + "-" + wlNumber); + if (!setPowerLevel(nodeId, OpticalControlMode.Power, new BigDecimal(-60), + connectionNumber)) { + LOG.warn("Power down failed for Roadm-connection: {}", connectionNumber); return false; } Thread.sleep(20000); - if (!roadmCrossConnect.setPowerLevel(OpticalControlMode.Off, - null)) { - LOG.warn("Setting power-control mode off failed for Roadm-connection: {}", - srcTpId + "-" + destTpId + "-" + wlNumber); + if (!setPowerLevel(nodeId, OpticalControlMode.Off, null, connectionNumber)) { + LOG.warn("Setting power-control mode off failed for Roadm-connection: {}", connectionNumber); return false; } } catch (InterruptedException e) { @@ -291,145 +295,83 @@ public class PowerMgmt { * Termination point of mounted netconf - node * @param interfaceName * Name of interface which needs status update - * @param deviceDb - * Reference to device data broker * @return true/false based on status of operation */ - public Boolean setInterfaceOutOfService(String nodeId, String tpId, - String interfaceName, DataBroker deviceDb) { + private Boolean setInterfaceOutOfService(String nodeId, String tpId, String interfaceName) { InstanceIdentifier interfacesIID = InstanceIdentifier .create(OrgOpenroadmDevice.class) .child(Interface.class, new InterfaceKey(interfaceName)); - Interface nodeInterface = new OpenRoadmInterfaces(db, mps, nodeId, tpId) - .getInterface(interfaceName); - InterfaceBuilder intfBuilder = new InterfaceBuilder(nodeInterface); - intfBuilder.setAdministrativeState(AdminStates.OutOfService); - final WriteTransaction writeTransaction = deviceDb.newWriteOnlyTransaction(); - writeTransaction.put(LogicalDatastoreType.CONFIGURATION, interfacesIID, intfBuilder.build()); - final CheckedFuture submit = writeTransaction.submit(); + Optional nodeInterfaceOpt; try { - submit.checkedGet(); - LOG.info("Successfully posted interface {}" , interfaceName); - return true; - } catch (TransactionCommitFailedException ex) { - LOG.warn("Failed to post {} ", interfaceName ,ex); + nodeInterfaceOpt = openRoadmInterfaces.getInterface(nodeId, interfaceName); + } catch (OpenRoadmInterfaceException ex) { + LOG.error("Failed to get interface {} from node {}!", interfaceName, nodeId, ex); return false; } - } - - /** - * This static method returns the DataBroker for a netconf node. - * - * @param nodeId - * Unique identifier for the mounted netconf- node - * @param mps - * Reference to mount service - * @return Databroker for the given device - */ - public static DataBroker getDeviceDataBroker(String nodeId, MountPointService mps) { - MountPoint netconfNode = getDeviceMountPoint(nodeId, mps); - if (netconfNode != null) { - DataBroker netconfNodeDataBroker = netconfNode.getService(DataBroker.class).get(); - return netconfNodeDataBroker; - } else { - LOG.info("Device Data broker not found for :" + nodeId); - return null; - } - } - - /** - * This static method returns the Mountpoint for a netconf node. - * - * @param nodeId - * Unique identifier for the mounted netconf- node - * @param mps - * Reference to mount service - * @return MountPoint for the given device - */ - public static MountPoint getDeviceMountPoint(String nodeId, MountPointService mps) { - final Optional netconfNodeOptional = mps.getMountPoint(NETCONF_TOPO_IID - .child(Node.class, new NodeKey(new NodeId(nodeId)))); - // Get mount point for specified device - if (netconfNodeOptional.isPresent()) { - MountPoint netconfNode = netconfNodeOptional.get(); - return netconfNode; - } else { - LOG.info("Mount Point not found for :" + nodeId); - return null; - } - - } - - /** - * This static method returns the DataBroker for a netconf node. - * - * @param nodeId - * Unique identifier for the mounted netconf- node - * @param mps - * Reference to mount service - * @param db - * Databroker - * @return Nodes from portMapping for given nodeId - */ - public static Nodes getNode(String nodeId, MountPointService mps, DataBroker db) { - InstanceIdentifier nodesIID = InstanceIdentifier.create(Network.class) - .child(Nodes.class, new NodesKey(nodeId)); - ReadOnlyTransaction readTransaction = db.newReadOnlyTransaction(); - Optional nodeObject; - try { - nodeObject = readTransaction.read(LogicalDatastoreType.CONFIGURATION, nodesIID).get(); - if (nodeObject.isPresent()) { - LOG.info("Found Node in Portmapping for nodeId {}", nodeObject.get().getNodeId()); - return nodeObject.get(); - } else { - LOG.info("Could not find Portmapping for nodeId {}", nodeId); - return null; + if (nodeInterfaceOpt.isPresent()) { + InterfaceBuilder intfBuilder = new InterfaceBuilder(nodeInterfaceOpt.get()); + intfBuilder.setAdministrativeState(AdminStates.OutOfService); + Future> deviceTxFuture = deviceTransactionManager.getDeviceTransaction(nodeId); + DeviceTransaction deviceTx; + try { + Optional deviceTxOpt = deviceTxFuture.get(); + if (deviceTxOpt.isPresent()) { + deviceTx = deviceTxOpt.get(); + } else { + LOG.error("Transaction for device {} was not found!", nodeId); + return false; + } + } catch (InterruptedException | ExecutionException e) { + LOG.error("Unable to get transaction for device {}!", nodeId, e); + return false; } - } catch (InterruptedException | ExecutionException ex) { - LOG.info("Unable to read Portmapping for nodeId {}", nodeId, ex); + deviceTx.put(LogicalDatastoreType.CONFIGURATION, interfacesIID, intfBuilder.build()); + ListenableFuture submit = deviceTx.submit(Timeouts.DEVICE_WRITE_TIMEOUT, + Timeouts.DEVICE_WRITE_TIMEOUT_UNIT); + try { + submit.get(); + LOG.info("Successfully posted interface {}", interfaceName); + return true; + } catch (InterruptedException | ExecutionException ex) { + LOG.warn("Failed to post {} ", interfaceName, ex); + return false; + } + } else { + LOG.error("Interface {} on node {} is not present!", interfaceName, nodeId); + return false; } - return null; } /** * This method provides Transponder transmit power range. * - * @param nodeId - * Unique identifier for the mounted netconf- node * @param circuitPackName * Transponder circuitPack name * @param portName * Transponder port name - * @param deviceDb + * @param deviceId * Databroker for the given device * @return HashMap holding Min and Max transmit power for given port */ - public Map getXponderPowerRange(String nodeId, String circuitPackName, String portName, - DataBroker deviceDb) { - InstanceIdentifier portIID = InstanceIdentifier.create(OrgOpenroadmDevice.class).child( - CircuitPacks.class, new CircuitPacksKey(circuitPackName)).child(Ports.class, new PortsKey(portName)); - ReadOnlyTransaction readTransaction = deviceDb.newReadOnlyTransaction(); - Map powerRangeMap = new HashMap(); - try { - LOG.info("Fetching logical Connection Point value for port " + portName + " at circuit pack " - + circuitPackName); - Optional portObject = readTransaction.read(LogicalDatastoreType.OPERATIONAL, portIID).get(); - if (portObject.isPresent()) { - Ports port = portObject.get(); - if (port.getTransponderPort() != null) { - powerRangeMap.put("MaxTx", port.getTransponderPort().getPortPowerCapabilityMaxTx() - .getValue().doubleValue()); - powerRangeMap.put("MinTx", port.getTransponderPort().getPortPowerCapabilityMinTx() - .getValue().doubleValue()); - } else { - LOG.warn("Logical Connection Point value missing for " + circuitPackName + " " + port - .getPortName()); - } + private Map getXponderPowerRange(String circuitPackName, String portName, String deviceId) { + InstanceIdentifier portIID = InstanceIdentifier.create(OrgOpenroadmDevice.class) + .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName)) + .child(Ports.class, new PortsKey(portName)); + Map powerRangeMap = new HashMap<>(); + LOG.info("Fetching logical Connection Point value for port {} at circuit pack {}", portName, circuitPackName); + Optional portObject = + deviceTransactionManager.getDataFromDevice(deviceId, LogicalDatastoreType.OPERATIONAL, portIID, + Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT); + if (portObject.isPresent()) { + Ports port = portObject.get(); + if (port.getTransponderPort().getPortPowerCapabilityMaxTx() != null) { + powerRangeMap.put("MaxTx", port.getTransponderPort().getPortPowerCapabilityMaxTx().getValue() + .doubleValue()); + powerRangeMap.put("MinTx", port.getTransponderPort().getPortPowerCapabilityMinTx().getValue() + .doubleValue()); + } else { + LOG.warn("Logical Connection Point value missing for {} {}", circuitPackName, port.getPortName()); } - } catch (InterruptedException | ExecutionException ex) { - LOG.warn("Read failed for Logical Connection Point value missing for " + circuitPackName + " " - + portName,ex); - return powerRangeMap; } return powerRangeMap; } @@ -441,48 +383,43 @@ public class PowerMgmt { * Unique identifier for the mounted netconf- node * @param srgId * SRG Id connected to transponder - * @param deviceDb - * Databroker for the given device * @return HashMap holding Min and Max transmit power for given port */ - public Map getSRGRxPowerRange(String nodeId, String srgId, DataBroker deviceDb) { - Map powerRangeMap = new HashMap(); + private Map getSRGRxPowerRange(String nodeId, String srgId) { + Map powerRangeMap = new HashMap<>(); LOG.info("Coming inside Xpdr power range"); - java.util.Optional mappingSRGObject = getNode(nodeId, mps, db).getMapping() + Optional mappingSRGOptional = OlmUtils.getNode(nodeId, db).flatMap(node -> node.getMapping() .stream().filter(o -> o.getKey() - .equals(new MappingKey(srgId))).findFirst(); - if (mappingSRGObject.isPresent()) { + .equals(new MappingKey(srgId))).findFirst()); + if (mappingSRGOptional.isPresent()) { LOG.info("Mapping object exists."); - String circuitPackName = mappingSRGObject.get().getSupportingCircuitPackName(); - String portName = mappingSRGObject.get().getSupportingPort(); + String circuitPackName = mappingSRGOptional.get().getSupportingCircuitPackName(); + String portName = mappingSRGOptional.get().getSupportingPort(); InstanceIdentifier portIID = InstanceIdentifier.create(OrgOpenroadmDevice.class) .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName)) .child(Ports.class, new PortsKey(portName)); - try { - LOG.info("Fetching logical Connection Point value for port " + portName + " at circuit pack " - + circuitPackName + portIID); - ReadOnlyTransaction rtx = deviceDb.newReadOnlyTransaction(); - Optional portObject = rtx.read(LogicalDatastoreType.OPERATIONAL, portIID).get(); - if (portObject.isPresent()) { - Ports port = portObject.get(); - if (port.getRoadmPort() != null) { - LOG.info("Port found on the node ID"); - powerRangeMap.put("MinRx", port.getRoadmPort() - .getPortPowerCapabilityMinRx().getValue().doubleValue()); - powerRangeMap.put("MaxRx", port.getRoadmPort() - .getPortPowerCapabilityMaxRx().getValue().doubleValue()); - return powerRangeMap; - } else { - LOG.warn("Roadm ports power value is missing for " + circuitPackName + " " + port - .getPortName()); - } + + LOG.info("Fetching logical Connection Point value for port {} at circuit pack {}{}", portName, + circuitPackName, portIID); + Optional portObject = + deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, portIID, + Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT); + if (portObject.isPresent()) { + Ports port = portObject.get(); + if (port.getRoadmPort() != null) { + LOG.info("Port found on the node ID"); + powerRangeMap.put("MinRx", port.getRoadmPort() + .getPortPowerCapabilityMinRx().getValue().doubleValue()); + powerRangeMap.put("MaxRx", port.getRoadmPort() + .getPortPowerCapabilityMaxRx().getValue().doubleValue()); + return powerRangeMap; } else { - LOG.info("Port not found"); + LOG.warn("Roadm ports power value is missing for {} {}", circuitPackName, port.getPortName()); } - } catch (InterruptedException | ExecutionException ex) { - LOG.warn("Read failed for Logical Connection Point value missing for " + circuitPackName + " " - + portName,ex); + } else { + LOG.info("Port not found"); } + } else { LOG.info("Port mapping not found for nodeId: {} and srgId: {} ", nodeId, srgId); @@ -497,43 +434,126 @@ public class PowerMgmt { * * @param nodeId * Unique identifier for the mounted netconf- node - * @param tpId - * Termination port for transponder connected to SRG * @param interfaceName * OCH interface name carrying WL * @param txPower * Calculated transmit power - * @param deviceDb - * Databroker for the given device * @return true/false based on status of operation */ - public boolean setTransponderPower(String nodeId, String tpId, String interfaceName, BigDecimal txPower, - DataBroker deviceDb) { + private boolean setTransponderPower(String nodeId, String interfaceName, BigDecimal txPower) { LOG.info("Setting target-power for transponder nodeId: {} InterfaceName: {}", nodeId, interfaceName); - InterfaceBuilder ochInterfaceBuilder = new InterfaceBuilder( - new OpenRoadmInterfaces(db, mps, nodeId, tpId) - .getInterface(interfaceName)); - OchBuilder ochBuilder = new OchBuilder(ochInterfaceBuilder - .getAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.optical - .channel.interfaces.rev161014.Interface1.class).getOch()); - ochBuilder.setTransmitPower(new PowerDBm(txPower)); - ochInterfaceBuilder.addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.optical - .channel.interfaces.rev161014.Interface1.class, - new Interface1Builder().setOch(ochBuilder.build()).build()); - ReadWriteTransaction rwtx = deviceDb.newReadWriteTransaction(); - InstanceIdentifier interfacesIID = InstanceIdentifier.create(OrgOpenroadmDevice.class) - .child(Interface.class, new InterfaceKey(interfaceName)); - rwtx.put(LogicalDatastoreType.CONFIGURATION, interfacesIID, ochInterfaceBuilder.build()); - CheckedFuture submit = rwtx.submit(); + Optional interfaceOptional; try { - submit.checkedGet(); - LOG.info("Power update is submitted"); - return true; - } catch (TransactionCommitFailedException e) { - LOG.info("Setting transponder power failed {}" ,e); + interfaceOptional = openRoadmInterfaces.getInterface(nodeId, interfaceName); + } catch (OpenRoadmInterfaceException ex) { + LOG.error("Failed to get interface {} from node {}!", interfaceName, nodeId, ex); + return false; + } + if (interfaceOptional.isPresent()) { + InterfaceBuilder ochInterfaceBuilder = + new InterfaceBuilder(interfaceOptional.get()); + OchBuilder ochBuilder = new OchBuilder(ochInterfaceBuilder.getAugmentation( + org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev161014 + .Interface1.class).getOch()); + ochBuilder.setTransmitPower(new PowerDBm(txPower)); + ochInterfaceBuilder.addAugmentation( + org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev161014 + .Interface1.class, new Interface1Builder().setOch(ochBuilder.build()).build()); + + Future> deviceTxFuture = deviceTransactionManager.getDeviceTransaction(nodeId); + DeviceTransaction deviceTx; + try { + Optional deviceTxOpt = deviceTxFuture.get(); + if (deviceTxOpt.isPresent()) { + deviceTx = deviceTxOpt.get(); + } else { + LOG.error("Transaction for device {} was not found!", nodeId); + return false; + } + } catch (InterruptedException | ExecutionException e) { + LOG.error("Unable to get transaction for device {}!", nodeId, e); + return false; + } + + InstanceIdentifier interfacesIID = InstanceIdentifier.create(OrgOpenroadmDevice.class) + .child(Interface.class, new InterfaceKey(interfaceName)); + deviceTx.put(LogicalDatastoreType.CONFIGURATION, interfacesIID, ochInterfaceBuilder.build()); + ListenableFuture submit = deviceTx.submit(Timeouts.DEVICE_WRITE_TIMEOUT, + Timeouts.DEVICE_WRITE_TIMEOUT_UNIT); + try { + submit.get(); + LOG.info("Power update is submitted"); + return true; + } catch (InterruptedException | ExecutionException e) { + LOG.error("Setting transponder power failed {}", e); + } + } else { + LOG.error("Interface {} on node {} is not present!", interfaceName, nodeId); + } + return false; + } + + /** + * This method does an edit-config on roadm connection subtree for a given + * connection number in order to set power level for use by the optical + * power control. + * + * @param deviceId + * Device id. + * @param mode + * Optical control modelcan be off, power or gainLoss. + * @param powerValue + * Power value in DBm. + * @param connectionNumber + * Name of the cross connect. + * @return true/false based on status of operation. + */ + private boolean setPowerLevel(String deviceId, OpticalControlMode mode, BigDecimal powerValue, + String connectionNumber) { + Optional rdmConnOpt = crossConnect.getCrossConnect(deviceId, connectionNumber); + if (rdmConnOpt.isPresent()) { + RoadmConnectionsBuilder rdmConnBldr = new RoadmConnectionsBuilder(rdmConnOpt.get()); + rdmConnBldr.setOpticalControlMode(mode); + if (powerValue != null) { + rdmConnBldr.setTargetOutputPower(new PowerDBm(powerValue)); + } + RoadmConnections newRdmConn = rdmConnBldr.build(); + + Future> deviceTxFuture = + deviceTransactionManager.getDeviceTransaction(deviceId); + DeviceTransaction deviceTx; + try { + Optional deviceTxOpt = deviceTxFuture.get(); + if (deviceTxOpt.isPresent()) { + deviceTx = deviceTxOpt.get(); + } else { + LOG.error("Transaction for device {} was not found!", deviceId); + return false; + } + } catch (InterruptedException | ExecutionException e) { + LOG.error("Unable to get transaction for device {}!", deviceId, e); + return false; + } + + // post the cross connect on the device + InstanceIdentifier roadmConnIID = InstanceIdentifier.create(OrgOpenroadmDevice.class) + .child(RoadmConnections.class, new RoadmConnectionsKey(connectionNumber)); + deviceTx.put(LogicalDatastoreType.CONFIGURATION, roadmConnIID, newRdmConn); + ListenableFuture submit = deviceTx.submit(Timeouts.DEVICE_WRITE_TIMEOUT, + Timeouts.DEVICE_WRITE_TIMEOUT_UNIT); + try { + submit.get(); + LOG.info("Roadm connection power level successfully set "); + return true; + } catch (InterruptedException | ExecutionException ex) { + LOG.warn("Failed to post {}", newRdmConn, ex); + } + + } else { + LOG.warn("Roadm-Connection is null in set power level ({})", connectionNumber); } return false; } -} \ No newline at end of file +}