fix deprecated openroadm interfaces/objects
[transportpce.git] / olm / src / main / java / org / opendaylight / transportpce / olm / service / OlmPowerServiceImpl.java
index fdf068623caaf693a5309823bb22a03176ce316b..b91fe7ccc4b96d46eb7d26b4935b241db6fb81d4 100644 (file)
@@ -13,15 +13,19 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Optional;
+import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.stream.Collectors;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.ReadTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.InstanceIdentifiers;
 import org.opendaylight.transportpce.common.NetworkUtils;
 import org.opendaylight.transportpce.common.ResponseCodes;
@@ -54,21 +58,21 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev17
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev170418.ServicePowerTurndownInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev170418.ServicePowerTurndownOutput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev170418.ServicePowerTurndownOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev170418.calculate.spanloss.base.output.Spans;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev170418.calculate.spanloss.base.output.SpansBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev170418.get.pm.output.Measurements;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev170228.network.nodes.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev191115.network.nodes.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev191115.network.nodes.NodeInfo.OpenroadmVersion;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Link1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.RatioDB;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfaces.grp.Interface;
 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.network.topology.rev181130.Link1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev181130.OpenroadmLinkType;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev161014.Interface1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev161014.Interface1Builder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev161014.ots.container.Ots;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev161014.ots.container.OtsBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev161014.PmGranularity;
-
 import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev161014.ResourceTypeEnum;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev170907.PmNamesEnum;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev170907.olm.get.pm.input.ResourceIdentifierBuilder;
@@ -84,7 +88,6 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.top
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkKey;
-
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
 import org.slf4j.Logger;
@@ -121,23 +124,18 @@ public class OlmPowerServiceImpl implements OlmPowerService {
 
     @Override
     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()));
+        OpenroadmVersion openroadmVersion;
         if (mappingUtils.getOpenRoadmVersion(pmInput.getNodeId())
             .equals(StringConstants.OPENROADM_DEVICE_VERSION_1_2_1)) {
             LOG.info("Device version is 1.2.1");
-            openroadmVersion = org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping
-                .rev170228.network.Nodes.OpenroadmVersion._121;
+            openroadmVersion = OpenroadmVersion._121;
         } else {
-            openroadmVersion = org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping
-                .rev170228.network.Nodes.OpenroadmVersion._221;
-            LOG.info("Device version is 2.2");
+            openroadmVersion = OpenroadmVersion._221;
+            LOG.info("Device version is 2.2.1");
         }
         LOG.info("Now calling get pm data");
         GetPmOutputBuilder pmOutputBuilder = OlmUtils.pmFetch(pmInput, deviceTransactionManager,
             openroadmVersion);
-
         return pmOutputBuilder.build();
     }
 
@@ -145,7 +143,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 {
@@ -173,7 +170,7 @@ public class OlmPowerServiceImpl implements OlmPowerService {
         LOG.info("CalculateSpanlossBase Request received for source type {}", spanlossBaseInput.getSrcType());
         List<RoadmLinks> roadmLinks = new ArrayList<>();
         CalculateSpanlossBaseOutputBuilder spanLossBaseBuilder = new CalculateSpanlossBaseOutputBuilder();
-        boolean spanLossResult = false;
+        Map<LinkId, BigDecimal> spanLossResult = null;
         //Depending on the source type do the calculation
         switch (spanlossBaseInput.getSrcType()) {
             case Link:
@@ -222,10 +219,20 @@ public class OlmPowerServiceImpl implements OlmPowerService {
                 }
                 spanLossResult = getLinkSpanloss(roadmLinks);
                 break;
+            default:
+                LOG.info("Invalid input in request");
         }
 
-        if (spanLossResult) {
+        if (spanLossResult != null && !spanLossResult.isEmpty()) {
             spanLossBaseBuilder.setResult(ResponseCodes.SUCCESS_RESULT);
+            List<Spans> listSpans = new ArrayList<>();
+            Set<Entry<LinkId, BigDecimal>> spanLossResultSet = spanLossResult.entrySet();
+            for (Entry<LinkId, BigDecimal> entry : spanLossResultSet) {
+                Spans span = new SpansBuilder().setLinkId(entry.getKey()).setSpanloss(entry.getValue().toString())
+                    .build();
+                listSpans.add(span);
+            }
+            spanLossBaseBuilder.setSpans(listSpans);
             return spanLossBaseBuilder.build();
         } else {
             LOG.warn("Spanloss calculation failed");
@@ -255,9 +262,9 @@ public class OlmPowerServiceImpl implements OlmPowerService {
             if (OpenroadmLinkType.ROADMTOROADM.equals(roadmLinkAugmentation.getLinkType())) {
                 // Only calculate spanloss for Roadm-to-Roadm links
                 RoadmLinks roadmLink = new RoadmLinks();
-                roadmLink.setSrcNodeId(link.getSource().getSourceNode().toString());
+                roadmLink.setSrcNodeId(link.getSource().getSourceNode().getValue());
                 roadmLink.setSrcTpId(link.getSource().getSourceTp().toString());
-                roadmLink.setDestNodeId(link.getDestination().getDestNode().toString());
+                roadmLink.setDestNodeId(link.getDestination().getDestNode().getValue());
                 roadmLink.setDestTpid(link.getDestination().getDestTp().toString());
                 roadmLinks.add(roadmLink);
             }
@@ -268,9 +275,9 @@ public class OlmPowerServiceImpl implements OlmPowerService {
             return null;
         }
 
-        boolean spanLossResult = getLinkSpanloss(roadmLinks);
+        Map<LinkId, BigDecimal> spanLossResult = getLinkSpanloss(roadmLinks);
         CalculateSpanlossCurrentOutputBuilder spanLossCurrentBuilder = new CalculateSpanlossCurrentOutputBuilder();
-        if (spanLossResult) {
+        if (spanLossResult != null && !spanLossResult.isEmpty()) {
             spanLossCurrentBuilder.setResult(ResponseCodes.SUCCESS_RESULT);
             return spanLossCurrentBuilder.build();
         } else {
@@ -294,10 +301,10 @@ public class OlmPowerServiceImpl implements OlmPowerService {
                 .augmentation(Network1.class)
                 .build();
         Optional<Network1> networkOptional;
-        try (ReadOnlyTransaction rtx = this.dataBroker.newReadOnlyTransaction()) {
+        try (ReadTransaction rtx = this.dataBroker.newReadOnlyTransaction()) {
             //TODO change to constant from Timeouts class when it will be merged.
             networkOptional = rtx.read(LogicalDatastoreType.CONFIGURATION, networkIID).get(Timeouts.DATASTORE_READ,
-                TimeUnit.MILLISECONDS).toJavaUtil();
+                TimeUnit.MILLISECONDS);
 
         } catch (InterruptedException | ExecutionException | TimeoutException e) {
             LOG.warn("Read of {} topology failed", NetworkUtils.OVERLAY_NETWORK_ID);
@@ -379,10 +386,8 @@ public class OlmPowerServiceImpl implements OlmPowerService {
      * @param direction for which spanloss is calculated.It can be either Tx or Rx
      * @return true/false
      */
-    private boolean setSpanLoss(String nodeId, String interfaceName, BigDecimal spanLoss, String direction,
-                                LinkId linkId) {
+    private boolean setSpanLoss(String nodeId, String interfaceName, BigDecimal spanLoss, String direction) {
         String realNodeId = getRealNodeId(nodeId);
-        BigDecimal initialSpanloss = new BigDecimal(0);
         try {
             LOG.info("Setting Spanloss in device for {}, InterfaceName: {}", realNodeId, interfaceName);
             if (mappingUtils.getOpenRoadmVersion(realNodeId)
@@ -393,8 +398,6 @@ public class OlmPowerServiceImpl implements OlmPowerService {
                 Optional<Interface> interfaceObject;
                 interfaceObject = openRoadmInterfaces.getInterface(realNodeId, interfaceName);
                 if (interfaceObject.isPresent()) {
-                    InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                        .child(Interface.class, new InterfaceKey(interfaceName));
                     InterfaceBuilder interfaceBuilder = new InterfaceBuilder(interfaceObject.get());
                     OtsBuilder otsBuilder = new OtsBuilder();
                     Interface intf = interfaceObject.get();
@@ -420,8 +423,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)
@@ -432,15 +434,8 @@ public class OlmPowerServiceImpl implements OlmPowerService {
                     .rev181019.RatioDB spanLossTx;
                 Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019
                     .interfaces.grp.Interface> interfaceObject =
-                        openRoadmInterfaces.getInterface(nodeId, interfaceName);
+                        openRoadmInterfaces.getInterface(realNodeId, interfaceName);
                 if (interfaceObject.isPresent()) {
-                    InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019
-                        .interfaces.grp.Interface> interfacesIID =
-                        InstanceIdentifier.create(org.opendaylight.yang.gen.v1.http.org.openroadm
-                            .device.rev181019.org.openroadm.device.container.OrgOpenroadmDevice.class)
-                            .child(org.opendaylight.yang.gen.v1.http.org.openroadm
-                                .device.rev181019.interfaces.grp.Interface.class, new org.opendaylight.yang.gen
-                                .v1.http.org.openroadm.device.rev181019.interfaces.grp.InterfaceKey(interfaceName));
                     org.opendaylight.yang.gen.v1.http.org.openroadm.device
                         .rev181019.interfaces.grp.InterfaceBuilder interfaceBuilder =
                         new org.opendaylight.yang.gen.v1.http.org.openroadm.device
@@ -489,21 +484,18 @@ 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;
                 }
             }
         } catch (OpenRoadmInterfaceException e) {
             // TODO Auto-generated catch block
-            e.printStackTrace();
+            LOG.error("OpenRoadmInterfaceException occured {}",e);
         } /**catch (InterruptedException e) {
          // TODO Auto-generated catch block
-            e.printStackTrace();
-        } catch (ExecutionException e) {
+         } catch (ExecutionException e) {
          // TODO Auto-generated catch block
-            e.printStackTrace();
-        }**/
+         }**/
         return false;
     }
 
@@ -520,48 +512,49 @@ public class OlmPowerServiceImpl implements OlmPowerService {
      *            reference to list of RoadmLinks
      * @return map with list of spans with their spanloss value
      */
-    private boolean getLinkSpanloss(List<RoadmLinks> roadmLinks) {
+    private Map<LinkId, BigDecimal> getLinkSpanloss(List<RoadmLinks> roadmLinks) {
+        Map<LinkId, BigDecimal> map = new HashMap<LinkId, BigDecimal>();
         LOG.info("Executing GetLinkSpanLoss");
         BigDecimal spanLoss = new BigDecimal(0);
-
-        for (int i = 0; i < roadmLinks.size(); i++) {
-            //TODO Add logic to check PM measurement for 3 times
-            OtsPmHolder srcOtsPmHoler = getPmMeasurements(roadmLinks.get(i).getSrcNodeId(),
-                roadmLinks.get(i).getSrcTpId(), "OpticalPowerOutput");
-            OtsPmHolder destOtsPmHoler = getPmMeasurements(roadmLinks.get(i).getDestNodeId(),
-                roadmLinks.get(i).getDestTpid(), "OpticalPowerInput");
+        for (RoadmLinks link : roadmLinks) {
+            String sourceNodeId = link.getSrcNodeId().toString();
+            String sourceTpId = link.getSrcTpId();
+            String destNodeId = link.getDestNodeId().toString();
+            String destTpId = link.getDestTpid();
+            OtsPmHolder srcOtsPmHoler = getPmMeasurements(sourceNodeId, sourceTpId, "OpticalPowerOutput");
+            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());
-            //TODO make it 3 times in here
-            if (spanLoss.doubleValue() < 28 && spanLoss.doubleValue() > 0) {
-                if (!setSpanLoss(roadmLinks.get(i).getSrcNodeId(), srcOtsPmHoler.getOtsInterfaceName(), spanLoss,
-                    "TX", roadmLinks.get(i).getLinkId())) {
-                    LOG.info("Setting spanLoss failed for " + roadmLinks.get(i).getSrcNodeId());
-                    return false;
-                }
-                if (!setSpanLoss(roadmLinks.get(i).getDestNodeId(), destOtsPmHoler.getOtsInterfaceName(), spanLoss,
-                    "RX",roadmLinks.get(i).getLinkId())) {
-                    LOG.info("Setting spanLoss failed for " + roadmLinks.get(i).getDestNodeId());
-                    return false;
-                }
+            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 true;
+        return map;
     }
 
     private String getRealNodeId(String mappedNodeId) {
         KeyedInstanceIdentifier<Node, NodeKey> mappedNodeII =
             InstanceIdentifiers.OVERLAY_NETWORK_II.child(Node.class, new NodeKey(new NodeId(mappedNodeId)));
-        com.google.common.base.Optional<Node> realNode;
-        try (ReadOnlyTransaction readOnlyTransaction = this.dataBroker.newReadOnlyTransaction()) {
+        Optional<Node> realNode;
+        try (ReadTransaction readOnlyTransaction = this.dataBroker.newReadOnlyTransaction()) {
             realNode = readOnlyTransaction.read(LogicalDatastoreType.CONFIGURATION, mappedNodeII).get();
         } catch (InterruptedException | ExecutionException e) {
             LOG.error(e.getMessage(), e);
             throw new IllegalStateException(e);
         }
         if (!realNode.isPresent() || (realNode.get().getSupportingNode() == null)) {
+            LOG.error("supporting node is null");
             throw new IllegalArgumentException(
                 String.format("Could not find node %s, or supporting node is not present", mappedNodeId));
         }
@@ -575,6 +568,7 @@ public class OlmPowerServiceImpl implements OlmPowerService {
                 collect.size(), mappedNodeId));
 
         }
+        LOG.info("getRealNodeId - return {}", collect.iterator().next().getNodeRef().getValue());
         return collect.iterator().next().getNodeRef().getValue();
     }
 
@@ -585,10 +579,10 @@ public class OlmPowerServiceImpl implements OlmPowerService {
             .augmentation(Network1.class).child(Link.class, new LinkKey(linkId))
             .build();
         Optional<Link> linkOptional;
-        try (ReadOnlyTransaction rtx = dataBroker.newReadOnlyTransaction()) {
+        try (ReadTransaction rtx = dataBroker.newReadOnlyTransaction()) {
             //TODO change to constant from Timeouts class when it will be merged.
             linkOptional = rtx.read(LogicalDatastoreType.CONFIGURATION, linkIID).get(Timeouts.DATASTORE_READ,
-                TimeUnit.MILLISECONDS).toJavaUtil();
+                TimeUnit.MILLISECONDS);
             return linkOptional.get();
         } catch (InterruptedException | ExecutionException | TimeoutException e) {
             LOG.warn("Read of {} topology failed", NetworkUtils.OVERLAY_NETWORK_ID);