Optical Intent compiler fix and ADVA OLS testing derived adjustments

Change-Id: I986431b751e3ba060cf81f357938b34f3a68f5aa
diff --git a/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OpticalConnectivityIntentCompiler.java b/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OpticalConnectivityIntentCompiler.java
index 2fced48..58c9d49 100644
--- a/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OpticalConnectivityIntentCompiler.java
+++ b/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OpticalConnectivityIntentCompiler.java
@@ -306,7 +306,10 @@
         // Sort available lambdas
         List<OchSignal> lambdaList = new ArrayList<>(lambdas);
         lambdaList.sort(new DefaultOchSignalComparator());
-
+        //Means there is only exactly one set of lambdas available
+        if (lambdaList.size() == count) {
+            return lambdaList;
+        }
         // Look ahead by count and ensure spacing multiplier is as expected (i.e., no gaps)
         for (int i = 0; i < lambdaList.size() - count; i++) {
             if (lambdaList.get(i).spacingMultiplier() + 2 * count ==
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 2c35a29..71e338e 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
@@ -54,6 +54,7 @@
 import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.SUPPORTED_LAYER_PROTOCOL_QUALIFIER;
 import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.UUID;
 import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.getOchSignal;
+import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.removeInitalConnectivityServices;
 import static org.onosproject.net.optical.device.OchPortHelper.ochPortDescription;
 import static org.slf4j.LoggerFactory.getLogger;
 
@@ -119,9 +120,13 @@
                 log.error("Can't discover port details at {}", SIP_REQUEST_DATA_API);
                 return ImmutableList.of();
             }
-            return parseTapiPorts(jsonNode);
+            List<PortDescription> ports = parseTapiPorts(jsonNode);
+            //Removing any initial connectivity services
+            removeInitalConnectivityServices(deviceId, handler());
+            return ports;
         } catch (IOException e) {
             log.error("Exception discoverPortDetails() {}", did(), e);
+            removeInitalConnectivityServices(deviceId, handler());
             return ImmutableList.of();
         }
     }
diff --git a/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/tapi/TapiDeviceHelper.java b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/tapi/TapiDeviceHelper.java
index efbc12d..d73daeb 100644
--- a/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/tapi/TapiDeviceHelper.java
+++ b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/tapi/TapiDeviceHelper.java
@@ -18,16 +18,30 @@
 package org.onosproject.drivers.odtn.tapi;
 
 import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectReader;
+import com.google.common.collect.ImmutableSet;
+import org.apache.http.HttpStatus;
+import org.onosproject.drivers.odtn.impl.DeviceConnectionCache;
 import org.onosproject.net.ChannelSpacing;
+import org.onosproject.net.DeviceId;
 import org.onosproject.net.GridType;
 import org.onosproject.net.OchSignal;
+import org.onosproject.net.driver.DriverHandler;
+import org.onosproject.protocol.rest.RestSBController;
 import org.slf4j.Logger;
 
+import javax.ws.rs.core.MediaType;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.Set;
+import java.util.concurrent.CompletableFuture;
 import java.util.stream.IntStream;
 
+import static com.google.common.base.Preconditions.checkNotNull;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -55,6 +69,8 @@
     public static final String LOWER_FREQUENCY = "lower-frequency";
     public static final long BASE_FREQUENCY = 193100000;   //Working in Mhz
     public static final String TAPI_CONNECTIVITY_CONNECTIVITY_SERVICE = "tapi-connectivity:connectivity-service";
+    public static final String TAPI_CONNECTIVITY_CONNECTIVITY_CONTEXT = "tapi-connectivity:connectivity-context";
+    public static final String CONNECTIVITY_SERVICE = "connectivity-service";
     public static final String END_POINT = "end-point";
     public static final String SERVICE_LAYER = "service-layer";
     public static final String SERVICE_TYPE = "service-type";
@@ -67,12 +83,20 @@
     public static final String AVAILABLE_SPECTRUM = "available-spectrum";
     protected static final String SUPPORTABLE_SPECTRUM = "supportable-spectrum";
 
-    private TapiDeviceHelper(){}
+    protected static final String CONN_REQ_POST_API = "/restconf/data/tapi-common:context/" +
+            "tapi-connectivity:connectivity-context/";
+    protected static final String CONN_REQ_REMOVE_DATA_API = "/restconf/data/tapi-common:context/" +
+            "tapi-connectivity:connectivity-context/connectivity-service=";
+    protected static final String CONN_REQ_GET_API = "/restconf/data/tapi-common:context/" +
+            "tapi-connectivity:connectivity-context/";
+
+    private TapiDeviceHelper() {
+    }
 
     /**
      * Returns the slot granularity corresponding to a channelSpacing.
      *
-     * @param chSpacing      OchSingal channel spacing {@link ChannelSpacing}
+     * @param chSpacing OchSingal channel spacing {@link ChannelSpacing}
      * @return OchSignal slot width granularity
      */
     public static int getSlotGranularity(ChannelSpacing chSpacing) {
@@ -113,10 +137,10 @@
     }
 
     /**
-     *  To Mbps conversion from Hz.
+     * To Mbps conversion from Hz.
      *
-     *  @param speed the speed in Hz
-     *  @return the speed in Mbps
+     * @param speed the speed in Hz
+     * @return the speed in Mbps
      */
     public static long toMbpsFromHz(long speed) {
         return speed / 1000000;
@@ -148,22 +172,41 @@
             JsonNode availableSpec = iterAvailable.next();
             availableUpperFrec = availableSpec.get(UPPER_FREQUENCY).asLong();
             availableLowerFrec = availableSpec.get(LOWER_FREQUENCY).asLong();
-            log.info("availableUpperFrec {}, availableLowerFrec {}", availableUpperFrec,
+            log.debug("availableUpperFrec {}, availableLowerFrec {}", availableUpperFrec,
                     availableLowerFrec);
             availableAdjustmentGranularity = availableSpec.get(FREQUENCY_CONSTRAINT)
                     .get(ADJUSTMENT_GRANULARITY).textValue();
             availableGridType = availableSpec.get(FREQUENCY_CONSTRAINT).get(GRID_TYPE).textValue();
-
+            log.debug("adjustment {}, availableLowerFrec {}", availableUpperFrec,
+                    availableLowerFrec);
             int slotGranularity;
             ChannelSpacing chSpacing = getChannelSpacing(availableAdjustmentGranularity);
-            double spacingFrequency = chSpacing.frequency().asGHz();
+            double spacingFrequency = chSpacing.frequency().asMHz();
             int lambdaCount = (int) ((availableUpperFrec - availableLowerFrec) / spacingFrequency);
             GridType gridType = GridType.valueOf(availableGridType);
             if (gridType == GridType.DWDM) {
                 slotGranularity = getSlotGranularity(chSpacing);
                 int finalSlotGranularity = slotGranularity;
-                IntStream.range(0, lambdaCount).forEach(x -> lambdas.add(new OchSignal(GridType.DWDM, chSpacing,
-                        x - (lambdaCount / 2), finalSlotGranularity)));
+                long finalAvailableUpperFrec = availableUpperFrec;
+                long finalAvailableLowerFrec = availableLowerFrec;
+                IntStream.range(0, lambdaCount).forEach(x -> {
+                    int spacingMultiplier = 0;
+                    if (finalAvailableUpperFrec > BASE_FREQUENCY) {
+                        spacingMultiplier = (int) (((finalAvailableUpperFrec -
+                                (chSpacing.frequency().asMHz() * lambdaCount * x) - slotGranularity / 2)
+                                - BASE_FREQUENCY) / (chSpacing.frequency().asMHz()));
+                    } else {
+                        spacingMultiplier = (int) ((BASE_FREQUENCY - (finalAvailableLowerFrec +
+                                (chSpacing.frequency().asMHz() * lambdaCount * x) + slotGranularity / 2))
+                                / (chSpacing.frequency().asMHz()));
+                    }
+                    OchSignal ochSignal = new OchSignal(GridType.DWDM, chSpacing,
+                            spacingMultiplier, finalSlotGranularity);
+                    log.debug("Spacing Freq {}, LambdaCount {}, FinalSlotGran {}, Spacing mult {}, CentralFreq {}",
+                            spacingFrequency, lambdaCount, finalSlotGranularity, spacingMultiplier,
+                            ochSignal.centralFrequency());
+                    lambdas.add(ochSignal);
+                });
             } else if (gridType == GridType.CWDM) {
                 log.warn("GridType CWDM. Not implemented");
             } else if (gridType == GridType.FLEX) {
@@ -174,4 +217,73 @@
         }
         return lambdas;
     }
+
+    static DeviceConnectionCache getConnectionCache() {
+        return DeviceConnectionCache.init();
+    }
+
+    protected static Set<String> getUuids(DeviceId deviceId, DriverHandler handler) {
+        RestSBController controller = checkNotNull(handler.get(RestSBController.class));
+        ObjectMapper om = new ObjectMapper();
+        final ObjectReader reader = om.reader();
+        InputStream response = controller.get(deviceId, CONN_REQ_GET_API, MediaType.APPLICATION_JSON_TYPE);
+        JsonNode jsonNode;
+        try {
+            jsonNode = reader.readTree(response);
+            if (jsonNode == null) {
+                log.error("JsonNode is null for response {}", response);
+                return ImmutableSet.of();
+            }
+            return parseTapiGetConnectivityRequest(jsonNode);
+        } catch (IOException e) {
+            log.error("Exception while reading response {}", response, e);
+            return ImmutableSet.of();
+        }
+    }
+
+    protected static Set<String> parseTapiGetConnectivityRequest(JsonNode tapiConnectivityReply) {
+        /*
+         {
+            "tapi-connectivity:connectivity-context": {
+                "connectivity-service": [
+                    {
+                        "uuid": "f4088e82-e8bd-4d00-a96c-40d9fcfa1d4d",
+                        ......
+                 ]
+             }
+          }
+         */
+        Set<String> uuids = new HashSet<>();
+        if (tapiConnectivityReply.has(TAPI_CONNECTIVITY_CONNECTIVITY_CONTEXT)
+                && tapiConnectivityReply.get(TAPI_CONNECTIVITY_CONNECTIVITY_CONTEXT).has(CONNECTIVITY_SERVICE)) {
+            tapiConnectivityReply.get(TAPI_CONNECTIVITY_CONNECTIVITY_CONTEXT).get(CONNECTIVITY_SERVICE).elements()
+                    .forEachRemaining(node -> uuids.add(node.get(TapiDeviceHelper.UUID).asText()));
+        } else {
+            log.warn("Can't retrieve connectivity UUID from {}", tapiConnectivityReply);
+        }
+        //This is only one uuid or empty in case of failures
+        return uuids;
+    }
+
+    protected static void removeInitalConnectivityServices(DeviceId deviceId, DriverHandler handler) {
+        RestSBController controller = checkNotNull(handler.get(RestSBController.class));
+        //If no connections are there removing all previous (if any) connections during first installation
+        if (getConnectionCache().size(deviceId) == 0) {
+            Set<String> uuids = getUuids(deviceId, handler);
+            uuids.forEach(uuid -> {
+                CompletableFuture<Integer> flowRemoval =
+                        CompletableFuture.supplyAsync(() -> controller.delete(deviceId,
+                                CONN_REQ_REMOVE_DATA_API + uuid,
+                                null, MediaType.APPLICATION_JSON_TYPE));
+                flowRemoval.thenApply(result -> {
+                    if (result == HttpStatus.SC_NO_CONTENT || result == HttpStatus.SC_OK) {
+                        log.info("Removed connectivity service {} from {}, result {}", uuid, deviceId, result);
+                    } else {
+                        log.error("Can't remove connectivity service {}, result {}", uuid, result);
+                    }
+                    return result;
+                });
+            });
+        }
+    }
 }
diff --git a/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/tapi/TapiFlowRuleProgrammable.java b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/tapi/TapiFlowRuleProgrammable.java
index ce09453..36e0e6c 100644
--- a/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/tapi/TapiFlowRuleProgrammable.java
+++ b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/tapi/TapiFlowRuleProgrammable.java
@@ -20,7 +20,6 @@
 import com.fasterxml.jackson.core.JsonEncoding;
 import com.fasterxml.jackson.core.JsonFactory;
 import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.collect.ImmutableList;
 import org.apache.http.HttpStatus;
 import org.onosproject.drivers.odtn.impl.DeviceConnection;
@@ -45,13 +44,14 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.CONN_REQ_POST_API;
+import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.CONN_REQ_REMOVE_DATA_API;
 import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.END_POINT;
 import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.LAYER_PROTOCOL_NAME;
 import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.LAYER_PROTOCOL_QUALIFIER;
@@ -64,6 +64,8 @@
 import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.SERVICE_TYPE;
 import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.TAPI_CONNECTIVITY_CONNECTIVITY_SERVICE;
 import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.TAPI_PHOTONIC_MEDIA_PHOTONIC_LAYER_QUALIFIER_NMC;
+import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.getConnectionCache;
+import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.getUuids;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -75,47 +77,13 @@
         implements FlowRuleProgrammable {
 
     private static final Logger log = getLogger(TapiFlowRuleProgrammable.class);
-    private static final String CONN_REQ_POST_API = "/restconf/data/tapi-common:context/" +
-            "tapi-connectivity:connectivity-context/";
-    private static final String CONN_REQ_REMOVE_DATA_API = "/restconf/data/tapi-common:context/" +
-            "tapi-connectivity:connectivity-context/connectivity-service=";
-    private static final String CONN_REQ_GET_API = "/restconf/data/tapi-common:context/" +
-            "tapi-connectivity:connectivity-context/";
 
 
     @Override
     public Collection<FlowEntry> getFlowEntries() {
         DeviceId deviceId = did();
         //TODO this is a blocking call on ADVA OLS, right now using cache.
-//        RestSBController controller = checkNotNull(handler().get(RestSBController.class));
-//        ObjectMapper om = new ObjectMapper();
-//        final ObjectReader reader = om.reader();
-//        InputStream response = controller.get(deviceId, CONN_REQ_GET_API, MediaType.APPLICATION_JSON_TYPE);
-//        JsonNode jsonNode = null;
-//        try {
-//            jsonNode = reader.readTree(response);
-//            if (jsonNode == null) {
-//                log.error("JsonNode is null for response {}", response);
-//                return ImmutableList.of();
-//            }
-//            Set<String> uuids = parseTapiGetConnectivityRequest(jsonNode);
-//            DeviceConnectionCache cache = getConnectionCache();
-//            if (cache.get(deviceId) == null) {
-//                return ImmutableList.of();
-//            }
-//            List<FlowEntry> entries = new ArrayList<>();
-//            uuids.forEach(uuid -> {
-//                FlowRule rule = cache.get(deviceId, uuid);
-//                if (rule != null) {
-//                    entries.add(new DefaultFlowEntry(rule, FlowEntry.FlowEntryState.ADDED, 0, 0, 0));
-//                } else {
-//                    log.info("Non existing rule for uuid {}", uuid);
-//                }
-//            });
-//            return entries;
-//        } catch (IOException e) {
-//            return ImmutableList.of();
-//        }
+        //return getFlowsFromConnectivityServices(deviceId);
         List<FlowEntry> entries = new ArrayList<>();
         Set<FlowRule> rules = getConnectionCache().get(deviceId);
         if (rules != null) {
@@ -135,21 +103,23 @@
             String uuid = createUuid();
             ByteArrayOutputStream applyConnectivityRequest = createConnectivityRequest(uuid, flowRule);
             if (applyConnectivityRequest.size() != 0) {
-                CompletableFuture<Integer>  flowInstallation =
+                log.debug("Connectivity request {}", applyConnectivityRequest.toString());
+                CompletableFuture<Integer> flowInstallation =
                         CompletableFuture.supplyAsync(() -> controller.post(deviceId, CONN_REQ_POST_API,
-                        new ByteArrayInputStream(applyConnectivityRequest.toByteArray()),
-                        MediaType.APPLICATION_JSON_TYPE));
+                                new ByteArrayInputStream(applyConnectivityRequest.toByteArray()),
+                                MediaType.APPLICATION_JSON_TYPE));
+                log.debug("Added {} to {}", flowRule, deviceId);
+                getConnectionCache().add(deviceId, uuid, flowRule);
+                added.add(flowRule);
                 flowInstallation.thenApply(result -> {
-                    if (result == HttpStatus.SC_CREATED) {
-                        getConnectionCache().add(deviceId, uuid, flowRule);
-                        added.add(flowRule);
+                    if (result == HttpStatus.SC_CREATED || result == HttpStatus.SC_OK) {
+                        log.info("Added {} to deviceId {}", flowRule, deviceId);
                     } else {
-                       log.error("Can't add flow {}, result {}", flowRule, result);
+                        log.error("Can't add flow {}, result {}", flowRule, result);
+                        getConnectionCache().remove(deviceId, flowRule);
                     }
                     return result;
                 });
-                // TODO retrieve the UUID from the location and store with that identifier
-                // at the moment is implied that the sent one is the same used by the TAPI server.
             }
         });
         //TODO workaround for blocking call on ADVA OLS should return added
@@ -168,11 +138,11 @@
                         flowRule.id(), deviceId);
                 return;
             }
-            CompletableFuture<Integer>  flowInstallation =
+            CompletableFuture<Integer> flowRemoval =
                     CompletableFuture.supplyAsync(() -> controller.delete(deviceId,
                             CONN_REQ_REMOVE_DATA_API + conn.getId(),
                             null, MediaType.APPLICATION_JSON_TYPE));
-            flowInstallation.thenApply(result -> {
+            flowRemoval.thenApply(result -> {
                 if (result == HttpStatus.SC_NO_CONTENT) {
                     getConnectionCache().remove(deviceId, flowRule);
                     removed.add(flowRule);
@@ -195,31 +165,28 @@
         return handler().data().deviceId();
     }
 
-    private DeviceConnectionCache getConnectionCache() {
-        return DeviceConnectionCache.init();
+    //Currently uused because get is a blocking call on ADVA
+    private Collection<FlowEntry> getFlowsFromConnectivityServices(DeviceId deviceId) {
+        Set<String> uuids = getUuids(deviceId, handler());
+        if (uuids.isEmpty()) {
+            return ImmutableList.of();
+        }
+        DeviceConnectionCache cache = getConnectionCache();
+        if (cache.get(deviceId) == null) {
+            return ImmutableList.of();
+        }
+        List<FlowEntry> entries = new ArrayList<>();
+        uuids.forEach(uuid -> {
+            FlowRule rule = cache.get(deviceId, uuid);
+            if (rule != null) {
+                entries.add(new DefaultFlowEntry(rule, FlowEntry.FlowEntryState.ADDED, 0, 0, 0));
+            } else {
+                log.info("Non existing rule for uuid {}", uuid);
+            }
+        });
+        return entries;
     }
 
-    protected Set<String> parseTapiGetConnectivityRequest(JsonNode tapiConnectivityReply) {
-        /*
-         {
-            "tapi-connectivity:connectivity-service":[
-                {
-                    "uuid":"ffb006d4-349e-4d2f-817e-0906c88458d0",
-                    <other fields>
-                }
-            ]
-          }
-         */
-        Set<String> uuids = new HashSet<>();
-        if (tapiConnectivityReply.has(TAPI_CONNECTIVITY_CONNECTIVITY_SERVICE)) {
-            tapiConnectivityReply.get(TAPI_CONNECTIVITY_CONNECTIVITY_SERVICE).elements()
-                    .forEachRemaining(node -> uuids.add(node.get(TapiDeviceHelper.UUID).asText()));
-        } else {
-            log.warn("Can't retrieve connectivity UUID from {}", tapiConnectivityReply);
-        }
-        //This is only one uuid or empty in case of failures
-        return uuids;
-    }
 
     ByteArrayOutputStream createConnectivityRequest(String uuid, FlowRule rule) {
         /*
@@ -272,8 +239,9 @@
             generator.writeStringField(SERVICE_LAYER, PHOTONIC_MEDIA);
             generator.writeStringField(SERVICE_TYPE, POINT_TO_POINT_CONNECTIVITY);
             generator.writeArrayFieldStart(END_POINT);
-            addEndPoint(generator, inputPortUuid);
-            addEndPoint(generator, outputPortUuid);
+            //ADVA OLS requires these to be 1,2 for every connection
+            addEndPoint(generator, inputPortUuid, 1);
+            addEndPoint(generator, outputPortUuid, 2);
             generator.writeEndArray();
             generator.writeEndObject();
             generator.writeEndArray();
@@ -290,6 +258,7 @@
         JsonFactory factory = new JsonFactory();
         return factory.createGenerator(stream, JsonEncoding.UTF8);
     }
+
     /*
     {
           "local-id":"1",
@@ -300,9 +269,10 @@
          }
      }
      */
-    private void addEndPoint(JsonGenerator generator, String sipUuid) throws IOException {
+    private void addEndPoint(JsonGenerator generator, String sipUuid, int localId) throws IOException {
         generator.writeStartObject();
-        generator.writeStringField(LOCAL_ID, sipUuid);
+        //ADVA OLS requires Local-id to be integer incremental numbers
+        generator.writeStringField(LOCAL_ID, Integer.toString(localId));
         generator.writeStringField(LAYER_PROTOCOL_NAME, PHOTONIC_MEDIA);
         generator.writeStringField(LAYER_PROTOCOL_QUALIFIER,
                 TAPI_PHOTONIC_MEDIA_PHOTONIC_LAYER_QUALIFIER_NMC);
diff --git a/drivers/odtn-driver/src/test/java/org/onosproject/drivers/odtn/tapi/TapiFlowRuleProgrammableTest.java b/drivers/odtn-driver/src/test/java/org/onosproject/drivers/odtn/tapi/TapiFlowRuleProgrammableTest.java
index a3128af..c0fdff4 100644
--- a/drivers/odtn-driver/src/test/java/org/onosproject/drivers/odtn/tapi/TapiFlowRuleProgrammableTest.java
+++ b/drivers/odtn-driver/src/test/java/org/onosproject/drivers/odtn/tapi/TapiFlowRuleProgrammableTest.java
@@ -113,16 +113,16 @@
 
     private static final String CONNECTIVITY_REQUEST = "{\"tapi-connectivity:connectivity-service\":" +
             "[{\"uuid\":\"" + CONNECTION_UUID + "\",\"service-layer\":\"PHOTONIC_MEDIA\",\"service-type\"" +
-            ":\"POINT_TO_POINT_CONNECTIVITY\",\"end-point\":[{\"local-id\":\"" + END_POINT_1_UUID + "\"," +
+            ":\"POINT_TO_POINT_CONNECTIVITY\",\"end-point\":[{\"local-id\":\"" + 1 + "\"," +
             "\"layer-protocol-name\":" + "\"PHOTONIC_MEDIA\",\"layer-protocol-qualifier\":" +
             "\"tapi-photonic-media:PHOTONIC_LAYER_QUALIFIER_NMC\"," + "\"service-interface-point\":" +
             "{\"service-interface-point-uuid\":\"" + END_POINT_1_UUID + "\"}}," +
-            "{\"local-id\":\"" + END_POINT_2_UUID + "\",\"layer-protocol-name\":\"PHOTONIC_MEDIA\"," +
+            "{\"local-id\":\"" + 2 + "\",\"layer-protocol-name\":\"PHOTONIC_MEDIA\"," +
             "\"layer-protocol-qualifier\":" + "\"tapi-photonic-media:PHOTONIC_LAYER_QUALIFIER_NMC\"," +
             "\"service-interface-point\":{" + "\"service-interface-point-uuid\":\"" + END_POINT_2_UUID + "\"}}]}]}";
 
-    private static final String GET_CONNECTIVITY_REQUEST_REPLY = "{\"tapi-connectivity:connectivity-service\" : " +
-            "[{\"uuid\" : \"" + CONNECTION_UUID + "\"}]}";
+    private static final String GET_CONNECTIVITY_REQUEST_REPLY = "{\"tapi-connectivity:connectivity-context\": " +
+            "{\"connectivity-service\" : [{\"uuid\" : \"" + CONNECTION_UUID + "\"}]}}}";
 
     private static final Set<String> CONNECTION_UUIDS = ImmutableSet.of(CONNECTION_UUID);
 
@@ -144,10 +144,9 @@
 
     @Test
     public void parseConnReply() throws IOException {
-        TapiFlowRuleProgrammable tapiFrp = new TapiFlowRuleProgrammable();
         ObjectMapper mapper = new ObjectMapper();
         JsonNode jsonReply = mapper.readTree(GET_CONNECTIVITY_REQUEST_REPLY);
-        Set<String> output = tapiFrp.parseTapiGetConnectivityRequest(jsonReply);
+        Set<String> output = TapiDeviceHelper.parseTapiGetConnectivityRequest(jsonReply);
         assertEquals("Wrong Tapi UUIDS", CONNECTION_UUIDS, output);
     }