ONOS-7066 ONOS-7067 PI abstractions refactoring and P4Info model parser

Includes changes previously reviewed in #15607, #15877, and #15955.

Change-Id: Ie2ff62e415f2099832ebfe05961a879b7b188fc3
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/CodecManager.java b/core/common/src/main/java/org/onosproject/codec/impl/CodecManager.java
index 7a88366..13782c7 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/CodecManager.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/CodecManager.java
@@ -75,10 +75,10 @@
 import org.onosproject.net.intent.Constraint;
 import org.onosproject.net.intent.HostToHostIntent;
 import org.onosproject.net.intent.Intent;
+import org.onosproject.net.intent.MultiPointToSinglePointIntent;
 import org.onosproject.net.intent.PointToPointIntent;
 import org.onosproject.net.intent.SinglePointToMultiPointIntent;
 import org.onosproject.net.intent.util.IntentMiniSummary;
-import org.onosproject.net.intent.MultiPointToSinglePointIntent;
 import org.onosproject.net.key.DeviceKey;
 import org.onosproject.net.mcast.McastRoute;
 import org.onosproject.net.meter.Band;
@@ -87,12 +87,9 @@
 import org.onosproject.net.packet.PacketRequest;
 import org.onosproject.net.pi.model.PiActionModel;
 import org.onosproject.net.pi.model.PiActionParamModel;
-import org.onosproject.net.pi.model.PiHeaderFieldTypeModel;
-import org.onosproject.net.pi.model.PiHeaderModel;
-import org.onosproject.net.pi.model.PiHeaderTypeModel;
+import org.onosproject.net.pi.model.PiMatchFieldModel;
 import org.onosproject.net.pi.model.PiPipeconf;
 import org.onosproject.net.pi.model.PiPipelineModel;
-import org.onosproject.net.pi.model.PiTableMatchFieldModel;
 import org.onosproject.net.pi.model.PiTableModel;
 import org.onosproject.net.region.Region;
 import org.onosproject.net.statistic.Load;
@@ -186,13 +183,10 @@
         registerCodec(TransportEndpointDescription.class, new TransportEndpointDescriptionCodec());
         registerCodec(PacketRequest.class, new PacketRequestCodec());
         registerCodec(PiActionModel.class, new PiActionModelCodec());
-        registerCodec(PiHeaderModel.class, new PiHeaderModelCodec());
         registerCodec(PiPipelineModel.class, new PiPipelineModelCodec());
         registerCodec(PiPipeconf.class, new PiPipeconfCodec());
         registerCodec(PiTableModel.class, new PiTableModelCodec());
-        registerCodec(PiTableMatchFieldModel.class, new PiTableMatchFieldModelCodec());
-        registerCodec(PiHeaderFieldTypeModel.class, new PiHeaderFieldTypeModelCodec());
-        registerCodec(PiHeaderTypeModel.class, new PiHeaderTypeModelCodec());
+        registerCodec(PiMatchFieldModel.class, new PiMatchFieldModelCodec());
         registerCodec(PiActionParamModel.class, new PiActionParamModelCodec());
         log.info("Started");
     }
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/FlowRuleCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/FlowRuleCodec.java
index da34c5e..37a173d 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/FlowRuleCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/FlowRuleCodec.java
@@ -27,7 +27,7 @@
 import org.onosproject.net.flow.IndexTableId;
 import org.onosproject.net.flow.TrafficSelector;
 import org.onosproject.net.flow.TrafficTreatment;
-import org.onosproject.net.pi.runtime.PiTableId;
+import org.onosproject.net.pi.model.PiTableId;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onlab.util.Tools.nullIsIllegal;
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/PiActionModelCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/PiActionModelCodec.java
index 10cef43..dd7b336 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/PiActionModelCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/PiActionModelCodec.java
@@ -33,7 +33,7 @@
     @Override
     public ObjectNode encode(PiActionModel action, CodecContext context) {
         ObjectNode result = context.mapper().createObjectNode();
-        result.put(NAME, action.name());
+        result.put(NAME, action.id().toString());
         ArrayNode params = result.putArray(PARAMS);
         action.params().forEach(param -> {
             ObjectNode paramData = context.encode(param, PiActionParamModel.class);
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/PiActionParamModelCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/PiActionParamModelCodec.java
index ac553fe..17f797a 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/PiActionParamModelCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/PiActionParamModelCodec.java
@@ -32,7 +32,7 @@
     @Override
     public ObjectNode encode(PiActionParamModel param, CodecContext context) {
         ObjectNode result = context.mapper().createObjectNode();
-        result.put(NAME, param.name());
+        result.put(NAME, param.id().toString());
         result.put(BIT_WIDTH, param.bitWidth());
         return result;
     }
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/PiHeaderModelCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/PiHeaderModelCodec.java
deleted file mode 100644
index 7bcd134..0000000
--- a/core/common/src/main/java/org/onosproject/codec/impl/PiHeaderModelCodec.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2017-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.codec.impl;
-
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.net.pi.model.PiHeaderModel;
-import org.onosproject.net.pi.model.PiHeaderTypeModel;
-
-/**
- * Codec for PiHeaderModel.
- */
-public class PiHeaderModelCodec extends JsonCodec<PiHeaderModel> {
-    private static final String NAME = "name";
-    private static final String TYPE = "type";
-    private static final String IS_META = "isMetadata";
-    private static final String INDEX = "index";
-
-    @Override
-    public ObjectNode encode(PiHeaderModel header, CodecContext context) {
-        ObjectNode result = context.mapper().createObjectNode();
-        ObjectNode headerTypeData = context.encode(header.type(), PiHeaderTypeModel.class);
-        result.put(NAME, header.name());
-        result.set(TYPE, headerTypeData);
-        result.put(IS_META, header.isMetadata());
-        result.put(INDEX, header.index());
-        return result;
-    }
-}
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/PiHeaderTypeModelCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/PiHeaderTypeModelCodec.java
deleted file mode 100644
index 1065a94..0000000
--- a/core/common/src/main/java/org/onosproject/codec/impl/PiHeaderTypeModelCodec.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2017-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.codec.impl;
-
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.net.pi.model.PiHeaderFieldTypeModel;
-import org.onosproject.net.pi.model.PiHeaderTypeModel;
-
-/**
- * Codec for PiHeaderTypeModel.
- */
-public class PiHeaderTypeModelCodec extends JsonCodec<PiHeaderTypeModel> {
-    private static final String NAME = "name";
-    private static final String FIELDS = "fields";
-
-    @Override
-    public ObjectNode encode(PiHeaderTypeModel headerType, CodecContext context) {
-        ObjectNode result = context.mapper().createObjectNode();
-        result.put(NAME, headerType.name());
-        ArrayNode fields = result.putArray(FIELDS);
-
-        headerType.fields().forEach(field -> {
-            fields.add(context.encode(field, PiHeaderFieldTypeModel.class));
-        });
-
-        return result;
-    }
-}
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/PiHeaderFieldTypeModelCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/PiMatchFieldModelCodec.java
similarity index 65%
rename from core/common/src/main/java/org/onosproject/codec/impl/PiHeaderFieldTypeModelCodec.java
rename to core/common/src/main/java/org/onosproject/codec/impl/PiMatchFieldModelCodec.java
index 09a1566..6d6dad4 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/PiHeaderFieldTypeModelCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/PiMatchFieldModelCodec.java
@@ -19,20 +19,19 @@
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.onosproject.codec.CodecContext;
 import org.onosproject.codec.JsonCodec;
-import org.onosproject.net.pi.model.PiHeaderFieldTypeModel;
+import org.onosproject.net.pi.model.PiMatchFieldModel;
 
 /**
- * Codec for PiHeaderFieldTypeModel.
+ * Codec for PiMatchFieldModel.
  */
-public class PiHeaderFieldTypeModelCodec extends JsonCodec<PiHeaderFieldTypeModel> {
-    private static final String NAME = "name";
-    private static final String BIT_WIDTH = "bitWidth";
-
+public class PiMatchFieldModelCodec extends JsonCodec<PiMatchFieldModel> {
+    private static final String MATCH_TYPE = "matchType";
+    private static final String FIELD = "field";
     @Override
-    public ObjectNode encode(PiHeaderFieldTypeModel headerFieldType, CodecContext context) {
+    public ObjectNode encode(PiMatchFieldModel matchFieldModel, CodecContext context) {
         ObjectNode result = context.mapper().createObjectNode();
-        result.put(NAME, headerFieldType.name());
-        result.put(BIT_WIDTH, headerFieldType.bitWidth());
+        result.put(MATCH_TYPE, matchFieldModel.matchType().toString());
+        result.put(FIELD, matchFieldModel.id().toString());
         return result;
     }
 }
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/PiPipelineModelCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/PiPipelineModelCodec.java
index 6b42c8d..28a7010 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/PiPipelineModelCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/PiPipelineModelCodec.java
@@ -21,7 +21,6 @@
 import org.onosproject.codec.CodecContext;
 import org.onosproject.codec.JsonCodec;
 import org.onosproject.net.pi.model.PiActionModel;
-import org.onosproject.net.pi.model.PiHeaderModel;
 import org.onosproject.net.pi.model.PiPipelineModel;
 import org.onosproject.net.pi.model.PiTableModel;
 
@@ -29,19 +28,17 @@
  * Codec for PiPipelineModel.
  */
 public class PiPipelineModelCodec extends JsonCodec<PiPipelineModel> {
-    private static final String HEADERS = "headers";
     private static final String ACTIONS = "actions";
     private static final String TABLES = "tables";
 
     @Override
     public ObjectNode encode(PiPipelineModel pipeline, CodecContext context) {
         ObjectNode result = context.mapper().createObjectNode();
-        ArrayNode headers = result.putArray(HEADERS);
-        pipeline.headers().stream()
-                .map(header -> context.encode(header, PiHeaderModel.class))
-                .forEach(headers::add);
         ArrayNode actions = result.putArray(ACTIONS);
-        pipeline.actions().stream()
+        pipeline.tables()
+                .stream()
+                .flatMap(piTableModel -> piTableModel.actions().stream())
+                .distinct()
                 .map(action -> context.encode(action, PiActionModel.class))
                 .forEach(actions::add);
         ArrayNode tables = result.putArray(TABLES);
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/PiTableMatchFieldModelCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/PiTableMatchFieldModelCodec.java
deleted file mode 100644
index a94bcba..0000000
--- a/core/common/src/main/java/org/onosproject/codec/impl/PiTableMatchFieldModelCodec.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2017-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.codec.impl;
-
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.net.pi.model.PiHeaderFieldTypeModel;
-import org.onosproject.net.pi.model.PiHeaderModel;
-import org.onosproject.net.pi.model.PiTableMatchFieldModel;
-
-/**
- * Codec for PiTableMatchFieldModel.
- */
-public class PiTableMatchFieldModelCodec extends JsonCodec<PiTableMatchFieldModel> {
-    private static final String MATCH_TYPE = "matchType";
-    private static final String HEADER = "header";
-    private static final String FIELD = "field";
-    @Override
-    public ObjectNode encode(PiTableMatchFieldModel tableMatchField, CodecContext context) {
-        ObjectNode result = context.mapper().createObjectNode();
-        result.put(MATCH_TYPE, tableMatchField.matchType().toString());
-        PiHeaderModel header = tableMatchField.field().header();
-        PiHeaderFieldTypeModel field = tableMatchField.field().type();
-        ObjectNode headerData = context.encode(header, PiHeaderModel.class);
-        ObjectNode headerFieldData = context.encode(field, PiHeaderFieldTypeModel.class);
-        result.set(HEADER, headerData);
-        result.set(FIELD, headerFieldData);
-        return result;
-    }
-}
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/PiTableModelCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/PiTableModelCodec.java
index 052e083..adf8bd7 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/PiTableModelCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/PiTableModelCodec.java
@@ -20,7 +20,7 @@
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.onosproject.codec.CodecContext;
 import org.onosproject.codec.JsonCodec;
-import org.onosproject.net.pi.model.PiTableMatchFieldModel;
+import org.onosproject.net.pi.model.PiMatchFieldModel;
 import org.onosproject.net.pi.model.PiTableModel;
 
 /**
@@ -40,21 +40,21 @@
 
         ObjectNode result = context.mapper().createObjectNode();
 
-        result.put(NAME, table.name());
+        result.put(NAME, table.id().toString());
         result.put(MAX_SIZE, table.maxSize());
-        result.put(HAS_COUNTERS, table.hasCounters());
+        result.put(HAS_COUNTERS, table.counters().size() > 0);
         result.put(SUPPORT_AGING, table.supportsAging());
 
         ArrayNode matchFields = result.putArray(MATCH_FIELDS);
         table.matchFields().forEach(matchField -> {
             ObjectNode matchFieldData =
-                    context.encode(matchField, PiTableMatchFieldModel.class);
+                    context.encode(matchField, PiMatchFieldModel.class);
             matchFields.add(matchFieldData);
         });
 
         ArrayNode actions = result.putArray(ACTIONS);
         table.actions().forEach(action -> {
-            actions.add(action.name());
+            actions.add(action.id().toString());
         });
 
         return result;