handle OLM when spanloss > 28dB 07/82507/10
authorGilles Thouenon <gilles.thouenon@orange.com>
Wed, 12 Jun 2019 15:44:46 +0000 (17:44 +0200)
committerGuillaume Lambert <guillaume.lambert@orange.com>
Wed, 19 Jun 2019 14:42:15 +0000 (14:42 +0000)
- when calculated spanloss is out of OpenROADM range ( = ]0-28] dB),
  it is all the same set in the OTS interface.
- when the spanloss is greater than 28 dB ,
  the OLM servicePowerSetup fails and triggers the rollback of
  roadm-connection interfaces already configured by the renderer.
- Change OlmServiceStub to result value to success

NB: OpenROADM specifies that spanloss must be < 27 dB but there is 1 dB
of tolerance in the measurement accuracy.
Thus the supported range for spanloss = ]0,28] dB.

Change-Id: Ibae4357bde37ba78fc5bface060099f4bb7be0b6
JIRA: TRNSPRTPCE-90
Signed-off-by: Gilles Thouenon <gilles.thouenon@orange.com>
Co-authored-by: Christophe Betoule <christophe.betoule@orange.com>
olm/src/main/java/org/opendaylight/transportpce/olm/power/PowerMgmtImpl.java
olm/src/main/java/org/opendaylight/transportpce/olm/service/OlmPowerServiceImpl.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/tasks/OlmPowerSetupTask.java
renderer/src/test/java/org/opendaylight/transportpce/renderer/stub/OlmServiceStub.java

index d9e22d60908efdc9d8a8ddcc838fafaf173bdbe0..f751e346013f1f64609765fd2738926b19802dfc 100644 (file)
@@ -140,8 +140,7 @@ public class PowerMgmtImpl implements PowerMgmt {
                                 LOG.info("SRG Power Range not found");
                             }
                         } else {
-                            LOG.info("Tranponder range not available seting to default "
-                                    + "power for nodeId: {}", nodeId);
+                            LOG.info("Tranponder range not available setting to default power for nodeId: {}", nodeId);
                             String interfaceName = destTpId + "-" + input.getWaveNumber();
                             if (callSetTransponderPower(nodeId, interfaceName, new BigDecimal(-5),openroadmVersion)) {
                                 LOG.info("Transponder OCH connection: {} power updated ", interfaceName);
@@ -194,8 +193,14 @@ public class PowerMgmtImpl implements PowerMgmt {
                                 return false;
                             }
                             if (interfaceOpt.isPresent()) {
-                                spanLossTx = interfaceOpt.get().augmentation(Interface1.class).getOts()
-                                    .getSpanLossTransmit().getValue();
+                                if (interfaceOpt.get().augmentation(Interface1.class).getOts()
+                                    .getSpanLossTransmit() != null) {
+                                    spanLossTx = interfaceOpt.get().augmentation(Interface1.class).getOts()
+                                            .getSpanLossTransmit().getValue();
+                                    LOG.info("Spanloss TX is {}", spanLossTx);
+                                } else {
+                                    LOG.error("interface {} has no spanloss value", interfaceOpt.get().getName());
+                                }
                             } else {
                                 LOG.error("Interface {} on node {} is not present!", portMapping.getSupportingOts(),
                                     nodeId);
@@ -217,18 +222,39 @@ public class PowerMgmtImpl implements PowerMgmt {
                                 return false;
                             }
                             if (interfaceOpt.isPresent()) {
-                                spanLossTx = interfaceOpt.get().augmentation(org.opendaylight.yang.gen.v1.http.org
-                                    .openroadm.optical.transport.interfaces.rev181019.Interface1.class).getOts()
-                                    .getSpanLossTransmit().getValue();
+                                if (interfaceOpt.get().augmentation(org.opendaylight.yang.gen.v1.http.org
+                                        .openroadm.optical.transport.interfaces.rev181019.Interface1.class).getOts()
+                                        .getSpanLossTransmit() != null) {
+                                    spanLossTx = interfaceOpt.get().augmentation(org.opendaylight.yang.gen.v1.http.org
+                                            .openroadm.optical.transport.interfaces.rev181019.Interface1.class).getOts()
+                                            .getSpanLossTransmit().getValue();
+                                    LOG.info("Spanloss TX is {}", spanLossTx);
+                                } else {
+                                    LOG.error("interface {} has no spanloss value", interfaceOpt.get().getName());
+                                }
                             } else {
                                 LOG.error("Interface {} on node {} is not present!", portMapping.getSupportingOts(),
                                     nodeId);
                                 return false;
                             }
                         }
-                        LOG.info("Spanloss TX is {}", spanLossTx);
-                        BigDecimal powerValue = BigDecimal.valueOf(Math.min(spanLossTx.doubleValue() - 9, 2));
-                        LOG.info("Power Value is {}", powerValue);
+
+                        BigDecimal powerValue =  null;
+                        if (spanLossTx != null &&  spanLossTx.intValue() <= 28 && spanLossTx.intValue() > 0) {
+                            powerValue = BigDecimal.valueOf(Math.min(spanLossTx.doubleValue() - 9, 2));
+                            LOG.info("Power Value is {}", powerValue);
+                        } else if (spanLossTx.intValue() > 28) {
+                            LOG.error(
+                                "Power Value is null - spanLossTx > 28dB not compliant with openROADM specifications");
+                            return false;
+                        } else if (spanLossTx.intValue() <= 0) {
+                            LOG.error(
+                                "Power Value is null - spanLossTx <= 0 dB not compliant with openROADM specifications");
+                            return false;
+                        } else {
+                            LOG.error("Power Value is null - spanLossTx is null");
+                            return false;
+                        }
                         try {
                             Boolean setXconnPowerSuccessVal = crossConnect.setPowerLevel(nodeId,
                                     OpticalControlMode.Power, powerValue, connectionNumber);
@@ -353,8 +379,7 @@ public class PowerMgmtImpl implements PowerMgmt {
             }
             LOG.info("Transponder power range is fine");
             if (!txPowerRangeMap.isEmpty()) {
-                LOG.info("Transponder power range is not null {}, {}",
-                        nextNodeId,srgId);
+                LOG.info("Transponder power range is not null {}, {}", nextNodeId,srgId);
                 //Transponder range is not empty then check SRG Range
 
                 Optional<Mapping> mappingObjectSRG = OlmUtils.getNode(nextNodeId, db)
@@ -405,8 +430,7 @@ public class PowerMgmtImpl implements PowerMgmt {
                     return false;
                 }
             } else {
-                LOG.info("Tranponder range not available seting to default "
-                        + "power for nodeId: {}", nodeId);
+                LOG.info("Tranponder range not available seting to default power for nodeId: {}", nodeId);
                 String interfaceName = destTpId + "-" + waveLength;
                 if (callSetTransponderPower(nodeId,interfaceName,new BigDecimal(-5),
                         openroadmVersion)) {
@@ -528,13 +552,11 @@ public class PowerMgmtImpl implements PowerMgmt {
                                 OpticalControlMode.GainLoss, powerValue,connectionNumber);
                         return true;
                     } else {
-                        LOG.info("Set Power failed for Roadm-connection: {} on Node: {}", connectionNumber,
-                                nodeId);
+                        LOG.info("Set Power failed for Roadm-connection: {} on Node: {}", connectionNumber, nodeId);
                         return false;
                     }
                 } else {
-                    LOG.error("Interface {} on node {} is not present!", interfaceName,
-                            nodeId);
+                    LOG.error("Interface {} on node {} is not present!", interfaceName, nodeId);
                     return false;
                 }
             } else if (openroadmVersion.equals(Nodes.OpenroadmVersion._221)) {
@@ -559,15 +581,13 @@ public class PowerMgmtImpl implements PowerMgmt {
                                 OpticalControlMode.GainLoss, powerValue,connectionNumber);
                         return true;
                     } else {
-                        LOG.info("Set Power failed for Roadm-connection: {} on Node: {}", connectionNumber,
-                                nodeId);
+                        LOG.info("Set Power failed for Roadm-connection: {} on Node: {}", connectionNumber, nodeId);
                         return false;
                     }
                 }
             }
         } catch (OpenRoadmInterfaceException | InterruptedException ex) {
-            LOG.error("Error during power setup on Roadm nodeId: {} for connection: {}",
-                    nodeId, connectionNumber, ex);
+            LOG.error("Error during power setup on Roadm nodeId: {} for connection: {}", nodeId, connectionNumber, ex);
             return false;
         }
         return false;
index 3d3889318e79bf2fde6181e93f5fcaeda2fd17fa..f2e2187af88a1be3ca7b272f099ff95591bba786 100644 (file)
@@ -127,7 +127,6 @@ public class OlmPowerServiceImpl implements OlmPowerService {
     public GetPmOutput getPm(GetPmInput pmInput) {
         org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping
             .rev170228.network.Nodes.OpenroadmVersion openroadmVersion;
-        //LOG.info("Version returbed by mapping util is "+ mappingUtils.getOpenROADMVersion(pmInput.getNodeId()));
         if (mappingUtils.getOpenRoadmVersion(pmInput.getNodeId())
             .equals(StringConstants.OPENROADM_DEVICE_VERSION_1_2_1)) {
             LOG.info("Device version is 1.2.1");
@@ -148,7 +147,6 @@ public class OlmPowerServiceImpl implements OlmPowerService {
     public ServicePowerSetupOutput servicePowerSetup(ServicePowerSetupInput powerSetupInput) {
         ServicePowerSetupOutputBuilder powerSetupOutput = new ServicePowerSetupOutputBuilder();
         boolean successValPowerCalculation = powerMgmt.setPower(powerSetupInput);
-
         if (successValPowerCalculation) {
             powerSetupOutput.setResult(ResponseCodes.SUCCESS_RESULT);
         } else {
@@ -432,8 +430,7 @@ public class OlmPowerServiceImpl implements OlmPowerService {
                     LOG.info("Spanloss Value update completed successfully");
                     return true;
                 } else {
-                    LOG.error("Interface not found for nodeId: {} and interfaceName: {}",
-                        nodeId,interfaceName);
+                    LOG.error("Interface not found for nodeId: {} and interfaceName: {}", nodeId, interfaceName);
                     return false;
                 }
             } else if (mappingUtils.getOpenRoadmVersion(realNodeId)
@@ -501,8 +498,7 @@ public class OlmPowerServiceImpl implements OlmPowerService {
                     LOG.info("Spanloss Value update completed successfully");
                     return true;
                 } else {
-                    LOG.error("Interface not found for nodeId: {} and interfaceName: {}",
-                        nodeId,interfaceName);
+                    LOG.error("Interface not found for nodeId: {} and interfaceName: {}", nodeId,interfaceName);
                     return false;
                 }
             }
@@ -543,19 +539,20 @@ public class OlmPowerServiceImpl implements OlmPowerService {
             OtsPmHolder destOtsPmHoler = getPmMeasurements(destNodeId, destTpId, "OpticalPowerInput");
             spanLoss = new BigDecimal(srcOtsPmHoler.getOtsParameterVal() - destOtsPmHoler.getOtsParameterVal())
                 .setScale(0, RoundingMode.HALF_UP);
-            LOG.info("Spanloss Calculated as :" + spanLoss + "=" + srcOtsPmHoler.getOtsParameterVal() + "-"
-                + destOtsPmHoler.getOtsParameterVal());
-            if ((spanLoss.doubleValue() < 28) && (spanLoss.doubleValue() > 0)) {
-                if (!setSpanLoss(sourceNodeId, srcOtsPmHoler.getOtsInterfaceName(), spanLoss, "TX")) {
-                    LOG.info("Setting spanLoss failed for " + sourceNodeId);
-                    return null;
-                }
-                if (!setSpanLoss(destNodeId, destOtsPmHoler.getOtsInterfaceName(), spanLoss, "RX")) {
-                    LOG.info("Setting spanLoss failed for " + destNodeId);
-                    return null;
-                }
-                map.put(link.getLinkId(), spanLoss);
+            LOG.info("Spanloss Calculated as :{}={}-{}",
+                spanLoss, srcOtsPmHoler.getOtsParameterVal(), destOtsPmHoler.getOtsParameterVal());
+            if (spanLoss.doubleValue() > 28) {
+                LOG.warn("Span Loss is out of range of OpenROADM specifications");
+            }
+            if (!setSpanLoss(sourceNodeId, srcOtsPmHoler.getOtsInterfaceName(), spanLoss, "TX")) {
+                LOG.info("Setting spanLoss failed for {}", sourceNodeId);
+                return null;
+            }
+            if (!setSpanLoss(destNodeId, destOtsPmHoler.getOtsInterfaceName(), spanLoss, "RX")) {
+                LOG.info("Setting spanLoss failed for {}", destNodeId);
+                return null;
             }
+            map.put(link.getLinkId(), spanLoss);
         }
         return map;
     }
index 5d4f3f72082ef62ba56e3c06edea6de5a4fe26a8..c64b5135ce9318bc5f3f12ecb5506a9054d71be5 100644 (file)
@@ -9,6 +9,8 @@ package org.opendaylight.transportpce.renderer.provisiondevice.tasks;
 
 import java.util.concurrent.Callable;
 import java.util.concurrent.Future;
+
+import org.opendaylight.transportpce.common.ResponseCodes;
 import org.opendaylight.transportpce.renderer.provisiondevice.OLMRenderingResult;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev170418.ServicePowerSetupInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev170418.ServicePowerSetupOutput;
@@ -39,7 +41,7 @@ public class OlmPowerSetupTask implements Callable<OLMRenderingResult> {
         }
 
         LOG.debug("Result: {}", result.getResult());
-        if (result.isSuccessful()) {
+        if (ResponseCodes.SUCCESS_RESULT.equals(result.getResult().getResult())) {
             LOG.info("OLM power setup finished successfully");
             return OLMRenderingResult.ok();
         } else {
index 94d35a04e1b3e5a64ea9028428ef2989b962f735..bc78541b5dd9eff00ec763747db10962af08925b 100644 (file)
@@ -9,6 +9,8 @@ package org.opendaylight.transportpce.renderer.stub;
 
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.ArrayList;
+
+import org.opendaylight.transportpce.common.ResponseCodes;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev170418.CalculateSpanlossBaseInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev170418.CalculateSpanlossBaseOutput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev170418.CalculateSpanlossCurrentInput;
@@ -61,6 +63,7 @@ public class OlmServiceStub implements TransportpceOlmService {
 
     @Override public ListenableFuture<RpcResult<ServicePowerSetupOutput>> servicePowerSetup(
             ServicePowerSetupInput input) {
-        return RpcResultBuilder.success(new ServicePowerSetupOutputBuilder().build()).buildFuture();
+        return RpcResultBuilder.success(new ServicePowerSetupOutputBuilder()
+            .setResult(ResponseCodes.SUCCESS_RESULT).build()).buildFuture();
     }
 }