+ private Map<String, Double> getTxPowerRangeMap(Nodes inputNode, String destTpId, String nodeId,
+ Integer openroadmVersion) {
+
+ Optional<Mapping> mappingObject = inputNode.nonnullMapping().values().stream()
+ .filter(o -> o.key().equals(new MappingKey(destTpId))).findFirst();
+ if (mappingObject.isEmpty()) {
+ LOG.info("Mapping object not found for nodeId: {}", nodeId);
+ // FIXME shouldn't it be LOG.error ?
+ return null;
+ // return null here means return false in setPower()
+ // TODO Align protections with getSRGRxPowerRangeMap
+ }
+
+ String circuitPackName = mappingObject.get().getSupportingCircuitPackName();
+ String portName = mappingObject.get().getSupportingPort();
+ switch (openroadmVersion) {
+ case 1:
+ return PowerMgmtVersion121.getXponderPowerRange(circuitPackName, portName,
+ nodeId, deviceTransactionManager);
+ case 2:
+ return PowerMgmtVersion221.getXponderPowerRange(circuitPackName, portName,
+ nodeId, deviceTransactionManager);
+ case 3:
+ return PowerMgmtVersion710.getXponderPowerRange(circuitPackName, portName,
+ nodeId, deviceTransactionManager);
+ default:
+ LOG.error("Unrecognized OpenRoadm version");
+ return new HashMap<>();
+ // FIXME shouldn't it lead to a return false in setPower()?
+ }
+ }
+
+
+ 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());
+
+ if (mappingObject.isEmpty()) {
+ return new HashMap<>();
+ // FIXME shouldn't it lead to a return false in setPower() ?
+ }
+
+ String circuitPackName = mappingObject.get().getSupportingCircuitPackName();
+ String portName = mappingObject.get().getSupportingPort();
+ switch (rdmOpenroadmVersion) {
+ case 1:
+ return PowerMgmtVersion121.getSRGRxPowerRange(nodeId, srgId,
+ deviceTransactionManager, circuitPackName, portName);
+ case 2:
+ return PowerMgmtVersion221.getSRGRxPowerRange(nodeId, srgId,
+ deviceTransactionManager, circuitPackName, portName);
+ case 3:
+ return PowerMgmtVersion710.getSRGRxPowerRange(nodeId, srgId,
+ deviceTransactionManager, circuitPackName, portName);
+ default:
+ LOG.error("Unrecognized OpenRoadm version");
+ return null;
+ //return null here means return false in setPower()
+ // TODO Align protections with getTxPowerRangeMap
+ }
+ }
+
+ private BigDecimal getSpanLossTx(String supportingOts, String destTpId, String nodeId, Integer openroadmVersion) {
+ try {
+ switch (openroadmVersion) {
+ case 1:
+ Optional<Interface> interfaceOpt =
+ this.openRoadmInterfaces.getInterface(nodeId, supportingOts);
+ if (interfaceOpt.isEmpty()) {
+ LOG.error(INTERFACE_NOT_PRESENT, supportingOts, nodeId);
+ return null;
+ }
+ if (interfaceOpt.get().augmentation(Interface1.class).getOts()
+ .getSpanLossTransmit() == null) {
+ LOG.error("interface {} has no spanloss value", interfaceOpt.get().getName());
+ return null;
+ }
+ return interfaceOpt.get()
+ .augmentation(Interface1.class)
+ .getOts().getSpanLossTransmit().getValue();
+ case 2:
+ Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019
+ .interfaces.grp.Interface> interfaceOpt1 =
+ this.openRoadmInterfaces.getInterface(nodeId, supportingOts);
+ if (interfaceOpt1.isEmpty()) {
+ LOG.error(INTERFACE_NOT_PRESENT, supportingOts, nodeId);
+ return null;
+ }
+ if (interfaceOpt1.get().augmentation(org.opendaylight.yang.gen.v1.http.org
+ .openroadm.optical.transport.interfaces.rev181019.Interface1.class).getOts()
+ .getSpanLossTransmit() == null) {
+ LOG.error("interface {} has no spanloss value", interfaceOpt1.get().getName());
+ return null;
+ }
+ return interfaceOpt1.get()
+ .augmentation(org.opendaylight.yang.gen.v1.http.org
+ .openroadm.optical.transport.interfaces.rev181019.Interface1.class)
+ .getOts().getSpanLossTransmit().getValue();
+ // TODO no case 3 ?
+ default:
+ return null;
+ }
+ } catch (OpenRoadmInterfaceException ex) {
+ LOG.error("Failed to get interface {} from node {}!",
+ supportingOts, nodeId, ex);
+ return null;
+ } catch (IllegalArgumentException ex) {
+ LOG.error("Failed to get non existing interface {} from node {}!",
+ supportingOts, nodeId);
+ return null;
+ }
+ }
+
+ private BigDecimal getXpdrPowerValue(Nodes inputNode, String destTpId, String nodeId, Integer openroadmVersion,
+ String srgId, String nextNodeId) {
+
+ Map<String, Double> txPowerRangeMap = getTxPowerRangeMap(inputNode, destTpId, nodeId, openroadmVersion);
+ if (txPowerRangeMap == null) {
+ return null;
+ // return null here means return false in setPower()
+ }
+ BigDecimal powerVal =
+ openroadmVersion == 3 ? DEFAULT_TPDR_PWR_400G : DEFAULT_TPDR_PWR_100G;
+ if (txPowerRangeMap.isEmpty()) {
+ LOG.info("Tranponder range not available setting to default power for nodeId: {}", nodeId);
+ return powerVal;
+ }
+
+ Map<String, Double> rxSRGPowerRangeMap = getSRGRxPowerRangeMap(srgId, nextNodeId, openroadmVersion);
+ if (rxSRGPowerRangeMap == null) {
+ return null;
+ // return null here means return false in setPower()
+ // TODO empty txPowerRangeMap + null rxSRGPowerRangeMap is allowed
+ // => confirm this behavior is OK
+ }
+ if (rxSRGPowerRangeMap.isEmpty()) {
+ LOG.info("SRG Power Range not found, setting the Transponder range to default");
+ return powerVal;
+ }
+
+ powerVal = new BigDecimal(txPowerRangeMap.get("MaxTx"))
+ .min(new BigDecimal(rxSRGPowerRangeMap.get("MaxRx")));
+ LOG.info("Calculated Transponder Power value is {}" , powerVal);
+ return powerVal;
+ }
+
+
+ private BigDecimal getRdmPowerValue(BigDecimal spanLossTx, ServicePowerSetupInput input) {
+ BigDecimal powerValue = spanLossTx.subtract(BigDecimal.valueOf(9)).min(BigDecimal.valueOf(2));
+ // we work at constant power spectral density (50 GHz channel width @-20dBm=37.5GHz)
+ // 87.5 GHz channel width @-20dBm=75GHz
+ if (input.getWidth() != null) {
+ BigDecimal gridSize = input.getWidth().getValue();
+ LOG.debug("Input Gridsize is {}",gridSize);
+ if (gridSize.equals(GridConstant.WIDTH_80)) {
+ powerValue = powerValue.add(BigDecimal.valueOf(3));
+ }
+ // TODO no default or warning for unsupported grid sizes ?
+ }
+ // FIXME compliancy with OpenROADM MSA and approximations used
+ // cf JIRA ticket https://jira.opendaylight.org/browse/TRNSPRTPCE-494
+ LOG.info("Power Value is {}", powerValue);
+ return powerValue;
+ }
+