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.PSTUtil;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.Pcrpt;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.PcrptBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.Lsp;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcrpt.message.pcrpt.message.reports.Path;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcrpt.message.pcrpt.message.reports.PathBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.srp.object.Srp;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.srp.object.srp.Tlvs;
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.bandwidth.object.Bandwidth;
@Override
public Message validate(final List<Object> objects, final List<Message> errors) throws PCEPDeserializerException {
- if (objects == null) {
- throw new IllegalArgumentException("Passed list can't be null.");
- }
+ Preconditions.checkArgument(objects != null, "Passed list can't be null.");
if (objects.isEmpty()) {
throw new PCEPDeserializerException("Pcrpt message cannot be empty.");
}
protected Reports getValidReports(final List<Object> objects, final List<Message> errors) {
boolean isValid = true;
final ReportsBuilder builder = new ReportsBuilder();
+ boolean lspViaSR = false;
if (objects.get(0) instanceof Srp) {
- builder.setSrp((Srp) objects.get(0));
+ final Srp srp = (Srp) objects.get(0);
+ final Tlvs tlvs = srp.getTlvs();
+ if (tlvs != null) {
+ lspViaSR = PSTUtil.isDefaultPST(tlvs.getPathSetupType());
+ }
+ builder.setSrp(srp);
objects.remove(0);
}
+
if (objects.get(0) instanceof Lsp) {
- builder.setLsp((Lsp) objects.get(0));
- objects.remove(0);
+ final Lsp lsp = (Lsp) objects.get(0);
+ if(!lspViaSR && lsp.getTlvs().getLspIdentifiers() == null && lsp.getPlspId().getValue() != 0) {
+ errors.add(createErrorMsg(PCEPErrors.LSP_IDENTIFIERS_TLV_MISSING, Optional.<Rp>absent()));
+ isValid = false;
+ } else {
+ builder.setLsp(lsp);
+ objects.remove(0);
+ }
} else {
errors.add(createErrorMsg(PCEPErrors.LSP_MISSING, Optional.<Rp>absent()));
isValid = false;
State state = State.INIT;
while (!objects.isEmpty() && !state.equals(State.END)) {
obj = objects.get(0);
- switch (state) {
- case INIT:
- state = State.LSPA_IN;
- if (obj instanceof Lspa) {
- builder.setLspa((Lspa) obj);
- break;
- }
- case LSPA_IN:
- state = State.BANDWIDTH_IN;
- if (obj instanceof Bandwidth) {
- builder.setBandwidth((Bandwidth) obj);
- break;
- }
- case BANDWIDTH_IN:
- state = State.METRIC_IN;
- if (obj instanceof Metric) {
- pathMetrics.add(new MetricsBuilder().setMetric((Metric) obj).build());
- state = State.BANDWIDTH_IN;
- break;
- }
- case METRIC_IN:
- state = State.IRO_IN;
- if (obj instanceof Iro) {
- builder.setIro((Iro) obj);
- break;
- }
- case IRO_IN:
- state = State.RRO_IN;
- if (obj instanceof Rro) {
- builder.setRro((Rro) obj);
- break;
- }
- case RRO_IN:
- state = State.END;
- break;
- case END:
- break;
- default:
- break;
- }
+ state = insertObject(state, obj, builder, pathMetrics);
if (!state.equals(State.END)) {
objects.remove(0);
}
}
}
+ private State insertObject(final State state, final Object obj, final PathBuilder builder, final List<Metrics> pathMetrics) {
+ switch (state) {
+ case INIT:
+ if (obj instanceof Lspa) {
+ builder.setLspa((Lspa) obj);
+ return State.LSPA_IN;
+ }
+ case LSPA_IN:
+ if (obj instanceof Bandwidth) {
+ builder.setBandwidth((Bandwidth) obj);
+ return State.BANDWIDTH_IN;
+ }
+ case BANDWIDTH_IN:
+ if (obj instanceof Metric) {
+ pathMetrics.add(new MetricsBuilder().setMetric((Metric) obj).build());
+ return State.BANDWIDTH_IN;
+ }
+ case METRIC_IN:
+ if (obj instanceof Iro) {
+ builder.setIro((Iro) obj);
+ return State.IRO_IN;
+ }
+ case IRO_IN:
+ if (obj instanceof Rro) {
+ builder.setRro((Rro) obj);
+ return State.RRO_IN;
+ }
+ case RRO_IN:
+ case END:
+ return State.END;
+ default:
+ return state;
+ }
+ }
+
private enum State {
INIT, LSPA_IN, BANDWIDTH_IN, METRIC_IN, IRO_IN, RRO_IN, END
}