Jian Li
Committed by Ray Milkey

Support to encode and decode group id in InstructionCodec

Change-Id: Icd0947f494f572831e8b5c8d82d47c85eb074824
...@@ -22,6 +22,8 @@ import org.onlab.packet.MplsLabel; ...@@ -22,6 +22,8 @@ import org.onlab.packet.MplsLabel;
22 import org.onlab.packet.TpPort; 22 import org.onlab.packet.TpPort;
23 import org.onlab.packet.VlanId; 23 import org.onlab.packet.VlanId;
24 import org.onlab.util.HexString; 24 import org.onlab.util.HexString;
25 +import org.onosproject.core.DefaultGroupId;
26 +import org.onosproject.core.GroupId;
25 import org.onosproject.net.ChannelSpacing; 27 import org.onosproject.net.ChannelSpacing;
26 import org.onosproject.net.GridType; 28 import org.onosproject.net.GridType;
27 import org.onosproject.net.Lambda; 29 import org.onosproject.net.Lambda;
...@@ -261,6 +263,10 @@ public final class DecodeInstructionCodecHelper { ...@@ -261,6 +263,10 @@ public final class DecodeInstructionCodecHelper {
261 } else if (type.equals(Instruction.Type.TABLE.name())) { 263 } else if (type.equals(Instruction.Type.TABLE.name())) {
262 return Instructions.transition(nullIsIllegal(json.get(InstructionCodec.TABLE_ID) 264 return Instructions.transition(nullIsIllegal(json.get(InstructionCodec.TABLE_ID)
263 .asInt(), InstructionCodec.TABLE_ID + InstructionCodec.MISSING_MEMBER_MESSAGE)); 265 .asInt(), InstructionCodec.TABLE_ID + InstructionCodec.MISSING_MEMBER_MESSAGE));
266 + } else if (type.equals(Instruction.Type.GROUP.name())) {
267 + GroupId groupId = new DefaultGroupId(nullIsIllegal(json.get(InstructionCodec.GROUP_ID)
268 + .asInt(), InstructionCodec.GROUP_ID + InstructionCodec.MISSING_MEMBER_MESSAGE));
269 + return Instructions.createGroup(groupId);
264 } else if (type.equals(Instruction.Type.L0MODIFICATION.name())) { 270 } else if (type.equals(Instruction.Type.L0MODIFICATION.name())) {
265 return decodeL0(); 271 return decodeL0();
266 } else if (type.equals(Instruction.Type.L1MODIFICATION.name())) { 272 } else if (type.equals(Instruction.Type.L1MODIFICATION.name())) {
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
15 */ 15 */
16 package org.onosproject.codec.impl; 16 package org.onosproject.codec.impl;
17 17
18 +import com.fasterxml.jackson.databind.node.ObjectNode;
18 import org.onlab.util.HexString; 19 import org.onlab.util.HexString;
19 import org.onosproject.codec.CodecContext; 20 import org.onosproject.codec.CodecContext;
20 import org.onosproject.net.OchSignal; 21 import org.onosproject.net.OchSignal;
...@@ -29,8 +30,6 @@ import org.onosproject.net.flow.instructions.L4ModificationInstruction; ...@@ -29,8 +30,6 @@ import org.onosproject.net.flow.instructions.L4ModificationInstruction;
29 import org.slf4j.Logger; 30 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory; 31 import org.slf4j.LoggerFactory;
31 32
32 -import com.fasterxml.jackson.databind.node.ObjectNode;
33 -
34 /** 33 /**
35 * JSON encoding of Instructions. 34 * JSON encoding of Instructions.
36 */ 35 */
...@@ -249,6 +248,12 @@ public final class EncodeInstructionCodecHelper { ...@@ -249,6 +248,12 @@ public final class EncodeInstructionCodecHelper {
249 case NOACTION: 248 case NOACTION:
250 break; 249 break;
251 250
251 + case GROUP:
252 + final Instructions.GroupInstruction groupInstruction =
253 + (Instructions.GroupInstruction) instruction;
254 + result.put(InstructionCodec.GROUP_ID, groupInstruction.groupId().toString());
255 + break;
256 +
252 case L0MODIFICATION: 257 case L0MODIFICATION:
253 encodeL0(result); 258 encodeL0(result);
254 break; 259 break;
......
...@@ -50,6 +50,7 @@ public final class InstructionCodec extends JsonCodec<Instruction> { ...@@ -50,6 +50,7 @@ public final class InstructionCodec extends JsonCodec<Instruction> {
50 protected static final String TCP_PORT = "tcpPort"; 50 protected static final String TCP_PORT = "tcpPort";
51 protected static final String UDP_PORT = "udpPort"; 51 protected static final String UDP_PORT = "udpPort";
52 protected static final String TABLE_ID = "tableId"; 52 protected static final String TABLE_ID = "tableId";
53 + protected static final String GROUP_ID = "groupId";
53 protected static final String TRIBUTARY_PORT_NUMBER = "tributaryPortNumber"; 54 protected static final String TRIBUTARY_PORT_NUMBER = "tributaryPortNumber";
54 protected static final String TRIBUTARY_SLOT_LEN = "tributarySlotLength"; 55 protected static final String TRIBUTARY_SLOT_LEN = "tributarySlotLength";
55 protected static final String TRIBUTARY_SLOT_BITMAP = "tributarySlotBitmap"; 56 protected static final String TRIBUTARY_SLOT_BITMAP = "tributarySlotBitmap";
......
...@@ -15,11 +15,13 @@ ...@@ -15,11 +15,13 @@
15 */ 15 */
16 package org.onosproject.codec.impl; 16 package org.onosproject.codec.impl;
17 17
18 +import com.fasterxml.jackson.databind.JsonNode;
18 import org.hamcrest.Description; 19 import org.hamcrest.Description;
19 import org.hamcrest.TypeSafeDiagnosingMatcher; 20 import org.hamcrest.TypeSafeDiagnosingMatcher;
20 import org.onlab.util.HexString; 21 import org.onlab.util.HexString;
21 import org.onosproject.net.OduSignalId; 22 import org.onosproject.net.OduSignalId;
22 import org.onosproject.net.flow.instructions.Instruction; 23 import org.onosproject.net.flow.instructions.Instruction;
24 +import org.onosproject.net.flow.instructions.Instructions.GroupInstruction;
23 import org.onosproject.net.flow.instructions.Instructions.NoActionInstruction; 25 import org.onosproject.net.flow.instructions.Instructions.NoActionInstruction;
24 import org.onosproject.net.flow.instructions.Instructions.OutputInstruction; 26 import org.onosproject.net.flow.instructions.Instructions.OutputInstruction;
25 import org.onosproject.net.flow.instructions.L0ModificationInstruction.ModLambdaInstruction; 27 import org.onosproject.net.flow.instructions.L0ModificationInstruction.ModLambdaInstruction;
...@@ -33,8 +35,6 @@ import org.onosproject.net.flow.instructions.L2ModificationInstruction.PushHeade ...@@ -33,8 +35,6 @@ import org.onosproject.net.flow.instructions.L2ModificationInstruction.PushHeade
33 import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModIPInstruction; 35 import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModIPInstruction;
34 import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModIPv6FlowLabelInstruction; 36 import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModIPv6FlowLabelInstruction;
35 37
36 -import com.fasterxml.jackson.databind.JsonNode;
37 -
38 /** 38 /**
39 * Hamcrest matcher for instructions. 39 * Hamcrest matcher for instructions.
40 */ 40 */
...@@ -123,6 +123,33 @@ public final class InstructionJsonMatcher extends TypeSafeDiagnosingMatcher<Json ...@@ -123,6 +123,33 @@ public final class InstructionJsonMatcher extends TypeSafeDiagnosingMatcher<Json
123 } 123 }
124 124
125 /** 125 /**
126 + * Matches the contents of a group instruction.
127 + *
128 + * @param instructionJson JSON instruction to match
129 + * @param description Description object used for recording errors
130 + * @return true if contents match, false otherwise
131 + */
132 + private boolean matchGroupInstruction(JsonNode instructionJson,
133 + Description description) {
134 + final String jsonType = instructionJson.get("type").textValue();
135 + GroupInstruction instructionToMatch = (GroupInstruction) instruction;
136 + if (!instructionToMatch.type().name().equals(jsonType)) {
137 + description.appendText("type was " + jsonType);
138 + return false;
139 + }
140 +
141 + if (instructionJson.get("groupId").isInt()) {
142 + final int jsonGroupId = instructionJson.get("groupId").asInt();
143 + if (instructionToMatch.groupId().id() != jsonGroupId) {
144 + description.appendText("groupId was " + jsonGroupId);
145 + return false;
146 + }
147 + }
148 +
149 + return true;
150 + }
151 +
152 + /**
126 * Matches the contents of a mod lambda instruction. 153 * Matches the contents of a mod lambda instruction.
127 * 154 *
128 * @param instructionJson JSON instruction to match 155 * @param instructionJson JSON instruction to match
...@@ -453,6 +480,8 @@ public final class InstructionJsonMatcher extends TypeSafeDiagnosingMatcher<Json ...@@ -453,6 +480,8 @@ public final class InstructionJsonMatcher extends TypeSafeDiagnosingMatcher<Json
453 return matchPushHeaderInstruction(jsonInstruction, description); 480 return matchPushHeaderInstruction(jsonInstruction, description);
454 } else if (instruction instanceof OutputInstruction) { 481 } else if (instruction instanceof OutputInstruction) {
455 return matchOutputInstruction(jsonInstruction, description); 482 return matchOutputInstruction(jsonInstruction, description);
483 + } else if (instruction instanceof GroupInstruction) {
484 + return matchGroupInstruction(jsonInstruction, description);
456 } else if (instruction instanceof ModLambdaInstruction) { 485 } else if (instruction instanceof ModLambdaInstruction) {
457 return matchModLambdaInstruction(jsonInstruction, description); 486 return matchModLambdaInstruction(jsonInstruction, description);
458 } else if (instruction instanceof ModOchSignalInstruction) { 487 } else if (instruction instanceof ModOchSignalInstruction) {
......