private OFAction buildModOchSignalInstruction(ModOchSignalInstruction instruction) {
    OchSignal signal = instruction.lambda();
    byte gridType = OpenFlowValueMapper.lookupGridType(signal.gridType());
    byte channelSpacing = OpenFlowValueMapper.lookupChannelSpacing(signal.channelSpacing());

    return factory()
        .actions()
        .circuit(
            factory()
                .oxms()
                .ochSigidBasic(
                    new CircuitSignalID(
                        gridType,
                        channelSpacing,
                        (short) signal.spacingMultiplier(),
                        (short) signal.slotGranularity())));
  }
  /**
   * Matches the 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;
  }