Bug-2226: RFC5886 - Messages parsers/serializers 17/12517/6
authorMilos Fabian <milfabia@cisco.com>
Tue, 28 Oct 2014 09:54:14 +0000 (10:54 +0100)
committerDana Kutenicsova <dkutenic@cisco.com>
Fri, 16 Jan 2015 09:38:11 +0000 (10:38 +0100)
-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 <milfabia@cisco.com>
14 files changed:
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/Activator.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPMonitoringReplyMessageParser.java [new file with mode: 0644]
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPMonitoringRequestMessageParser.java [new file with mode: 0644]
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPReplyMessageParser.java
pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/message/PCEPRequestMessageParser.java
pcep/impl/src/test/java/org/opendaylight/protocol/pcep/impl/PCEPValidatorTest.java
pcep/impl/src/test/resources/PCMonRep.bin [new file with mode: 0644]
pcep/impl/src/test/resources/PCMonReq.bin [new file with mode: 0644]
pcep/impl/src/test/resources/PCRepMon.5.bin [new file with mode: 0644]
pcep/impl/src/test/resources/PCReq.3.bin
pcep/impl/src/test/resources/PCReq.7.bin
pcep/impl/src/test/resources/PCReq.8.bin [new file with mode: 0644]
pcep/segment-routing/src/main/java/org/opendaylight/protocol/pcep/segment/routing02/SrPcRepMessageParser.java
pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/PCEPErrors.java

index 10c1bc4d0d25349a1e55132c22556596a1e1e382..f224ac900bdc59107f79e640be88ac8835651e57 100644 (file)
@@ -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<AutoCloseable> 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<AutoCloseable> 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 (file)
index 0000000..a5ee099
--- /dev/null
@@ -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<Object> objects, final List<Message> 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.<Rp>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> specificMetrics = new ArrayList<>();
+        while (!objects.isEmpty()) {
+            final SpecificMetricsBuilder smb = new SpecificMetricsBuilder();
+            final List<MetricPce> 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<Object> 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 (file)
index 0000000..fa1b007
--- /dev/null
@@ -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<Object> objects, List<Message> 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.<Rp>absent()));
+        }
+        final PcreqMessageBuilder mBuilder = new PcreqMessageBuilder();
+        mBuilder.setMonitoringRequest(monReq);
+        final List<Svec> svecs = getSvecs(objects, errors);
+        if (!svecs.isEmpty()) {
+            mBuilder.setSvec(svecs);
+        }
+        final List<Requests> 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();
+    }
+}
index 6ef825c4e448c56c05c39f1144819a6ff64398f6..2a6e48a6076254ba7d964e2cecf904e8ca2586a4 100644 (file)
@@ -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<Object> objects, final List<Message> errors) {
+    protected Replies getValidReply(final List<Object> objects, final List<Message> errors) throws PCEPDeserializerException {
         if (!(objects.get(0) instanceof Rp)) {
             errors.add(createErrorMsg(PCEPErrors.RP_MISSING, Optional.<Rp>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<VendorInformationObject> 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> paths = new ArrayList<>();
                 final PathsBuilder pBuilder = new PathsBuilder();
                 pBuilder.setEro(ero);
-                while (!objects.isEmpty()) {
+                while (!objects.isEmpty() && !(objects.get(0) instanceof PceId)) {
                     final List<VendorInformationObject> 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<MetricPce> 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<Object> 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<Object> 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;
+    }
 }
index 593cc33577d1dcce8ee3f701bca17a5fae8264b0..4adccf1ef5d2dd207e92cfbba8032008025c282f 100644 (file)
@@ -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<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Object> objects,
-            final List<Message> errors) throws PCEPDeserializerException {
+    protected Message validate(final List<Object> objects, final List<Message> errors) throws PCEPDeserializerException {
         if (objects == null) {
             throw new IllegalArgumentException("Passed list can't be null.");
         }
-        final List<Requests> 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<Svec> svecs = getSvecs(objects, errors);
+        if (!svecs.isEmpty()) {
+            mBuilder.setSvec(svecs);
+        }
+        final List<Requests> requests = getRequests(objects, errors);
+        if (requests != null && !requests.isEmpty()) {
+            mBuilder.setRequests(requests);
+        } else {
+            errors.add(createErrorMsg(PCEPErrors.RP_MISSING, Optional.<Rp>absent()));
+        }
+        if (!objects.isEmpty()) {
+            throw new PCEPDeserializerException("Unprocessed Objects: " + objects);
+        }
+        return new PcreqBuilder().setPcreqMessage(mBuilder.build()).build();
+    }
+
+    protected List<Svec> getSvecs(final List<Object> objects, final List<Message> errors) {
         final List<Svec> 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<Requests> getRequests(final List<Object> objects, final List<Message> errors) {
+        final List<Requests> 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<Object> objects, final List<Message> 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> metrics = new ArrayList<>();
         final List<VendorInformationObject> 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<Object> 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> 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();
+    }
 }
index 27096cc67363ee6d17b23393f5bb448b8761b2e2..ca4a51c938778d24b8189c50e923631626fe813d 100644 (file)
@@ -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<VendorInformationObject> 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.<Message> 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<MetricPce> 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<MetricPce> 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.<Message> 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<Replies> 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> 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.<Message> 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<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.pcreq.message.Requests> 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.<Message> 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.<Message> 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<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcreq.message.pcreq.message.Requests> 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.<Message> 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 (file)
index 0000000..66544b5
Binary files /dev/null and b/pcep/impl/src/test/resources/PCMonRep.bin differ
diff --git a/pcep/impl/src/test/resources/PCMonReq.bin b/pcep/impl/src/test/resources/PCMonReq.bin
new file mode 100644 (file)
index 0000000..cfb06b1
Binary files /dev/null and b/pcep/impl/src/test/resources/PCMonReq.bin differ
diff --git a/pcep/impl/src/test/resources/PCRepMon.5.bin b/pcep/impl/src/test/resources/PCRepMon.5.bin
new file mode 100644 (file)
index 0000000..4d39ab9
Binary files /dev/null and b/pcep/impl/src/test/resources/PCRepMon.5.bin differ
index 2da667e36467958437adfc8c85692007549698f9..d95f56bb62aae720f1ae5a8e9e3cbdfd35d68f49 100644 (file)
Binary files a/pcep/impl/src/test/resources/PCReq.3.bin and b/pcep/impl/src/test/resources/PCReq.3.bin differ
index c8efd0fb624b352aa2c17e25f65c3da6e5a77b14..0c0decc3b501d2bcb5a70f5a7558f3760c7c69fa 100644 (file)
Binary files a/pcep/impl/src/test/resources/PCReq.7.bin and b/pcep/impl/src/test/resources/PCReq.7.bin differ
diff --git a/pcep/impl/src/test/resources/PCReq.8.bin b/pcep/impl/src/test/resources/PCReq.8.bin
new file mode 100644 (file)
index 0000000..4399cb9
Binary files /dev/null and b/pcep/impl/src/test/resources/PCReq.8.bin differ
index 0e8cabf15a7d02a26020b50e033b330c92afb084..4102a127195d69f53c07395c944ed7beb22d8f65 100644 (file)
@@ -14,6 +14,7 @@ import io.netty.buffer.ByteBuf;
 import java.util.List;
 import org.opendaylight.protocol.pcep.impl.message.PCEPReplyMessageParser;
 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.types.rev131005.Message;
@@ -53,7 +54,7 @@ public class SrPcRepMessageParser extends PCEPReplyMessageParser {
     }
 
     @Override
-    protected Replies getValidReply(List<Object> objects, List<Message> errors) {
+    protected Replies getValidReply(List<Object> objects, List<Message> errors) throws PCEPDeserializerException {
         if (!(objects.get(0) instanceof Rp)) {
             errors.add(createErrorMsg(PCEPErrors.RP_MISSING, Optional.<Rp>absent()));
             return null;
index 7213c02d77bcad5dcd9584dcb82739a971687b61..5a4d8be80495b131bb5e2941fbe3be7e530e25d2 100644 (file)
@@ -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<PCEPErrorIdentifier, PCEPErrors> VALUE_MAP;