import com.google.common.collect.Lists;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
-
import java.util.Collections;
import java.util.List;
-
+import org.opendaylight.protocol.pcep.spi.PCEPErrors;
+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.pcerr.message.Errors;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.ErrorsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.FailureType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.OperationResult;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.operation.result.Error;
this.error = null;
}
- private OperationResults(final List<Error> error) {
- this.failure = FailureType.Failed;
+ private OperationResults(final FailureType failure, final List<Error> error) {
+ this.failure = failure;
this.error = error;
}
public static OperationResults createFailed(final List<Errors> errors) {
final List<Errors> e = errors != null ? errors : Collections.<Errors>emptyList();
- return new OperationResults(Lists.transform(e, CONVERT_ERRORS));
+ return new OperationResults(FailureType.Failed, Lists.transform(e, CONVERT_ERRORS));
+ }
+
+ public static OperationResults createUnsent(final PCEPErrors error) {
+ final List<Errors> e = error != null ? Collections.singletonList(getErrorFor(error)) : Collections.<Errors>emptyList();
+ return new OperationResults(FailureType.Unsent, Lists.transform(e, CONVERT_ERRORS));
+ }
+
+ private static Errors getErrorFor(final PCEPErrors error) {
+ final ErrorsBuilder builder = new ErrorsBuilder();
+ builder.setErrorObject(new ErrorObjectBuilder().setType(error.getErrorType()).setValue(error.getErrorValue()).build());
+ return builder.build();
}
@Override
import java.util.Collections;
import org.opendaylight.controller.config.yang.pcep.topology.provider.PeerCapabilities;
import org.opendaylight.protocol.pcep.PCEPSession;
+import org.opendaylight.protocol.pcep.spi.PCEPErrors;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated._00.rev140113.PcinitiateBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated._00.rev140113.Stateful1;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated._00.rev140113.pcinitiate.message.PcinitiateMessageBuilder;
public ListenableFuture<OperationResult> apply(final Optional<ReportedLsp> rep) {
if (rep.isPresent()) {
LOG.debug("Node {} already contains lsp {} at {}", input.getNode(), input.getName(), lsp);
- return OperationResults.UNSENT.future();
+ return OperationResults.createUnsent(PCEPErrors.USED_SYMBOLIC_PATH_NAME).future();
}
final SymbolicPathNameBuilder name = new SymbolicPathNameBuilder().setPathName(new SymbolicPathName(input.getName().getBytes(Charsets.UTF_8)));
final Lsp reportedLsp = validateReportedLsp(rep, input);
if (reportedLsp == null) {
LOG.warn("Reported LSP does not contain LSP object.");
- return OperationResults.UNSENT.future();
+ return OperationResults.createUnsent(PCEPErrors.UNKNOWN_PLSP_ID).future();
}
// Build the request and send it
final UpdatesBuilder rb = new UpdatesBuilder();
public ListenableFuture<OperationResult> apply(final Optional<ReportedLsp> rep) {
final Lsp reportedLsp = validateReportedLsp(rep, input);
if (reportedLsp == null) {
- return OperationResults.UNSENT.future();
+ return OperationResults.createUnsent(PCEPErrors.UNKNOWN_PLSP_ID).future();
}
final Arguments2 args = input.getArguments().getAugmentation(Arguments2.class);
Preconditions.checkArgument(args != null, "Input is missing operational tag.");
import java.util.concurrent.atomic.AtomicLong;
import org.opendaylight.controller.config.yang.pcep.topology.provider.PeerCapabilities;
import org.opendaylight.protocol.pcep.PCEPSession;
+import org.opendaylight.protocol.pcep.spi.PCEPErrors;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.PcinitiateBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Srp1;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Srp1Builder;
public ListenableFuture<OperationResult> apply(final Optional<ReportedLsp> rep) {
if (rep.isPresent()) {
LOG.debug("Node {} already contains lsp {} at {}", input.getNode(), input.getName(), lsp);
- return OperationResults.UNSENT.future();
+ return OperationResults.createUnsent(PCEPErrors.USED_SYMBOLIC_PATH_NAME).future();
}
if (!getPeerCapabilities().getInstantiation()) {
- return OperationResults.UNSENT.future();
+ return OperationResults.createUnsent(PCEPErrors.CAPABILITY_NOT_SUPPORTED).future();
}
// Build the request
public ListenableFuture<OperationResult> apply(final Optional<ReportedLsp> rep) {
final Lsp reportedLsp = validateReportedLsp(rep, input);
if (reportedLsp == null) {
- return OperationResults.UNSENT.future();
+ return OperationResults.createUnsent(PCEPErrors.UNKNOWN_PLSP_ID).future();
}
// Build the request and send it
final RequestsBuilder rb = new RequestsBuilder();
public ListenableFuture<OperationResult> apply(final Optional<ReportedLsp> rep) {
final Lsp reportedLsp = validateReportedLsp(rep, input);
if (reportedLsp == null) {
- return OperationResults.UNSENT.future();
+ return OperationResults.createUnsent(PCEPErrors.UNKNOWN_PLSP_ID).future();
}
// create mandatory objects
final Srp srp = new SrpBuilder().setOperationId(nextRequest()).setProcessingRule(Boolean.TRUE).build();
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.RemoveLspInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.UpdateLspInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.UpdateLspInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.UpdateLspOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.add.lsp.args.ArgumentsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.pcep.client.attributes.PathComputationClient;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.pcep.client.attributes.path.computation.client.ReportedLsp;
assertFalse(topology.getNode().isEmpty());
}
+ @Test
+ public void testUpdateUnknownLsp() throws InterruptedException, ExecutionException {
+ this.listener.onSessionUp(this.session);
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.update.lsp.args.ArgumentsBuilder updArgsBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.update.lsp.args.ArgumentsBuilder();
+ updArgsBuilder.setEro(createEroWithIpPrefixes(Lists.newArrayList(ERO_IP_PREFIX, DST_IP_PREFIX)));
+ updArgsBuilder.addAugmentation(Arguments3.class, new Arguments3Builder().setLsp(new LspBuilder().setDelegate(true).setAdministrative(true).build()).build());
+ final UpdateLspInput update = new UpdateLspInputBuilder().setArguments(updArgsBuilder.build()).setName(TUNNEL_NAME).setNetworkTopologyRef(new NetworkTopologyRef(TOPO_IID)).setNode(NODE_ID).build();
+ final UpdateLspOutput result = this.topologyRpcs.updateLsp(update).get().getResult();
+ assertEquals(FailureType.Unsent, result.getFailure());
+ assertEquals(1, result.getError().size());
+ final ErrorObject errorObject = result.getError().get(0).getErrorObject();
+ assertNotNull(errorObject);
+ assertEquals(PCEPErrors.UNKNOWN_PLSP_ID, PCEPErrors.forValue(errorObject.getType(), errorObject.getValue()));
+ }
+
+ @Test
+ public void testRemoveUnknownLsp() throws InterruptedException, ExecutionException {
+ this.listener.onSessionUp(this.session);
+ final RemoveLspInput remove = new RemoveLspInputBuilder().setName(TUNNEL_NAME).setNetworkTopologyRef(new NetworkTopologyRef(TOPO_IID)).setNode(NODE_ID).build();
+ final OperationResult result = this.topologyRpcs.removeLsp(remove).get().getResult();
+ assertEquals(FailureType.Unsent, result.getFailure());
+ assertEquals(1, result.getError().size());
+ final ErrorObject errorObject = result.getError().get(0).getErrorObject();
+ assertNotNull(errorObject);
+ assertEquals(PCEPErrors.UNKNOWN_PLSP_ID, PCEPErrors.forValue(errorObject.getType(), errorObject.getValue()));
+ }
+
+ @Test
+ public void testAddAlreadyExistingLsp() throws UnknownHostException, InterruptedException, ExecutionException {
+ this.listener.onSessionUp(this.session);
+ this.topologyRpcs.addLsp(createAddLspInput());
+ assertEquals(1, this.receivedMsgs.size());
+ assertTrue(this.receivedMsgs.get(0) instanceof Pcinitiate);
+ final Pcinitiate pcinitiate = (Pcinitiate) this.receivedMsgs.get(0);
+ final Requests req = pcinitiate.getPcinitiateMessage().getRequests().get(0);
+ final long srpId = req.getSrp().getOperationId().getValue();
+ final InetAddress inetAddress = InetAddress.getByName(TEST_ADDRESS);
+ final Tlvs tlvs = createLspTlvs(req.getLsp().getPlspId().getValue(), true,
+ inetAddress, inetAddress, inetAddress);
+ final Pcrpt pcRpt = MsgBuilderUtil.createPcRtpMessage(new LspBuilder(req.getLsp()).setTlvs(tlvs).setPlspId(new PlspId(1L)).setSync(false).setRemove(false).setOperational(OperationalStatus.Active).build(), Optional.of(MsgBuilderUtil.createSrp(srpId)), MsgBuilderUtil.createPath(req.getEro().getSubobject()));
+ this.listener.onMessage(this.session, pcRpt);
+
+ //try to add already existing LSP
+ final AddLspOutput result = this.topologyRpcs.addLsp(createAddLspInput()).get().getResult();
+ assertEquals(FailureType.Unsent, result.getFailure());
+ assertEquals(1, result.getError().size());
+ final ErrorObject errorObject = result.getError().get(0).getErrorObject();
+ assertNotNull(errorObject);
+ assertEquals(PCEPErrors.USED_SYMBOLIC_PATH_NAME, PCEPErrors.forValue(errorObject.getType(), errorObject.getValue()));
+ }
+
@Override
protected Open getLocalPref() {
return new OpenBuilder(super.getLocalPref()).setTlvs(new TlvsBuilder().addAugmentation(Tlvs1.class, new Tlvs1Builder().setStateful(new StatefulBuilder().addAugmentation(Stateful1.class, new Stateful1Builder().setInitiation(Boolean.TRUE).build()).build()).build()).build()).build();