Fix for ADVA ols with TAPI

Change-Id: I91d0002dc67697d394f6a97ed7f97089054f4837
diff --git a/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/tapi/TapiDeviceDescriptionDiscovery.java b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/tapi/TapiDeviceDescriptionDiscovery.java
index c106202..ab0a986 100644
--- a/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/tapi/TapiDeviceDescriptionDiscovery.java
+++ b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/tapi/TapiDeviceDescriptionDiscovery.java
@@ -22,20 +22,18 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import org.onlab.packet.ChassisId;
+import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.net.Device;
-import org.onosproject.net.PortNumber;
 import org.onosproject.net.DeviceId;
-import org.onosproject.net.device.PortDescription;
+import org.onosproject.net.OchSignal;
+import org.onosproject.net.OduSignalType;
+import org.onosproject.net.PortNumber;
 import org.onosproject.net.device.DefaultDeviceDescription;
 import org.onosproject.net.device.DeviceDescription;
 import org.onosproject.net.device.DeviceDescriptionDiscovery;
 import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.device.PortDescription;
 import org.onosproject.net.driver.AbstractHandlerBehaviour;
-import org.onosproject.net.OchSignal;
-import org.onosproject.net.OduSignalType;
-import org.onosproject.net.GridType;
-import org.onosproject.net.ChannelSpacing;
-import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.protocol.rest.RestSBController;
 import org.slf4j.Logger;
 
@@ -46,24 +44,16 @@
 import java.util.List;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.CONTEXT;
 import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.LAYER_PROTOCOL_NAME;
-import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.MEDIA_CHANNEL_SERVICE_INTERFACE_POINT_SPEC;
-import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.AVAILABLE_SPECTRUM;
-import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.ADJUSTMENT_GRANULARITY;
-import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.BASE_FREQUENCY;
-import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.FREQUENCY_CONSTRAINT;
-import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.GRID_TYPE;
-import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.LOWER_FREQUENCY;
 import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.MC_POOL;
+import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.MEDIA_CHANNEL_SERVICE_INTERFACE_POINT_SPEC;
 import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.PHOTONIC_LAYER_QUALIFIER_NMC;
 import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.PHOTONIC_MEDIA;
 import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.SERVICE_INTERFACE_POINT;
 import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.SUPPORTED_LAYER_PROTOCOL_QUALIFIER;
-import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.UPPER_FREQUENCY;
 import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.UUID;
-import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.toMbpsFromHz;
-import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.getChannelSpacing;
-import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.getSlotGranularity;
+import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.getOchSignal;
 import static org.onosproject.net.optical.device.OchPortHelper.ochPortDescription;
 import static org.slf4j.LoggerFactory.getLogger;
 
@@ -77,9 +67,7 @@
         implements DeviceDescriptionDiscovery {
 
     private static final Logger log = getLogger(TapiDeviceDescriptionDiscovery.class);
-    private static final String SIP_REQUEST_DATA_API = "/data/context/";
-    private static PortNumber nPort = PortNumber.portNumber(1);
-    private static final Object N_PORT_LOCK = new Object();
+    private static final String SIP_REQUEST_DATA_API = "/restconf/data/tapi-common:context";
 
     /**
      * Get the deviceId for which the methods apply.
@@ -98,9 +86,10 @@
         Device device = deviceService.getDevice(deviceId);
 
         if (device == null) {
+            //TODO need to obtain from the device.
             return new DefaultDeviceDescription(deviceId.uri(),
                     Device.Type.OLS,
-                    "tapi-swagger",
+                    "Tapi",
                     "0",
                     "2.1",
                     "Unknown",
@@ -125,6 +114,10 @@
         try {
             InputStream inputStream = controller.get(deviceId, SIP_REQUEST_DATA_API, MediaType.APPLICATION_JSON_TYPE);
             JsonNode jsonNode = new ObjectMapper().readTree(inputStream);
+            if (jsonNode == null) {
+                log.error("Can't discover port details at {}", SIP_REQUEST_DATA_API);
+                return ImmutableList.of();
+            }
             return parseTapiPorts(jsonNode);
         } catch (IOException e) {
             log.error("Exception discoverPortDetails() {}", did(), e);
@@ -134,39 +127,28 @@
 
     protected List<PortDescription> parseTapiPorts(JsonNode tapiContext) {
         List<PortDescription> ports = Lists.newArrayList();
-        int counter = 0;
-
-        /**
+        /*
          This annotations are used to store persistent mapping information between TAPI SIP's uuid
          and ONOS device portNumbers. This is needed to be publicly available at least within ODTN app
          when connectivity services will be sent to OLS Controller.
-         **/
+         */
         DefaultAnnotations.Builder annotations = DefaultAnnotations.builder();
-
-        JsonNode sips = tapiContext.get(SERVICE_INTERFACE_POINT);
-        Iterator<JsonNode> iter = sips.iterator();
+        Iterator<JsonNode> iter = tapiContext.get(CONTEXT).get(SERVICE_INTERFACE_POINT).iterator();
         while (iter.hasNext()) {
             JsonNode sipAttributes = iter.next();
             if (checkValidEndpoint(sipAttributes)) {
                 String uuid = sipAttributes.get(UUID).textValue();
+                PortNumber portNumber = PortNumber.portNumber(uuid.split("-")[0]);
+                annotations.set(UUID, uuid);
+
                 JsonNode mcPool = sipAttributes.get(MEDIA_CHANNEL_SERVICE_INTERFACE_POINT_SPEC).get(MC_POOL);
+                // We get the first OCH signal as reported by the device.
+                OchSignal ochSignal = getOchSignal(mcPool).iterator().next();
+                //add och port
+                ports.add(ochPortDescription(portNumber, true, OduSignalType.ODU4,
+                        false, ochSignal, annotations.build()));
 
-                /*We create a sample OChSignal in the first position of the 50GHz DWDM Grid,
-                this should be replace for a OChSignal construct which has undefined spectrum.
-                OchSignal ochSignal = new OchSignal(GridType.DWDM, ChannelSpacing.CHL_50GHZ,
-                        0, 1);*/
 
-                OchSignal ochSignal = getOchSignal(mcPool);
-                synchronized (N_PORT_LOCK) {
-                    //annotations(portNumber-uuid)
-                    annotations.set(UUID, uuid);
-
-                    //add och port
-                    ports.add(ochPortDescription(nPort, true, OduSignalType.ODU4,
-                            false, ochSignal, annotations.build()));
-
-                    nPort = PortNumber.portNumber(counter++);
-                }
             } else {
                 log.error("SIP {} is not valid", sipAttributes);
             }
@@ -183,52 +165,11 @@
      * [PHOTONIC_LAYER_QUALIFIER_NMC, PHOTONIC_LAYER_QUALIFIER_NMCA, PHOTONIC_LAYER_QUALIFIER_OTSI...]
      **/
     private boolean checkValidEndpoint(JsonNode sipAttributes) {
-        return (sipAttributes.get(LAYER_PROTOCOL_NAME).toString().contains(PHOTONIC_MEDIA) &&
+        return sipAttributes.has(LAYER_PROTOCOL_NAME) &&
+                sipAttributes.get(LAYER_PROTOCOL_NAME).toString().contains(PHOTONIC_MEDIA) &&
+                sipAttributes.has(SUPPORTED_LAYER_PROTOCOL_QUALIFIER) &&
                 sipAttributes.get(SUPPORTED_LAYER_PROTOCOL_QUALIFIER).toString()
-                        .contains(PHOTONIC_LAYER_QUALIFIER_NMC));
-    }
-
-    /**
-     * If SIP info match our criteria, SIP component shall includes mc-pool information which must be obtained in order
-     * to complete the OchSignal info. with the TAPI SIP information included in spectrum-supported, spectrum-available
-     * and spectrum-occupied tapi objects.
-     **/
-    private OchSignal getOchSignal(JsonNode mcPool) {
-        long availableUpperFrec = 0;
-        long availableLowerFrec = 0;
-        String availableAdjustmentGranularity = "";
-        String availableGridType = "";
-        JsonNode availableSpectrum = mcPool.get(AVAILABLE_SPECTRUM);
-
-        /**At this time only the latest availableSpectrum is used**/
-        Iterator<JsonNode> iterAvailable = availableSpectrum.iterator();
-        while (iterAvailable.hasNext()) {
-            JsonNode availableSpec = iterAvailable.next();
-            availableUpperFrec = availableSpec.get(UPPER_FREQUENCY).asLong();
-            availableLowerFrec = availableSpec.get(LOWER_FREQUENCY).asLong();
-            availableAdjustmentGranularity = availableSpec.get(FREQUENCY_CONSTRAINT)
-                    .get(ADJUSTMENT_GRANULARITY).textValue();
-            availableGridType = availableSpec.get(FREQUENCY_CONSTRAINT).get(GRID_TYPE).textValue();
-        }
-
-        int spacingMult = 0;
-        int slotGranularity = 1;
-        ChannelSpacing chSpacing = getChannelSpacing(availableAdjustmentGranularity);
-        long spacingFrequency = chSpacing.frequency().asHz();
-        long centralFrequency = (availableUpperFrec - (availableUpperFrec - availableLowerFrec) / 2);
-
-        GridType gridType = GridType.valueOf(availableGridType);
-        if (gridType == GridType.DWDM) {
-            spacingMult = (int) ((centralFrequency - BASE_FREQUENCY) / toMbpsFromHz(spacingFrequency));
-        } else if (gridType == GridType.CWDM) {
-            log.warn("GridType CWDM. Not implemented");
-        } else if (gridType == GridType.FLEX) {
-            log.warn("GridType FLEX. Not implemented");
-            slotGranularity = getSlotGranularity(chSpacing);
-        } else {
-            log.warn("Unknown GridType");
-        }
-        return new OchSignal(gridType, chSpacing, spacingMult, slotGranularity);
+                        .contains(PHOTONIC_LAYER_QUALIFIER_NMC);
     }
 
 }