ONOS-7898 Action profile group/member refactoring

Also includes:
- New abstract P4Runtime codec implementation. Currently used for action
profile members/groups encoding/deconding, the plan is to handle all
other codecs via this.
- Improved read requests in P4RuntimeClientImpl
- Removed handling of max group size in P4Runtime driver. Instead, added
modified group translator to specify a max group size by using
information from the pipeline model.

Change-Id: I684bae0184d683bb448ba19863c561f9848479d2
diff --git a/protocols/p4runtime/ctl/src/test/java/org/onosproject/p4runtime/ctl/P4RuntimeGroupTest.java b/protocols/p4runtime/ctl/src/test/java/org/onosproject/p4runtime/ctl/P4RuntimeGroupTest.java
index b51a2c3..a7f7183 100644
--- a/protocols/p4runtime/ctl/src/test/java/org/onosproject/p4runtime/ctl/P4RuntimeGroupTest.java
+++ b/protocols/p4runtime/ctl/src/test/java/org/onosproject/p4runtime/ctl/P4RuntimeGroupTest.java
@@ -84,15 +84,19 @@
     private static final PiActionParamId PORT_PARAM_ID = PiActionParamId.of("port");
     private static final int BASE_MEM_ID = 65535;
     private static final List<Integer> MEMBER_IDS = ImmutableList.of(65536, 65537, 65538);
-    private static final List<PiActionProfileMember> GROUP_MEMBERS =
+    private static final List<PiActionProfileMember> GROUP_MEMBER_INSTANCES =
             Lists.newArrayList(
                     outputMember((short) 1),
                     outputMember((short) 2),
                     outputMember((short) 3)
             );
+    private static final List<PiActionProfileGroup.WeightedMember> GROUP_WEIGHTED_MEMBERS =
+            GROUP_MEMBER_INSTANCES.stream()
+                    .map(m -> new PiActionProfileGroup.WeightedMember(m, DEFAULT_MEMBER_WEIGHT))
+                    .collect(Collectors.toList());
     private static final PiActionProfileGroup GROUP = PiActionProfileGroup.builder()
             .withId(GROUP_ID)
-            .addMembers(GROUP_MEMBERS)
+            .addMembers(GROUP_MEMBER_INSTANCES)
             .withActionProfileId(ACT_PROF_ID)
             .build();
     private static final DeviceId DEVICE_ID = DeviceId.deviceId("device:p4runtime:1");
@@ -121,7 +125,6 @@
                 .forActionProfile(ACT_PROF_ID)
                 .withAction(piAction)
                 .withId(PiActionProfileMemberId.of(BASE_MEM_ID + portNum))
-                .withWeight(DEFAULT_MEMBER_WEIGHT)
                 .build();
     }
 
@@ -163,7 +166,7 @@
     @Test
     public void testInsertPiActionProfileGroup() throws Exception {
         CompletableFuture<Void> complete = p4RuntimeServerImpl.expectRequests(1);
-        client.writeActionProfileGroup(GROUP, INSERT, PIPECONF, 3);
+        client.writeActionProfileGroup(GROUP, INSERT, PIPECONF);
         complete.get(DEFAULT_TIMEOUT_TIME, TimeUnit.SECONDS);
         WriteRequest result = p4RuntimeServerImpl.getWriteReqs().get(0);
         assertEquals(1, result.getDeviceId());
@@ -192,7 +195,7 @@
     @Test
     public void testInsertPiActionMembers() throws Exception {
         CompletableFuture<Void> complete = p4RuntimeServerImpl.expectRequests(1);
-        client.writeActionProfileMembers(GROUP_MEMBERS, INSERT, PIPECONF);
+        client.writeActionProfileMembers(GROUP_MEMBER_INSTANCES, INSERT, PIPECONF);
         complete.get(DEFAULT_TIMEOUT_TIME, TimeUnit.SECONDS);
         WriteRequest result = p4RuntimeServerImpl.getWriteReqs().get(0);
         assertEquals(1, result.getDeviceId());
@@ -224,15 +227,41 @@
                 .setGroupId(GROUP_ID.id())
                 .setActionProfileId(P4_INFO_ACT_PROF_ID);
 
-        List<ActionProfileMember> members = Lists.newArrayList();
-
         MEMBER_IDS.forEach(id -> {
             ActionProfileGroup.Member member = ActionProfileGroup.Member.newBuilder()
                     .setMemberId(id)
                     .setWeight(DEFAULT_MEMBER_WEIGHT)
                     .build();
             group.addMembers(member);
+        });
 
+        List<ReadResponse> responses = Lists.newArrayList();
+        responses.add(ReadResponse.newBuilder()
+                              .addEntities(Entity.newBuilder().setActionProfileGroup(group))
+                              .build()
+        );
+
+        p4RuntimeServerImpl.willReturnReadResult(responses);
+        CompletableFuture<Void> complete = p4RuntimeServerImpl.expectRequests(1);
+        CompletableFuture<List<PiActionProfileGroup>> groupsComplete = client.dumpActionProfileGroups(
+                ACT_PROF_ID, PIPECONF);
+        complete.get(DEFAULT_TIMEOUT_TIME, TimeUnit.SECONDS);
+
+        Collection<PiActionProfileGroup> groups = groupsComplete.get(DEFAULT_TIMEOUT_TIME, TimeUnit.SECONDS);
+        assertEquals(1, groups.size());
+        PiActionProfileGroup piActionGroup = groups.iterator().next();
+        assertEquals(ACT_PROF_ID, piActionGroup.actionProfile());
+        assertEquals(GROUP_ID, piActionGroup.id());
+        assertEquals(3, piActionGroup.members().size());
+        assertTrue(GROUP_WEIGHTED_MEMBERS.containsAll(piActionGroup.members()));
+        assertTrue(piActionGroup.members().containsAll(GROUP_WEIGHTED_MEMBERS));
+    }
+
+    @Test
+    public void testReadMembers() throws Exception {
+        List<ActionProfileMember> members = Lists.newArrayList();
+
+        MEMBER_IDS.forEach(id -> {
             byte outPort = (byte) (id - BASE_MEM_ID);
             ByteString bs = ByteString.copyFrom(new byte[]{0, outPort});
             Action.Param param = Action.Param.newBuilder()
@@ -256,11 +285,6 @@
 
         List<ReadResponse> responses = Lists.newArrayList();
         responses.add(ReadResponse.newBuilder()
-                              .addEntities(Entity.newBuilder().setActionProfileGroup(group))
-                              .build()
-        );
-
-        responses.add(ReadResponse.newBuilder()
                               .addAllEntities(members.stream()
                                                       .map(m -> Entity.newBuilder()
                                                               .setActionProfileMember(m).build())
@@ -268,18 +292,14 @@
                               .build());
 
         p4RuntimeServerImpl.willReturnReadResult(responses);
-        CompletableFuture<Void> complete = p4RuntimeServerImpl.expectRequests(2);
-        CompletableFuture<List<PiActionProfileGroup>> groupsComplete = client.dumpActionProfileGroups(
+        CompletableFuture<Void> complete = p4RuntimeServerImpl.expectRequests(1);
+        CompletableFuture<List<PiActionProfileMember>> membersComplete = client.dumpActionProfileMembers(
                 ACT_PROF_ID, PIPECONF);
         complete.get(DEFAULT_TIMEOUT_TIME, TimeUnit.SECONDS);
 
-        Collection<PiActionProfileGroup> groups = groupsComplete.get(DEFAULT_TIMEOUT_TIME, TimeUnit.SECONDS);
-        assertEquals(1, groups.size());
-        PiActionProfileGroup piActionGroup = groups.iterator().next();
-        assertEquals(ACT_PROF_ID, piActionGroup.actionProfileId());
-        assertEquals(GROUP_ID, piActionGroup.id());
-        assertEquals(3, piActionGroup.members().size());
-        assertTrue(GROUP_MEMBERS.containsAll(piActionGroup.members()));
-        assertTrue(piActionGroup.members().containsAll(GROUP_MEMBERS));
+        Collection<PiActionProfileMember> piMembers = membersComplete.get(DEFAULT_TIMEOUT_TIME, TimeUnit.SECONDS);
+        assertEquals(3, piMembers.size());
+        assertTrue(GROUP_MEMBER_INSTANCES.containsAll(piMembers));
+        assertTrue(piMembers.containsAll(GROUP_MEMBER_INSTANCES));
     }
 }