Sho SHIMIZU
Committed by Gerrit Code Review

Support ModOchSignalInstruction in InstructionCodec

Resolve ONOS-1875

Change-Id: I63e10aeb4689991bfb5c6df349843ef5aff4d6f7
......@@ -17,6 +17,7 @@ package org.onosproject.codec.impl;
import org.onosproject.codec.CodecContext;
import org.onosproject.codec.JsonCodec;
import org.onosproject.net.OchSignal;
import org.onosproject.net.flow.instructions.Instruction;
import org.onosproject.net.flow.instructions.Instructions;
import org.onosproject.net.flow.instructions.L0ModificationInstruction;
......@@ -52,6 +53,16 @@ public final class InstructionCodec extends JsonCodec<Instruction> {
result.put("lambda", modLambdaInstruction.lambda());
break;
case OCH:
L0ModificationInstruction.ModOchSignalInstruction ochSignalInstruction =
(L0ModificationInstruction.ModOchSignalInstruction) instruction;
OchSignal ochSignal = ochSignalInstruction.lambda();
result.put("gridType", ochSignal.gridType().name());
result.put("channelSpacing", ochSignal.channelSpacing().name());
result.put("spacingMultiplier", ochSignal.spacingMultiplier());
result.put("slotGranularity", ochSignal.slotGranularity());
break;
default:
log.info("Cannot convert L0 subtype of {}", instruction.subtype());
}
......
......@@ -24,6 +24,9 @@ import org.onlab.packet.MplsLabel;
import org.onlab.packet.VlanId;
import org.onosproject.codec.CodecContext;
import org.onosproject.codec.JsonCodec;
import org.onosproject.net.ChannelSpacing;
import org.onosproject.net.GridType;
import org.onosproject.net.Lambda;
import org.onosproject.net.PortNumber;
import org.onosproject.net.flow.instructions.Instruction;
import org.onosproject.net.flow.instructions.Instructions;
......@@ -105,6 +108,19 @@ public class InstructionCodecTest {
}
/**
* Tests the encoding of mod OCh signal instructions.
*/
@Test
public void modOchSignalInstructionTest() {
L0ModificationInstruction.ModOchSignalInstruction instruction =
(L0ModificationInstruction.ModOchSignalInstruction)
Instructions.modL0Lambda(Lambda.ochSignal(GridType.DWDM, ChannelSpacing.CHL_100GHZ, 4, 8));
ObjectNode instructionJson =
instructionCodec.encode(instruction, context);
assertThat(instructionJson, matchesInstruction(instruction));
}
/**
* Tests the encoding of mod ether instructions.
*/
@Test
......
......@@ -133,6 +133,57 @@ public final class InstructionJsonMatcher extends TypeSafeDiagnosingMatcher<Json
}
/**
* Matches teh contents of a mod OCh singal instruction.
*
* @param instructionJson JSON instruction to match
* @param description Description object used for recording errors
* @return true if contents matches, false otherwise
*/
private boolean matchModOchSingalInstruction(JsonNode instructionJson,
Description description) {
ModOchSignalInstruction instructionToMatch =
(ModOchSignalInstruction) instruction;
String jsonSubType = instructionJson.get("subtype").textValue();
if (!instructionToMatch.subtype().name().equals(jsonSubType)) {
description.appendText("subtype was " + jsonSubType);
return false;
}
String jsonType = instructionJson.get("type").textValue();
if (!instructionToMatch.type().name().equals(jsonType)) {
description.appendText("type was " + jsonType);
return false;
}
String jsonGridType = instructionJson.get("gridType").textValue();
if (!instructionToMatch.lambda().gridType().name().equals(jsonGridType)) {
description.appendText("gridType was " + jsonGridType);
return false;
}
String jsonChannelSpacing = instructionJson.get("channelSpacing").textValue();
if (!instructionToMatch.lambda().channelSpacing().name().equals(jsonChannelSpacing)) {
description.appendText("channelSpacing was " + jsonChannelSpacing);
return false;
}
int jsonSpacingMultiplier = instructionJson.get("spacingMultiplier").intValue();
if (instructionToMatch.lambda().spacingMultiplier() != jsonSpacingMultiplier) {
description.appendText("spacingMultiplier was " + jsonSpacingMultiplier);
return false;
}
int jsonSlotGranularity = instructionJson.get("slotGranularity").intValue();
if (instructionToMatch.lambda().slotGranularity() != jsonSlotGranularity) {
description.appendText("slotGranularity was " + jsonSlotGranularity);
return false;
}
return true;
}
/**
* Matches the contents of a mod Ethernet instruction.
*
* @param instructionJson JSON instruction to match
......@@ -350,6 +401,8 @@ public final class InstructionJsonMatcher extends TypeSafeDiagnosingMatcher<Json
return matchOutputInstruction(jsonInstruction, description);
} else if (instruction instanceof ModLambdaInstruction) {
return matchModLambdaInstruction(jsonInstruction, description);
} else if (instruction instanceof ModOchSignalInstruction) {
return matchModOchSingalInstruction(jsonInstruction, description);
} else if (instruction instanceof ModEtherInstruction) {
return matchModEtherInstruction(jsonInstruction, description);
} else if (instruction instanceof ModVlanIdInstruction) {
......