Update portmapping YANG model
[transportpce.git] / olm / src / main / java / org / opendaylight / transportpce / olm / util / OlmUtils.java
index cce3606541b140d433395e9a836cb5e1490a1768..f30207425d996420854f267d272c1461dfee4ab8 100644 (file)
@@ -7,62 +7,30 @@
  */
 package org.opendaylight.transportpce.olm.util;
 
-import com.google.common.base.Strings;
-
-import java.util.ArrayList;
-import java.util.List;
 import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
-
-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.transportpce.common.Timeouts;
+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.device.DeviceTransactionManager;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev161014.CurrentPmlist;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev161014.current.pm.Measurements;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev161014.currentpmlist.CurrentPm;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev161014.PmGranularity;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev161014.PmNamesEnum;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev161014.resource.resource.Resource;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev161014.resource.resource.resource.CircuitPack;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev161014.resource.resource.resource.Connection;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev161014.resource.resource.resource.Degree;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev161014.resource.resource.resource.Interface;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev161014.resource.resource.resource.InternalLink;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev161014.resource.resource.resource.PhysicalLink;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev161014.resource.resource.resource.Port;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev161014.resource.resource.resource.Service;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev161014.resource.resource.resource.Shelf;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev161014.resource.resource.resource.Srg;
-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.olm.get.pm.input.ResourceIdentifier;
-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.GetPmInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.olm.rev170418.GetPmOutputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.olm.rev170418.get.pm.output.MeasurementsBuilder;
-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.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
-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.http.org.opendaylight.transportpce.olm.rev170418.GetPmInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev170418.GetPmOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210315.Network;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210315.OpenroadmNodeVersion;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210315.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210315.network.NodesKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class OlmUtils {
+public final class OlmUtils {
 
     private static final Logger LOG = LoggerFactory.getLogger(OlmUtils.class);
     private static long DATABROKER_READ_TIMEOUT_SECONDS = 120;
-    private static final InstanceIdentifier<Topology> NETCONF_TOPO_IID =
-            InstanceIdentifier
-                    .create(NetworkTopology.class)
-                    .child(Topology.class,
-                            new TopologyKey(new TopologyId(TopologyNetconf.QNAME.getLocalName())));
+    public static final long OLM_TIMER_1 = 120000; //#FUNCTESTVAL= 3000;
+    public static final long OLM_TIMER_2 = 20000;  //#FUNCTESTVAL= 2000;
 
     /**
      * This static method returns the port mapping {@link Nodes} for node.
@@ -75,12 +43,12 @@ public class OlmUtils {
      */
     public static Optional<Nodes> getNode(String nodeId, DataBroker db) {
         InstanceIdentifier<Nodes> nodesIID = InstanceIdentifier.create(Network.class)
-                .child(Nodes.class, new NodesKey(nodeId));
-        try (ReadOnlyTransaction readTransaction = db.newReadOnlyTransaction()) {
+            .child(Nodes.class, new NodesKey(nodeId));
+        try (ReadTransaction readTransaction = db.newReadOnlyTransaction()) {
             return readTransaction.read(LogicalDatastoreType.CONFIGURATION, nodesIID)
-                    .get(DATABROKER_READ_TIMEOUT_SECONDS, TimeUnit.SECONDS).toJavaUtil();
+                .get(DATABROKER_READ_TIMEOUT_SECONDS, TimeUnit.SECONDS);
         } catch (InterruptedException | ExecutionException | TimeoutException ex) {
-            LOG.info("Unable to read Portmapping for nodeId {}", nodeId, ex);
+            LOG.error("Unable to read Portmapping for nodeId {}", nodeId, ex);
             return Optional.empty();
         }
     }
@@ -98,195 +66,34 @@ public class OlmUtils {
      *            Input parameter from the olm yang model get-pm rpc
      * @param deviceTransactionManager
      *            Device tx manager
+     * @param openRoadmVersion
+     *            OpenRoadm version number
      *
      * @return Result of the request list of PM readings
      */
-    public static GetPmOutputBuilder pmFetch(GetPmInput input, DeviceTransactionManager deviceTransactionManager) {
+    public static GetPmOutputBuilder pmFetch(GetPmInput input, DeviceTransactionManager deviceTransactionManager,
+                                             OpenroadmNodeVersion openRoadmVersion) {
         LOG.info("Getting PM Data for NodeId: {} ResourceType: {} ResourceName: {}", input.getNodeId(),
-                input.getResourceType(), input.getResourceIdentifier());
-        GetPmOutputBuilder pmOutputBuilder = new GetPmOutputBuilder();
-        InstanceIdentifier<CurrentPmlist> currentPmsIID = InstanceIdentifier.create(CurrentPmlist.class);
-        Optional<CurrentPmlist> currentPmList;
-
-        currentPmList = deviceTransactionManager
-                .getDataFromDevice(input.getNodeId(), LogicalDatastoreType.OPERATIONAL, currentPmsIID,
-                        Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
-        if (currentPmList.isPresent()) {
-            List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.olm.rev170418.get.pm.output
-                    .Measurements> measurements = extractWantedMeasurements(currentPmList.get(),
-                    input.getResourceType(), input.getResourceIdentifier(), input.getGranularity());
-            if (measurements.isEmpty()) {
-                LOG.error("No Matching PM data found for node: {}, " + "resource type: {}, resource name: {}",
-                        input.getNodeId(), input.getResourceType(),
-                        getResourceIdentifierAsString(input.getResourceIdentifier()));
-            } else {
-                pmOutputBuilder.setNodeId(input.getNodeId()).setResourceType(input.getResourceType())
-                        .setResourceIdentifier(input.getResourceIdentifier()).setGranularity(input.getGranularity())
-                        .setMeasurements(measurements);
-                LOG.info("PM Data found successfully for node: {}, resource type: {}, " + "resource name {}",
-                        input.getNodeId(), input.getResourceType(),
-                        getResourceIdentifierAsString(input.getResourceIdentifier()));
-            }
-
-        } else {
-            LOG.info("Device PM Data for node: {} is not available", input.getNodeId());
-        }
-
-        return pmOutputBuilder;
-    }
-
-    private static String getResourceIdentifierAsString(ResourceIdentifier resourceIdentifier) {
-        if (Strings.isNullOrEmpty(resourceIdentifier.getCircuitPackName())) {
-            return resourceIdentifier.getResourceName();
-        } else {
-            return resourceIdentifier.getResourceName() + ", circuit pack name: "
-                + resourceIdentifier.getCircuitPackName();
-        }
-    }
-
-    private static List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.olm.rev170418.get.pm
-            .output.Measurements> extractWantedMeasurements(CurrentPmlist currentPmList,
-            ResourceTypeEnum wantedResourceType, ResourceIdentifier wantedResourceIdentifier,
-            PmGranularity wantedGranularity) {
-        List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.olm.rev170418.get.pm
-            .output.Measurements> measurements = new ArrayList<>();
-        for (CurrentPm pm : currentPmList.getCurrentPm()) {
-            ResourceTypeEnum currentResourceType = pm.getResource().getResourceType().getType();
-            if (currentResourceType.equals(wantedResourceType)) {
-                Resource currentResource = pm.getResource().getResource().getResource();
-                PmGranularity currentGranularity = pm.getGranularity();
-                boolean isWantedPowerMeasure = isWantedPowerMeasure(currentResource, currentGranularity,
-                        wantedResourceType, wantedResourceIdentifier, wantedGranularity);
-                if (isWantedPowerMeasure) {
-                    measurements.addAll(extractMeasurements(pm.getMeasurements()));
-                }
-            }
-        }
-        return measurements;
-    }
-
-    private static List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.olm.rev170418.get.pm
-            .output.Measurements> extractMeasurements(List<Measurements> measurementsFromDevice) {
-        List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.olm.rev170418.get.pm.output.Measurements>
-            extractedMeasurements = new ArrayList<>();
-        for (Measurements measure : measurementsFromDevice) {
-            MeasurementsBuilder measurement = new MeasurementsBuilder();
-            if (!measure.getMeasurement().getPmParameterName().getType().equals(PmNamesEnum.VendorExtension)) {
-                measurement.setPmparameterName(measure.getMeasurement().getPmParameterName().getType().toString());
-            } else {
-                measurement.setPmparameterName(measure.getMeasurement().getPmParameterName().getExtension());
-            }
-
-            if (measure.getMeasurement().getPmParameterValue().getDecimal64() != null) {
-                measurement.setPmparameterValue(measure.getMeasurement().getPmParameterValue().getDecimal64()
-                    .toPlainString());
-            } else if (measure.getMeasurement().getPmParameterValue().getUint64() != null) {
-                measurement.setPmparameterValue(measure.getMeasurement().getPmParameterValue().getUint64().toString());
-            }
-            extractedMeasurements.add(measurement.build());
-        }
-        return extractedMeasurements;
-    }
-
-    private static boolean isWantedPowerMeasure(Resource resource, PmGranularity granularity,
-            ResourceTypeEnum wantedResourceType, ResourceIdentifier wantedResourceIdentifier,
-            PmGranularity wantedGranularity) {
-        boolean identifiersAreEqual = compareResourceIdentifiers(resource, wantedResourceType,
-                wantedResourceIdentifier);
-        return identifiersAreEqual && granularity != null && granularity.equals(wantedGranularity);
-    }
-
-    private static boolean compareResourceIdentifiers(Resource resource, ResourceTypeEnum wantedResourceType,
-            ResourceIdentifier wantedResourceIdentifier) {
-        switch (wantedResourceType) {
-            case CircuitPack:
-                Optional<CircuitPack> circuitPackOptional = tryCastToParticularResource(CircuitPack.class, resource);
-                return circuitPackOptional.flatMap(
-                    circuitPack -> Optional.ofNullable(circuitPack.getCircuitPackName()))
-                        .map(circuitPackName -> circuitPackName.equals(wantedResourceIdentifier.getResourceName()))
-                        .orElse(false);
-            case Connection:
-                Optional<Connection> connectionOptional = tryCastToParticularResource(Connection.class, resource);
-                return connectionOptional.flatMap(
-                    connection -> Optional.ofNullable(connection.getConnectionNumber()))
-                        .map(connectionNumber -> connectionNumber.equals(wantedResourceIdentifier.getResourceName()))
-                        .orElse(false);
-            case Degree:
-                Optional<Degree> degreeOptional = tryCastToParticularResource(Degree.class, resource);
-                return degreeOptional.flatMap(
-                    degree -> Optional.ofNullable(degree.getDegreeNumber()))
-                        .flatMap(degreeInteger -> Optional.of(degreeInteger.toString()))
-                        .map(degreeNumberAsString ->
-                            degreeNumberAsString.equals(wantedResourceIdentifier.getResourceName()))
-                        .orElse(false);
-            case Interface:
-                Optional<Interface> interfaceOptional = tryCastToParticularResource(Interface.class, resource);
-                return interfaceOptional.flatMap(
-                    interfaceResource -> Optional.ofNullable(interfaceResource.getInterfaceName()))
-                        .map(interfaceName -> interfaceName.equals(wantedResourceIdentifier.getResourceName()))
-                        .orElse(false);
-            case InternalLink:
-                Optional<InternalLink> internalLinkOptional = tryCastToParticularResource(InternalLink.class, resource);
-                return internalLinkOptional.flatMap(
-                    internalLink -> Optional.ofNullable(internalLink.getInternalLinkName()))
-                        .map(internalLinkName -> internalLinkName.equals(wantedResourceIdentifier.getResourceName()))
-                        .orElse(false);
-            case PhysicalLink:
-                Optional<PhysicalLink> physicalLinkOptional = tryCastToParticularResource(PhysicalLink.class, resource);
-                return physicalLinkOptional.flatMap(
-                    physicalLink -> Optional.ofNullable(physicalLink.getPhysicalLinkName()))
-                        .map(physicalLinkName -> physicalLinkName.equals(wantedResourceIdentifier.getResourceName()))
-                        .orElse(false);
-            case Service:
-                Optional<Service> serviceOptional = tryCastToParticularResource(Service.class, resource);
-                return serviceOptional.flatMap(
-                    service -> Optional.ofNullable(service.getServiceName()))
-                        .map(serviceName -> serviceName.equals(wantedResourceIdentifier.getResourceName()))
-                    .orElse(false);
-            case Shelf:
-                Optional<Shelf> shelfOptional = tryCastToParticularResource(Shelf.class, resource);
-                return shelfOptional.flatMap(
-                    shelf -> Optional.ofNullable(shelf.getShelfName()))
-                        .map(shelfName -> shelfName.equals(wantedResourceIdentifier.getResourceName()))
-                        .orElse(false);
-            case SharedRiskGroup:
-                Optional<Srg> sharedRiskGroupOptional = tryCastToParticularResource(Srg.class, resource);
-                return sharedRiskGroupOptional.flatMap(
-                    sharedRiskGroup -> Optional.ofNullable(sharedRiskGroup.getSrgNumber()))
-                        .flatMap(sharedRiskGroupNumberInteger -> Optional.of(sharedRiskGroupNumberInteger.toString()))
-                        .map(srgNumberAsString -> srgNumberAsString.equals(wantedResourceIdentifier.getResourceName()))
-                        .orElse(false);
-            case Port:
-                Optional<Port> portContainerOptional = tryCastToParticularResource(Port.class, resource);
-                return portContainerOptional.flatMap(
-                    portContainer -> Optional.ofNullable(portContainer.getPort()))
-                        .map(port -> {
-                            String portName = port.getPortName();
-                            String circuitPackName = port.getCircuitPackName();
-                            return portName != null
-                                    && circuitPackName != null
-                                    && portName.equals(wantedResourceIdentifier.getResourceName())
-                                    && circuitPackName.equals(wantedResourceIdentifier.getCircuitPackName());
-                        })
-                        .orElse(false);
+            input.getResourceType(), input.getResourceIdentifier());
+        GetPmOutputBuilder pmOutputBuilder;
+        switch (openRoadmVersion.getIntValue()) {
+            case 1:
+                pmOutputBuilder = OlmUtils121.pmFetch(input, deviceTransactionManager);
+                break;
+            case 2:
+                pmOutputBuilder = OlmUtils221.pmFetch(input, deviceTransactionManager);
+                break;
+            case 3:
+                pmOutputBuilder = OlmUtils710.pmFetch(input, deviceTransactionManager);
+                break;
             default:
-                LOG.warn("Unknown resource type {}", wantedResourceType);
-                return false;
+                LOG.error("Unrecognized OpenRoadm version");
+                pmOutputBuilder = new GetPmOutputBuilder();
         }
+        return pmOutputBuilder;
     }
 
-    @SuppressWarnings("unchecked")
-    private static <T extends Resource> Optional<T> tryCastToParticularResource(Class<T> resourceClass,
-            Resource resource) {
-        if (resource == null) {
-            LOG.warn("Resource is null.");
-        } else if (! resourceClass.isInstance(resource)) {
-            LOG.warn("Resource implement different type than expected. Expected {}, actual {}.",
-                    resourceClass.getSimpleName(), resource.getClass().getSimpleName());
-        } else {
-            return Optional.of((T) resource);
-        }
-        return Optional.empty();
+    private OlmUtils() {
     }
 
 }