<groupId>org.opendaylight.yangtools</groupId>
<artifactId>mockito-configuration</artifactId>
</dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>pcep-spi</artifactId>
- <type>test-jar</type>
- <scope>test</scope>
- </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>pcep-spi</artifactId>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-binding-broker-impl</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-binding-broker-impl</artifactId>
+ <scope>test</scope>
+ <type>test-jar</type>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>pcep-topology-provider</artifactId>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>pcep-topology-provider</artifactId>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<build>
import org.opendaylight.protocol.pcep.ietf.stateful07.Stateful07PCReportMessageParser;
import org.opendaylight.protocol.pcep.spi.ObjectRegistry;
import org.opendaylight.protocol.pcep.spi.PCEPErrors;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.identifiers.tlv.LspIdentifiersBuilder;
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.lsp.object.LspBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.lsp.TlvsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcrpt.message.pcrpt.message.Reports;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcrpt.message.pcrpt.message.ReportsBuilder;
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.types.rev131005.Object;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.Ero;
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.rsvp.rev130820.LspId;
public class SrPcRptMessageParser extends Stateful07PCReportMessageParser {
@Override
protected Reports getValidReports(List<Object> objects, List<Message> errors) {
- if (!(objects.get(0) instanceof Srp)) {
- errors.add(createErrorMsg(PCEPErrors.SRP_MISSING, Optional.<Rp>absent()));
- }
- final Srp srp = (Srp) objects.get(0);
- if (isSegmentRoutingPath(srp)) {
- boolean isValid = true;
- final ReportsBuilder builder = new ReportsBuilder();
- builder.setSrp(srp);
- objects.remove(0);
- if (objects.get(0) instanceof Lsp) {
- builder.setLsp((Lsp) objects.get(0));
+ if (objects.get(0) instanceof Srp) {
+ final Srp srp = (Srp) objects.get(0);
+ if (isSegmentRoutingPath(srp)) {
+ boolean isValid = true;
+ final ReportsBuilder builder = new ReportsBuilder();
+ builder.setSrp(srp);
objects.remove(0);
- } else {
- errors.add(createErrorMsg(PCEPErrors.LSP_MISSING, Optional.<Rp>absent()));
- isValid = false;
- }
-
- final Object obj = objects.get(0);
- if (obj instanceof Ero) {
- final Ero ero = (Ero) obj;
- final PCEPErrors error = SrEroUtil.validateSrEroSubobjects(ero);
- if (error != null) {
- errors.add(createErrorMsg(error, Optional.<Rp>absent()));
+ if (objects.get(0) instanceof Lsp) {
+ final Lsp lsp = (Lsp) objects.get(0);
+ final LspBuilder lspBuilder = new LspBuilder(lsp);
+ final TlvsBuilder tlvsBuilder = new TlvsBuilder(lsp.getTlvs());
+ tlvsBuilder.setLspIdentifiers(new LspIdentifiersBuilder().setLspId(new LspId(lsp.getPlspId().getValue())).build());
+ lspBuilder.setTlvs(tlvsBuilder.build());
+ builder.setLsp(lspBuilder.build());
+ objects.remove(0);
+ } else {
+ errors.add(createErrorMsg(PCEPErrors.LSP_MISSING, Optional.<Rp>absent()));
isValid = false;
+ }
+
+ final Object obj = objects.get(0);
+ if (obj instanceof Ero) {
+ final Ero ero = (Ero) obj;
+ final PCEPErrors error = SrEroUtil.validateSrEroSubobjects(ero);
+ if (error != null) {
+ errors.add(createErrorMsg(error, Optional.<Rp>absent()));
+ isValid = false;
+ } else {
+ builder.setPath(new PathBuilder().setEro(ero).build());
+ }
+ objects.remove(0);
} else {
- builder.setPath(new PathBuilder().setEro(ero).build());
+ errors.add(createErrorMsg(PCEPErrors.ERO_MISSING, Optional.<Rp>absent()));
+ isValid = false;
}
- objects.remove(0);
- } else {
- errors.add(createErrorMsg(PCEPErrors.ERO_MISSING, Optional.<Rp>absent()));
- isValid = false;
- }
- if (isValid) {
- return builder.build();
+ if (isValid) {
+ return builder.build();
+ }
+ return null;
}
- return null;
}
return super.getValidReports(objects, errors);
}
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.PcupdBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.PlspId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.SrpIdNumber;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.identifiers.tlv.LspIdentifiersBuilder;
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.lsp.object.LspBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcrpt.message.PcrptMessageBuilder;
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.rp.object.rp.TlvsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.LspId;
public class SrMessageParserTest {
final SrPcRptMessageParser parser = new SrPcRptMessageParser(objectRegistry);
final PcrptMessageBuilder builder = new PcrptMessageBuilder();
final ReportsBuilder rptBuilder = new ReportsBuilder();
- rptBuilder.setLsp(createLspObject());
+ final Lsp lsp = createLspObject();
+ final LspBuilder lspBuilder = new LspBuilder(lsp);
+ final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.lsp.TlvsBuilder tlvsBuilder =
+ new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.lsp.TlvsBuilder(lsp.getTlvs());
+ tlvsBuilder.setLspIdentifiers(new LspIdentifiersBuilder().setLspId(new LspId(0L)).build());
+ lspBuilder.setTlvs(tlvsBuilder.build());
+ rptBuilder.setLsp(lspBuilder.build());
rptBuilder.setSrp(createSrpObject());
rptBuilder.setPath(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcrpt.message.pcrpt.message.reports.PathBuilder().setEro(createSrEroObject()).build());
builder.setReports(Lists.newArrayList(rptBuilder.build()));
buf.readableBytes() - 4), Collections.<Message> emptyList()));
final ByteBuf buffer = Unpooled.buffer(statefulMsg.length);
+ rptBuilder.setLsp(createLspObject());
+ builder.setReports(Lists.newArrayList(rptBuilder.build()));
parser.serializeMessage(new PcrptBuilder().setPcrptMessage(builder.build()).build(), buffer);
assertArrayEquals(statefulMsg, buffer.array());
}
--- /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.segment.routing02;
+
+import com.google.common.base.Charsets;
+import com.google.common.collect.Lists;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.opendaylight.bgpcep.pcep.topology.provider.AbstractPCEPSessionTest;
+import org.opendaylight.bgpcep.pcep.topology.provider.AbstractTopologySessionListener;
+import org.opendaylight.bgpcep.pcep.topology.provider.Stateful07TopologySessionListenerFactory;
+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.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.PlspId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.SrpIdNumber;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.SymbolicPathName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.identifiers.tlv.LspIdentifiersBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.LspBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.lsp.TlvsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcrpt.message.PcrptMessageBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcrpt.message.pcrpt.message.ReportsBuilder;
+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.SrpBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.symbolic.path.name.tlv.SymbolicPathNameBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.segment.routing._02.rev140506.SidType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.segment.routing._02.rev140506.SrEroSubobject.Flags;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.segment.routing._02.rev140506.network.topology.topology.node.path.computation.client.reported.lsp.path.ero.subobject.subobject.type.SrEroType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.segment.routing._02.rev140506.pcrpt.pcrpt.message.reports.path.ero.subobject.subobject.type.SrEroTypeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.segment.routing._02.rev140506.sr.ero.subobject.nai.IpNodeId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.segment.routing._02.rev140506.sr.ero.subobject.nai.IpNodeIdBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.Ero;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.EroBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.ero.Subobject;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.ero.SubobjectBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.LspId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.Node1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.pcep.client.attributes.path.computation.client.ReportedLsp;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
+
+public class TopologyProviderTest extends AbstractPCEPSessionTest<Stateful07TopologySessionListenerFactory> {
+
+ private AbstractTopologySessionListener<SrpIdNumber, PlspId> listener;
+
+ @SuppressWarnings("unchecked")
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ this.listener = (AbstractTopologySessionListener<SrpIdNumber, PlspId>) getSessionListener();
+ }
+
+ @Test
+ public void testOnReportMessage() throws InterruptedException, ExecutionException {
+ this.listener.onSessionUp(this.session);
+
+ Pcrpt pcRptMsg = createSrPcRpt("1.1.1.1", "sr-path1", 1L);
+ this.listener.onMessage(this.session, pcRptMsg);
+ //check sr-path
+ Topology topology = getTopology().get();
+ List<ReportedLsp> reportedLsps = topology.getNode().get(0).getAugmentation(Node1.class).getPathComputationClient().getReportedLsp();
+ Assert.assertEquals(1, reportedLsps.size());
+ final ReportedLsp lsp = reportedLsps.get(0);
+ Assert.assertEquals("sr-path1", lsp.getName());
+ List<Subobject> subobjects = lsp.getPath().get(0).getEro().getSubobject();
+ Assert.assertEquals(1, subobjects.size());
+ Assert.assertEquals("1.1.1.1", ((IpNodeId)((SrEroType)subobjects.get(0).getSubobjectType()).getNai()).getIpAddress().getIpv4Address().getValue());
+
+ pcRptMsg = createSrPcRpt("1.1.1.3", "sr-path2", 2L);
+ this.listener.onMessage(this.session, pcRptMsg);
+ //check second lsp sr-path
+ topology = getTopology().get();
+ reportedLsps = topology.getNode().get(0).getAugmentation(Node1.class).getPathComputationClient().getReportedLsp();
+ Assert.assertEquals(2, reportedLsps.size());
+
+ pcRptMsg = createSrPcRpt("1.1.1.2", "sr-path1", 1L);
+ this.listener.onMessage(this.session, pcRptMsg);
+ //check updated sr-path
+ topology = getTopology().get();
+ reportedLsps = topology.getNode().get(0).getAugmentation(Node1.class).getPathComputationClient().getReportedLsp();
+ Assert.assertEquals(2, reportedLsps.size());
+ for (final ReportedLsp rlsp : reportedLsps) {
+ if (rlsp.getName().equals("sr-path1")) {
+ subobjects = rlsp.getPath().get(0).getEro().getSubobject();
+ Assert.assertEquals(1, subobjects.size());
+ Assert.assertEquals("1.1.1.2", ((IpNodeId)((SrEroType)subobjects.get(0).getSubobjectType()).getNai()).getIpAddress().getIpv4Address().getValue());
+ }
+ }
+ }
+
+ private static Pcrpt createSrPcRpt(final String nai, final String pathName, final long plspId) {
+ return new PcrptBuilder().setPcrptMessage(new PcrptMessageBuilder().setReports(Lists.newArrayList(new ReportsBuilder()
+ .setLsp(new LspBuilder().setPlspId(new PlspId(plspId)).setRemove(false).setSync(true).setAdministrative(true).setDelegate(true)
+ .setTlvs(new TlvsBuilder()
+ .setLspIdentifiers(new LspIdentifiersBuilder().setLspId(new LspId(plspId)).build())
+ .setSymbolicPathName(new SymbolicPathNameBuilder().setPathName(new SymbolicPathName(pathName.getBytes(Charsets.UTF_8))).build()).build()).build())
+ .setSrp(new SrpBuilder().setOperationId(new SrpIdNumber(0L)).build())
+ .setPath(new PathBuilder().setEro(createSrEroObject(nai)).build())
+ .build())).build()).build();
+ }
+
+ private static Ero createSrEroObject(final String nai) {
+ final SrEroTypeBuilder srEroBuilder = new SrEroTypeBuilder();
+ srEroBuilder.setFlags(new Flags(false, false, false, false));
+ srEroBuilder.setSidType(SidType.Ipv4NodeId);
+ srEroBuilder.setSid(123456L);
+ srEroBuilder.setNai(new IpNodeIdBuilder().setIpAddress(new IpAddress(new Ipv4Address(nai))).build());
+ final SubobjectBuilder subobjBuilder = new SubobjectBuilder().setSubobjectType(srEroBuilder.build()).setLoose(false);
+
+ final List<Subobject> subobjects = Lists.newArrayList(subobjBuilder.build());
+ return new EroBuilder().setProcessingRule(false).setIgnore(false).setSubobject(subobjects).build();
+ }
+
+}
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
+
import com.google.common.base.Optional;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import org.opendaylight.controller.md.sal.binding.test.AbstractDataBrokerTest;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.protocol.pcep.PCEPSessionListener;
import org.opendaylight.protocol.pcep.impl.DefaultPCEPSessionNegotiator;
import org.opendaylight.protocol.pcep.impl.PCEPSessionImpl;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
protected Open getLocalPref() {
return this.localPrefs;
}
+
+ protected PCEPSessionListener getSessionListener() {
+ return this.manager.getSessionListener();
+ }
}
@Before
public void setUp() throws Exception {
super.setUp();
- listener = (Stateful02TopologySessionListener) this.manager.getSessionListener();
+ listener = (Stateful02TopologySessionListener) getSessionListener();
}
@Test
@Before
public void setUp() throws Exception {
super.setUp();
- this.listener = (Stateful07TopologySessionListener) this.manager.getSessionListener();
+ this.listener = (Stateful07TopologySessionListener) getSessionListener();
}
@Test