Removed hardcoded model from BMv2 driver
Now it uses the model stored in device annotations. Also refactored flow
rule translator classes to reflect this change.
Change-Id: I46541bcc2ab5a267eef4becb6250b9a99684056a
diff --git a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/translators/Bmv2SimpleTranslatorConfig.java b/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/translators/Bmv2SimpleTranslatorConfig.java
index 565c1e4..4a105a3 100644
--- a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/translators/Bmv2SimpleTranslatorConfig.java
+++ b/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/translators/Bmv2SimpleTranslatorConfig.java
@@ -16,10 +16,8 @@
package org.onosproject.drivers.bmv2.translators;
-import com.eclipsesource.json.Json;
-import com.eclipsesource.json.JsonObject;
import com.google.common.annotations.Beta;
-import com.google.common.collect.Maps;
+import com.google.common.collect.ImmutableMap;
import org.onlab.util.ImmutableByteSequence;
import org.onosproject.bmv2.api.model.Bmv2Model;
import org.onosproject.bmv2.api.runtime.Bmv2Action;
@@ -29,10 +27,6 @@
import org.onosproject.net.flow.instructions.Instruction;
import org.onosproject.net.flow.instructions.Instructions;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
import java.util.Map;
/**
@@ -40,24 +34,21 @@
* simple.p4 model.
*/
@Beta
-public class Bmv2SimpleTranslatorConfig implements Bmv2FlowRuleTranslator.TranslatorConfig {
+public class Bmv2SimpleTranslatorConfig extends Bmv2DefaultTranslatorConfig {
- private static final String JSON_CONFIG_PATH = "/simple.json";
- private final Map<String, Criterion.Type> fieldMap = Maps.newHashMap();
- private final Bmv2Model model;
+ // Lazily populate field map.
+ private static final Map<String, Criterion.Type> FIELD_MAP = ImmutableMap.of(
+ "standard_metadata.ingress_port", Criterion.Type.IN_PORT,
+ "ethernet.dstAddr", Criterion.Type.ETH_DST,
+ "ethernet.srcAddr", Criterion.Type.ETH_SRC,
+ "ethernet.etherType", Criterion.Type.ETH_TYPE);
/**
* Creates a new simple pipeline translator configuration.
*/
- public Bmv2SimpleTranslatorConfig() {
-
- this.model = getModel();
-
- // populate fieldMap
- fieldMap.put("standard_metadata.ingress_port", Criterion.Type.IN_PORT);
- fieldMap.put("ethernet.dstAddr", Criterion.Type.ETH_DST);
- fieldMap.put("ethernet.srcAddr", Criterion.Type.ETH_SRC);
- fieldMap.put("ethernet.etherType", Criterion.Type.ETH_TYPE);
+ public Bmv2SimpleTranslatorConfig(Bmv2Model model) {
+ // Populate fieldMap.
+ super(model, FIELD_MAP);
}
private static Bmv2Action buildDropAction() {
@@ -94,41 +85,16 @@
return actionBuilder.build();
}
- private static Bmv2Model getModel() {
- InputStream inputStream = Bmv2SimpleTranslatorConfig.class
- .getResourceAsStream(JSON_CONFIG_PATH);
- InputStreamReader reader = new InputStreamReader(inputStream);
- BufferedReader bufReader = new BufferedReader(reader);
- JsonObject json = null;
- try {
- json = Json.parse(bufReader).asObject();
- } catch (IOException e) {
- throw new RuntimeException("Unable to parse JSON file: " + e.getMessage());
- }
-
- return Bmv2Model.parse(json);
- }
-
- @Override
- public Bmv2Model model() {
- return this.model;
- }
-
- @Override
- public Map<String, Criterion.Type> fieldToCriterionTypeMap() {
- return fieldMap;
- }
-
@Override
public Bmv2Action buildAction(TrafficTreatment treatment)
throws Bmv2FlowRuleTranslatorException {
if (treatment.allInstructions().size() == 0) {
- // no instructions means drop
+ // No instructions means drop.
return buildDropAction();
} else if (treatment.allInstructions().size() > 1) {
- // otherwise, we understand treatments with only 1 instruction
+ // Otherwise, we understand treatments with only 1 instruction.
throw new Bmv2FlowRuleTranslatorException(
"Treatment not supported, more than 1 instructions found: "
+ treatment.toString());