From f3943ad27a8e3ccfe22a7ed5ab40bf73e7a82375 Mon Sep 17 00:00:00 2001 From: Milos Fabian Date: Tue, 28 Oct 2014 10:54:14 +0100 Subject: [PATCH] Bug-2226: RFC5886 - Messages parsers/serializers -new messages PCMonReq and PCMonRep parsers/serializers implementation -extended PCReq and PCRep message parsers/serializer -fixed and refactored PCReq message parser Change-Id: I53081c1cdca7d8e0acedc24e25260f31f76032cd Signed-off-by: Milos Fabian --- .../protocol/pcep/impl/Activator.java | 58 +++++ .../PCEPMonitoringReplyMessageParser.java | 181 ++++++++++++++++ .../PCEPMonitoringRequestMessageParser.java | 89 ++++++++ .../impl/message/PCEPReplyMessageParser.java | 98 ++++++++- .../message/PCEPRequestMessageParser.java | 141 +++++++++--- .../protocol/pcep/impl/PCEPValidatorTest.java | 201 ++++++++++++++++++ pcep/impl/src/test/resources/PCMonRep.bin | Bin 0 -> 144 bytes pcep/impl/src/test/resources/PCMonReq.bin | Bin 0 -> 96 bytes pcep/impl/src/test/resources/PCRepMon.5.bin | Bin 0 -> 100 bytes pcep/impl/src/test/resources/PCReq.3.bin | Bin 60 -> 60 bytes pcep/impl/src/test/resources/PCReq.7.bin | Bin 76 -> 76 bytes pcep/impl/src/test/resources/PCReq.8.bin | Bin 0 -> 56 bytes .../routing02/SrPcRepMessageParser.java | 3 +- .../protocol/pcep/spi/PCEPErrors.java | 6 +- 14 files changed, 734 insertions(+), 43 deletions(-) create mode 100644 pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPMonitoringReplyMessageParser.java create mode 100644 pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPMonitoringRequestMessageParser.java create mode 100644 pcep/impl/src/test/resources/PCMonRep.bin create mode 100644 pcep/impl/src/test/resources/PCMonReq.bin create mode 100644 pcep/impl/src/test/resources/PCRepMon.5.bin create mode 100644 pcep/impl/src/test/resources/PCReq.8.bin diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/Activator.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/Activator.java index 10c1bc4d0d..f224ac900b 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/Activator.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/Activator.java @@ -12,6 +12,8 @@ import java.util.List; import org.opendaylight.protocol.pcep.impl.message.PCEPCloseMessageParser; import org.opendaylight.protocol.pcep.impl.message.PCEPErrorMessageParser; import org.opendaylight.protocol.pcep.impl.message.PCEPKeepAliveMessageParser; +import org.opendaylight.protocol.pcep.impl.message.PCEPMonitoringReplyMessageParser; +import org.opendaylight.protocol.pcep.impl.message.PCEPMonitoringRequestMessageParser; import org.opendaylight.protocol.pcep.impl.message.PCEPNotificationMessageParser; import org.opendaylight.protocol.pcep.impl.message.PCEPOpenMessageParser; import org.opendaylight.protocol.pcep.impl.message.PCEPReplyMessageParser; @@ -30,11 +32,18 @@ import org.opendaylight.protocol.pcep.impl.object.PCEPIncludeRouteObjectParser; import org.opendaylight.protocol.pcep.impl.object.PCEPLoadBalancingObjectParser; import org.opendaylight.protocol.pcep.impl.object.PCEPLspaObjectParser; import org.opendaylight.protocol.pcep.impl.object.PCEPMetricObjectParser; +import org.opendaylight.protocol.pcep.impl.object.PCEPMonitoringObjectParser; import org.opendaylight.protocol.pcep.impl.object.PCEPNoPathObjectParser; import org.opendaylight.protocol.pcep.impl.object.PCEPNotificationObjectParser; import org.opendaylight.protocol.pcep.impl.object.PCEPObjectiveFunctionObjectParser; import org.opendaylight.protocol.pcep.impl.object.PCEPOpenObjectParser; +import org.opendaylight.protocol.pcep.impl.object.PCEPOverloadObjectParser; import org.opendaylight.protocol.pcep.impl.object.PCEPPathKeyObjectParser; +import org.opendaylight.protocol.pcep.impl.object.PCEPPccIdReqIPv4ObjectParser; +import org.opendaylight.protocol.pcep.impl.object.PCEPPccIdReqIPv6ObjectParser; +import org.opendaylight.protocol.pcep.impl.object.PCEPPceIdIPv4ObjectParser; +import org.opendaylight.protocol.pcep.impl.object.PCEPPceIdIPv6ObjectParser; +import org.opendaylight.protocol.pcep.impl.object.PCEPProcTimeObjectParser; import org.opendaylight.protocol.pcep.impl.object.PCEPReportedRouteObjectParser; import org.opendaylight.protocol.pcep.impl.object.PCEPRequestParameterObjectParser; import org.opendaylight.protocol.pcep.impl.object.PCEPSvecObjectParser; @@ -78,6 +87,8 @@ import org.opendaylight.protocol.pcep.spi.pojo.AbstractPCEPExtensionProviderActi import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.Close; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.Keepalive; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.Pcerr; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.Pcmonrep; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.Pcmonreq; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.Pcntf; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.Pcrep; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.Pcreq; @@ -93,16 +104,21 @@ 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.load.balancing.object.LoadBalancing; 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.monitoring.object.Monitoring; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.notification.object.CNotification; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.of.list.tlv.OfList; 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.open.object.Open; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.order.tlv.Order; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.overload.duration.tlv.OverloadDuration; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.overload.object.Overload; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.path.setup.type.tlv.PathSetupType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcc.id.req.object.PccIdReq; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pce.id.object.PceId; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcep.error.object.ErrorObject; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcrep.message.pcrep.message.replies.result.failure._case.NoPath; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcrep.message.pcrep.message.replies.result.failure._case.no.path.tlvs.NoPathVector; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.proc.time.object.ProcTime; 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.req.missing.tlv.ReqMissing; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.Rp; @@ -161,6 +177,15 @@ public final class Activator extends AbstractPCEPExtensionProviderActivator { final PCEPCloseMessageParser closeParser = new PCEPCloseMessageParser(objReg); regs.add(context.registerMessageParser(PCEPCloseMessageParser.TYPE, closeParser)); regs.add(context.registerMessageSerializer(Close.class, closeParser)); + + final PCEPMonitoringReplyMessageParser monRepParser = new PCEPMonitoringReplyMessageParser(objReg); + regs.add(context.registerMessageParser(PCEPMonitoringReplyMessageParser.TYPE, monRepParser)); + regs.add(context.registerMessageSerializer(Pcmonrep.class, monRepParser)); + + final PCEPMonitoringRequestMessageParser monReqParser = new PCEPMonitoringRequestMessageParser(objReg, viObjReg); + regs.add(context.registerMessageParser(PCEPMonitoringRequestMessageParser.TYPE, monReqParser)); + regs.add(context.registerMessageSerializer(Pcmonreq.class, monReqParser)); + return regs; } @@ -258,6 +283,8 @@ public final class Activator extends AbstractPCEPExtensionProviderActivator { final PCEPGlobalConstraintsObjectParser gcParser = new PCEPGlobalConstraintsObjectParser(tlvReg, viTlvReg); regs.add(context.registerObjectParser(PCEPGlobalConstraintsObjectParser.CLASS, PCEPGlobalConstraintsObjectParser.TYPE, gcParser)); regs.add(context.registerObjectSerializer(Gc.class, gcParser)); + + registerMonitoringExtensionParsers(regs, context, tlvReg, viTlvReg); } private void registerEROParsers(final List regs, final PCEPExtensionProviderContext context, final LabelRegistry labelReg) { @@ -375,4 +402,35 @@ public final class Activator extends AbstractPCEPExtensionProviderActivator { regs.add(context.registerTlvParser(PathSetupTypeTlvParser.TYPE, pstParser)); regs.add(context.registerTlvSerializer(PathSetupType.class, pstParser)); } + + private void registerMonitoringExtensionParsers(final List regs, final PCEPExtensionProviderContext context, + final TlvRegistry tlvReg, final VendorInformationTlvRegistry viTlvReg) { + final PCEPMonitoringObjectParser monParser = new PCEPMonitoringObjectParser(tlvReg, viTlvReg); + regs.add(context.registerObjectParser(PCEPMonitoringObjectParser.CLASS, PCEPMonitoringObjectParser.TYPE, monParser)); + regs.add(context.registerObjectSerializer(Monitoring.class, monParser)); + + final PCEPPccIdReqIPv4ObjectParser pccIdIPv4Parser = new PCEPPccIdReqIPv4ObjectParser(); + regs.add(context.registerObjectParser(PCEPPccIdReqIPv4ObjectParser.CLASS, PCEPPccIdReqIPv4ObjectParser.IPV4_TYPE, pccIdIPv4Parser)); + regs.add(context.registerObjectSerializer(PccIdReq.class, pccIdIPv4Parser)); + + final PCEPPccIdReqIPv6ObjectParser pccIdIPv6Parser = new PCEPPccIdReqIPv6ObjectParser(); + regs.add(context.registerObjectParser(PCEPPccIdReqIPv6ObjectParser.CLASS, PCEPPccIdReqIPv6ObjectParser.IPV6_TYPE, pccIdIPv6Parser)); + regs.add(context.registerObjectSerializer(PccIdReq.class, pccIdIPv6Parser)); + + final PCEPPceIdIPv4ObjectParser pceIdIP4Parser = new PCEPPceIdIPv4ObjectParser(); + regs.add(context.registerObjectParser(PCEPPceIdIPv4ObjectParser.CLASS, PCEPPceIdIPv4ObjectParser.IPV4_TYPE, pceIdIP4Parser)); + regs.add(context.registerObjectSerializer(PceId.class, pceIdIP4Parser)); + + final PCEPPceIdIPv6ObjectParser pceIdIP6Parser = new PCEPPceIdIPv6ObjectParser(); + regs.add(context.registerObjectParser(PCEPPceIdIPv6ObjectParser.CLASS, PCEPPceIdIPv6ObjectParser.IPV6_TYPE, pceIdIP6Parser)); + regs.add(context.registerObjectSerializer(PceId.class, pceIdIP6Parser)); + + final PCEPProcTimeObjectParser procTimeParser = new PCEPProcTimeObjectParser(); + regs.add(context.registerObjectParser(PCEPProcTimeObjectParser.CLASS, PCEPProcTimeObjectParser.TYPE, procTimeParser)); + regs.add(context.registerObjectSerializer(ProcTime.class, procTimeParser)); + + final PCEPOverloadObjectParser overloadParser = new PCEPOverloadObjectParser(); + regs.add(context.registerObjectParser(PCEPOverloadObjectParser.CLASS, PCEPOverloadObjectParser.TYPE, overloadParser)); + regs.add(context.registerObjectSerializer(Overload.class, overloadParser)); + } } diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPMonitoringReplyMessageParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPMonitoringReplyMessageParser.java new file mode 100644 index 0000000000..a5ee099e0f --- /dev/null +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPMonitoringReplyMessageParser.java @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.protocol.pcep.impl.message; + +import com.google.common.base.Optional; +import com.google.common.base.Preconditions; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; + +import java.util.ArrayList; +import java.util.List; +import org.opendaylight.protocol.pcep.spi.AbstractMessageParser; +import org.opendaylight.protocol.pcep.spi.MessageUtil; +import org.opendaylight.protocol.pcep.spi.ObjectRegistry; +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.Pcmonrep; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.PcmonrepBuilder; +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.monitoring.metrics.MetricPce; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.monitoring.metrics.MetricPceBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.monitoring.object.Monitoring; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.monitoring.response.monitoring.metrics.list.GeneralMetricsList; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.monitoring.response.monitoring.metrics.list.GeneralMetricsListBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.monitoring.response.monitoring.metrics.list.SpecificMetricsList; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.monitoring.response.monitoring.metrics.list.SpecificMetricsListBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.monitoring.response.monitoring.metrics.list.specific.metrics.list.SpecificMetrics; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.monitoring.response.monitoring.metrics.list.specific.metrics.list.SpecificMetricsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.overload.object.Overload; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcc.id.req.object.PccIdReq; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pce.id.object.PceId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcmonrep.message.PcmonrepMessage; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcmonrep.message.PcmonrepMessageBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.proc.time.object.ProcTime; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.Rp; + +/** + * Parser for {@link Pcmonrep} + * @see https://tools.ietf.org/html/rfc5886#section-3.2 + */ +public class PCEPMonitoringReplyMessageParser extends AbstractMessageParser { + + public static final int TYPE = 9; + + public PCEPMonitoringReplyMessageParser(final ObjectRegistry registry) { + super(registry); + } + + @Override + public void serializeMessage(final Message message, final ByteBuf buffer) { + Preconditions.checkArgument(message instanceof Pcmonrep, "Wrong instance of Message. Passed instance of %s. Need Pcmonrep.", message.getClass()); + final PcmonrepMessage monRepMsg = ((Pcmonrep) message).getPcmonrepMessage(); + Preconditions.checkArgument(monRepMsg.getMonitoring() != null, "MONITORING object is mandatory."); + final ByteBuf body = Unpooled.buffer(); + serializeObject(monRepMsg.getMonitoring(), body); + serializeObject(monRepMsg.getPccIdReq(), body); + if (monRepMsg.getMonitoringMetricsList() instanceof GeneralMetricsList) { + final GeneralMetricsList gml = (GeneralMetricsList) monRepMsg.getMonitoringMetricsList(); + if (gml.getMetricPce() != null) { + for (final MetricPce metricPce : gml.getMetricPce()) { + serializeMetricPce(metricPce, body); + } + } + } else if (monRepMsg.getMonitoringMetricsList() instanceof SpecificMetricsList) { + final SpecificMetricsList sml = (SpecificMetricsList) monRepMsg.getMonitoringMetricsList(); + if (sml.getSpecificMetrics() != null) { + for (final SpecificMetrics specificMetrics : sml.getSpecificMetrics()) { + serializeObject(specificMetrics.getRp(), body); + if (specificMetrics.getMetricPce() != null) { + for (final MetricPce metricPce : specificMetrics.getMetricPce()) { + serializeMetricPce(metricPce, body); + } + } + } + } + } + + MessageUtil.formatMessage(TYPE, body, buffer); + } + + private void serializeMetricPce(final MetricPce metricPce, final ByteBuf buffer) { + Preconditions.checkArgument(metricPce.getPceId() != null, "PCE-ID must be present."); + serializeObject(metricPce.getPceId(), buffer); + serializeObject(metricPce.getProcTime(), buffer); + serializeObject(metricPce.getOverload(), buffer); + } + + @Override + protected Message validate(final List objects, final List errors) throws PCEPDeserializerException { + if (objects == null) { + throw new IllegalArgumentException("Passed list can't be null."); + } + if (objects.isEmpty()) { + throw new PCEPDeserializerException("Pcmonrep message cannot be empty."); + } + if (!(objects.get(0) instanceof Monitoring)) { + errors.add(createErrorMsg(PCEPErrors.MONITORING_OBJECT_MISSING, Optional.absent())); + return null; + } + final PcmonrepMessageBuilder builder = new PcmonrepMessageBuilder(); + builder.setMonitoring((Monitoring) objects.get(0)); + objects.remove(0); + if (!objects.isEmpty() && objects.get(0) instanceof PccIdReq) { + builder.setPccIdReq((PccIdReq) objects.get(0)); + objects.remove(0); + } + final List specificMetrics = new ArrayList<>(); + while (!objects.isEmpty()) { + final SpecificMetricsBuilder smb = new SpecificMetricsBuilder(); + final List metricPceList = new ArrayList<>(); + if (objects.get(0) instanceof Rp) { + smb.setRp((Rp) objects.get(0)); + objects.remove(0); + } + while (!objects.isEmpty() && !(objects.get(0) instanceof Rp)) { + metricPceList.add(validateMonitoringMetrics(objects)); + } + if (smb.getRp() != null) { + smb.setMetricPce(metricPceList); + specificMetrics.add(smb.build()); + } else if (!metricPceList.isEmpty()) { + builder.setMonitoringMetricsList(new GeneralMetricsListBuilder().setMetricPce(metricPceList).build()); + } + } + if (!specificMetrics.isEmpty()) { + builder.setMonitoringMetricsList(new SpecificMetricsListBuilder().setSpecificMetrics(specificMetrics).build()); + } + if (!objects.isEmpty()) { + throw new PCEPDeserializerException("Unprocessed Objects: " + objects); + } + return new PcmonrepBuilder().setPcmonrepMessage(builder.build()).build(); + } + + private MetricPce validateMonitoringMetrics(final List objects) throws PCEPDeserializerException { + final MetricPceBuilder metricPceBuilder = new MetricPceBuilder(); + if (!(objects.get(0) instanceof PceId)) { + throw new PCEPDeserializerException("metric-pce-list must start with PCE-ID object."); + } + metricPceBuilder.setPceId((PceId) (objects.get(0))); + objects.remove(0); + State state = State.START; + while (!objects.isEmpty() && !state.equals(State.END)) { + final Object obj = objects.get(0); + switch(state) { + case START : + state = State.PROC_TIME; + if (obj instanceof ProcTime) { + metricPceBuilder.setProcTime((ProcTime) obj); + break; + } + case PROC_TIME : + state = State.OVERLOAD; + if (obj instanceof Overload) { + metricPceBuilder.setOverload((Overload) obj); + break; + } + case OVERLOAD : + state = State.END; + break; + case END : + break; + } + if (!state.equals(State.END)) { + objects.remove(0); + } + } + return metricPceBuilder.build(); + } + + private enum State { + START, PROC_TIME, OVERLOAD, END; + } + +} diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPMonitoringRequestMessageParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPMonitoringRequestMessageParser.java new file mode 100644 index 0000000000..fa1b007136 --- /dev/null +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPMonitoringRequestMessageParser.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.protocol.pcep.impl.message; + +import com.google.common.base.Optional; +import com.google.common.base.Preconditions; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import java.util.List; +import org.opendaylight.protocol.pcep.spi.MessageUtil; +import org.opendaylight.protocol.pcep.spi.ObjectRegistry; +import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException; +import org.opendaylight.protocol.pcep.spi.PCEPErrors; +import org.opendaylight.protocol.pcep.spi.VendorInformationObjectRegistry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.Pcmonreq; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.PcmonreqBuilder; +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.pcreq.message.PcreqMessage; +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.MonitoringRequest; +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.Svec; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.Rp; + +/** + * Parser for {@link Pcmonreq} + * @see https://tools.ietf.org/html/rfc5886#section-3.3 + */ +public class PCEPMonitoringRequestMessageParser extends PCEPRequestMessageParser { + + public static final int TYPE = 8; + + public PCEPMonitoringRequestMessageParser(final ObjectRegistry registry, final VendorInformationObjectRegistry viRegistry) { + super(registry, viRegistry); + } + + @Override + public void serializeMessage(Message message, ByteBuf out) { + Preconditions.checkArgument(message instanceof Pcmonreq, "Wrong instance of Message. Passed instance of %s. Need Pcmonreq.", message.getClass()); + final PcreqMessage msg = ((Pcmonreq) message).getPcreqMessage(); + if (msg.getMonitoringRequest() == null) { + throw new IllegalArgumentException("MONITORING object MUST be present."); + } + final ByteBuf buffer = Unpooled.buffer(); + serializeMonitoringRequest(msg.getMonitoringRequest(), buffer); + if (msg.getSvec() != null) { + serializeSvec(msg, buffer); + } + if (msg.getRequests() != null && !msg.getRequests().isEmpty()) { + serializeRequest(msg, buffer); + } + MessageUtil.formatMessage(TYPE, buffer, out); + } + + @Override + protected Message validate(List objects, List errors) throws PCEPDeserializerException { + if (objects == null) { + throw new IllegalArgumentException("Passed list can't be null."); + } + if (objects.isEmpty()) { + throw new PCEPDeserializerException("Pcmonreq message cannot be empty."); + } + final MonitoringRequest monReq = getMonitoring(objects); + if (monReq == null) { + errors.add(createErrorMsg(PCEPErrors.MONITORING_OBJECT_MISSING, Optional.absent())); + } + final PcreqMessageBuilder mBuilder = new PcreqMessageBuilder(); + mBuilder.setMonitoringRequest(monReq); + final List svecs = getSvecs(objects, errors); + if (!svecs.isEmpty()) { + mBuilder.setSvec(svecs); + } + final List requests = getRequests(objects, errors); + if (requests != null && !requests.isEmpty()) { + mBuilder.setRequests(requests); + } + if (!objects.isEmpty()) { + throw new PCEPDeserializerException("Unprocessed Objects: " + objects); + } + return new PcmonreqBuilder().setPcreqMessage(mBuilder.build()).build(); + } +} diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPReplyMessageParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPReplyMessageParser.java index 6ef825c4e4..2a6e48a607 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPReplyMessageParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPReplyMessageParser.java @@ -30,7 +30,13 @@ 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.lsp.attributes.MetricsBuilder; 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.monitoring.metrics.MetricPce; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.monitoring.metrics.MetricPceBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.monitoring.object.Monitoring; 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.overload.object.Overload; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcc.id.req.object.PccIdReq; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pce.id.object.PceId; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcrep.message.PcrepMessageBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcrep.message.pcrep.message.Replies; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcrep.message.pcrep.message.RepliesBuilder; @@ -43,6 +49,7 @@ 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.pcrep.message.pcrep.message.replies.result.success._case.SuccessBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcrep.message.pcrep.message.replies.result.success._case.success.Paths; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcrep.message.pcrep.message.replies.result.success._case.success.PathsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.proc.time.object.ProcTime; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.Rp; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.vendor.information.objects.VendorInformationObject; @@ -76,6 +83,7 @@ public class PCEPReplyMessageParser extends AbstractMessageParser { protected void serializeReply(final Replies reply, final ByteBuf buffer) { serializeObject(reply.getRp(), buffer); + serializeMonitoring(reply, buffer); serializeVendorInformationObjects(reply.getVendorInformationObject(), buffer); if (reply.getResult() == null) { return; @@ -111,6 +119,27 @@ public class PCEPReplyMessageParser extends AbstractMessageParser { } serializeVendorInformationObjects(s.getSuccess().getVendorInformationObject(), buffer); } + serializeMonitoringMetrics(reply, buffer); + } + + private void serializeMonitoring(final Replies reply, final ByteBuf buffer) { + serializeObject(reply.getMonitoring(), buffer); + serializeObject(reply.getPccIdReq(), buffer); + } + + private void serializeMonitoringMetrics(final Replies reply, final ByteBuf buffer) { + if (reply.getMetricPce() != null) { + for (final MetricPce metricPce : reply.getMetricPce()) { + serializeMetricPce(metricPce, buffer); + } + } + } + + protected void serializeMetricPce(final MetricPce metricPce, final ByteBuf buffer) { + Preconditions.checkArgument(metricPce.getPceId() != null, "PCE-ID must be present."); + serializeObject(metricPce.getPceId(), buffer); + serializeObject(metricPce.getProcTime(), buffer); + serializeObject(metricPce.getOverload(), buffer); } @Override @@ -134,13 +163,22 @@ public class PCEPReplyMessageParser extends AbstractMessageParser { return new PcrepBuilder().setPcrepMessage(new PcrepMessageBuilder().setReplies(replies).build()).build(); } - protected Replies getValidReply(final List objects, final List errors) { + protected Replies getValidReply(final List objects, final List errors) throws PCEPDeserializerException { if (!(objects.get(0) instanceof Rp)) { errors.add(createErrorMsg(PCEPErrors.RP_MISSING, Optional.absent())); return null; } final Rp rp = (Rp) objects.get(0); objects.remove(0); + final RepliesBuilder repliesBuilder = new RepliesBuilder(); + if (!objects.isEmpty() && objects.get(0) instanceof Monitoring) { + repliesBuilder.setMonitoring((Monitoring) objects.get(0)); + objects.remove(0); + } + if (!objects.isEmpty() && objects.get(0) instanceof PccIdReq) { + repliesBuilder.setPccIdReq((PccIdReq) objects.get(0)); + objects.remove(0); + } final List vendorInfo = addVendorInformationObjects(objects); Result res = null; if (!objects.isEmpty()) { @@ -149,7 +187,7 @@ public class PCEPReplyMessageParser extends AbstractMessageParser { objects.remove(0); final FailureCaseBuilder builder = new FailureCaseBuilder(); builder.setNoPath(noPath); - while (!objects.isEmpty()) { + while (!objects.isEmpty() && !(objects.get(0) instanceof PceId)) { this.parseAttributes(builder, objects); } res = builder.build(); @@ -160,7 +198,7 @@ public class PCEPReplyMessageParser extends AbstractMessageParser { final List paths = new ArrayList<>(); final PathsBuilder pBuilder = new PathsBuilder(); pBuilder.setEro(ero); - while (!objects.isEmpty()) { + while (!objects.isEmpty() && !(objects.get(0) instanceof PceId)) { final List vendorInfoObjects = addVendorInformationObjects(objects); if (!vendorInfoObjects.isEmpty()) { builder.setVendorInformationObject(vendorInfoObjects); @@ -172,11 +210,19 @@ public class PCEPReplyMessageParser extends AbstractMessageParser { res = new SuccessCaseBuilder().setSuccess(builder.build()).build(); } } - final RepliesBuilder builder = new RepliesBuilder(); + final List metricPceList = new ArrayList<>(); + if (!objects.isEmpty() && objects.get(0) instanceof PceId) { + while (!objects.isEmpty()) { + metricPceList.add(validateMetricPce(objects)); + } + } if (!vendorInfo.isEmpty()) { - builder.setVendorInformationObject(vendorInfo); + repliesBuilder.setVendorInformationObject(vendorInfo); } - return builder.setRp(rp).setResult(res).build(); + if (!metricPceList.isEmpty()) { + repliesBuilder.setMetricPce(metricPceList); + } + return repliesBuilder.setRp(rp).setResult(res).build(); } protected void parseAttributes(final FailureCaseBuilder builder, final List objects) { @@ -290,4 +336,44 @@ public class PCEPReplyMessageParser extends AbstractMessageParser { private enum State { INIT, LSPA_IN, OF_IN, BANDWIDTH_IN, METRIC_IN, IRO_IN, END } + + protected MetricPce validateMetricPce(final List objects) throws PCEPDeserializerException { + final MetricPceBuilder metricPceBuilder = new MetricPceBuilder(); + if (!(objects.get(0) instanceof PceId)) { + throw new PCEPDeserializerException("metric-pce-list must start with PCE-ID object."); + } + metricPceBuilder.setPceId((PceId) (objects.get(0))); + objects.remove(0); + MetricPceState state = MetricPceState.START; + while (!objects.isEmpty() && !state.equals(MetricPceState.END)) { + final Object obj = objects.get(0); + switch(state) { + case START : + state = MetricPceState.PROC_TIME; + if (obj instanceof ProcTime) { + metricPceBuilder.setProcTime((ProcTime) obj); + break; + } + case PROC_TIME : + state = MetricPceState.OVERLOAD; + if (obj instanceof Overload) { + metricPceBuilder.setOverload((Overload) obj); + break; + } + case OVERLOAD : + state = MetricPceState.END; + break; + case END : + break; + } + if (!state.equals(MetricPceState.END)) { + objects.remove(0); + } + } + return metricPceBuilder.build(); + } + + private enum MetricPceState { + START, PROC_TIME, OVERLOAD, END; + } } 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 593cc33577..4adccf1ef5 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 @@ -34,14 +34,21 @@ 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.lsp.attributes.MetricsBuilder; 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.monitoring.object.Monitoring; 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.pcc.id.req.object.PccIdReq; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pce.id.object.PceId; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.PcreqMessage; 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.MonitoringRequest; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.pcreq.message.MonitoringRequestBuilder; 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.monitoring.request.PceIdList; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.pcreq.message.monitoring.request.PceIdListBuilder; 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; @@ -72,6 +79,17 @@ public class PCEPRequestMessageParser extends AbstractMessageParser { throw new IllegalArgumentException("Requests cannot be null or empty."); } final ByteBuf buffer = Unpooled.buffer(); + if (msg.getMonitoringRequest() != null) { + serializeMonitoringRequest(msg.getMonitoringRequest(), buffer); + } + if (msg.getSvec() != null) { + serializeSvec(msg, buffer); + } + serializeRequest(msg, buffer); + MessageUtil.formatMessage(TYPE, buffer, out); + } + + protected void serializeRequest(final PcreqMessage msg, final ByteBuf buffer) { for (final Requests req : msg.getRequests()) { serializeObject(req.getRp(), buffer); serializeVendorInformationObjects(req.getVendorInformationObject(), buffer); @@ -85,21 +103,21 @@ public class PCEPRequestMessageParser extends AbstractMessageParser { } } } - if (msg.getSvec() != null) { - for (final Svec s : msg.getSvec()) { - serializeObject(s.getSvec(), buffer); - serializeObject(s.getOf(), buffer); - serializeObject(s.getGc(), buffer); - serializeObject(s.getXro(), buffer); - if (s.getMetric() != null) { - for (final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.pcreq.message.svec.Metric m : s.getMetric()) { - serializeObject(m.getMetric(), buffer); - } + } + + protected void serializeSvec(final PcreqMessage msg, final ByteBuf buffer) { + for (final Svec s : msg.getSvec()) { + serializeObject(s.getSvec(), buffer); + serializeObject(s.getOf(), buffer); + serializeObject(s.getGc(), buffer); + serializeObject(s.getXro(), buffer); + if (s.getMetric() != null) { + for (final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.pcreq.message.svec.Metric m : s.getMetric()) { + serializeObject(m.getMetric(), buffer); } - serializeVendorInformationObjects(s.getVendorInformationObject(), buffer); } + serializeVendorInformationObjects(s.getVendorInformationObject(), buffer); } - MessageUtil.formatMessage(TYPE, buffer, out); } protected void serializeP2P(final ByteBuf buffer, final P2p p2p) { @@ -127,15 +145,57 @@ public class PCEPRequestMessageParser extends AbstractMessageParser { serializeObject(p2p.getClassType(), buffer); } + protected void serializeMonitoringRequest(final MonitoringRequest monReq, final ByteBuf out) { + serializeObject(monReq.getMonitoring(), out); + serializeObject(monReq.getPccIdReq(), out); + if (monReq.getPceIdList() != null) { + for (final PceIdList pceId : monReq.getPceIdList()) { + serializeObject(pceId.getPceId(), out); + } + } + } + @Override - protected Message validate( - final List objects, - final List errors) throws PCEPDeserializerException { + 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 requests = new ArrayList<>(); + if (objects.isEmpty()) { + throw new PCEPDeserializerException("Pcrep message cannot be empty."); + } + final PcreqMessageBuilder mBuilder = new PcreqMessageBuilder(); + mBuilder.setMonitoringRequest(getMonitoring(objects)); + final List svecs = getSvecs(objects, errors); + if (!svecs.isEmpty()) { + mBuilder.setSvec(svecs); + } + final List requests = getRequests(objects, errors); + if (requests != null && !requests.isEmpty()) { + mBuilder.setRequests(requests); + } else { + errors.add(createErrorMsg(PCEPErrors.RP_MISSING, Optional.absent())); + } + if (!objects.isEmpty()) { + throw new PCEPDeserializerException("Unprocessed Objects: " + objects); + } + return new PcreqBuilder().setPcreqMessage(mBuilder.build()).build(); + } + + protected List getSvecs(final List objects, final List errors) { final List svecList = new ArrayList<>(); + while (!objects.isEmpty()) { + final SvecBuilder sBuilder = new SvecBuilder(); + final Svec svecComp = getValidSvec(sBuilder, objects); + if (svecComp == null) { + break; + } + svecList.add(svecComp); + } + return svecList; + } + + protected List getRequests(final List objects, final List errors) { + final List requests = new ArrayList<>(); while (!objects.isEmpty()) { final RequestsBuilder rBuilder = new RequestsBuilder(); Rp rpObj = null; @@ -166,7 +226,7 @@ public class PCEPRequestMessageParser extends AbstractMessageParser { final P2pBuilder p2pBuilder = new P2pBuilder(); - if (objects.get(0) instanceof EndpointsObj) { + if (!objects.isEmpty() && objects.get(0) instanceof EndpointsObj) { final EndpointsObj ep = (EndpointsObj) objects.get(0); objects.remove(0); if (!ep.isProcessingRule()) { @@ -185,23 +245,9 @@ public class PCEPRequestMessageParser extends AbstractMessageParser { rBuilder.setSegmentComputation(segm); } } - while (!objects.isEmpty()) { - final SvecBuilder sBuilder = new SvecBuilder(); - final Svec svecComp = getValidSvec(sBuilder, objects); - if (svecComp == null) { - break; - } - svecList.add(svecComp); - } requests.add(rBuilder.build()); } - - final PcreqMessageBuilder mBuilder = new PcreqMessageBuilder(); - mBuilder.setRequests(requests); - if (!svecList.isEmpty()) { - mBuilder.setSvec(svecList); - } - return new PcreqBuilder().setPcreqMessage(mBuilder.build()).build(); + return requests; } protected SegmentComputation getSegmentComputation(final P2pBuilder builder, final List objects, final List errors, @@ -331,11 +377,13 @@ public class PCEPRequestMessageParser extends AbstractMessageParser { 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)) { + + 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; } - 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); final List metrics = new ArrayList<>(); final List viObjects = new ArrayList<>(); @@ -399,4 +447,27 @@ public class PCEPRequestMessageParser extends AbstractMessageParser { private enum SvecState { INIT, OF_IN, GC_IN, XRO_IN, METRIC_IN, VENDOR_INFO, END } + + protected MonitoringRequest getMonitoring(final List objects) { + final MonitoringRequestBuilder builder = new MonitoringRequestBuilder(); + if (!objects.isEmpty() && objects.get(0) instanceof Monitoring) { + builder.setMonitoring((Monitoring) objects.get(0)); + objects.remove(0); + } else { + return null; + } + if (!objects.isEmpty() && objects.get(0) instanceof PccIdReq) { + builder.setPccIdReq((PccIdReq) objects.get(0)); + objects.remove(0); + } + final List pceIdList = new ArrayList<>(); + while(!objects.isEmpty() && objects.get(0) instanceof PceId) { + pceIdList.add(new PceIdListBuilder().setPceId((PceId) objects.get(0)).build()); + objects.remove(0); + } + if (!pceIdList.isEmpty()) { + builder.setPceIdList(pceIdList); + } + return builder.build(); + } } diff --git a/pcep/impl/src/test/java/org/opendaylight/protocol/pcep/impl/PCEPValidatorTest.java b/pcep/impl/src/test/java/org/opendaylight/protocol/pcep/impl/PCEPValidatorTest.java index 27096cc673..ca4a51c938 100644 --- a/pcep/impl/src/test/java/org/opendaylight/protocol/pcep/impl/PCEPValidatorTest.java +++ b/pcep/impl/src/test/java/org/opendaylight/protocol/pcep/impl/PCEPValidatorTest.java @@ -24,6 +24,8 @@ import org.opendaylight.protocol.pcep.impl.TestVendorInformationTlvParser.TestEn import org.opendaylight.protocol.pcep.impl.message.PCEPCloseMessageParser; import org.opendaylight.protocol.pcep.impl.message.PCEPErrorMessageParser; import org.opendaylight.protocol.pcep.impl.message.PCEPKeepAliveMessageParser; +import org.opendaylight.protocol.pcep.impl.message.PCEPMonitoringReplyMessageParser; +import org.opendaylight.protocol.pcep.impl.message.PCEPMonitoringRequestMessageParser; import org.opendaylight.protocol.pcep.impl.message.PCEPNotificationMessageParser; import org.opendaylight.protocol.pcep.impl.message.PCEPOpenMessageParser; import org.opendaylight.protocol.pcep.impl.message.PCEPReplyMessageParser; @@ -33,6 +35,7 @@ import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException; import org.opendaylight.protocol.pcep.spi.VendorInformationObjectRegistry; import org.opendaylight.protocol.pcep.spi.pojo.SimplePCEPExtensionProviderContext; import org.opendaylight.protocol.util.ByteArray; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.iana.rev130816.EnterpriseNumber; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ieee754.rev130819.Float32; @@ -40,6 +43,8 @@ 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.message.rev131007.KeepaliveBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.OpenBuilder; 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.message.rev131007.PcmonrepBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.PcmonreqBuilder; 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.message.rev131007.PcrepBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.PcreqBuilder; @@ -66,12 +71,26 @@ 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.lspa.object.Lspa; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lspa.object.LspaBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.metric.object.MetricBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.monitoring.metrics.MetricPce; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.monitoring.metrics.MetricPceBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.monitoring.object.Monitoring; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.monitoring.object.Monitoring.Flags; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.monitoring.object.MonitoringBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.monitoring.response.monitoring.metrics.list.GeneralMetricsListBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.monitoring.response.monitoring.metrics.list.SpecificMetricsListBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.monitoring.response.monitoring.metrics.list.specific.metrics.list.SpecificMetricsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.notification.object.CNotification; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.notification.object.CNotificationBuilder; 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.of.object.OfBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.message.OpenMessageBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Open; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.overload.object.Overload; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.overload.object.OverloadBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcc.id.req.object.PccIdReq; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcc.id.req.object.PccIdReqBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pce.id.object.PceId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pce.id.object.PceIdBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcep.error.object.ErrorObject; 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; @@ -81,6 +100,7 @@ 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.pcerr.message.pcerr.message.error.type.SessionCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.error.type.request._case.RequestBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.error.type.session._case.SessionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcmonrep.message.PcmonrepMessageBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcntf.message.PcntfMessageBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcntf.message.pcntf.message.Notifications; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcntf.message.pcntf.message.NotificationsBuilder; @@ -97,9 +117,14 @@ 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.pcrep.message.pcrep.message.replies.result.success._case.success.Paths; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcrep.message.pcrep.message.replies.result.success._case.success.PathsBuilder; 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.MonitoringRequestBuilder; 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.monitoring.request.PceIdList; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.pcreq.message.monitoring.request.PceIdListBuilder; 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.proc.time.object.ProcTime; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.proc.time.object.ProcTimeBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.Rp; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.RpBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.svec.object.Svec; @@ -128,6 +153,11 @@ public class PCEPValidatorTest { private EndpointsObj endpoints; private Svec svec; private List viObjects; + private Monitoring monitoring; + private PccIdReq pccIdReq; + private PceId pceId; + private ProcTime procTime; + private Overload overload; private AsNumberCase eroASSubobject; @@ -255,6 +285,23 @@ public class PCEPValidatorTest { final VendorInformationObject viObj = new VendorInformationObjectBuilder().setEnterpriseNumber(new EnterpriseNumber(0L)) .setEnterpriseSpecificInformation(esInfo).build(); this.viObjects.add(viObj); + + this.monitoring = new MonitoringBuilder() + .setMonitoringId(100L) + .setFlags(new Flags(false, false, false, false, false)) + .setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.monitoring.object.monitoring.TlvsBuilder().build()).build(); + this.pccIdReq = new PccIdReqBuilder().setIpAddress(new IpAddress(new Ipv4Address("127.0.0.1"))).build(); + this.pceId = new PceIdBuilder().setIpAddress(new IpAddress(new Ipv4Address("127.0.0.2"))).build(); + + final ProcTimeBuilder procTimeBuilder = new ProcTimeBuilder(); + procTimeBuilder.setEstimated(false); + procTimeBuilder.setCurrentProcTime(1L); + procTimeBuilder.setMinProcTime(2L); + procTimeBuilder.setMaxProcTime(3L); + procTimeBuilder.setAverageProcTime(4L); + procTimeBuilder.setVarianceProcTime(5L); + this.procTime = procTimeBuilder.build(); + this.overload = new OverloadBuilder().setDuration(120).build(); } @Test @@ -619,4 +666,158 @@ public class PCEPValidatorTest { parser.serializeMessage(new PcrepBuilder().setPcrepMessage(builder.build()).build(), buf); assertArrayEquals(result.array(), buf.array()); } + + @Test + public void testMonRepMsg() throws PCEPDeserializerException, IOException { + final PCEPMonitoringReplyMessageParser parser = new PCEPMonitoringReplyMessageParser(this.objectRegistry); + final PcmonrepMessageBuilder builder = new PcmonrepMessageBuilder(); + builder.setMonitoring(this.monitoring); + builder.setMonitoringMetricsList(new GeneralMetricsListBuilder().setMetricPce(Lists.newArrayList(new MetricPceBuilder().setPceId(this.pceId).build())).build()); + + final byte[] msgBytes = { + 0x20, 0x09, 0x00, 0x18, + /* monitoring object */ + 0x13, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, + /* pce-id object */ + 0x19, 0x10, 0x00, 0x08, 0x7f, 0x00, 0x00, 0x02 + }; + + ByteBuf result = Unpooled.wrappedBuffer(msgBytes); + assertEquals(new PcmonrepBuilder().setPcmonrepMessage(builder.build()).build(), parser.parseMessage(result.slice(4, + result.readableBytes() - 4), Collections. emptyList())); + ByteBuf buf = Unpooled.buffer(result.readableBytes()); + parser.serializeMessage(new PcmonrepBuilder().setPcmonrepMessage(builder.build()).build(), buf); + assertArrayEquals(result.array(), buf.array()); + + builder.setMonitoring(this.monitoring); + builder.setPccIdReq(this.pccIdReq); + final SpecificMetricsBuilder smBuilder = new SpecificMetricsBuilder(); + smBuilder.setRp(this.rpTrue); + final List metricPces = Lists.newArrayList(); + metricPces.add(new MetricPceBuilder().setOverload(this.overload).setPceId(this.pceId).setProcTime(this.procTime).build()); + metricPces.add(new MetricPceBuilder().setPceId(this.pceId).setProcTime(this.procTime).build()); + smBuilder.setMetricPce(metricPces); + final SpecificMetricsBuilder smBuilder2 = new SpecificMetricsBuilder(); + final List metricPces2 = Lists.newArrayList(); + smBuilder2.setRp(this.rpTrue); + metricPces2.add(new MetricPceBuilder().setOverload(this.overload).setPceId(this.pceId).build()); + smBuilder2.setMetricPce(metricPces2); + builder.setMonitoringMetricsList(new SpecificMetricsListBuilder().setSpecificMetrics(Lists.newArrayList(smBuilder.build(), smBuilder2.build())).build()); + + result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCMonRep.bin")); + assertEquals(new PcmonrepBuilder().setPcmonrepMessage(builder.build()).build(), parser.parseMessage(result.slice(4, + result.readableBytes() - 4), Collections. emptyList())); + buf = Unpooled.buffer(result.readableBytes()); + parser.serializeMessage(new PcmonrepBuilder().setPcmonrepMessage(builder.build()).build(), buf); + assertArrayEquals(result.array(), buf.array()); + } + + @Test + public void testRepWithMonitoring() throws IOException, PCEPDeserializerException { + final PCEPReplyMessageParser parser = new PCEPReplyMessageParser(this.objectRegistry, this.viObjRegistry); + + final PcrepMessageBuilder builder = new PcrepMessageBuilder(); + RepliesBuilder rBuilder = new RepliesBuilder(); + + final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCRepMon.5.bin")); + final List replies4 = Lists.newArrayList(); + rBuilder = new RepliesBuilder(); + rBuilder.setRp(this.rpTrue); + rBuilder.setMonitoring(this.monitoring); + rBuilder.setPccIdReq(pccIdReq); + rBuilder.setMetricPce(Lists.newArrayList(new MetricPceBuilder().setPceId(this.pceId).build())); + final List paths = Lists.newArrayList(); + final PathsBuilder paBuilder = new PathsBuilder(); + paBuilder.setEro(this.ero); + paBuilder.setLspa(this.lspa); + paBuilder.setMetrics(Lists.newArrayList(this.metrics)); + paBuilder.setIro(this.iro); + paBuilder.setOf(this.of); + paths.add(paBuilder.build()); + rBuilder.setResult(new SuccessCaseBuilder().setSuccess(new SuccessBuilder().setPaths(paths).build()).build()).build(); + replies4.add(rBuilder.build()); + builder.setReplies(replies4); + + assertEquals(new PcrepBuilder().setPcrepMessage(builder.build()).build(), parser.parseMessage(result.slice(4, + result.readableBytes() - 4), Collections. emptyList())); + final ByteBuf buf = Unpooled.buffer(result.readableBytes()); + parser.serializeMessage(new PcrepBuilder().setPcrepMessage(builder.build()).build(), buf); + assertArrayEquals(result.array(), buf.array()); + } + + @Test + public void testReqWithMonitoring() throws IOException, PCEPDeserializerException { + final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCReq.8.bin")); + + final PCEPRequestMessageParser parser = new PCEPRequestMessageParser(this.objectRegistry, this.viObjRegistry); + + 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()); + reqs1.add(rBuilder.build()); + final MonitoringRequestBuilder monReqBuilder = new MonitoringRequestBuilder(); + monReqBuilder.setMonitoring(this.monitoring); + monReqBuilder.setPccIdReq(this.pccIdReq); + monReqBuilder.setPceIdList(Lists.newArrayList(new PceIdListBuilder().setPceId(this.pceId).build())); + builder.setMonitoringRequest(monReqBuilder.build()); + builder.setRequests(reqs1); + + assertEquals(new PcreqBuilder().setPcreqMessage(builder.build()).build(), parser.parseMessage(result.slice(4, + result.readableBytes() - 4), Collections. emptyList())); + final ByteBuf buf = Unpooled.buffer(result.readableBytes()); + parser.serializeMessage(new PcreqBuilder().setPcreqMessage(builder.build()).build(), buf); + + assertArrayEquals(result.array(), buf.array()); + } + + @Test + public void testMonReqMsg() throws PCEPDeserializerException, IOException { + final PCEPMonitoringRequestMessageParser parser = new PCEPMonitoringRequestMessageParser(this.objectRegistry, this.viObjRegistry); + + final PcreqMessageBuilder builder = new PcreqMessageBuilder(); + final MonitoringRequestBuilder monReqBuilder = new MonitoringRequestBuilder(); + monReqBuilder.setMonitoring(this.monitoring); + monReqBuilder.setPceIdList(Lists.newArrayList(new PceIdListBuilder().setPceId(this.pceId).build())); + builder.setMonitoringRequest(monReqBuilder.build()); + final byte[] msgBytes = { + 0x20, 0x08, 0x00, 0x18, + /* monitoring object */ + 0x13, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, + /* pce-id object */ + 0x19, 0x10, 0x00, 0x08, 0x7f, 0x00, 0x00, 0x02 + }; + ByteBuf result = Unpooled.wrappedBuffer(msgBytes); + assertEquals(new PcmonreqBuilder().setPcreqMessage(builder.build()).build(), parser.parseMessage(result.slice(4, + result.readableBytes() - 4), Collections. emptyList())); + ByteBuf buf = Unpooled.buffer(result.readableBytes()); + parser.serializeMessage(new PcmonreqBuilder().setPcreqMessage(builder.build()).build(), buf); + assertArrayEquals(result.array(), buf.array()); + + result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCMonReq.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.setMetrics(Lists.newArrayList(this.metrics)); + p2pBuilder.setIro(this.iro); + rBuilder1.setSegmentComputation(new SegmentComputationBuilder().setP2p(p2pBuilder.build()).build()); + reqs2.add(rBuilder1.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())); + monReqBuilder.setMonitoring(this.monitoring); + monReqBuilder.setPccIdReq(this.pccIdReq); + final PceIdList pceIdList = new PceIdListBuilder().setPceId(this.pceId).build(); + monReqBuilder.setPceIdList(Lists.newArrayList(pceIdList, pceIdList)); + builder.setMonitoringRequest(monReqBuilder.build()); + + assertEquals(new PcmonreqBuilder().setPcreqMessage(builder.build()).build(), parser.parseMessage(result.slice(4, + result.readableBytes() - 4), Collections. emptyList())); + buf = Unpooled.buffer(result.readableBytes()); + parser.serializeMessage(new PcmonreqBuilder().setPcreqMessage(builder.build()).build(), buf); + assertArrayEquals(result.array(), buf.array()); + } } diff --git a/pcep/impl/src/test/resources/PCMonRep.bin b/pcep/impl/src/test/resources/PCMonRep.bin new file mode 100644 index 0000000000000000000000000000000000000000..66544b54386c51619a600191cceb42680c1af924 GIT binary patch literal 144 zcmY%3WSAf@_g42(=dU@=9YFqb4mj7ds>K?bUh5lAxuF*6Xe05PjH PPz{i-AVw`VvtjxH3NQwx literal 0 HcmV?d00001 diff --git a/pcep/impl/src/test/resources/PCMonReq.bin b/pcep/impl/src/test/resources/PCMonReq.bin new file mode 100644 index 0000000000000000000000000000000000000000..cfb06b1e1d1931a6dab0a8c85c10d8e5df91ff86 GIT binary patch literal 96 zcmY%3U`P-aVBleZfD{n{29A0L21ZE;%><*l5o#Ejguv<*fm*m&fb9QJzy?vn2r`Nb Ks9%BQ|9=3|ZVn&- literal 0 HcmV?d00001 diff --git a/pcep/impl/src/test/resources/PCRepMon.5.bin b/pcep/impl/src/test/resources/PCRepMon.5.bin new file mode 100644 index 0000000000000000000000000000000000000000..4d39ab98fc90944290512c539cc55c1020c4c39b GIT binary patch literal 100 zcmY#jVMt*TV&Gw5U{C~NE@1&M8^~lx5fNbEsAphcWCzj;EdT#=3NVO(B#?n9P!7ar QgXm)fvALk?B_aBm09d*Q#{d8T literal 0 HcmV?d00001 diff --git a/pcep/impl/src/test/resources/PCReq.3.bin b/pcep/impl/src/test/resources/PCReq.3.bin index 2da667e36467958437adfc8c85692007549698f9..d95f56bb62aae720f1ae5a8e9e3cbdfd35d68f49 100644 GIT binary patch literal 60 tcmY#jX0YKFVBleZ07fPuFk2DG objects, List errors) { + protected Replies getValidReply(List objects, List errors) throws PCEPDeserializerException { if (!(objects.get(0) instanceof Rp)) { errors.add(createErrorMsg(PCEPErrors.RP_MISSING, Optional.absent())); return null; diff --git a/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/PCEPErrors.java b/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/PCEPErrors.java index 7213c02d77..5a4d8be804 100644 --- a/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/PCEPErrors.java +++ b/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/PCEPErrors.java @@ -275,7 +275,11 @@ public enum PCEPErrors { /** * Invalid traffic engineering path setup type: Mismatched path setup type */ - MISMATCHED_PST(21, 2); + MISMATCHED_PST(21, 2), + /** + * MONITORING object missing + */ + MONITORING_OBJECT_MISSING(6, 4); private PCEPErrorIdentifier errorId; private static final Map VALUE_MAP; -- 2.36.6