Added initial Response handling code. Error handling needs more work & needs some... 01/2201/1
authorMadhu Venugopal <mavenugo@gmail.com>
Mon, 28 Oct 2013 04:18:36 +0000 (21:18 -0700)
committerMadhu Venugopal <mavenugo@gmail.com>
Mon, 28 Oct 2013 04:18:36 +0000 (21:18 -0700)
and will be handled in a different commit.

Signed-off-by: Madhu Venugopal <mavenugo@gmail.com>
14 files changed:
ovsdb/src/main/java/org/opendaylight/ovsdb/lib/jsonrpc/JsonRpcEndpoint.java
ovsdb/src/main/java/org/opendaylight/ovsdb/lib/message/EchoResponse.java
ovsdb/src/main/java/org/opendaylight/ovsdb/lib/message/OVSDB.java
ovsdb/src/main/java/org/opendaylight/ovsdb/lib/message/Response.java [new file with mode: 0644]
ovsdb/src/main/java/org/opendaylight/ovsdb/lib/message/TableUpdates.java
ovsdb/src/main/java/org/opendaylight/ovsdb/lib/message/TransactBuilder.java
ovsdb/src/main/java/org/opendaylight/ovsdb/lib/message/TransactResponse.java [new file with mode: 0644]
ovsdb/src/main/java/org/opendaylight/ovsdb/lib/message/operations/DeleteOperation.java
ovsdb/src/main/java/org/opendaylight/ovsdb/lib/message/operations/InsertOperation.java
ovsdb/src/main/java/org/opendaylight/ovsdb/lib/message/operations/MutateOperation.java
ovsdb/src/main/java/org/opendaylight/ovsdb/lib/message/operations/Operation.java
ovsdb/src/main/java/org/opendaylight/ovsdb/lib/message/operations/OperationResult.java [new file with mode: 0644]
ovsdb/src/main/java/org/opendaylight/ovsdb/lib/message/operations/UpdateOperation.java
ovsdb/src/test/java/org/opendaylight/ovsdb/lib/message/OVSDBNettyFactoryTest.java

index c3281b30ea5d54129741ccaa9ca78029b7b065d3..684a0a1176088e0d673ec5d22844d7de74d5b3aa 100644 (file)
@@ -11,6 +11,7 @@ import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.SettableFuture;
 
 import org.opendaylight.controller.sal.core.Node;
+import org.opendaylight.ovsdb.lib.message.Response;
 import org.opendaylight.ovsdb.plugin.Connection;
 import org.opendaylight.ovsdb.plugin.ConnectionService;
 import org.slf4j.Logger;
@@ -105,16 +106,22 @@ public class JsonRpcEndpoint {
     public void processResult(JsonNode response) throws NoSuchMethodException {
 
         CallContext returnCtxt = methodContext.get(response.get("id").asText());
+        if (returnCtxt == null) return;
 
         Class<?> returnType = null;
-
         if (ListenableFuture.class == returnCtxt.getMethod().getReturnType()) {
             TypeToken<?> retType = TypeToken.of(
                     returnCtxt.getMethod().getGenericReturnType())
                     .resolveType(ListenableFuture.class.getMethod("get").getGenericReturnType());
 
             JsonNode result = response.get("result");
+            logger.debug("Response : {}", result.toString());
             Object result1 = objectMapper.convertValue(result, retType.getRawType());
+            JsonNode error = response.get("error");
+            if (error != null) {
+                logger.debug("Error : {}", error.toString());
+            }
+
             returnCtxt.getFuture().set(result1);
 
         } else {
index 90cc98f6fd47a1aff90e91e35b43c77da331056a..2a28e67aefcbb41befac77294daa81e93b640673 100644 (file)
@@ -1,5 +1,4 @@
 package org.opendaylight.ovsdb.lib.message;
 
-
-public class EchoResponse {
+public class EchoResponse extends Response {
 }
index 8d927e50970bf4d5401de29944984071db2767bd..763a0cb3481526f1459c833f8f7a3135810eaf23 100644 (file)
@@ -4,8 +4,9 @@ import java.util.List;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
+import org.opendaylight.controller.sal.core.Node;
 import org.opendaylight.ovsdb.lib.database.DatabaseSchema;
-
+import org.opendaylight.ovsdb.lib.message.operations.OperationResult;
 
 public interface OVSDB {
 
@@ -17,12 +18,24 @@ public interface OVSDB {
 
     public ListenableFuture<List<String>> list_dbs();
 
-    public ListenableFuture<List<Object>> transact(TransactBuilder transact);
-    /*
+    public ListenableFuture<List<OperationResult>> transact(TransactBuilder transact);
+
+    public ListenableFuture<Response> cancel(String id);
+
+    public ListenableFuture<Object> monitor_cancel(Object json_value);
+
+    public ListenableFuture<Object> lock(List<String> id);
+
+    public ListenableFuture<Object> steal(List<String> id);
+
+    public ListenableFuture<Object> unlock(List<String> id);
+/*
     public void registerListener(Callback callback);
 
     public static interface Callback {
-        public void monitorResponse(TableUpdates upadate);
+        public void update(Node node, TableUpdates upadate);
+        public void locked(Node node, Object json_value);
+        public void echo(Node node, Object json_value);
     }
-    */
+*/
 }
diff --git a/ovsdb/src/main/java/org/opendaylight/ovsdb/lib/message/Response.java b/ovsdb/src/main/java/org/opendaylight/ovsdb/lib/message/Response.java
new file mode 100644 (file)
index 0000000..1af3416
--- /dev/null
@@ -0,0 +1,13 @@
+package org.opendaylight.ovsdb.lib.message;
+
+public abstract class Response {
+    Object error;
+
+    public Object getError() {
+        return error;
+    }
+
+    public void setError(Object error) {
+        this.error = error;
+    }
+}
index f79826fdaeff760551947b5646d7e6b76f5e37b6..766d6f5b0b8d4de136d2d8f82fda2bd495bb72c7 100644 (file)
@@ -10,7 +10,7 @@ import org.opendaylight.ovsdb.lib.table.*;
 import org.opendaylight.ovsdb.lib.table.internal.Table;
 
 
-public  class TableUpdates {
+public  class TableUpdates extends Response {
 
     Map<Table.Name, TableUpdate> map = Maps.newHashMap();
 
index b3a561683df04e21c6b852dc9e9cd649c7f7e5b3..1ddba2cd925a569cc1b2f6c2c42be92322f74de6 100644 (file)
@@ -15,6 +15,10 @@ public class TransactBuilder implements Params {
 
     List<Operation> requests = Lists.newArrayList();
 
+    public List<Operation> getRequests() {
+        return requests;
+    }
+
     @Override
     public List<Object> params() {
         List<Object> lists = Lists.newArrayList((Object)"Open_vSwitch");
diff --git a/ovsdb/src/main/java/org/opendaylight/ovsdb/lib/message/TransactResponse.java b/ovsdb/src/main/java/org/opendaylight/ovsdb/lib/message/TransactResponse.java
new file mode 100644 (file)
index 0000000..67dbd9d
--- /dev/null
@@ -0,0 +1,22 @@
+package org.opendaylight.ovsdb.lib.message;
+
+import java.util.ArrayList;
+
+import org.opendaylight.ovsdb.lib.message.operations.OperationResult;
+
+public class TransactResponse extends Response {
+    ArrayList<OperationResult> result;
+
+    public ArrayList<OperationResult> getResult() {
+        return result;
+    }
+
+    public void setResult(ArrayList<OperationResult> result) {
+        this.result = result;
+    }
+
+    @Override
+    public String toString() {
+        return "TransactResponse [result=" + result + "]";
+    }
+}
index b80b6c94a30aeaee5b28dbe09bddf648877a7034..4c478ce5dd600424b8ee1035b3a1801a2dff73ca 100644 (file)
@@ -26,4 +26,9 @@ public class DeleteOperation extends Operation {
     public void setWhere(List<Condition> where) {
         this.where = where;
     }
+    @Override
+    public String toString() {
+        return "DeleteOperation [table=" + table + ", where=" + where
+                + ", toString()=" + super.toString() + "]";
+    }
 }
index e704e4891fcabed7560bd25c68b4586e46378320..481a90e3286087019c301794fcbe2f4f5c7c03e9 100644 (file)
@@ -46,4 +46,10 @@ public class InsertOperation extends Operation {
     public void setRow(Map<String, Object> row) {
         this.row = row;
     }
+
+    @Override
+    public String toString() {
+        return "InsertOperation [table=" + table + ", uuidName=" + uuidName
+                + ", row=" + row + ", toString()=" + super.toString() + "]";
+    }
 }
index 21934053aa0e79791d2d994d0b57e84a5bc03374..d9101fd8772dc66f4518aff7d20311c1482f42e8 100644 (file)
@@ -37,4 +37,10 @@ public class MutateOperation extends Operation {
     public void setMutations(List<Mutation> mutations) {
         this.mutations = mutations;
     }
+    @Override
+    public String toString() {
+        return "MutateOperation [table=" + table + ", where=" + where
+                + ", mutations=" + mutations + ", toString()="
+                + super.toString() + "]";
+    }
 }
index d4734dacbc8f63bbc6ed2e6b7765494ff214d3ad..1e9d33d3bafd8a1936c21f45bc6868586c5d9e9b 100644 (file)
@@ -1,7 +1,12 @@
 package org.opendaylight.ovsdb.lib.message.operations;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
 public abstract class Operation {
     private String op;
+    @JsonIgnore
+    // Just a simple way to retain the result of a transact operation which the client can refer to.
+    private OperationResult result;
 
     public String getOp() {
         return op;
@@ -10,4 +15,17 @@ public abstract class Operation {
     public void setOp(String op) {
         this.op = op;
     }
+
+    public OperationResult getResult() {
+        return result;
+    }
+
+    public void setResult(OperationResult result) {
+        this.result = result;
+    }
+
+    @Override
+    public String toString() {
+        return "Operation [op=" + op + ", result=" + result + "]";
+    }
 }
diff --git a/ovsdb/src/main/java/org/opendaylight/ovsdb/lib/message/operations/OperationResult.java b/ovsdb/src/main/java/org/opendaylight/ovsdb/lib/message/operations/OperationResult.java
new file mode 100644 (file)
index 0000000..7116176
--- /dev/null
@@ -0,0 +1,50 @@
+package org.opendaylight.ovsdb.lib.message.operations;
+
+import java.util.ArrayList;
+import org.opendaylight.ovsdb.lib.notation.UUID;
+
+// Section 5.2 of ovsdb draft covers the various response structures for
+// each of the Operations covered by Transaction (Insert, Update, Delete, Mutate, etc...)
+// It is better to have the OperationResult as an abstract parent class with individual
+// concrete child classes for each of the operation response.
+// But this needs proper response handling
+// https://trello.com/c/mfTTS86k/28-generic-response-error-handling-especially-for-transact
+// As a temporary measure, adding all the expected responses under the same response.
+
+public class OperationResult {
+    //public abstract boolean isSuccess();
+    private int count;
+    private UUID uuid;
+    private ArrayList<Object> rows;
+    private String error;
+
+    public int getCount() {
+        return count;
+    }
+    public void setCount(int count) {
+        this.count = count;
+    }
+    public UUID getUuid() {
+        return uuid;
+    }
+    public void setUuid(UUID uuid) {
+        this.uuid = uuid;
+    }
+    public ArrayList<Object> getRows() {
+        return rows;
+    }
+    public void setRows(ArrayList<Object> rows) {
+        this.rows = rows;
+    }
+    public String getError() {
+        return error;
+    }
+    public void setError(String error) {
+        this.error = error;
+    }
+    @Override
+    public String toString() {
+        return "OperationResult [count=" + count + ", uuid=" + uuid + ", rows="
+                + rows + ", error=" + error + "]";
+    }
+}
index 3b9f38cbeda6a5957ddd4aa627114657c5ab05aa..c78aaacfe285cb79c39700e3cdc7fec1b72dca7d 100644 (file)
@@ -35,4 +35,9 @@ public class UpdateOperation extends Operation {
     public void setRow(Object row) {
         this.row = row;
     }
+    @Override
+    public String toString() {
+        return "UpdateOperation [table=" + table + ", where=" + where
+                + ", row=" + row + ", toString()=" + super.toString() + "]";
+    }
 }
index 763f895a497996153014f9a817231987247de268..4a83e101461b29ed9e65f57073d153ac814e6bc1 100644 (file)
@@ -24,6 +24,7 @@ import org.opendaylight.ovsdb.lib.message.TableUpdates;
 import org.opendaylight.ovsdb.lib.message.operations.InsertOperation;
 import org.opendaylight.ovsdb.lib.message.operations.MutateOperation;
 import org.opendaylight.ovsdb.lib.message.operations.Operation;
+import org.opendaylight.ovsdb.lib.message.operations.OperationResult;
 import org.opendaylight.ovsdb.lib.notation.Condition;
 import org.opendaylight.ovsdb.lib.notation.Function;
 import org.opendaylight.ovsdb.lib.notation.Mutation;
@@ -57,7 +58,7 @@ public class OVSDBNettyFactoryTest {
         JsonRpcServiceBinderHandler binderHandler = new JsonRpcServiceBinderHandler(factory);
 
         List<ChannelHandler> _handlers = Lists.newArrayList();
-        _handlers.add(new LoggingHandler(LogLevel.INFO));
+        //_handlers.add(new LoggingHandler(LogLevel.INFO));
         _handlers.add(new JsonRpcDecoder(100000));
         _handlers.add(new StringEncoder(CharsetUtil.UTF_8));
         _handlers.add(binderHandler);
@@ -102,7 +103,7 @@ public class OVSDBNettyFactoryTest {
         String newPort = "new_port";
         String newSwitch = "new_switch";
 
-        String bridgeIdentifier = "br10";
+        String bridgeIdentifier = "br1";
         Operation addSwitchRequest = null;
 
         if(ovsTable != null){
@@ -146,10 +147,9 @@ public class OVSDBNettyFactoryTest {
         transaction.addOperations(new ArrayList<Operation>(
                                   Arrays.asList(addSwitchRequest, addIntfRequest, addPortRequest, addBridgeRequest)));
 
-        ListenableFuture<List<Object>> transResponse = ovsdb.transact(transaction);
+        ListenableFuture<List<OperationResult>> transResponse = ovsdb.transact(transaction);
         System.out.println("Transcation sent :");
-        Object tr = transResponse.get();
-        System.out.println(tr.toString());
+        List<OperationResult> tr = transResponse.get();
         // TEST ECHO
 
         ListenableFuture<List<String>> some = ovsdb.echo();