New P4RuntimeClient implementation that supports batching and error reporting

The new client API supports batching and provides detailed response for
write requests (e.g. if entity already exists when inserting), which was
not possible with the old one.

This patch includes:
- New more efficient implementation of P4RuntimeClient (no more locking,
use native gRPC executor, use stub deadlines)
- Ported all codecs to new AbstractCodec-based implementation (needed to
implement codec cache in the future)
- Uses batching in P4RuntimeFlowRuleProgrammable and
P4RuntimeGroupActionProgrammable
- Minor changes to PI framework runtime classes

Change-Id: I3fac42057bb4e1389d761006a32600c786598683
diff --git a/protocols/p4runtime/model/src/main/java/org/onosproject/p4runtime/model/P4ControlMetadataModel.java b/protocols/p4runtime/model/src/main/java/org/onosproject/p4runtime/model/P4ControlMetadataModel.java
index 45e7edc..a6e2a43 100644
--- a/protocols/p4runtime/model/src/main/java/org/onosproject/p4runtime/model/P4ControlMetadataModel.java
+++ b/protocols/p4runtime/model/src/main/java/org/onosproject/p4runtime/model/P4ControlMetadataModel.java
@@ -16,26 +16,26 @@
 
 package org.onosproject.p4runtime.model;
 
-import org.onosproject.net.pi.model.PiControlMetadataId;
-import org.onosproject.net.pi.model.PiControlMetadataModel;
+import org.onosproject.net.pi.model.PiPacketMetadataId;
+import org.onosproject.net.pi.model.PiPacketMetadataModel;
 
 import java.util.Objects;
 
 /**
- * Implementation of PiControlMetadataModel for P4Runtime.
+ * Implementation of PiPacketMetadataModel for P4Runtime.
  */
-final class P4ControlMetadataModel implements PiControlMetadataModel {
+final class P4PacketMetadataModel implements PiPacketMetadataModel {
 
-    private final PiControlMetadataId id;
+    private final PiPacketMetadataId id;
     private final int bitWidth;
 
-    P4ControlMetadataModel(PiControlMetadataId id, int bitWidth) {
+    P4PacketMetadataModel(PiPacketMetadataId id, int bitWidth) {
         this.id = id;
         this.bitWidth = bitWidth;
     }
 
     @Override
-    public PiControlMetadataId id() {
+    public PiPacketMetadataId id() {
         return id;
     }
 
@@ -57,7 +57,7 @@
         if (obj == null || getClass() != obj.getClass()) {
             return false;
         }
-        final P4ControlMetadataModel other = (P4ControlMetadataModel) obj;
+        final P4PacketMetadataModel other = (P4PacketMetadataModel) obj;
         return Objects.equals(this.id, other.id)
                 && Objects.equals(this.bitWidth, other.bitWidth);
     }
diff --git a/protocols/p4runtime/model/src/main/java/org/onosproject/p4runtime/model/P4InfoParser.java b/protocols/p4runtime/model/src/main/java/org/onosproject/p4runtime/model/P4InfoParser.java
index c69cd0b..6160881 100644
--- a/protocols/p4runtime/model/src/main/java/org/onosproject/p4runtime/model/P4InfoParser.java
+++ b/protocols/p4runtime/model/src/main/java/org/onosproject/p4runtime/model/P4InfoParser.java
@@ -28,8 +28,8 @@
 import org.onosproject.net.pi.model.PiActionParamModel;
 import org.onosproject.net.pi.model.PiActionProfileId;
 import org.onosproject.net.pi.model.PiActionProfileModel;
-import org.onosproject.net.pi.model.PiControlMetadataId;
-import org.onosproject.net.pi.model.PiControlMetadataModel;
+import org.onosproject.net.pi.model.PiPacketMetadataId;
+import org.onosproject.net.pi.model.PiPacketMetadataModel;
 import org.onosproject.net.pi.model.PiCounterId;
 import org.onosproject.net.pi.model.PiCounterModel;
 import org.onosproject.net.pi.model.PiCounterType;
@@ -362,10 +362,10 @@
             throws P4InfoParserException {
         final Map<PiPacketOperationType, PiPacketOperationModel> packetOpMap = Maps.newHashMap();
         for (ControllerPacketMetadata ctrlPktMetaMsg : p4info.getControllerPacketMetadataList()) {
-            final ImmutableList.Builder<PiControlMetadataModel> metadataListBuilder =
+            final ImmutableList.Builder<PiPacketMetadataModel> metadataListBuilder =
                     ImmutableList.builder();
             ctrlPktMetaMsg.getMetadataList().forEach(metadataMsg -> metadataListBuilder.add(
-                    new P4ControlMetadataModel(PiControlMetadataId.of(metadataMsg.getName()),
+                    new P4PacketMetadataModel(PiPacketMetadataId.of(metadataMsg.getName()),
                                                metadataMsg.getBitwidth())));
             packetOpMap.put(
                     mapPacketOpType(ctrlPktMetaMsg.getPreamble().getName()),
diff --git a/protocols/p4runtime/model/src/main/java/org/onosproject/p4runtime/model/P4PacketOperationModel.java b/protocols/p4runtime/model/src/main/java/org/onosproject/p4runtime/model/P4PacketOperationModel.java
index 84e2fe4..e29553f 100644
--- a/protocols/p4runtime/model/src/main/java/org/onosproject/p4runtime/model/P4PacketOperationModel.java
+++ b/protocols/p4runtime/model/src/main/java/org/onosproject/p4runtime/model/P4PacketOperationModel.java
@@ -17,7 +17,7 @@
 package org.onosproject.p4runtime.model;
 
 import com.google.common.collect.ImmutableList;
-import org.onosproject.net.pi.model.PiControlMetadataModel;
+import org.onosproject.net.pi.model.PiPacketMetadataModel;
 import org.onosproject.net.pi.model.PiPacketOperationModel;
 import org.onosproject.net.pi.model.PiPacketOperationType;
 
@@ -30,10 +30,10 @@
 final class P4PacketOperationModel implements PiPacketOperationModel {
 
     private final PiPacketOperationType type;
-    private final ImmutableList<PiControlMetadataModel> metadatas;
+    private final ImmutableList<PiPacketMetadataModel> metadatas;
 
     P4PacketOperationModel(PiPacketOperationType type,
-                                  ImmutableList<PiControlMetadataModel> metadatas) {
+                                  ImmutableList<PiPacketMetadataModel> metadatas) {
         this.type = type;
         this.metadatas = metadatas;
     }
@@ -44,7 +44,7 @@
     }
 
     @Override
-    public List<PiControlMetadataModel> metadatas() {
+    public List<PiPacketMetadataModel> metadatas() {
         return metadatas;
     }
 
diff --git a/protocols/p4runtime/model/src/test/java/org/onosproject/p4runtime/model/P4ControlMetadataModelTest.java b/protocols/p4runtime/model/src/test/java/org/onosproject/p4runtime/model/P4PacketMetadataModelTest.java
similarity index 61%
rename from protocols/p4runtime/model/src/test/java/org/onosproject/p4runtime/model/P4ControlMetadataModelTest.java
rename to protocols/p4runtime/model/src/test/java/org/onosproject/p4runtime/model/P4PacketMetadataModelTest.java
index 998875a..ca5f131 100644
--- a/protocols/p4runtime/model/src/test/java/org/onosproject/p4runtime/model/P4ControlMetadataModelTest.java
+++ b/protocols/p4runtime/model/src/test/java/org/onosproject/p4runtime/model/P4PacketMetadataModelTest.java
@@ -17,32 +17,31 @@
 
 import com.google.common.testing.EqualsTester;
 import org.junit.Test;
-import org.onosproject.net.pi.model.PiControlMetadataId;
+import org.onosproject.net.pi.model.PiPacketMetadataId;
 
-import static org.junit.Assert.*;
 import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
 
 /**
- * Test for P4ControlMetadataModel class.
+ * Test for P4PacketMetadataModel class.
  */
-public class P4ControlMetadataModelTest {
+public class P4PacketMetadataModelTest {
 
-    private final PiControlMetadataId piControlMetadataId = PiControlMetadataId.of("EGRESS_PORT");
-    private final PiControlMetadataId sameAsPiControlMetadataId = PiControlMetadataId.of("EGRESS_PORT");
-    private final PiControlMetadataId piControlMetadataId2 = PiControlMetadataId.of("INGRESS_PORT");
+    private final PiPacketMetadataId piPacketMetadataId = PiPacketMetadataId.of("EGRESS_PORT");
+    private final PiPacketMetadataId sameAsPiPacketMetadataId = PiPacketMetadataId.of("EGRESS_PORT");
+    private final PiPacketMetadataId piPacketMetadataId2 = PiPacketMetadataId.of("INGRESS_PORT");
 
     private static final int BIT_WIDTH_32 = 32;
     private static final int BIT_WIDTH_64 = 64;
 
-    private final P4ControlMetadataModel metadataModel = new P4ControlMetadataModel(piControlMetadataId, BIT_WIDTH_32);
+    private final P4PacketMetadataModel metadataModel = new P4PacketMetadataModel(piPacketMetadataId, BIT_WIDTH_32);
 
-    private final P4ControlMetadataModel sameAsMetadataModel = new P4ControlMetadataModel(sameAsPiControlMetadataId,
+    private final P4PacketMetadataModel sameAsMetadataModel = new P4PacketMetadataModel(sameAsPiPacketMetadataId,
                                                                                           BIT_WIDTH_32);
 
-    private final P4ControlMetadataModel metadataModel2 = new P4ControlMetadataModel(piControlMetadataId2,
+    private final P4PacketMetadataModel metadataModel2 = new P4PacketMetadataModel(piPacketMetadataId2,
                                                                                      BIT_WIDTH_32);
 
-    private final P4ControlMetadataModel metadataModel3 = new P4ControlMetadataModel(piControlMetadataId, BIT_WIDTH_64);
+    private final P4PacketMetadataModel metadataModel3 = new P4PacketMetadataModel(piPacketMetadataId, BIT_WIDTH_64);
 
 
 
@@ -51,7 +50,7 @@
      */
     @Test
     public void testImmutability() {
-        assertThatClassIsImmutable(P4ControlMetadataModel.class);
+        assertThatClassIsImmutable(P4PacketMetadataModel.class);
     }
 
     /**
@@ -65,4 +64,4 @@
                 .addEqualityGroup(metadataModel3)
                 .testEquals();
     }
-}
\ No newline at end of file
+}
diff --git a/protocols/p4runtime/model/src/test/java/org/onosproject/p4runtime/model/P4PacketOperationModelTest.java b/protocols/p4runtime/model/src/test/java/org/onosproject/p4runtime/model/P4PacketOperationModelTest.java
index 486a625..5d760e8 100644
--- a/protocols/p4runtime/model/src/test/java/org/onosproject/p4runtime/model/P4PacketOperationModelTest.java
+++ b/protocols/p4runtime/model/src/test/java/org/onosproject/p4runtime/model/P4PacketOperationModelTest.java
@@ -19,8 +19,8 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.testing.EqualsTester;
 import org.junit.Test;
-import org.onosproject.net.pi.model.PiControlMetadataId;
-import org.onosproject.net.pi.model.PiControlMetadataModel;
+import org.onosproject.net.pi.model.PiPacketMetadataId;
+import org.onosproject.net.pi.model.PiPacketMetadataModel;
 import org.onosproject.net.pi.model.PiPacketOperationType;
 import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
 
@@ -32,29 +32,29 @@
     private static final PiPacketOperationType PI_PACKET_OPERATION_TYPE_1 = PiPacketOperationType.PACKET_IN;
     private static final PiPacketOperationType PI_PACKET_OPERATION_TYPE_2 = PiPacketOperationType.PACKET_OUT;
 
-    private static final PiControlMetadataId PI_CONTROL_METADATA_ID_1 = PiControlMetadataId.of("Metadata1");
-    private static final PiControlMetadataId PI_CONTROL_METADATA_ID_2 = PiControlMetadataId.of("Metadata2");
+    private static final PiPacketMetadataId PI_CONTROL_METADATA_ID_1 = PiPacketMetadataId.of("Metadata1");
+    private static final PiPacketMetadataId PI_CONTROL_METADATA_ID_2 = PiPacketMetadataId.of("Metadata2");
 
     private static final int BIT_WIDTH_1 = 8;
     private static final int BIT_WIDTH_2 = 9;
 
-    private static final PiControlMetadataModel PI_CONTROL_METADATA_MODEL_1 =
-        new P4ControlMetadataModel(PI_CONTROL_METADATA_ID_1, BIT_WIDTH_1);
-    private static final PiControlMetadataModel PI_CONTROL_METADATA_MODEL_2 =
-        new P4ControlMetadataModel(PI_CONTROL_METADATA_ID_2, BIT_WIDTH_2);
+    private static final PiPacketMetadataModel PI_CONTROL_METADATA_MODEL_1 =
+        new P4PacketMetadataModel(PI_CONTROL_METADATA_ID_1, BIT_WIDTH_1);
+    private static final PiPacketMetadataModel PI_CONTROL_METADATA_MODEL_2 =
+        new P4PacketMetadataModel(PI_CONTROL_METADATA_ID_2, BIT_WIDTH_2);
 
-    private static final ImmutableList<PiControlMetadataModel> METADATAS_1 =
-        new ImmutableList.Builder<PiControlMetadataModel>()
+    private static final ImmutableList<PiPacketMetadataModel> METADATAS_1 =
+        new ImmutableList.Builder<PiPacketMetadataModel>()
             .add(PI_CONTROL_METADATA_MODEL_1)
             .build();
 
-    private static final ImmutableList<PiControlMetadataModel> METADATAS_2 =
-        new ImmutableList.Builder<PiControlMetadataModel>()
+    private static final ImmutableList<PiPacketMetadataModel> METADATAS_2 =
+        new ImmutableList.Builder<PiPacketMetadataModel>()
             .add(PI_CONTROL_METADATA_MODEL_2)
             .build();
 
-    private static final ImmutableList<PiControlMetadataModel> METADATAS_3 =
-        new ImmutableList.Builder<PiControlMetadataModel>()
+    private static final ImmutableList<PiPacketMetadataModel> METADATAS_3 =
+        new ImmutableList.Builder<PiPacketMetadataModel>()
             .add(PI_CONTROL_METADATA_MODEL_1)
             .add(PI_CONTROL_METADATA_MODEL_2)
             .build();
@@ -87,4 +87,4 @@
             .addEqualityGroup(P4_PACKET_OPERATION_MODEL_3)
             .testEquals();
     }
-}
\ No newline at end of file
+}
diff --git a/protocols/p4runtime/model/src/test/java/org/onosproject/p4runtime/model/P4PipelineModelTest.java b/protocols/p4runtime/model/src/test/java/org/onosproject/p4runtime/model/P4PipelineModelTest.java
index 4723ea5..e8b1c70 100644
--- a/protocols/p4runtime/model/src/test/java/org/onosproject/p4runtime/model/P4PipelineModelTest.java
+++ b/protocols/p4runtime/model/src/test/java/org/onosproject/p4runtime/model/P4PipelineModelTest.java
@@ -27,8 +27,8 @@
 import org.onosproject.net.pi.model.PiActionParamModel;
 import org.onosproject.net.pi.model.PiActionProfileId;
 import org.onosproject.net.pi.model.PiActionProfileModel;
-import org.onosproject.net.pi.model.PiControlMetadataId;
-import org.onosproject.net.pi.model.PiControlMetadataModel;
+import org.onosproject.net.pi.model.PiPacketMetadataId;
+import org.onosproject.net.pi.model.PiPacketMetadataModel;
 import org.onosproject.net.pi.model.PiCounterId;
 import org.onosproject.net.pi.model.PiCounterModel;
 import org.onosproject.net.pi.model.PiCounterType;
@@ -287,16 +287,16 @@
     private static final PiPacketOperationType PI_PACKET_OPERATION_TYPE_1 = PiPacketOperationType.PACKET_IN;
     private static final PiPacketOperationType PI_PACKET_OPERATION_TYPE_2 = PiPacketOperationType.PACKET_OUT;
 
-    private static final PiControlMetadataId PI_CONTROL_METADATA_ID_1 = PiControlMetadataId.of("INGRESS PORT");
-    private static final PiControlMetadataId PI_CONTROL_METADATA_ID_2 = PiControlMetadataId.of("EGRESS PORT");
+    private static final PiPacketMetadataId PI_CONTROL_METADATA_ID_1 = PiPacketMetadataId.of("INGRESS PORT");
+    private static final PiPacketMetadataId PI_CONTROL_METADATA_ID_2 = PiPacketMetadataId.of("EGRESS PORT");
 
     private static final int META_BIT_WIDTH_1 = 32;
     private static final int META_BIT_WIDTH_2 = 64;
 
-    private static final PiControlMetadataModel P4_CONTROL_METADATA_MODEL_1 =
-            new P4ControlMetadataModel(PI_CONTROL_METADATA_ID_1, META_BIT_WIDTH_1);
-    private static final PiControlMetadataModel P4_CONTROL_METADATA_MODEL_2 =
-            new P4ControlMetadataModel(PI_CONTROL_METADATA_ID_2, META_BIT_WIDTH_2);
+    private static final PiPacketMetadataModel P4_CONTROL_METADATA_MODEL_1 =
+            new P4PacketMetadataModel(PI_CONTROL_METADATA_ID_1, META_BIT_WIDTH_1);
+    private static final PiPacketMetadataModel P4_CONTROL_METADATA_MODEL_2 =
+            new P4PacketMetadataModel(PI_CONTROL_METADATA_ID_2, META_BIT_WIDTH_2);
 
     /* Pipeline Models */
     private static final ImmutableMap<PiTableId, PiTableModel> TABLES_1 =
@@ -317,12 +317,12 @@
                     .put(PI_ACTION_PROFILE_ID_2, P4_ACTION_PROFILE_MODEL_2)
                     .build();
 
-    private static final ImmutableList<PiControlMetadataModel> METADATAS_1 =
-            new ImmutableList.Builder<PiControlMetadataModel>()
+    private static final ImmutableList<PiPacketMetadataModel> METADATAS_1 =
+            new ImmutableList.Builder<PiPacketMetadataModel>()
                     .add(P4_CONTROL_METADATA_MODEL_1)
                     .build();
-    private static final ImmutableList<PiControlMetadataModel> METADATAS_2 =
-            new ImmutableList.Builder<PiControlMetadataModel>()
+    private static final ImmutableList<PiPacketMetadataModel> METADATAS_2 =
+            new ImmutableList.Builder<PiPacketMetadataModel>()
                     .add(P4_CONTROL_METADATA_MODEL_2)
                     .build();