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;
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;
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;
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;
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;
}
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) {
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));
+ }
}
--- /dev/null
+/*
+ * 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;
+ }
+
+}
--- /dev/null
+/*
+ * 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();
+ }
+}
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;
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;
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;
}
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
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()) {
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();
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);
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) {
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;
+ }
}
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;
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);
}
}
}
- 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) {
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;
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()) {
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,
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<>();
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();
+ }
}
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;
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;
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;
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;
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;
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;
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;
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
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());
+ }
}
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;
}
@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;
/**
* 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;