*/
package org.opendaylight.transportpce.olm.power;
+
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
-import org.opendaylight.mdsal.binding.api.DataBroker;
import org.opendaylight.transportpce.common.crossconnect.CrossConnect;
import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
import org.opendaylight.transportpce.common.fixedflex.GridConstant;
+import org.opendaylight.transportpce.common.mapping.PortMapping;
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.opendaylight.transportpce.olm.rev210618.ServicePowerSetupInput;
import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220114.OpenroadmNodeVersion;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220114.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220114.mapping.MappingKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220114.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220922.OpenroadmNodeVersion;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220922.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220922.mapping.MappingKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220922.network.Nodes;
import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.OpticalControlMode;
import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfaces.grp.Interface;
import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev161014.Interface1;
+import org.opendaylight.yangtools.yang.common.Decimal64;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+@Component(configurationPid = "org.opendaylight.transportpce")
public class PowerMgmtImpl implements PowerMgmt {
+
+ @ObjectClassDefinition
+ public @interface Configuration {
+ @AttributeDefinition
+ long timer1() default 120000;
+ @AttributeDefinition
+ long timer2() default 20000;
+ }
private static final Logger LOG = LoggerFactory.getLogger(PowerMgmtImpl.class);
- private final DataBroker db;
private final OpenRoadmInterfaces openRoadmInterfaces;
private final CrossConnect crossConnect;
private final DeviceTransactionManager deviceTransactionManager;
+ private final PortMapping portMapping;
private static final BigDecimal DEFAULT_TPDR_PWR_100G = new BigDecimal(-5);
private static final BigDecimal DEFAULT_TPDR_PWR_400G = new BigDecimal(0);
private static final String INTERFACE_NOT_PRESENT = "Interface {} on node {} is not present!";
private static final double MC_WIDTH_GRAN = 2 * GridConstant.GRANULARITY;
- private long timer1 = 120000;
+ private long timer1;
// openroadm spec value is 120000, functest value is 3000
- private long timer2 = 20000;
+ private long timer2;
// openroadm spec value is 20000, functest value is 2000
- public PowerMgmtImpl(DataBroker db, OpenRoadmInterfaces openRoadmInterfaces,
- CrossConnect crossConnect, DeviceTransactionManager deviceTransactionManager) {
- this.db = db;
- this.openRoadmInterfaces = openRoadmInterfaces;
- this.crossConnect = crossConnect;
- this.deviceTransactionManager = deviceTransactionManager;
+ @Activate
+ public PowerMgmtImpl(@Reference OpenRoadmInterfaces openRoadmInterfaces,
+ @Reference CrossConnect crossConnect,
+ @Reference DeviceTransactionManager deviceTransactionManager,
+ @Reference PortMapping portMapping, final Configuration configuration) {
+ this(openRoadmInterfaces, crossConnect, deviceTransactionManager, portMapping, configuration.timer1(),
+ configuration.timer2());
}
- public PowerMgmtImpl(DataBroker db, OpenRoadmInterfaces openRoadmInterfaces,
+ public PowerMgmtImpl(OpenRoadmInterfaces openRoadmInterfaces,
CrossConnect crossConnect, DeviceTransactionManager deviceTransactionManager,
- String timer1, String timer2) {
- this.db = db;
+ PortMapping portMapping, long timer1, long timer2) {
this.openRoadmInterfaces = openRoadmInterfaces;
this.crossConnect = crossConnect;
this.deviceTransactionManager = deviceTransactionManager;
+ this.portMapping = portMapping;
try {
- this.timer1 = Long.parseLong(timer1);
+ this.timer1 = Long.valueOf(timer1);
} catch (NumberFormatException e) {
this.timer1 = 120000;
LOG.warn("Failed to retrieve Olm timer1 value from configuration - using default value {}",
this.timer1, e);
}
try {
- this.timer2 = Long.parseLong(timer2);
+ this.timer2 = Long.valueOf(timer2);
} catch (NumberFormatException e) {
this.timer2 = 20000;
LOG.warn("Failed to retrieve Olm timer2 value from configuration - using default value {}",
this.timer2, e);
}
+ LOG.debug("PowerMgmtImpl instantiated with olm timers = {} - {}", this.timer1, this.timer2);
}
/**
String spectralSlotName = String.join(GridConstant.SPECTRAL_SLOT_SEPARATOR,
input.getLowerSpectralSlotNumber().toString(),
input.getHigherSpectralSlotNumber().toString());
+ if (input.getNodes() == null) {
+ LOG.error("No Nodes to configure");
+ return false;
+ }
for (int i = 0; i < input.getNodes().size(); i++) {
String nodeId = input.getNodes().get(i).getNodeId();
String destTpId = input.getNodes().get(i).getDestTp();
- Optional<Nodes> inputNodeOptional = OlmUtils.getNode(nodeId, this.db);
- if (inputNodeOptional.isEmpty()
- || inputNodeOptional.get().getNodeInfo().getNodeType() == null) {
- LOG.error("OLM-PowerMgmtImpl : Error node type cannot be retrieved for node {}", nodeId);
- continue;
+ Nodes inputNode = this.portMapping.getNode(nodeId);
+ if (inputNode == null || inputNode.getNodeInfo() == null) {
+ LOG.error("OLM-PowerMgmtImpl : Error retrieving mapping node for {}", nodeId);
+ return false;
}
- Nodes inputNode = inputNodeOptional.get();
OpenroadmNodeVersion openroadmVersion = inputNode.getNodeInfo().getOpenroadmVersion();
switch (inputNode.getNodeInfo().getNodeType()) {
spanLossTx);
return false;
}
- BigDecimal powerValue = getRdmPowerValue(spanLossTx, input);
+ Decimal64 powerValue = Decimal64.valueOf(getRdmPowerValue(spanLossTx, input));
try {
if (!crossConnect.setPowerLevel(nodeId, OpticalControlMode.Power.getName(), powerValue,
connectionNumber)) {
private Map<String, Double> getSRGRxPowerRangeMap(String srgId, String nodeId, Integer openroadmVersion) {
- Optional<Nodes> inputNode = OlmUtils.getNode(nodeId, this.db);
- int rdmOpenroadmVersion =
- inputNode.isPresent()
- ? inputNode.get().getNodeInfo().getOpenroadmVersion().getIntValue()
- : openroadmVersion;
- Optional<Mapping> mappingObject = inputNode
- .flatMap(node -> node.nonnullMapping().values().stream()
- .filter(o -> o.key().equals(new MappingKey(srgId))).findFirst());
+ Nodes inputNode = this.portMapping.getNode(nodeId);
+ int rdmOpenroadmVersion = inputNode.getNodeInfo().getOpenroadmVersion().getIntValue();
+ Optional<Mapping> mappingObject = inputNode.nonnullMapping().values().stream()
+ .filter(o -> o.key().equals(new MappingKey(srgId)))
+ .findFirst();
if (mappingObject.isEmpty()) {
return new HashMap<>();
}
return interfaceOpt.get()
.augmentation(Interface1.class)
- .getOts().getSpanLossTransmit().getValue();
+ .getOts().getSpanLossTransmit().getValue().decimalValue();
case 2:
Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019
.interfaces.grp.Interface> interfaceOpt1 =
return interfaceOpt1.get()
.augmentation(org.opendaylight.yang.gen.v1.http.org
.openroadm.optical.transport.interfaces.rev181019.Interface1.class)
- .getOts().getSpanLossTransmit().getValue();
+ .getOts().getSpanLossTransmit().getValue().decimalValue();
// TODO no case 3 ?
default:
return null;
} else {
powerValue = spanLossTx.subtract(BigDecimal.valueOf(9));
}
- // target-output-power yang precision is 2, so we limit here to 2
- powerValue = powerValue.setScale(2, RoundingMode.CEILING);
- LOG.info("P1[50GHz]={} dBm for spanloss {} based on OpenROADM-5.0 specs power target mask", powerValue,
- spanLossTx);
+ BigDecimal mcWidth = new BigDecimal(50);
// we work at constant power spectral density (50 GHz channel width @-20dBm=37.5GHz)
// 87.5 GHz channel width @-20dBm=75GHz
if (input.getMcWidth() != null) {
- // Units of MC-wdith are in GHz, meaning it should be 40/50/87.5GHz
+ // Units of MC-width are in GHz, meaning it should be 40/50/87.5GHz
// TODO: Should we validate this units before proceeding?
- LOG.debug("Input Grid size is {}",input.getMcWidth().getValue());
+ LOG.debug("Input Grid size is {}", input.getMcWidth().getValue());
// We round-off the mc-width to the nearest grid-value based on the granularity of 12.5 GHz
double nbrMcSlots = Math.ceil(input.getMcWidth().getValue().doubleValue() / MC_WIDTH_GRAN);
LOG.debug("Nearest (ceil) number of slots {}", nbrMcSlots);
- BigDecimal mcWidth = new BigDecimal(MC_WIDTH_GRAN * nbrMcSlots);
- LOG.info("Given mc-width={}, Rounded mc-width={}", input.getMcWidth().getValue(), mcWidth);
+ mcWidth = new BigDecimal(MC_WIDTH_GRAN * nbrMcSlots);
+ LOG.debug("Given mc-width={}, Rounded mc-width={}", input.getMcWidth().getValue(), mcWidth);
BigDecimal logVal = mcWidth.divide(new BigDecimal(50));
double pdsVal = 10 * Math.log10(logVal.doubleValue());
// Addition of PSD value will give Pin[87.5 GHz]
- powerValue = powerValue.add(new BigDecimal(pdsVal, new MathContext(3,
- RoundingMode.HALF_EVEN)));
- LOG.info("P1[{}GHz]={} dB will be used for OSNR calculation", mcWidth, powerValue);
+ powerValue = powerValue.add(new BigDecimal(pdsVal, new MathContext(3, RoundingMode.HALF_EVEN)));
}
// FIXME compliancy with OpenROADM MSA and approximations used -- should be addressed with powermask update
// cf JIRA ticket https://jira.opendaylight.org/browse/TRNSPRTPCE-494
- LOG.info("The power value is {} for spanloss {}", powerValue, spanLossTx);
+ powerValue = powerValue.setScale(2, RoundingMode.CEILING);
+ // target-output-power yang precision is 2, so we limit here to 2
+ LOG.info("The power value is P1[{}GHz]={} dB for spanloss {}", mcWidth, powerValue, spanLossTx);
return powerValue;
}
input.getNodes().get(i).getSrcTp(), destTpId, spectralSlotName);
try {
if (destTpId.toUpperCase(Locale.getDefault()).contains("DEG")) {
- if (!crossConnect.setPowerLevel(nodeId, OpticalControlMode.Power.getName(), new BigDecimal(-60),
- connectionNumber)) {
+ if (!crossConnect.setPowerLevel(nodeId, OpticalControlMode.Power.getName(),
+ Decimal64.valueOf("-60"), connectionNumber)) {
LOG.warn("Power down failed for Roadm-connection: {}", connectionNumber);
return false;
}