Committed by
Gerrit Code Review
More readable toString for BMv2 extension selectors and treatments
Also, added a test for serialization Change-Id: I77e80fa7597b552c71e80c9d39d03549e0325778
Showing
4 changed files
with
105 additions
and
21 deletions
| ... | @@ -39,6 +39,11 @@ | ... | @@ -39,6 +39,11 @@ |
| 39 | <groupId>org.apache.felix</groupId> | 39 | <groupId>org.apache.felix</groupId> |
| 40 | <artifactId>org.apache.felix.scr.annotations</artifactId> | 40 | <artifactId>org.apache.felix.scr.annotations</artifactId> |
| 41 | </dependency> | 41 | </dependency> |
| 42 | + <dependency> | ||
| 43 | + <groupId>org.onosproject</groupId> | ||
| 44 | + <artifactId>onos-core-serializers</artifactId> | ||
| 45 | + <version>${project.version}</version> | ||
| 46 | + </dependency> | ||
| 42 | </dependencies> | 47 | </dependencies> |
| 43 | 48 | ||
| 44 | </project> | 49 | </project> |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| ... | @@ -29,9 +29,10 @@ import org.onosproject.bmv2.api.utils.Bmv2TranslatorUtils; | ... | @@ -29,9 +29,10 @@ import org.onosproject.bmv2.api.utils.Bmv2TranslatorUtils; |
| 29 | import org.onosproject.net.flow.AbstractExtension; | 29 | import org.onosproject.net.flow.AbstractExtension; |
| 30 | import org.onosproject.net.flow.criteria.ExtensionSelector; | 30 | import org.onosproject.net.flow.criteria.ExtensionSelector; |
| 31 | import org.onosproject.net.flow.criteria.ExtensionSelectorType; | 31 | import org.onosproject.net.flow.criteria.ExtensionSelectorType; |
| 32 | +import org.onosproject.store.serializers.KryoNamespaces; | ||
| 32 | 33 | ||
| 33 | import java.nio.ByteBuffer; | 34 | import java.nio.ByteBuffer; |
| 34 | -import java.util.HashMap; | 35 | +import java.util.Collections; |
| 35 | import java.util.Map; | 36 | import java.util.Map; |
| 36 | 37 | ||
| 37 | import static com.google.common.base.Preconditions.*; | 38 | import static com.google.common.base.Preconditions.*; |
| ... | @@ -46,9 +47,8 @@ import static org.onosproject.bmv2.api.utils.Bmv2TranslatorUtils.fitByteSequence | ... | @@ -46,9 +47,8 @@ import static org.onosproject.bmv2.api.utils.Bmv2TranslatorUtils.fitByteSequence |
| 46 | @Beta | 47 | @Beta |
| 47 | public final class Bmv2ExtensionSelector extends AbstractExtension implements ExtensionSelector { | 48 | public final class Bmv2ExtensionSelector extends AbstractExtension implements ExtensionSelector { |
| 48 | 49 | ||
| 49 | - private final KryoNamespace appKryo = new KryoNamespace.Builder() | 50 | + private static final KryoNamespace APP_KRYO = new KryoNamespace.Builder() |
| 50 | - .register(HashMap.class) | 51 | + .register(KryoNamespaces.API) |
| 51 | - .register(Bmv2MatchParam.class) | ||
| 52 | .register(Bmv2ExactMatchParam.class) | 52 | .register(Bmv2ExactMatchParam.class) |
| 53 | .register(Bmv2TernaryMatchParam.class) | 53 | .register(Bmv2TernaryMatchParam.class) |
| 54 | .register(Bmv2LpmMatchParam.class) | 54 | .register(Bmv2LpmMatchParam.class) |
| ... | @@ -83,12 +83,12 @@ public final class Bmv2ExtensionSelector extends AbstractExtension implements Ex | ... | @@ -83,12 +83,12 @@ public final class Bmv2ExtensionSelector extends AbstractExtension implements Ex |
| 83 | 83 | ||
| 84 | @Override | 84 | @Override |
| 85 | public byte[] serialize() { | 85 | public byte[] serialize() { |
| 86 | - return appKryo.serialize(parameterMap); | 86 | + return APP_KRYO.serialize(parameterMap); |
| 87 | } | 87 | } |
| 88 | 88 | ||
| 89 | @Override | 89 | @Override |
| 90 | public void deserialize(byte[] data) { | 90 | public void deserialize(byte[] data) { |
| 91 | - this.parameterMap = appKryo.deserialize(data); | 91 | + this.parameterMap = APP_KRYO.deserialize(data); |
| 92 | } | 92 | } |
| 93 | 93 | ||
| 94 | @Override | 94 | @Override |
| ... | @@ -110,9 +110,31 @@ public final class Bmv2ExtensionSelector extends AbstractExtension implements Ex | ... | @@ -110,9 +110,31 @@ public final class Bmv2ExtensionSelector extends AbstractExtension implements Ex |
| 110 | 110 | ||
| 111 | @Override | 111 | @Override |
| 112 | public String toString() { | 112 | public String toString() { |
| 113 | - return MoreObjects.toStringHelper(this) | 113 | + MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper(this); |
| 114 | - .add("parameterMap", parameterMap) | 114 | + parameterMap.forEach((name, param) -> { |
| 115 | - .toString(); | 115 | + switch (param.type()) { |
| 116 | + case EXACT: | ||
| 117 | + Bmv2ExactMatchParam e = (Bmv2ExactMatchParam) param; | ||
| 118 | + helper.add(name, e.value()); | ||
| 119 | + break; | ||
| 120 | + case TERNARY: | ||
| 121 | + Bmv2TernaryMatchParam t = (Bmv2TernaryMatchParam) param; | ||
| 122 | + helper.add(name, t.value() + "&&&" + t.mask()); | ||
| 123 | + break; | ||
| 124 | + case LPM: | ||
| 125 | + Bmv2LpmMatchParam l = (Bmv2LpmMatchParam) param; | ||
| 126 | + helper.add(name, l.value() + "/" + String.valueOf(l.prefixLength())); | ||
| 127 | + break; | ||
| 128 | + case VALID: | ||
| 129 | + Bmv2ValidMatchParam v = (Bmv2ValidMatchParam) param; | ||
| 130 | + helper.add(name, v.flag() ? "VALID" : "NOT_VALID"); | ||
| 131 | + break; | ||
| 132 | + default: | ||
| 133 | + helper.add(name, param); | ||
| 134 | + break; | ||
| 135 | + } | ||
| 136 | + }); | ||
| 137 | + return helper.toString(); | ||
| 116 | } | 138 | } |
| 117 | 139 | ||
| 118 | /** | 140 | /** |
| ... | @@ -121,7 +143,7 @@ public final class Bmv2ExtensionSelector extends AbstractExtension implements Ex | ... | @@ -121,7 +143,7 @@ public final class Bmv2ExtensionSelector extends AbstractExtension implements Ex |
| 121 | * @return a BMv2 extension treatment | 143 | * @return a BMv2 extension treatment |
| 122 | */ | 144 | */ |
| 123 | public static Bmv2ExtensionSelector empty() { | 145 | public static Bmv2ExtensionSelector empty() { |
| 124 | - return new Bmv2ExtensionSelector(null); | 146 | + return new Bmv2ExtensionSelector(Collections.emptyMap()); |
| 125 | } | 147 | } |
| 126 | 148 | ||
| 127 | /** | 149 | /** | ... | ... |
| ... | @@ -29,11 +29,14 @@ import org.onosproject.bmv2.api.utils.Bmv2TranslatorUtils; | ... | @@ -29,11 +29,14 @@ import org.onosproject.bmv2.api.utils.Bmv2TranslatorUtils; |
| 29 | import org.onosproject.net.flow.AbstractExtension; | 29 | import org.onosproject.net.flow.AbstractExtension; |
| 30 | import org.onosproject.net.flow.instructions.ExtensionTreatment; | 30 | import org.onosproject.net.flow.instructions.ExtensionTreatment; |
| 31 | import org.onosproject.net.flow.instructions.ExtensionTreatmentType; | 31 | import org.onosproject.net.flow.instructions.ExtensionTreatmentType; |
| 32 | +import org.onosproject.store.serializers.KryoNamespaces; | ||
| 32 | 33 | ||
| 33 | import java.nio.ByteBuffer; | 34 | import java.nio.ByteBuffer; |
| 34 | import java.util.ArrayList; | 35 | import java.util.ArrayList; |
| 36 | +import java.util.Collections; | ||
| 35 | import java.util.List; | 37 | import java.util.List; |
| 36 | import java.util.Map; | 38 | import java.util.Map; |
| 39 | +import java.util.StringJoiner; | ||
| 37 | 40 | ||
| 38 | import static com.google.common.base.Preconditions.checkArgument; | 41 | import static com.google.common.base.Preconditions.checkArgument; |
| 39 | import static com.google.common.base.Preconditions.checkNotNull; | 42 | import static com.google.common.base.Preconditions.checkNotNull; |
| ... | @@ -47,16 +50,25 @@ import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.Exten | ... | @@ -47,16 +50,25 @@ import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.Exten |
| 47 | @Beta | 50 | @Beta |
| 48 | public final class Bmv2ExtensionTreatment extends AbstractExtension implements ExtensionTreatment { | 51 | public final class Bmv2ExtensionTreatment extends AbstractExtension implements ExtensionTreatment { |
| 49 | 52 | ||
| 50 | - private final KryoNamespace appKryo = new KryoNamespace.Builder().build(); | 53 | + private static final KryoNamespace APP_KRYO = new KryoNamespace.Builder() |
| 54 | + .register(KryoNamespaces.API) | ||
| 55 | + .register(Bmv2ExtensionTreatment.class) | ||
| 56 | + .register(Bmv2Action.class) | ||
| 57 | + .build(); | ||
| 58 | + | ||
| 59 | + private List<String> parameterNames; | ||
| 51 | private Bmv2Action action; | 60 | private Bmv2Action action; |
| 52 | 61 | ||
| 53 | /** | 62 | /** |
| 54 | * Creates a new extension treatment for the given BMv2 action. | 63 | * Creates a new extension treatment for the given BMv2 action. |
| 64 | + * The list of action parameters name is also required for visualization purposes (i.e. nicer toString()). | ||
| 55 | * | 65 | * |
| 56 | - * @param action an action | 66 | + * @param action an action |
| 67 | + * @param parameterNames a list of strings | ||
| 57 | */ | 68 | */ |
| 58 | - private Bmv2ExtensionTreatment(Bmv2Action action) { | 69 | + private Bmv2ExtensionTreatment(Bmv2Action action, List<String> parameterNames) { |
| 59 | this.action = action; | 70 | this.action = action; |
| 71 | + this.parameterNames = parameterNames; | ||
| 60 | } | 72 | } |
| 61 | 73 | ||
| 62 | /** | 74 | /** |
| ... | @@ -75,12 +87,14 @@ public final class Bmv2ExtensionTreatment extends AbstractExtension implements E | ... | @@ -75,12 +87,14 @@ public final class Bmv2ExtensionTreatment extends AbstractExtension implements E |
| 75 | 87 | ||
| 76 | @Override | 88 | @Override |
| 77 | public byte[] serialize() { | 89 | public byte[] serialize() { |
| 78 | - return appKryo.serialize(action); | 90 | + return APP_KRYO.serialize(this); |
| 79 | } | 91 | } |
| 80 | 92 | ||
| 81 | @Override | 93 | @Override |
| 82 | public void deserialize(byte[] data) { | 94 | public void deserialize(byte[] data) { |
| 83 | - action = appKryo.deserialize(data); | 95 | + Bmv2ExtensionTreatment other = APP_KRYO.deserialize(data); |
| 96 | + action = other.action; | ||
| 97 | + parameterNames = other.parameterNames; | ||
| 84 | } | 98 | } |
| 85 | 99 | ||
| 86 | @Override | 100 | @Override |
| ... | @@ -102,8 +116,12 @@ public final class Bmv2ExtensionTreatment extends AbstractExtension implements E | ... | @@ -102,8 +116,12 @@ public final class Bmv2ExtensionTreatment extends AbstractExtension implements E |
| 102 | 116 | ||
| 103 | @Override | 117 | @Override |
| 104 | public String toString() { | 118 | public String toString() { |
| 119 | + StringJoiner stringJoiner = new StringJoiner(", ", "(", ")"); | ||
| 120 | + for (int i = 0; i < parameterNames.size(); i++) { | ||
| 121 | + stringJoiner.add(parameterNames.get(i) + "=" + action.parameters().get(i)); | ||
| 122 | + } | ||
| 105 | return MoreObjects.toStringHelper(this) | 123 | return MoreObjects.toStringHelper(this) |
| 106 | - .add("action", action) | 124 | + .addValue(action.name() + stringJoiner.toString()) |
| 107 | .toString(); | 125 | .toString(); |
| 108 | } | 126 | } |
| 109 | 127 | ||
| ... | @@ -113,7 +131,7 @@ public final class Bmv2ExtensionTreatment extends AbstractExtension implements E | ... | @@ -113,7 +131,7 @@ public final class Bmv2ExtensionTreatment extends AbstractExtension implements E |
| 113 | * @return a BMv2 extension treatment | 131 | * @return a BMv2 extension treatment |
| 114 | */ | 132 | */ |
| 115 | public static Bmv2ExtensionTreatment empty() { | 133 | public static Bmv2ExtensionTreatment empty() { |
| 116 | - return new Bmv2ExtensionTreatment(null); | 134 | + return new Bmv2ExtensionTreatment(null, Collections.emptyList()); |
| 117 | } | 135 | } |
| 118 | 136 | ||
| 119 | /** | 137 | /** |
| ... | @@ -232,6 +250,7 @@ public final class Bmv2ExtensionTreatment extends AbstractExtension implements E | ... | @@ -232,6 +250,7 @@ public final class Bmv2ExtensionTreatment extends AbstractExtension implements E |
| 232 | "invalid number of parameters", actionName); | 250 | "invalid number of parameters", actionName); |
| 233 | 251 | ||
| 234 | List<ImmutableByteSequence> newParameters = new ArrayList<>(parameters.size()); | 252 | List<ImmutableByteSequence> newParameters = new ArrayList<>(parameters.size()); |
| 253 | + List<String> parameterNames = new ArrayList<>(parameters.size()); | ||
| 235 | 254 | ||
| 236 | for (String parameterName : parameters.keySet()) { | 255 | for (String parameterName : parameters.keySet()) { |
| 237 | Bmv2RuntimeDataModel runtimeData = actionModel.runtimeData(parameterName); | 256 | Bmv2RuntimeDataModel runtimeData = actionModel.runtimeData(parameterName); |
| ... | @@ -242,13 +261,14 @@ public final class Bmv2ExtensionTreatment extends AbstractExtension implements E | ... | @@ -242,13 +261,14 @@ public final class Bmv2ExtensionTreatment extends AbstractExtension implements E |
| 242 | ImmutableByteSequence newSequence = fitByteSequence(parameters.get(parameterName), bitWidth); | 261 | ImmutableByteSequence newSequence = fitByteSequence(parameters.get(parameterName), bitWidth); |
| 243 | int idx = actionModel.runtimeDatas().indexOf(runtimeData); | 262 | int idx = actionModel.runtimeDatas().indexOf(runtimeData); |
| 244 | newParameters.add(idx, newSequence); | 263 | newParameters.add(idx, newSequence); |
| 264 | + parameterNames.add(idx, parameterName); | ||
| 245 | } catch (Bmv2TranslatorUtils.ByteSequenceFitException e) { | 265 | } catch (Bmv2TranslatorUtils.ByteSequenceFitException e) { |
| 246 | throw new IllegalArgumentException(e.getMessage() + | 266 | throw new IllegalArgumentException(e.getMessage() + |
| 247 | " [" + actionName + "->" + runtimeData.name() + "]"); | 267 | " [" + actionName + "->" + runtimeData.name() + "]"); |
| 248 | } | 268 | } |
| 249 | } | 269 | } |
| 250 | 270 | ||
| 251 | - return new Bmv2ExtensionTreatment(new Bmv2Action(actionName, newParameters)); | 271 | + return new Bmv2ExtensionTreatment(new Bmv2Action(actionName, newParameters), parameterNames); |
| 252 | } | 272 | } |
| 253 | 273 | ||
| 254 | 274 | ... | ... |
| ... | @@ -18,6 +18,7 @@ package org.onosproject.bmv2.api.runtime; | ... | @@ -18,6 +18,7 @@ package org.onosproject.bmv2.api.runtime; |
| 18 | 18 | ||
| 19 | import com.eclipsesource.json.Json; | 19 | import com.eclipsesource.json.Json; |
| 20 | import com.eclipsesource.json.JsonObject; | 20 | import com.eclipsesource.json.JsonObject; |
| 21 | +import com.google.common.testing.EqualsTester; | ||
| 21 | import org.junit.Before; | 22 | import org.junit.Before; |
| 22 | import org.junit.Test; | 23 | import org.junit.Test; |
| 23 | import org.onlab.packet.MacAddress; | 24 | import org.onlab.packet.MacAddress; |
| ... | @@ -30,7 +31,7 @@ import java.io.InputStreamReader; | ... | @@ -30,7 +31,7 @@ import java.io.InputStreamReader; |
| 30 | import static org.hamcrest.MatcherAssert.assertThat; | 31 | import static org.hamcrest.MatcherAssert.assertThat; |
| 31 | import static org.hamcrest.Matchers.is; | 32 | import static org.hamcrest.Matchers.is; |
| 32 | 33 | ||
| 33 | -public class Bmv2ExtensionBuilderTest { | 34 | +public class Bmv2ExtensionsTest { |
| 34 | 35 | ||
| 35 | private Bmv2Configuration config; | 36 | private Bmv2Configuration config; |
| 36 | 37 | ||
| ... | @@ -42,7 +43,7 @@ public class Bmv2ExtensionBuilderTest { | ... | @@ -42,7 +43,7 @@ public class Bmv2ExtensionBuilderTest { |
| 42 | } | 43 | } |
| 43 | 44 | ||
| 44 | @Test | 45 | @Test |
| 45 | - public void testExtensionSelector() throws Exception { | 46 | + public void testExtensionSelectorBuilder() throws Exception { |
| 46 | 47 | ||
| 47 | Bmv2ExtensionSelector extSelectorExact = Bmv2ExtensionSelector.builder() | 48 | Bmv2ExtensionSelector extSelectorExact = Bmv2ExtensionSelector.builder() |
| 48 | .forConfiguration(config) | 49 | .forConfiguration(config) |
| ... | @@ -85,7 +86,7 @@ public class Bmv2ExtensionBuilderTest { | ... | @@ -85,7 +86,7 @@ public class Bmv2ExtensionBuilderTest { |
| 85 | } | 86 | } |
| 86 | 87 | ||
| 87 | @Test | 88 | @Test |
| 88 | - public void testExtensionTreatment() throws Exception { | 89 | + public void testExtensionTreatmentBuilder() throws Exception { |
| 89 | 90 | ||
| 90 | Bmv2ExtensionTreatment treatment = Bmv2ExtensionTreatment.builder() | 91 | Bmv2ExtensionTreatment treatment = Bmv2ExtensionTreatment.builder() |
| 91 | .forConfiguration(config) | 92 | .forConfiguration(config) |
| ... | @@ -97,4 +98,40 @@ public class Bmv2ExtensionBuilderTest { | ... | @@ -97,4 +98,40 @@ public class Bmv2ExtensionBuilderTest { |
| 97 | 98 | ||
| 98 | // TODO add more tests, e.g. check for byte sequences content and size. | 99 | // TODO add more tests, e.g. check for byte sequences content and size. |
| 99 | } | 100 | } |
| 101 | + | ||
| 102 | + @Test | ||
| 103 | + public void testExtensionSelectorSerialization() throws Exception { | ||
| 104 | + | ||
| 105 | + Bmv2ExtensionSelector original = Bmv2ExtensionSelector.builder() | ||
| 106 | + .forConfiguration(config) | ||
| 107 | + .matchExact("standard_metadata", "ingress_port", (short) 255) | ||
| 108 | + .matchLpm("ethernet", "etherType", 512, 4) | ||
| 109 | + .matchTernary("ethernet", "dstAddr", 1024L, 512L) | ||
| 110 | + .matchValid("ethernet", "srcAddr", true) | ||
| 111 | + .build(); | ||
| 112 | + | ||
| 113 | + Bmv2ExtensionSelector other = Bmv2ExtensionSelector.empty(); | ||
| 114 | + other.deserialize(original.serialize()); | ||
| 115 | + | ||
| 116 | + new EqualsTester() | ||
| 117 | + .addEqualityGroup(original, other) | ||
| 118 | + .testEquals(); | ||
| 119 | + } | ||
| 120 | + | ||
| 121 | + @Test | ||
| 122 | + public void testExtensionTreatmentSerialization() throws Exception { | ||
| 123 | + | ||
| 124 | + Bmv2ExtensionTreatment original = Bmv2ExtensionTreatment.builder() | ||
| 125 | + .forConfiguration(config) | ||
| 126 | + .setActionName("set_egress_port") | ||
| 127 | + .addParameter("port", 1) | ||
| 128 | + .build(); | ||
| 129 | + | ||
| 130 | + Bmv2ExtensionTreatment other = Bmv2ExtensionTreatment.empty(); | ||
| 131 | + other.deserialize(original.serialize()); | ||
| 132 | + | ||
| 133 | + new EqualsTester() | ||
| 134 | + .addEqualityGroup(original, other) | ||
| 135 | + .testEquals(); | ||
| 136 | + } | ||
| 100 | } | 137 | } |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
-
Please register or login to post a comment