From 941008ce258cee73837e86051ff8b47c75fe7258 Mon Sep 17 00:00:00 2001 From: Dana Kutenicsova Date: Thu, 21 Nov 2013 19:11:11 +0100 Subject: [PATCH] BUG-50 : added parser for Pcreq message. Adjusted processing flag handling. Change-Id: I0038d8fed20c12715b352883fcd4a2b0cb49525e Signed-off-by: Dana Kutenicsova --- .../impl/message/AbstractMessageParser.java | 16 +- .../impl/message/PCEPErrorMessageParser.java | 5 + .../PCEPNotificationMessageParser.java | 13 +- .../message/PCEPRequestMessageParser.java | 529 ++++++++++-------- .../object/PCEPEndPointsObjectParser.java | 18 +- .../PCEPRequestParameterObjectParser.java | 17 +- .../pcep/impl/PCEPObjectParserTest.java | 1 + .../protocol/pcep/impl/PCEPValidatorTest.java | 495 ++++++++-------- .../test/resources/PCEPRequestMessage1.bin | Bin 28 -> 24 bytes pcep/impl/src/test/resources/PCRep.1.bin | Bin 12 -> 12 bytes pcep/impl/src/test/resources/PCRep.2.bin | Bin 32 -> 32 bytes pcep/impl/src/test/resources/PCRep.3.bin | Bin 60 -> 60 bytes pcep/impl/src/test/resources/PCRep.5.bin | Bin 68 -> 68 bytes pcep/impl/src/test/resources/PCReq.3.bin | Bin 144 -> 64 bytes 14 files changed, 586 insertions(+), 508 deletions(-) diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/AbstractMessageParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/AbstractMessageParser.java index d9a963960f..f764f06c81 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/AbstractMessageParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/AbstractMessageParser.java @@ -17,10 +17,12 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.mes import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Object; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.ObjectHeader; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.PcerrMessage; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcep.error.object.ErrorObjectBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.PcerrMessageBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.ErrorsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.error.type.RequestBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.error.type.request.RpsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.Rp; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; @@ -138,7 +140,7 @@ public abstract class AbstractMessageParser implements MessageParser, MessageSer return objs; } - public static PcerrMessage createErrorMsg(final PCEPErrors e) { + public static Message createErrorMsg(final PCEPErrors e) { final PCEPErrorMapping maping = PCEPErrorMapping.getInstance(); return new PcerrBuilder().setPcerrMessage( new PcerrMessageBuilder().setErrors( @@ -147,6 +149,16 @@ public abstract class AbstractMessageParser implements MessageParser, MessageSer maping.getFromErrorsEnum(e).value).build()).build())).build()).build(); } + public static Message createErrorMsg(final PCEPErrors e, final Rp rp) { + final PCEPErrorMapping maping = PCEPErrorMapping.getInstance(); + return new PcerrBuilder().setPcerrMessage( + new PcerrMessageBuilder().setErrorType( + new RequestBuilder().setRps(Lists.newArrayList(new RpsBuilder().setRp(rp).build())).build()).setErrors( + Arrays.asList(new ErrorsBuilder().setErrorObject( + new ErrorObjectBuilder().setType(maping.getFromErrorsEnum(e).type).setValue( + maping.getFromErrorsEnum(e).value).build()).build())).build()).build(); + } + abstract protected Message validate(final List objects, final List errors) throws PCEPDeserializerException; @Override diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPErrorMessageParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPErrorMessageParser.java index a4b92e7aed..831f2c83f4 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPErrorMessageParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPErrorMessageParser.java @@ -13,6 +13,7 @@ import java.util.List; import org.opendaylight.protocol.pcep.spi.ObjectHandlerRegistry; import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException; +import org.opendaylight.protocol.pcep.spi.PCEPErrors; import org.opendaylight.protocol.pcep.spi.UnknownObject; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.PcerrBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message; @@ -97,6 +98,10 @@ public class PCEPErrorMessageParser extends AbstractMessageParser { objects.remove(0); } else if (obj instanceof Rp) { final Rp o = ((Rp) obj); + if (o.isProcessingRule()) { + errors.add(createErrorMsg(PCEPErrors.P_FLAG_NOT_SET)); + return null; + } requestParameters.add(new RpsBuilder().setRp(o).build()); state = State.RpIn; objects.remove(0); diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPNotificationMessageParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPNotificationMessageParser.java index c1dc700cac..1cdec11e64 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPNotificationMessageParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPNotificationMessageParser.java @@ -13,6 +13,7 @@ import java.util.List; import org.opendaylight.protocol.pcep.spi.ObjectHandlerRegistry; import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException; +import org.opendaylight.protocol.pcep.spi.PCEPErrors; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.PcntfBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Object; @@ -67,7 +68,6 @@ public class PCEPNotificationMessageParser extends AbstractMessageParser { if (objects == null) { throw new IllegalArgumentException("Passed list can't be null."); } - if (objects.isEmpty()) { throw new PCEPDeserializerException("Notification message cannot be empty."); } @@ -76,27 +76,24 @@ public class PCEPNotificationMessageParser extends AbstractMessageParser { while (!objects.isEmpty()) { org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcntf.message.pcntf.message.Notifications comObj; - comObj = getValidNotificationComposite(objects); + comObj = getValidNotificationComposite(objects, errors); if (comObj == null) { break; } compositeNotifications.add(comObj); } - if (compositeNotifications.isEmpty()) { throw new PCEPDeserializerException("Atleast one Notifications is mandatory."); } - if (!objects.isEmpty()) { throw new PCEPDeserializerException("Unprocessed Objects: " + objects); } - return new PcntfBuilder().setPcntfMessage(new PcntfMessageBuilder().setNotifications(compositeNotifications).build()).build(); } private static org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcntf.message.pcntf.message.Notifications getValidNotificationComposite( - final List objects) { + final List objects, final List errors) { final List requestParameters = Lists.newArrayList(); final List notifications = Lists.newArrayList(); Object obj; @@ -109,6 +106,10 @@ public class PCEPNotificationMessageParser extends AbstractMessageParser { state = State.RpIn; if (obj instanceof Rp) { final Rp rp = (Rp) obj; + if (rp.isProcessingRule()) { + errors.add(createErrorMsg(PCEPErrors.P_FLAG_NOT_SET)); + return null; + } requestParameters.add(new RpsBuilder().setRp(rp).build()); state = State.Init; break; diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPRequestMessageParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPRequestMessageParser.java index 709e911813..02ef0159ef 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPRequestMessageParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPRequestMessageParser.java @@ -13,13 +13,44 @@ import java.util.List; import org.opendaylight.protocol.pcep.spi.ObjectHandlerRegistry; import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException; +import org.opendaylight.protocol.pcep.spi.PCEPErrors; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.Pcreq; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.PcreqBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.PcrepMessage; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Object; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.bandwidth.object.Bandwidth; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.bandwidth.object.BandwidthBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.classtype.object.ClassType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.endpoints.object.EndpointsObj; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.exclude.route.object.Xro; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.gc.object.Gc; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.include.route.object.Iro; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.load.balancing.object.LoadBalancing; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lsp.attributes.Metrics; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lsp.attributes.MetricsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lsp.object.Lsp; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lspa.object.Lspa; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.metric.object.Metric; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.of.object.Of; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.path.key.object.PathKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.PcreqMessageBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.pcreq.message.Requests; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.pcreq.message.RequestsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.pcreq.message.Svec; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.pcreq.message.SvecBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.pcreq.message.requests.PathKeyExpansionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.pcreq.message.requests.SegmentComputation; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.pcreq.message.requests.SegmentComputationBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.pcreq.message.requests.segment.computation.P2pBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.pcreq.message.requests.segment.computation.p2p.ReportedRouteBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.reported.route.object.Rro; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.Rp; + +import com.google.common.collect.Lists; /** - * Parser for {@link PcrepMessage} + * Parser for {@link Pcreq} */ -// FIXME finish public class PCEPRequestMessageParser extends AbstractMessageParser { public static final int TYPE = 3; @@ -30,260 +61,264 @@ public class PCEPRequestMessageParser extends AbstractMessageParser { @Override public void serializeMessage(final Message message, final ByteBuf buffer) { - if (!(message instanceof PcrepMessage)) { + if (!(message instanceof Pcreq)) { throw new IllegalArgumentException("Wrong instance of PCEPMessage. Passed instance of " + message.getClass() + ". Needed PcrepMessage."); } + } @Override protected Message validate( final List objects, final List errors) throws PCEPDeserializerException { - // if (objects == null) - // throw new IllegalArgumentException("Passed list can't be null."); - // - // final List msgs = Lists.newArrayList(); - // final List svecList = new ArrayList(); - // - // CompositeRequestSvecObject svecComp; - // while (!objects.isEmpty()) { - // try { - // if ((svecComp = getValidSvecComposite(objects)) == null) - // break; - // } catch (final PCEPDocumentedException e) { - // msgs.add(new PCEPErrorMessage(new PCEPErrorObject(e.getError()))); - // return msgs; - // } - // - // svecList.add(svecComp); - // } - // - // while (!objects.isEmpty()) { - // final List requests = new ArrayList(); - // PCEPRequestParameterObject rpObj = null; - // boolean requestRejected = false; - // - // if (objects.get(0) instanceof PCEPRequestParameterObject) { - // rpObj = (PCEPRequestParameterObject) objects.get(0); - // objects.remove(rpObj); - // if (!rpObj.isProcessed()) { - // msgs.add(new PCEPErrorMessage(new CompositeErrorObject(rpObj, new PCEPErrorObject(PCEPErrors.P_FLAG_NOT_SET)))); - // requestRejected = true; - // } - // - // } else { - // // if RP obj is missing return error only; - // msgs.clear(); - // msgs.add(new PCEPErrorMessage(new PCEPErrorObject(PCEPErrors.RP_MISSING))); - // return msgs; - // } - // - // PCEPEndPointsObject endPoints = null; - // if (objects.get(0) instanceof PCEPEndPointsObject) { - // endPoints = (PCEPEndPointsObject) objects.get(0); - // objects.remove(0); - // if (!endPoints.isProcessed()) { - // msgs.add(new PCEPErrorMessage(new CompositeErrorObject(copyRP(rpObj, false), new - // PCEPErrorObject(PCEPErrors.P_FLAG_NOT_SET)))); - // requestRejected = true; - // } - // } else { - // msgs.add(new PCEPErrorMessage(new CompositeErrorObject(copyRP(rpObj, false), new - // PCEPErrorObject(PCEPErrors.END_POINTS_MISSING)))); - // requestRejected = true; - // } - // - // // ignore all continual end-points objects - // while (!objects.isEmpty() && objects.get(0) instanceof PCEPEndPointsObject) { - // objects.remove(0); - // } - // - // PCEPClassTypeObject classType = null; - // PCEPLspObject lsp = null; - // PCEPLspaObject lspa = null; - // PCEPRequestedPathBandwidthObject bandwidth = null; - // final List metrics = new ArrayList(); - // PCEPReportedRouteObject rro = null; - // PCEPExistingPathBandwidthObject rroBandwidth = null; - // PCEPIncludeRouteObject iro = null; - // PCEPLoadBalancingObject loadBalancing = null; - // - // int state = 1; - // while (!objects.isEmpty()) { - // final Object obj = objects.get(0); - // if (obj instanceof UnknownObject) { - // if (((UnknownObject) obj).isProcessingRule()) { - // msgs.add(new PCEPErrorMessage(new CompositeErrorObject(copyRP(rpObj, false), new PCEPErrorObject(((UnknownObject) - // obj).getError())))); - // requestRejected = true; - // } - // - // objects.remove(0); - // continue; - // } - // switch (state) { - // case 1: - // state = 2; - // if (obj instanceof PCEPClassTypeObject) { - // classType = (PCEPClassTypeObject) obj; - // if (!classType.isProcessed()) { - // msgs.add(new PCEPErrorMessage(new CompositeErrorObject(copyRP(rpObj, false), new - // PCEPErrorObject(PCEPErrors.P_FLAG_NOT_SET)))); - // requestRejected = true; - // } - // break; - // } - // case 2: - // state = 3; - // if (obj instanceof PCEPLspObject) { - // lsp = (PCEPLspObject) obj; - // break; - // } - // case 3: - // state = 4; - // if (obj instanceof PCEPLspaObject) { - // lspa = (PCEPLspaObject) obj; - // break; - // } - // case 4: - // state = 5; - // if (obj instanceof PCEPRequestedPathBandwidthObject) { - // bandwidth = (PCEPRequestedPathBandwidthObject) obj; - // break; - // } - // case 5: - // state = 6; - // if (obj instanceof PCEPMetricObject) { - // metrics.add((PCEPMetricObject) obj); - // state = 5; - // - // break; - // } - // case 6: - // state = 8; - // if (obj instanceof PCEPReportedRouteObject) { - // rro = (PCEPReportedRouteObject) obj; - // state = 7; - // break; - // } - // case 7: - // state = 8; - // if (obj instanceof PCEPExistingPathBandwidthObject) { - // rroBandwidth = (PCEPExistingPathBandwidthObject) obj; - // break; - // } - // case 8: - // state = 9; - // if (obj instanceof PCEPIncludeRouteObject) { - // iro = (PCEPIncludeRouteObject) obj; - // break; - // } - // case 9: - // if (obj instanceof PCEPLoadBalancingObject) { - // loadBalancing = (PCEPLoadBalancingObject) obj; - // break; - // } - // state = 10; - // } - // - // if (state == 10) { - // break; - // } - // - // objects.remove(obj); - // } - // - // if (rpObj.isReoptimized() && bandwidth != null && bandwidth.getBandwidth() != new Bandwidth(new byte[] { 0 }) && - // rro == null) { - // msgs.add(new PCEPErrorMessage(new CompositeErrorObject(copyRP(rpObj, false), new - // PCEPErrorObject(PCEPErrors.RRO_MISSING)))); - // requestRejected = true; - // } - // - // if (!requestRejected) { - // requests.add(new CompositeRequestObject(rpObj, endPoints, classType, lsp, lspa, bandwidth, metrics, rro, - // rroBandwidth, iro, loadBalancing)); - // msgs.add(new PCEPRequestMessage(Collections.unmodifiableList(svecList), Collections.unmodifiableList(requests))); - // } - // } - // - // return msgs; - // } - // - // private static CompositeRequestSvecObject getValidSvecComposite(final List objects) throws - // PCEPDocumentedException { - // if (objects == null || objects.isEmpty()) { - // throw new IllegalArgumentException("List cannot be null or empty."); - // } - // - // PCEPSvecObject svec = null; - // if (objects.get(0) instanceof PCEPSvecObject) { - // svec = (PCEPSvecObject) objects.get(0); - // objects.remove(svec); - // } else - // return null; - // - // PCEPObjectiveFunctionObject of = null; - // PCEPGlobalConstraintsObject gc = null; - // PCEPExcludeRouteObject xro = null; - // final List metrics = new ArrayList(); - // - // int state = 1; - // while (!objects.isEmpty()) { - // final Object obj = objects.get(0); - // - // if (obj instanceof UnknownObject && ((UnknownObject) obj).isProcessingRule()) { - // throw new PCEPDocumentedException("Unknown object in SVEC list.", ((UnknownObject) obj).getError()); - // } - // - // switch (state) { - // case 1: - // state = 2; - // if (obj instanceof PCEPObjectiveFunctionObject) { - // of = (PCEPObjectiveFunctionObject) obj; - // break; - // } - // case 2: - // state = 3; - // if (obj instanceof PCEPGlobalConstraintsObject) { - // gc = (PCEPGlobalConstraintsObject) obj; - // break; - // } - // case 3: - // state = 4; - // if (obj instanceof PCEPExcludeRouteObject) { - // xro = (PCEPExcludeRouteObject) obj; - // break; - // } - // case 4: - // state = 5; - // if (obj instanceof PCEPMetricObject) { - // metrics.add((PCEPMetricObject) obj); - // state = 4; - // - // break; - // } - // } - // - // if (state == 5) - // break; - // - // objects.remove(obj); - // } - // - // return new CompositeRequestSvecObject(svec, of, gc, xro, metrics); - // } - // - // private static PCEPRequestParameterObject copyRP(final PCEPRequestParameterObject origRp, final boolean - // processed) { - // return new PCEPRequestParameterObject(origRp.isLoose(), origRp.isBidirectional(), origRp.isReoptimized(), - // origRp.isMakeBeforeBreak(), origRp.isReportRequestOrder(), origRp.isSuplyOFOnResponse(), - // origRp.isFragmentation(), origRp.isP2mp(), origRp.isEroCompression(), origRp.getPriority(), - // origRp.getRequestID(), origRp.getTlvs(), processed, origRp.isIgnored()); - // } + if (objects == null) { + throw new IllegalArgumentException("Passed list can't be null."); + } + + final List requests = Lists.newArrayList(); + final List svecList = Lists.newArrayList(); + while (!objects.isEmpty()) { + final RequestsBuilder rBuilder = new RequestsBuilder(); + Rp rpObj = null; + if (objects.get(0) instanceof Rp) { + rpObj = (Rp) objects.get(0); + objects.remove(0); + if (!rpObj.isProcessingRule()) { + errors.add(createErrorMsg(PCEPErrors.P_FLAG_NOT_SET)); + } else { + rBuilder.setRp(rpObj); + } + } else { + // if RP obj is missing return error only; + errors.add(createErrorMsg(PCEPErrors.RP_MISSING)); + return null; + } + + // expansion + if (rpObj.isPathKey()) { + if (objects.get(0) instanceof PathKey) { + rBuilder.setPathKeyExpansion(new PathKeyExpansionBuilder().setPathKey((PathKey) objects.get(0)).build()); + } + continue; + } + + final P2pBuilder p2pBuilder = new P2pBuilder(); + + if (objects.get(0) instanceof EndpointsObj) { + final EndpointsObj ep = (EndpointsObj) objects.get(0); + objects.remove(0); + if (!ep.isProcessingRule()) { + errors.add(createErrorMsg(PCEPErrors.P_FLAG_NOT_SET, rpObj)); + } else { + p2pBuilder.setEndpointsObj(ep); + } + } else { + errors.add(createErrorMsg(PCEPErrors.END_POINTS_MISSING, rpObj)); + return null; + } + // p2p + if (!rpObj.isP2mp()) { + final SegmentComputation segm = getSegmentComputation(p2pBuilder, objects, errors, rpObj); + if (segm != null) { + rBuilder.setSegmentComputation(segm); + } + } + while (!objects.isEmpty()) { + final SvecBuilder sBuilder = new SvecBuilder(); + final Svec svecComp = getValidSvec(sBuilder, objects); + if (svecComp == null) { + break; + } + svecList.add(svecComp); + } + } + + final PcreqMessageBuilder mBuilder = new PcreqMessageBuilder(); + mBuilder.setRequests(requests); + if (!svecList.isEmpty()) { + mBuilder.setSvec(svecList); + } + return new PcreqBuilder().setPcreqMessage(mBuilder.build()).build(); + } + + private SegmentComputation getSegmentComputation(final P2pBuilder builder, final List objects, final List errors, + final Rp rp) { + final List metrics = Lists.newArrayList(); + + State state = State.Init; + while (!objects.isEmpty() && state != State.End) { + Object obj = objects.get(0); + + switch (state) { + case Init: + state = State.ReportedIn; + if (obj instanceof Rro) { + final ReportedRouteBuilder rrBuilder = new ReportedRouteBuilder(); + rrBuilder.setRro((Rro) obj); + objects.remove(0); + obj = objects.get(0); + if (obj instanceof Bandwidth) { + rrBuilder.setBandwidth((Bandwidth) obj); + } + break; + } + case ReportedIn: + state = State.LoadBIn; + if (obj instanceof LoadBalancing) { + builder.setLoadBalancing((LoadBalancing) obj); + break; + } + case LoadBIn: + state = State.LspaIn; + if (obj instanceof Lspa) { + builder.setLspa((Lspa) obj); + break; + } + case LspaIn: + state = State.BandwidthIn; + if (obj instanceof Bandwidth) { + builder.setBandwidth((Bandwidth) obj); + break; + } + case BandwidthIn: + state = State.MetricIn; + if (obj instanceof Metric) { + metrics.add(new MetricsBuilder().setMetric((Metric) obj).build()); + state = State.BandwidthIn; + break; + } + case MetricIn: + state = State.IroIn; + if (obj instanceof Iro) { + builder.setIro((Iro) obj); + break; + } + case IroIn: + state = State.RroIn; + if (obj instanceof Rro) { + builder.setRro((Rro) obj); + break; + } + case RroIn: + state = State.XroIn; + if (obj instanceof Xro) { + builder.setXro((Xro) obj); + break; + } + case XroIn: + state = State.OfIn; + if (obj instanceof Of) { + builder.setOf((Of) obj); + break; + } + case OfIn: + state = State.CtIn; + if (obj instanceof ClassType) { + final ClassType classType = (ClassType) obj; + if (!classType.isProcessingRule()) { + errors.add(createErrorMsg(PCEPErrors.P_FLAG_NOT_SET, rp)); + } else { + builder.setClassType(classType); + } + break; + } + case CtIn: + state = State.LspIn; + if (obj instanceof Lsp) { + builder.setLsp((Lsp) obj); + break; + } + case LspIn: + state = State.End; + break; + case End: + break; + } + if (!state.equals(State.End)) { + objects.remove(0); + } + } + if (!metrics.isEmpty()) { + builder.setMetrics(metrics); + } + + if (rp.isReoptimization() + && builder.getBandwidth() != null + && builder.getReportedRoute().getBandwidth().getBandwidth() != new BandwidthBuilder().setBandwidth( + new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nps.concepts.rev130930.Bandwidth(new byte[] { 0 })).build() + && builder.getReportedRoute().getRro() == null) { + errors.add(createErrorMsg(PCEPErrors.RRO_MISSING, rp)); + return null; + } + return new SegmentComputationBuilder().setP2p(builder.build()).build(); + } + + private enum State { + Init, ReportedIn, LoadBIn, LspaIn, BandwidthIn, MetricIn, IroIn, RroIn, XroIn, OfIn, CtIn, LspIn, End + } + + private Svec getValidSvec(final SvecBuilder builder, final List objects) { + if (objects == null || objects.isEmpty()) { + throw new IllegalArgumentException("List cannot be null or empty."); + } + + if (objects.get(0) instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.svec.object.Svec) { + builder.setSvec((org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.svec.object.Svec) objects.get(0)); + objects.remove(0); + } else { + return null; + } + + final List metrics = Lists.newArrayList(); + + Object obj = null; + SvecState state = SvecState.Init; + while (!objects.isEmpty() && !state.equals(SvecState.End)) { + obj = objects.get(0); + + switch (state) { + case Init: + state = SvecState.OfIn; + if (obj instanceof Of) { + builder.setOf((Of) obj); + break; + } + case OfIn: + state = SvecState.GcIn; + if (obj instanceof Gc) { + builder.setGc((Gc) obj); + break; + } + case GcIn: + state = SvecState.XroIn; + if (obj instanceof Xro) { + builder.setXro((Xro) obj); + break; + } + case XroIn: + state = SvecState.MetricIn; + if (obj instanceof Metric) { + metrics.add(new MetricsBuilder().setMetric((Metric) obj).build()); + state = SvecState.XroIn; + + break; + } + case MetricIn: + state = SvecState.End; + break; + case End: + break; + } + if (!state.equals(SvecState.End)) { + objects.remove(0); + } + } + return builder.build(); + } - return null; + private enum SvecState { + Init, OfIn, GcIn, XroIn, MetricIn, End } @Override diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPEndPointsObjectParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPEndPointsObjectParser.java index 170bff9f6f..8754c2e648 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPEndPointsObjectParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPEndPointsObjectParser.java @@ -10,7 +10,9 @@ package org.opendaylight.protocol.pcep.impl.object; import org.opendaylight.protocol.concepts.Ipv4Util; import org.opendaylight.protocol.concepts.Ipv6Util; import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException; +import org.opendaylight.protocol.pcep.spi.PCEPErrors; import org.opendaylight.protocol.pcep.spi.TlvHandlerRegistry; +import org.opendaylight.protocol.pcep.spi.UnknownObject; import org.opendaylight.protocol.util.ByteArray; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Object; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.ObjectHeader; @@ -22,12 +24,16 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.endpoints.address.family.Ipv6Builder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.endpoints.object.EndpointsObj; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.endpoints.object.EndpointsObjBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Parser for IPv4 {@link EndpointsObj} */ public class PCEPEndPointsObjectParser extends AbstractObjectWithTlvsParser { + private static final Logger LOG = LoggerFactory.getLogger(PCEPEndPointsObjectParser.class); + public static final int CLASS = 4; public static final int TYPE = 1; @@ -54,16 +60,10 @@ public class PCEPEndPointsObjectParser extends AbstractObjectWithTlvsParser requests = new ArrayList(); - // final byte[] ipAdress = { (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF }; - // requests.add(new CompositeRequestObject(new PCEPRequestParameterObject(true, false, false, false, false, false, - // false, false, (short) 5, 0xDEADBEEFL, true, false), new PCEPEndPointsObject(new - // IPv4Address(ipAdress), new IPv4Address(ipAdress)))); - // PCEPRequestMessage specMessage = new PCEPRequestMessage(requests); - // List deserMsgs = deserMsg("src/test/resources/PCEPRequestMessage1.bin"); - // final List specMessages = Lists.newArrayList(); - // specMessages.add(specMessage); - // - // assertEquals(deserMsgs.toString(), specMessages.toString()); - // - // requests = new ArrayList(); - // final byte[] ipAdress2 = { (byte) 0x7F, (byte) 0x00, (byte) 0x00, (byte) 0x01 }; - // requests.add(new CompositeRequestObject(this.requestParameter, new PCEPEndPointsObject(new - // IPv4Address(ipAdress2), new IPv4Address(ipAdress2)))); - // specMessage = new PCEPRequestMessage(requests); - // deserMsgs = deserMsg("src/test/resources/PCReq.1.bin"); - // specMessages.clear(); - // specMessages.add(specMessage); - // assertEquals(deserMsgs.toString(), specMessages.toString()); - // - // requests = new ArrayList(); - // requests.add(new CompositeRequestObject(this.requestParameter, new PCEPEndPointsObject(new - // IPv4Address(ipAdress2), new IPv4Address(ipAdress2)), null, null, null, null, null, null, null, null, new - // PCEPLoadBalancingObject(3, new Bandwidth(ByteArray.floatToBytes((float) 1024.75)), false))); - // specMessage = new PCEPRequestMessage(requests); - // deserMsgs = deserMsg("src/test/resources/PCReq.2.bin"); - // specMessages.clear(); - // specMessages.add(specMessage); - // assertEquals(deserMsgs.toString(), specMessages.toString()); - // - // requests = new ArrayList(); - // requests.add(new CompositeRequestObject(this.requestParameter, new PCEPEndPointsObject(new - // IPv4Address(ipAdress2), new IPv4Address(ipAdress2)), null, new PCEPLspObject(1, false, false, true, false), - // PCEPValidatorTest.lspa, new PCEPRequestedPathBandwidthObject(new Bandwidth(ByteArray.floatToBytes(1000)), false, - // false), new ArrayList() { - // private static final long serialVersionUID = 1L; - // - // { - // this.add(new PCEPMetricObject(true, true, new IGPMetric(53L), false, false)); - // } - // }, new PCEPReportedRouteObject(this.rroSubobjects, false), new PCEPExistingPathBandwidthObject(new - // Bandwidth(ByteArray.floatToBytes(5353)), false, false), new PCEPIncludeRouteObject(this.eroSubobjects, false, - // false), new PCEPLoadBalancingObject(5, new Bandwidth(ByteArray.floatToBytes(3)), false))); - // - // List svecList = new ArrayList(); - // svecList.add(new CompositeRequestSvecObject(new PCEPSvecObject(true, false, false, false, false, this.requestIds, - // false))); - // - // specMessage = new PCEPRequestMessage(svecList, requests); - // deserMsgs = deserMsg("src/test/resources/PCReq.3.bin"); - // specMessages.clear(); - // specMessages.add(specMessage); - // // FIXME BUG-89 - // // assertEquals(deserMsgs, specMessages); - // - // specMessages.clear(); - // requests = new ArrayList(); - // requests.add(new CompositeRequestObject(this.requestParameter, new PCEPEndPointsObject(new - // IPv4Address(ipAdress2), new IPv4Address(ipAdress2)), null, null, null, null, null, null, null, null, null)); - // specMessages.add(new PCEPRequestMessage(requests)); - // - // final byte[] ipAdress3 = { (byte) 0x7F, (byte) 0x00, (byte) 0x30, (byte) 0x01 }; - // requests = new ArrayList(); - // requests.add(new CompositeRequestObject(new PCEPRequestParameterObject(false, false, false, false, false, false, - // false, false, (short) 4, 1, true, false), new PCEPEndPointsObject(new IPv4Address(ipAdress3), new - // IPv4Address(ipAdress2)), null, null, null, null, null, null, null, null, null)); - // specMessages.add(new PCEPRequestMessage(requests)); - // - // final byte[] ipAdress4 = { (byte) 0x7F, (byte) 0x30, (byte) 0x00, (byte) 0x01 }; - // requests = new ArrayList(); - // requests.add(new CompositeRequestObject(this.requestParameter, new PCEPEndPointsObject(new - // IPv4Address(ipAdress2), new IPv4Address(ipAdress4)), null, null, null, null, null, null, null, null, null)); - // specMessages.add(new PCEPRequestMessage(requests)); - // - // final byte[] ipAdress5 = { (byte) 0x7F, (byte) 0xd0, (byte) 0x00, (byte) 0x01 }; - // requests = new ArrayList(); - // requests.add(new CompositeRequestObject(new PCEPRequestParameterObject(true, false, false, false, false, false, - // false, false, (short) 1, 1, true, false), new PCEPEndPointsObject(new IPv4Address(ipAdress5), new - // IPv4Address(ipAdress5)), null, null, null, null, null, null, null, null, null)); - // - // specMessages.add(new PCEPRequestMessage(requests)); - // deserMsgs = deserMsg("src/test/resources/PCReq.4.bin"); - // assertEquals(deserMsgs.toString(), specMessages.toString()); - // - // specMessages.clear(); - // svecList = new ArrayList(); - // svecList.add(new CompositeRequestSvecObject(new PCEPSvecObject(true, false, false, false, false, this.requestIds, - // false))); - // svecList.add(new CompositeRequestSvecObject(new PCEPSvecObject(false, true, true, false, false, this.requestIds, - // false), new PCEPObjectiveFunctionObject(PCEPOFCodes.MCC, true, false), new PCEPGlobalConstraintsObject((short) - // 0x55, (short) 1, (short) 100, (short) 0x26, true, false), new PCEPExcludeRouteObject(new - // ArrayList() { - // private static final long serialVersionUID = 1L; - // - // { - // this.add(new XROAsNumberSubobject(new AsNumber((long) 0x12), true)); - // } - // }, true, true, false), new ArrayList() { - // private static final long serialVersionUID = 1L; - // - // { - // this.add(new PCEPMetricObject(true, true, new TEMetric(123456L), true, false)); - // } - // })); - // - // requests = new ArrayList(); - // requests.add(new CompositeRequestObject(this.requestParameter, new PCEPEndPointsObject(new - // IPv4Address(ipAdress2), new IPv4Address(ipAdress2)), null, null, PCEPValidatorTest.lspa, new - // PCEPRequestedPathBandwidthObject(new Bandwidth(ByteArray.floatToBytes(1000)), false, false), new - // ArrayList() { - // private static final long serialVersionUID = 1L; - // - // { - // this.add(new PCEPMetricObject(true, true, new IGPMetric(53L), false, false)); - // this.add(new PCEPMetricObject(true, true, new IGPMetric(5335L), false, false)); - // this.add(new PCEPMetricObject(true, true, new IGPMetric(128256), false, false)); - // } - // }, new PCEPReportedRouteObject(this.rroSubobjects, false), new PCEPExistingPathBandwidthObject(new - // Bandwidth(ByteArray.floatToBytes(5353)), false, false), new PCEPIncludeRouteObject(this.eroSubobjects, false, - // false), new PCEPLoadBalancingObject(5, new Bandwidth(ByteArray.floatToBytes(3)), false))); - // - // final byte[] ipAdress6 = { (byte) 0x7F, (byte) 0xF0, (byte) 0x00, (byte) 0x01 }; - // specMessages.add(new PCEPRequestMessage(svecList, requests)); - // - // requests = new ArrayList(); - // requests.add(new CompositeRequestObject(this.requestParameter, new PCEPEndPointsObject(new - // IPv4Address(ipAdress6), new IPv4Address(ipAdress6)), null, null, PCEPValidatorTest.lspa, new - // PCEPRequestedPathBandwidthObject(new Bandwidth(ByteArray.floatToBytes(1000)), false, false), new - // ArrayList() { - // private static final long serialVersionUID = 1L; - // - // { - // this.add(new PCEPMetricObject(true, true, new IGPMetric(53L), false, false)); - // } - // }, new PCEPReportedRouteObject(this.rroSubobjects, false), new PCEPExistingPathBandwidthObject(new - // Bandwidth(ByteArray.floatToBytes(5353)), false, false), new PCEPIncludeRouteObject(this.eroSubobjects, false, - // false), new PCEPLoadBalancingObject(5, new Bandwidth(ByteArray.floatToBytes(3f)), false))); - // deserMsgs = deserMsg("src/test/resources/PCReq.5.bin"); - // specMessages.add(new PCEPRequestMessage(svecList, requests)); - // // FIXME - // // assertEquals(deserMsgs, specMessages); - // - // // FIXME: need construct with invalid processed parameter - // // assertEquals(deserMsg("src/test/resources/PCReq.6.invalid.bin"), - // // asList( - // // new PCEPErrorMessage(new CompositeErrorObject(new - // // PCEPRequestParameterObject(true, false, false, false, false, false, - // // false, false, (short) 3, - // // 1L, false, false), new PCEPErrorObject(PCEPErrors.P_FLAG_NOT_SET))), - // // new PCEPRequestMessage(asList(new - // // CompositeRequestObject(this.requestParameter, new - // // PCEPEndPointsObject(IPv4Address - // // .getNetworkAddressFactory().getNetworkAddressForBytes(new byte[] { - // // 127, 0, 0, 1 }), IPv4Address.getNetworkAddressFactory() - // // .getNetworkAddressForBytes(new byte[] { 127, 0, 0, 1 })), null, null, - // // null, null, null, null, null, null, new PCEPLoadBalancingObject( - // // 3, new Bandwidth(1024.75), false)))))); - // - // } - // - // @Test - // public void testRequestMessageValidationFromRawMsg() throws PCEPDeserializerException { - // List objs = new ArrayList(); - // List msgs; - // PCEPRequestParameterObject tmpRP; - // - // // test unrecognized object in svec list - // objs.add(this.svecObj); - // objs.add(new UnknownObject(true, false, PCEPErrors.UNRECOGNIZED_OBJ_CLASS)); - // objs.add(new PCEPSvecObject(true, true, true, false, false, PCEPValidatorTest.this.requestIds, true)); - // - // msgs = PCEPMessageValidator.getValidator(PCEPMessageType.REQUEST).validate(objs); - // - // assertEquals(msgs.get(0).toString(), new PCEPErrorMessage(new ArrayList() { - // private static final long serialVersionUID = 1L; - // - // { - // this.add(new PCEPErrorObject(PCEPErrors.UNRECOGNIZED_OBJ_CLASS)); - // } - // }).toString()); - // - // // test with request p flag not set and ignoracion of more than one - // // end-points objects - // objs = new ArrayList(); - // objs.add(this.svecObj); - // objs.add(this.svecObj); - // tmpRP = new PCEPRequestParameterObject(true, false, false, false, false, false, false, false, (short) 3, 1, - // false, false); - // objs.add(tmpRP); - // objs.add(this.endPoints); - // - // objs.add(this.requestParameter); - // objs.add(this.endPoints); - // objs.add(this.endPoints); - // // FIXME:mv use object constructor with set processed flag - // // objs.add(this.classTypeProvider); - // // objs.add(this.requestParameter); - // // objs.add(this.endPointsProvider); - // // objs.add(new PCEPClassTypeObjectProvider((short) 7, false)); - // - // msgs = PCEPMessageValidator.getValidator(PCEPMessageType.REQUEST).validate(objs); - // // FIXME:mv use object constructor with set processed flag - // // assertEquals(msgs.get(0), new PCEPErrorMessage(new - // // CompositeErrorObject(tmpRP, new - // // PCEPErrorObject(PCEPErrors.P_FLAG_NOT_SET)))); - // // assertEquals( - // // msgs.get(1), - // // new PCEPRequestMessage(asList(new - // // CompositeRequestSvecObject(this.svecObj), new - // // CompositeRequestSvecObject(this.svecObj)), Util - // // .asList(new CompositeRequestObject(this.requestParameter, - // // this.endPoints, this.classType, null, null, null, null, null, null, - // // null, - // // null)))); - // // assertEquals(msgs.get(2), new PCEPErrorMessage(new - // // CompositeErrorObject(tmpRP, new - // // PCEPErrorObject(PCEPErrors.P_FLAG_NOT_SET)))); - // } - // + @Test + public void testRequestMsg() throws IOException, PCEPDeserializerException { + byte[] result = ByteArray.fileToBytes("src/test/resources/PCEPRequestMessage1.bin"); + + final PCEPRequestMessageParser parser = new PCEPRequestMessageParser(this.objectRegistry); + + final PcreqMessageBuilder builder = new PcreqMessageBuilder(); + final List reqs1 = Lists.newArrayList(); + final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.pcreq.message.RequestsBuilder rBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.pcreq.message.RequestsBuilder(); + rBuilder.setRp(this.rpTrue); + rBuilder.setSegmentComputation(new SegmentComputationBuilder().setP2p(new P2pBuilder().setEndpointsObj(this.endpoints).build()).build()); + builder.setRequests(reqs1); + + assertEquals(new PcreqBuilder().setPcreqMessage(builder.build()).build(), + parser.parseMessage(result, Collections. emptyList())); + ByteBuf buf = Unpooled.buffer(result.length); + parser.serializeMessage(new PcreqBuilder().setPcreqMessage(builder.build()).build(), buf); + // assertArrayEquals(result, buf.array()); + + result = ByteArray.fileToBytes("src/test/resources/PCReq.3.bin"); + + final List reqs2 = Lists.newArrayList(); + final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.pcreq.message.RequestsBuilder rBuilder1 = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.pcreq.message.RequestsBuilder(); + rBuilder1.setRp(this.rpTrue); + final P2pBuilder p2pBuilder = new P2pBuilder(); + p2pBuilder.setEndpointsObj(this.endpoints); + p2pBuilder.setLsp(this.lsp); + p2pBuilder.setMetrics(Lists.newArrayList(this.metrics)); + p2pBuilder.setIro(this.iro); + rBuilder1.setSegmentComputation(new SegmentComputationBuilder().setP2p(p2pBuilder.build()).build()); + builder.setRequests(reqs2); + builder.setSvec(Lists.newArrayList(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.pcreq.message.SvecBuilder().setSvec( + this.svec).build())); + + assertEquals(new PcreqBuilder().setPcreqMessage(builder.build()).build(), + parser.parseMessage(result, Collections. emptyList())); + buf = Unpooled.buffer(result.length); + parser.serializeMessage(new PcreqBuilder().setPcreqMessage(builder.build()).build(), buf); + // assertArrayEquals(result, buf.array()); + + // specMessages.clear(); + // requests = new ArrayList(); + // requests.add(new CompositeRequestObject(this.requestParameter, new PCEPEndPointsObject(new + // IPv4Address(ipAdress2), new IPv4Address(ipAdress2)), null, null, null, null, null, null, null, null, null)); + // specMessages.add(new PCEPRequestMessage(requests)); + // + // final byte[] ipAdress3 = { (byte) 0x7F, (byte) 0x00, (byte) 0x30, (byte) 0x01 }; + // requests = new ArrayList(); + // requests.add(new CompositeRequestObject(new PCEPRequestParameterObject(false, false, false, false, false, + // false, + // false, false, (short) 4, 1, true, false), new PCEPEndPointsObject(new IPv4Address(ipAdress3), + // new + // IPv4Address(ipAdress2)), null, null, null, null, null, null, null, null, null)); + // specMessages.add(new PCEPRequestMessage(requests)); + // + // final byte[] ipAdress4 = { (byte) 0x7F, (byte) 0x30, (byte) 0x00, (byte) 0x01 }; + // requests = new ArrayList(); + // requests.add(new CompositeRequestObject(this.requestParameter, new PCEPEndPointsObject(new + // IPv4Address(ipAdress2), new IPv4Address(ipAdress4)), null, null, null, null, null, null, null, null, null)); + // specMessages.add(new PCEPRequestMessage(requests)); + // + // final byte[] ipAdress5 = { (byte) 0x7F, (byte) 0xd0, (byte) 0x00, (byte) 0x01 }; + // requests = new ArrayList(); + // requests.add(new CompositeRequestObject(new PCEPRequestParameterObject(true, false, false, false, false, + // false, + // false, false, (short) 1, 1, true, false), new PCEPEndPointsObject(new IPv4Address(ipAdress5), + // new + // IPv4Address(ipAdress5)), null, null, null, null, null, null, null, null, null)); + // + // specMessages.add(new PCEPRequestMessage(requests)); + // deserMsgs = deserMsg("src/test/resources/PCReq.4.bin"); + // assertEquals(deserMsgs.toString(), specMessages.toString()); + // + // specMessages.clear(); + // svecList = new ArrayList(); + // svecList.add(new CompositeRequestSvecObject(new PCEPSvecObject(true, false, false, false, false, + // this.requestIds, + // false))); + // svecList.add(new CompositeRequestSvecObject(new PCEPSvecObject(false, true, true, false, false, + // this.requestIds, + // false), new PCEPObjectiveFunctionObject(PCEPOFCodes.MCC, true, false), new + // PCEPGlobalConstraintsObject((short) + // 0x55, (short) 1, (short) 100, (short) 0x26, true, false), new PCEPExcludeRouteObject(new + // ArrayList() { + // private static final long serialVersionUID = 1L; + // + // { + // this.add(new XROAsNumberSubobject(new AsNumber((long) 0x12), true)); + // } + // }, true, true, false), new ArrayList() { + // private static final long serialVersionUID = 1L; + // + // { + // this.add(new PCEPMetricObject(true, true, new TEMetric(123456L), true, false)); + // } + // })); + // + // requests = new ArrayList(); + // requests.add(new CompositeRequestObject(this.requestParameter, new PCEPEndPointsObject(new + // IPv4Address(ipAdress2), new IPv4Address(ipAdress2)), null, null, PCEPValidatorTest.lspa, new + // PCEPRequestedPathBandwidthObject(new Bandwidth(ByteArray.floatToBytes(1000)), false, false), new + // ArrayList() { + // private static final long serialVersionUID = 1L; + // + // { + // this.add(new PCEPMetricObject(true, true, new IGPMetric(53L), false, false)); + // this.add(new PCEPMetricObject(true, true, new IGPMetric(5335L), false, false)); + // this.add(new PCEPMetricObject(true, true, new IGPMetric(128256), false, false)); + // } + // }, new PCEPReportedRouteObject(this.rroSubobjects, false), new PCEPExistingPathBandwidthObject(new + // Bandwidth(ByteArray.floatToBytes(5353)), false, false), new PCEPIncludeRouteObject(this.eroSubobjects, false, + // false), new PCEPLoadBalancingObject(5, new Bandwidth(ByteArray.floatToBytes(3)), false))); + // + // final byte[] ipAdress6 = { (byte) 0x7F, (byte) 0xF0, (byte) 0x00, (byte) 0x01 }; + // specMessages.add(new PCEPRequestMessage(svecList, requests)); + // + // requests = new ArrayList(); + // requests.add(new CompositeRequestObject(this.requestParameter, new PCEPEndPointsObject(new + // IPv4Address(ipAdress6), new IPv4Address(ipAdress6)), null, null, PCEPValidatorTest.lspa, new + // PCEPRequestedPathBandwidthObject(new Bandwidth(ByteArray.floatToBytes(1000)), false, false), new + // ArrayList() { + // private static final long serialVersionUID = 1L; + // + // { + // this.add(new PCEPMetricObject(true, true, new IGPMetric(53L), false, false)); + // } + // }, new PCEPReportedRouteObject(this.rroSubobjects, false), new PCEPExistingPathBandwidthObject(new + // Bandwidth(ByteArray.floatToBytes(5353)), false, false), new PCEPIncludeRouteObject(this.eroSubobjects, false, + // false), new PCEPLoadBalancingObject(5, new Bandwidth(ByteArray.floatToBytes(3f)), false))); + // deserMsgs = deserMsg("src/test/resources/PCReq.5.bin"); + // specMessages.add(new PCEPRequestMessage(svecList, requests)); + // // FIXME + // // assertEquals(deserMsgs, specMessages); + // + // // FIXME: need construct with invalid processed parameter + // // assertEquals(deserMsg("src/test/resources/PCReq.6.invalid.bin"), + // // asList( + // // new PCEPErrorMessage(new CompositeErrorObject(new + // // PCEPRequestParameterObject(true, false, false, false, false, false, + // // false, false, (short) 3, + // // 1L, false, false), new PCEPErrorObject(PCEPErrors.P_FLAG_NOT_SET))), + // // new PCEPRequestMessage(asList(new + // // CompositeRequestObject(this.requestParameter, new + // // PCEPEndPointsObject(IPv4Address + // // .getNetworkAddressFactory().getNetworkAddressForBytes(new byte[] { + // // 127, 0, 0, 1 }), IPv4Address.getNetworkAddressFactory() + // // .getNetworkAddressForBytes(new byte[] { 127, 0, 0, 1 })), null, null, + // // null, null, null, null, null, null, new PCEPLoadBalancingObject( + // // 3, new Bandwidth(1024.75), false)))))); + // + // } + // + // @Test + // public void testRequestMessageValidationFromRawMsg() throws PCEPDeserializerException { + // List objs = new ArrayList(); + // List msgs; + // PCEPRequestParameterObject tmpRP; + // + // // test unrecognized object in svec list + // objs.add(this.svecObj); + // objs.add(new UnknownObject(true, false, PCEPErrors.UNRECOGNIZED_OBJ_CLASS)); + // objs.add(new PCEPSvecObject(true, true, true, false, false, PCEPValidatorTest.this.requestIds, true)); + // + // msgs = PCEPMessageValidator.getValidator(PCEPMessageType.REQUEST).validate(objs); + // + // assertEquals(msgs.get(0).toString(), new PCEPErrorMessage(new ArrayList() { + // private static final long serialVersionUID = 1L; + // + // { + // this.add(new PCEPErrorObject(PCEPErrors.UNRECOGNIZED_OBJ_CLASS)); + // } + // }).toString()); + // + // // test with request p flag not set and ignoracion of more than one + // // end-points objects + // objs = new ArrayList(); + // objs.add(this.svecObj); + // objs.add(this.svecObj); + // tmpRP = new PCEPRequestParameterObject(true, false, false, false, false, false, false, false, (short) 3, 1, + // false, false); + // objs.add(tmpRP); + // objs.add(this.endPoints); + // + // objs.add(this.requestParameter); + // objs.add(this.endPoints); + // objs.add(this.endPoints); + // // FIXME:mv use object constructor with set processed flag + // // objs.add(this.classTypeProvider); + // // objs.add(this.requestParameter); + // // objs.add(this.endPointsProvider); + // // objs.add(new PCEPClassTypeObjectProvider((short) 7, false)); + // + // msgs = PCEPMessageValidator.getValidator(PCEPMessageType.REQUEST).validate(objs); + // // FIXME:mv use object constructor with set processed flag + // // assertEquals(msgs.get(0), new PCEPErrorMessage(new + // // CompositeErrorObject(tmpRP, new + // // PCEPErrorObject(PCEPErrors.P_FLAG_NOT_SET)))); + // // assertEquals( + // // msgs.get(1), + // // new PCEPRequestMessage(asList(new + // // CompositeRequestSvecObject(this.svecObj), new + // // CompositeRequestSvecObject(this.svecObj)), Util + // // .asList(new CompositeRequestObject(this.requestParameter, + // // this.endPoints, this.classType, null, null, null, null, null, null, + // // null, + // // null)))); + // // assertEquals(msgs.get(2), new PCEPErrorMessage(new + // // CompositeErrorObject(tmpRP, new + // // PCEPErrorObject(PCEPErrors.P_FLAG_NOT_SET)))); + } @Test public void testReplyMsg() throws IOException, PCEPDeserializerException { @@ -550,7 +571,7 @@ public class PCEPValidatorTest { RepliesBuilder rBuilder = new RepliesBuilder(); final List replies1 = Lists.newArrayList(); - rBuilder.setRp(this.rp); + rBuilder.setRp(this.rpTrue); replies1.add(rBuilder.build()); builder.setReplies(replies1); @@ -564,10 +585,10 @@ public class PCEPValidatorTest { result = ByteArray.fileToBytes("src/test/resources/PCRep.2.bin"); final List replies2 = Lists.newArrayList(); rBuilder = new RepliesBuilder(); - rBuilder.setRp(this.rp); + rBuilder.setRp(this.rpTrue); replies2.add(rBuilder.build()); final RepliesBuilder rBuilder2 = new RepliesBuilder(); - rBuilder2.setRp(this.rp); + rBuilder2.setRp(this.rpTrue); rBuilder2.setResult(new FailureBuilder().setNoPath(this.noPath).build()); replies2.add(rBuilder2.build()); builder.setReplies(replies2); @@ -582,7 +603,7 @@ public class PCEPValidatorTest { result = ByteArray.fileToBytes("src/test/resources/PCRep.3.bin"); final List replies3 = Lists.newArrayList(); rBuilder = new RepliesBuilder(); - rBuilder.setRp(this.rp); + rBuilder.setRp(this.rpTrue); rBuilder.setResult(new FailureBuilder().setNoPath(this.noPath).setLspa(this.lspa).setMetrics(Lists.newArrayList(this.metrics)).setIro( this.iro).build()); replies3.add(rBuilder.build()); @@ -598,7 +619,7 @@ public class PCEPValidatorTest { result = ByteArray.fileToBytes("src/test/resources/PCRep.5.bin"); final List replies4 = Lists.newArrayList(); rBuilder = new RepliesBuilder(); - rBuilder.setRp(this.rp); + rBuilder.setRp(this.rpTrue); final List paths = Lists.newArrayList(); final PathsBuilder paBuilder = new PathsBuilder(); paBuilder.setEro(this.ero); @@ -757,7 +778,7 @@ public class PCEPValidatorTest { innerNot.add(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcntf.message.pcntf.message.notifications.NotificationsBuilder().setCNotification( cn1).build()); final List rps = Lists.newArrayList(); - rps.add(new RpsBuilder().setRp(this.rp).build()); + rps.add(new RpsBuilder().setRp(this.rpFalse).build()); final byte[] result = ByteArray.fileToBytes("src/test/resources/PCNtf.5.bin"); @@ -776,8 +797,8 @@ public class PCEPValidatorTest { innerNot1.add(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcntf.message.pcntf.message.notifications.NotificationsBuilder().setCNotification( cn1).build()); final List rps1 = Lists.newArrayList(); - rps1.add(new RpsBuilder().setRp(this.rp).build()); - rps1.add(new RpsBuilder().setRp(this.rp).build()); + rps1.add(new RpsBuilder().setRp(this.rpFalse).build()); + rps1.add(new RpsBuilder().setRp(this.rpFalse).build()); b.setNotifications(innerNot1); b.setRps(rps1); @@ -816,7 +837,7 @@ public class PCEPValidatorTest { final List rps = Lists.newArrayList(); rps.add(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.error.type.request.RpsBuilder().setRp( - this.rp).build()); + this.rpFalse).build()); innerErr = Lists.newArrayList(); innerErr.add(new ErrorsBuilder().setErrorObject(error1).build()); diff --git a/pcep/impl/src/test/resources/PCEPRequestMessage1.bin b/pcep/impl/src/test/resources/PCEPRequestMessage1.bin index 1d3555fbfeeba56dd9c580d191c98bd34dc3478d..0f62209f80a366037f638e9263157f8332009fad 100644 GIT binary patch literal 24 XcmZP)V&Gw5U{C~NE*2pBKNJ7}D$@vN literal 28 dcmY#jW{_bLV&Gw5U{JlccHeszAp1WQ003XG3)cVu diff --git a/pcep/impl/src/test/resources/PCRep.1.bin b/pcep/impl/src/test/resources/PCRep.1.bin index 5140c6c0f3bdbe9e73ec51babbe97cec6ba0b34e..c1e2d5e676074dfa9c96b565bbdbc84d0445a47b 100644 GIT binary patch literal 12 RcmZP)V&Gw5U{C~NE&u`r089V? literal 12 RcmZP)VBle3U{C~NE&u`V07?J= diff --git a/pcep/impl/src/test/resources/PCRep.2.bin b/pcep/impl/src/test/resources/PCRep.2.bin index 085ce75578e947b15ab962afe9ef1c2a9d071d99..848b6b1b6121f1b8e294b4e771b0f4b9bc48c777 100644 GIT binary patch literal 32 bcmZP)V&Gw5U{C~NE+!;4vj77JP>cZp4E6xB literal 32 bcmZP)VBle3U{C~NE+!;4vj77JP>cZp43Yq@ diff --git a/pcep/impl/src/test/resources/PCRep.3.bin b/pcep/impl/src/test/resources/PCRep.3.bin index ac80c48072e22d716b8577014c9d869c26c20956..dbf28ee4d5ab83d16e44d3b058c294ee432135b0 100644 GIT binary patch delta 8 PcmcDqVPX=R$Ycco1=|5! delta 8 PcmcDqVPX=P$Ycco1=9gq diff --git a/pcep/impl/src/test/resources/PCRep.5.bin b/pcep/impl/src/test/resources/PCRep.5.bin index 029052974c612573a9908a3b46f71dfb1bedb4a7..42d6e04fa41cee0121a383d68f7f5fcc05147b3e 100644 GIT binary patch delta 8 PcmZ>9VPX=R$m9e723rAi delta 8 PcmZ>9VPX=P$m9e722%lY diff --git a/pcep/impl/src/test/resources/PCReq.3.bin b/pcep/impl/src/test/resources/PCReq.3.bin index cec3f19c16be75275051f8b2f2b7acef8b5a0926..8b73bbffbd163c81b132e338442e357ad5eb34eb 100644 GIT binary patch literal 64 zcmZP)V&Gw5U{C~NE*2pBKNPSDfW;Ys;tX5@3>*q9|NkohX$A%X25yKPNQw~vxQPor literal 144 zcmY#jW|+V&z`(=6z`zK?OhRC`GKkFrWY+^}5LOUi;9y`7VBr*C5CO`e09K%!OBDkH z8`vCXMyC)41`YwBVvwnVO2!QT8UC{>FmSjo_h8@x>Q`X-{~uY74`M&7g98Ht0JldC A!vFvP -- 2.36.6