Committed by
Gerrit Code Review
Support to encode and decode setqueue id in InstructionCodec
Change-Id: I911e14b750d5264755687a9eff322502ba9ed118
Showing
4 changed files
with
85 additions
and
16 deletions
... | @@ -233,32 +233,42 @@ public final class DecodeInstructionCodecHelper { | ... | @@ -233,32 +233,42 @@ public final class DecodeInstructionCodecHelper { |
233 | } | 233 | } |
234 | 234 | ||
235 | /** | 235 | /** |
236 | - * Decodes the JSON into an instruction object. | 236 | + * Extracts port number of the given json node. |
237 | * | 237 | * |
238 | - * @return Criterion object | 238 | + * @param jsonNode json node |
239 | - * @throws IllegalArgumentException if the JSON is invalid | 239 | + * @return port number |
240 | */ | 240 | */ |
241 | - public Instruction decode() { | 241 | + private PortNumber getPortNumber(ObjectNode jsonNode) { |
242 | - String type = json.get(InstructionCodec.TYPE).asText(); | ||
243 | - | ||
244 | - if (type.equals(Instruction.Type.OUTPUT.name())) { | ||
245 | PortNumber portNumber; | 242 | PortNumber portNumber; |
246 | - if (json.get(InstructionCodec.PORT).isLong() || json.get(InstructionCodec.PORT).isInt()) { | 243 | + if (jsonNode.get(InstructionCodec.PORT).isLong() || jsonNode.get(InstructionCodec.PORT).isInt()) { |
247 | portNumber = PortNumber | 244 | portNumber = PortNumber |
248 | - .portNumber(nullIsIllegal(json.get(InstructionCodec.PORT) | 245 | + .portNumber(nullIsIllegal(jsonNode.get(InstructionCodec.PORT) |
249 | .asLong(), InstructionCodec.PORT | 246 | .asLong(), InstructionCodec.PORT |
250 | + InstructionCodec.MISSING_MEMBER_MESSAGE)); | 247 | + InstructionCodec.MISSING_MEMBER_MESSAGE)); |
251 | - } else if (json.get(InstructionCodec.PORT).isTextual()) { | 248 | + } else if (jsonNode.get(InstructionCodec.PORT).isTextual()) { |
252 | portNumber = PortNumber | 249 | portNumber = PortNumber |
253 | - .fromString(nullIsIllegal(json.get(InstructionCodec.PORT) | 250 | + .fromString(nullIsIllegal(jsonNode.get(InstructionCodec.PORT) |
254 | .textValue(), InstructionCodec.PORT | 251 | .textValue(), InstructionCodec.PORT |
255 | + InstructionCodec.MISSING_MEMBER_MESSAGE)); | 252 | + InstructionCodec.MISSING_MEMBER_MESSAGE)); |
256 | } else { | 253 | } else { |
257 | throw new IllegalArgumentException("Port value " | 254 | throw new IllegalArgumentException("Port value " |
258 | - + json.get(InstructionCodec.PORT).toString() | 255 | + + jsonNode.get(InstructionCodec.PORT).toString() |
259 | + " is not supported"); | 256 | + " is not supported"); |
260 | } | 257 | } |
261 | - return Instructions.createOutput(portNumber); | 258 | + return portNumber; |
259 | + } | ||
260 | + | ||
261 | + /** | ||
262 | + * Decodes the JSON into an instruction object. | ||
263 | + * | ||
264 | + * @return Criterion object | ||
265 | + * @throws IllegalArgumentException if the JSON is invalid | ||
266 | + */ | ||
267 | + public Instruction decode() { | ||
268 | + String type = json.get(InstructionCodec.TYPE).asText(); | ||
269 | + | ||
270 | + if (type.equals(Instruction.Type.OUTPUT.name())) { | ||
271 | + return Instructions.createOutput(getPortNumber(json)); | ||
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) { | ... | ... |
-
Please register or login to post a comment