Jian Li
Committed by Gerrit Code Review

Support to encode and decode setqueue id in InstructionCodec

Change-Id: I911e14b750d5264755687a9eff322502ba9ed118
...@@ -233,6 +233,32 @@ public final class DecodeInstructionCodecHelper { ...@@ -233,6 +233,32 @@ public final class DecodeInstructionCodecHelper {
233 } 233 }
234 234
235 /** 235 /**
236 + * Extracts port number of the given json node.
237 + *
238 + * @param jsonNode json node
239 + * @return port number
240 + */
241 + private PortNumber getPortNumber(ObjectNode jsonNode) {
242 + PortNumber portNumber;
243 + if (jsonNode.get(InstructionCodec.PORT).isLong() || jsonNode.get(InstructionCodec.PORT).isInt()) {
244 + portNumber = PortNumber
245 + .portNumber(nullIsIllegal(jsonNode.get(InstructionCodec.PORT)
246 + .asLong(), InstructionCodec.PORT
247 + + InstructionCodec.MISSING_MEMBER_MESSAGE));
248 + } else if (jsonNode.get(InstructionCodec.PORT).isTextual()) {
249 + portNumber = PortNumber
250 + .fromString(nullIsIllegal(jsonNode.get(InstructionCodec.PORT)
251 + .textValue(), InstructionCodec.PORT
252 + + InstructionCodec.MISSING_MEMBER_MESSAGE));
253 + } else {
254 + throw new IllegalArgumentException("Port value "
255 + + jsonNode.get(InstructionCodec.PORT).toString()
256 + + " is not supported");
257 + }
258 + return portNumber;
259 + }
260 +
261 + /**
236 * Decodes the JSON into an instruction object. 262 * Decodes the JSON into an instruction object.
237 * 263 *
238 * @return Criterion object 264 * @return Criterion object
...@@ -242,23 +268,7 @@ public final class DecodeInstructionCodecHelper { ...@@ -242,23 +268,7 @@ public final class DecodeInstructionCodecHelper {
242 String type = json.get(InstructionCodec.TYPE).asText(); 268 String type = json.get(InstructionCodec.TYPE).asText();
243 269
244 if (type.equals(Instruction.Type.OUTPUT.name())) { 270 if (type.equals(Instruction.Type.OUTPUT.name())) {
245 - PortNumber portNumber; 271 + return Instructions.createOutput(getPortNumber(json));
246 - if (json.get(InstructionCodec.PORT).isLong() || json.get(InstructionCodec.PORT).isInt()) {
247 - portNumber = PortNumber
248 - .portNumber(nullIsIllegal(json.get(InstructionCodec.PORT)
249 - .asLong(), InstructionCodec.PORT
250 - + InstructionCodec.MISSING_MEMBER_MESSAGE));
251 - } else if (json.get(InstructionCodec.PORT).isTextual()) {
252 - portNumber = PortNumber
253 - .fromString(nullIsIllegal(json.get(InstructionCodec.PORT)
254 - .textValue(), InstructionCodec.PORT
255 - + InstructionCodec.MISSING_MEMBER_MESSAGE));
256 - } else {
257 - throw new IllegalArgumentException("Port value "
258 - + json.get(InstructionCodec.PORT).toString()
259 - + " is not supported");
260 - }
261 - return Instructions.createOutput(portNumber);
262 } else if (type.equals(Instruction.Type.NOACTION.name())) { 272 } else if (type.equals(Instruction.Type.NOACTION.name())) {
263 return Instructions.createNoAction(); 273 return Instructions.createNoAction();
264 } else if (type.equals(Instruction.Type.TABLE.name())) { 274 } else if (type.equals(Instruction.Type.TABLE.name())) {
...@@ -272,6 +282,10 @@ public final class DecodeInstructionCodecHelper { ...@@ -272,6 +282,10 @@ public final class DecodeInstructionCodecHelper {
272 MeterId meterId = MeterId.meterId(nullIsIllegal(json.get(InstructionCodec.METER_ID) 282 MeterId meterId = MeterId.meterId(nullIsIllegal(json.get(InstructionCodec.METER_ID)
273 .asLong(), InstructionCodec.METER_ID + InstructionCodec.MISSING_MEMBER_MESSAGE)); 283 .asLong(), InstructionCodec.METER_ID + InstructionCodec.MISSING_MEMBER_MESSAGE));
274 return Instructions.meterTraffic(meterId); 284 return Instructions.meterTraffic(meterId);
285 + } else if (type.equals(Instruction.Type.QUEUE.name())) {
286 + long queueId = nullIsIllegal(json.get(InstructionCodec.QUEUE_ID)
287 + .asLong(), InstructionCodec.QUEUE_ID + InstructionCodec.MISSING_MEMBER_MESSAGE);
288 + return Instructions.setQueue(queueId, getPortNumber(json));
275 } else if (type.equals(Instruction.Type.L0MODIFICATION.name())) { 289 } else if (type.equals(Instruction.Type.L0MODIFICATION.name())) {
276 return decodeL0(); 290 return decodeL0();
277 } else if (type.equals(Instruction.Type.L1MODIFICATION.name())) { 291 } else if (type.equals(Instruction.Type.L1MODIFICATION.name())) {
......
...@@ -256,6 +256,13 @@ public final class EncodeInstructionCodecHelper { ...@@ -256,6 +256,13 @@ public final class EncodeInstructionCodecHelper {
256 result.put(InstructionCodec.METER_ID, meterInstruction.meterId().toString()); 256 result.put(InstructionCodec.METER_ID, meterInstruction.meterId().toString());
257 break; 257 break;
258 258
259 + case QUEUE:
260 + final Instructions.SetQueueInstruction setQueueInstruction =
261 + (Instructions.SetQueueInstruction) instruction;
262 + result.put(InstructionCodec.QUEUE_ID, setQueueInstruction.queueId());
263 + result.put(InstructionCodec.PORT, setQueueInstruction.port().toString());
264 + break;
265 +
259 case L0MODIFICATION: 266 case L0MODIFICATION:
260 encodeL0(result); 267 encodeL0(result);
261 break; 268 break;
......
...@@ -52,6 +52,7 @@ public final class InstructionCodec extends JsonCodec<Instruction> { ...@@ -52,6 +52,7 @@ public final class InstructionCodec extends JsonCodec<Instruction> {
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 GROUP_ID = "groupId";
54 protected static final String METER_ID = "meterId"; 54 protected static final String METER_ID = "meterId";
55 + protected static final String QUEUE_ID = "queueId";
55 protected static final String TRIBUTARY_PORT_NUMBER = "tributaryPortNumber"; 56 protected static final String TRIBUTARY_PORT_NUMBER = "tributaryPortNumber";
56 protected static final String TRIBUTARY_SLOT_LEN = "tributarySlotLength"; 57 protected static final String TRIBUTARY_SLOT_LEN = "tributarySlotLength";
57 protected static final String TRIBUTARY_SLOT_BITMAP = "tributarySlotBitmap"; 58 protected static final String TRIBUTARY_SLOT_BITMAP = "tributarySlotBitmap";
......
...@@ -25,6 +25,7 @@ import org.onosproject.net.flow.instructions.Instructions.GroupInstruction; ...@@ -25,6 +25,7 @@ import org.onosproject.net.flow.instructions.Instructions.GroupInstruction;
25 import org.onosproject.net.flow.instructions.Instructions.MeterInstruction; 25 import org.onosproject.net.flow.instructions.Instructions.MeterInstruction;
26 import org.onosproject.net.flow.instructions.Instructions.NoActionInstruction; 26 import org.onosproject.net.flow.instructions.Instructions.NoActionInstruction;
27 import org.onosproject.net.flow.instructions.Instructions.OutputInstruction; 27 import org.onosproject.net.flow.instructions.Instructions.OutputInstruction;
28 +import org.onosproject.net.flow.instructions.Instructions.SetQueueInstruction;
28 import org.onosproject.net.flow.instructions.L0ModificationInstruction.ModLambdaInstruction; 29 import org.onosproject.net.flow.instructions.L0ModificationInstruction.ModLambdaInstruction;
29 import org.onosproject.net.flow.instructions.L0ModificationInstruction.ModOchSignalInstruction; 30 import org.onosproject.net.flow.instructions.L0ModificationInstruction.ModOchSignalInstruction;
30 import org.onosproject.net.flow.instructions.L1ModificationInstruction.ModOduSignalIdInstruction; 31 import org.onosproject.net.flow.instructions.L1ModificationInstruction.ModOduSignalIdInstruction;
...@@ -115,7 +116,7 @@ public final class InstructionJsonMatcher extends TypeSafeDiagnosingMatcher<Json ...@@ -115,7 +116,7 @@ public final class InstructionJsonMatcher extends TypeSafeDiagnosingMatcher<Json
115 } 116 }
116 } else { 117 } else {
117 final String jsonPort = instructionJson.get("port").toString(); 118 final String jsonPort = instructionJson.get("port").toString();
118 - description.appendText("Unmathcing types "); 119 + description.appendText("Unmatching types ");
119 description.appendText("instructionToMatch " + instructionToMatch.port().toString()); 120 description.appendText("instructionToMatch " + instructionToMatch.port().toString());
120 description.appendText("jsonPort " + jsonPort); 121 description.appendText("jsonPort " + jsonPort);
121 } 122 }
...@@ -174,6 +175,51 @@ public final class InstructionJsonMatcher extends TypeSafeDiagnosingMatcher<Json ...@@ -174,6 +175,51 @@ public final class InstructionJsonMatcher extends TypeSafeDiagnosingMatcher<Json
174 } 175 }
175 176
176 /** 177 /**
178 + * Matches the contents of a set queue instruction.
179 + *
180 + * @param instructionJson JSON instruction to match
181 + * @param description Description object used for recording errors
182 + * @return true if contents match, false otherwise
183 + */
184 + private boolean matchSetQueueInstruction(JsonNode instructionJson,
185 + Description description) {
186 + final String jsonType = instructionJson.get("type").textValue();
187 + SetQueueInstruction instructionToMatch = (SetQueueInstruction) instruction;
188 + if (!instructionToMatch.type().name().equals(jsonType)) {
189 + description.appendText("type was " + jsonType);
190 + return false;
191 + }
192 +
193 + final long jsonQueueId = instructionJson.get("queueId").longValue();
194 + if (instructionToMatch.queueId() != jsonQueueId) {
195 + description.appendText("queueId was " + jsonQueueId);
196 + return false;
197 + }
198 +
199 + if (instructionJson.get("port").isLong() ||
200 + instructionJson.get("port").isInt()) {
201 + final long jsonPort = instructionJson.get("port").asLong();
202 + if (instructionToMatch.port().toLong() != (jsonPort)) {
203 + description.appendText("port was " + jsonPort);
204 + return false;
205 + }
206 + } else if (instructionJson.get("port").isTextual()) {
207 + final String jsonPort = instructionJson.get("port").textValue();
208 + if (!instructionToMatch.port().toString().equals(jsonPort)) {
209 + description.appendText("port was " + jsonPort);
210 + return false;
211 + }
212 + } else {
213 + final String jsonPort = instructionJson.get("port").toString();
214 + description.appendText("Unmatching types ");
215 + description.appendText("instructionToMatch " + instructionToMatch.port().toString());
216 + description.appendText("jsonPort " + jsonPort);
217 + }
218 +
219 + return true;
220 + }
221 +
222 + /**
177 * Matches the contents of a mod lambda instruction. 223 * Matches the contents of a mod lambda instruction.
178 * 224 *
179 * @param instructionJson JSON instruction to match 225 * @param instructionJson JSON instruction to match
...@@ -508,6 +554,8 @@ public final class InstructionJsonMatcher extends TypeSafeDiagnosingMatcher<Json ...@@ -508,6 +554,8 @@ public final class InstructionJsonMatcher extends TypeSafeDiagnosingMatcher<Json
508 return matchGroupInstruction(jsonInstruction, description); 554 return matchGroupInstruction(jsonInstruction, description);
509 } else if (instruction instanceof MeterInstruction) { 555 } else if (instruction instanceof MeterInstruction) {
510 return matchMeterInstruction(jsonInstruction, description); 556 return matchMeterInstruction(jsonInstruction, description);
557 + } else if (instruction instanceof SetQueueInstruction) {
558 + return matchSetQueueInstruction(jsonInstruction, description);
511 } else if (instruction instanceof ModLambdaInstruction) { 559 } else if (instruction instanceof ModLambdaInstruction) {
512 return matchModLambdaInstruction(jsonInstruction, description); 560 return matchModLambdaInstruction(jsonInstruction, description);
513 } else if (instruction instanceof ModOchSignalInstruction) { 561 } else if (instruction instanceof ModOchSignalInstruction) {
...@@ -521,8 +569,7 @@ public final class InstructionJsonMatcher extends TypeSafeDiagnosingMatcher<Json ...@@ -521,8 +569,7 @@ public final class InstructionJsonMatcher extends TypeSafeDiagnosingMatcher<Json
521 } else if (instruction instanceof ModIPInstruction) { 569 } else if (instruction instanceof ModIPInstruction) {
522 return matchModIpInstruction(jsonInstruction, description); 570 return matchModIpInstruction(jsonInstruction, description);
523 } else if (instruction instanceof ModIPv6FlowLabelInstruction) { 571 } else if (instruction instanceof ModIPv6FlowLabelInstruction) {
524 - return matchModIPv6FlowLabelInstruction(jsonInstruction, 572 + return matchModIPv6FlowLabelInstruction(jsonInstruction, description);
525 - description);
526 } else if (instruction instanceof ModMplsLabelInstruction) { 573 } else if (instruction instanceof ModMplsLabelInstruction) {
527 return matchModMplsLabelInstruction(jsonInstruction, description); 574 return matchModMplsLabelInstruction(jsonInstruction, description);
528 } else if (instruction instanceof ModOduSignalIdInstruction) { 575 } else if (instruction instanceof ModOduSignalIdInstruction) {
......