From 8d3f35e52ff92ff2848290a5dc271a8cb106c06f Mon Sep 17 00:00:00 2001 From: Ajay Date: Tue, 2 Aug 2016 01:06:13 +0000 Subject: [PATCH] Bug-5878: PCErr not generated by configuring 32-pcep.xml file to not advertise stateful capability - throw exception and abort PCEP Topology Provider instantiation if stateful capability is not configured but stateful plugin is Change-Id: Ie066cc4661f07877e133ce666819b242aa783c85 Signed-off-by: Ajay --- .../protocol/pcep/PCEPCapability.java | 1 + .../protocol/pcep/PCEPDispatcher.java | 4 +++- .../pcep/PCEPSessionNegotiatorFactory.java | 2 ++ .../protocol/pcep/PCEPSessionProposalFactory.java | 3 +++ .../ietf/stateful07/PCEPStatefulCapability.java | 1 + .../pcep/impl/BasePCEPSessionProposalFactory.java | 4 ++++ .../impl/DefaultPCEPSessionNegotiatorFactory.java | 5 +++++ .../protocol/pcep/impl/PCEPDispatcherImpl.java | 7 ++++++- .../routing/PCEPSegmentRoutingCapability.java | 5 +++++ .../topology/provider/PCEPTopologyProvider.java | 15 ++++++++++++++- .../provider/PCEPTopologyProviderModuleTest.java | 3 ++- .../PCEPTunnelTopologyProviderModuleTest.java | 4 +++- 12 files changed, 49 insertions(+), 5 deletions(-) diff --git a/pcep/api/src/main/java/org/opendaylight/protocol/pcep/PCEPCapability.java b/pcep/api/src/main/java/org/opendaylight/protocol/pcep/PCEPCapability.java index a78d07698f..ed5fc07547 100644 --- a/pcep/api/src/main/java/org/opendaylight/protocol/pcep/PCEPCapability.java +++ b/pcep/api/src/main/java/org/opendaylight/protocol/pcep/PCEPCapability.java @@ -23,4 +23,5 @@ public interface PCEPCapability { */ void setCapabilityProposal(InetSocketAddress address, TlvsBuilder builder); + boolean isStateful(); } diff --git a/pcep/api/src/main/java/org/opendaylight/protocol/pcep/PCEPDispatcher.java b/pcep/api/src/main/java/org/opendaylight/protocol/pcep/PCEPDispatcher.java index 19b393f9c6..1191afa881 100644 --- a/pcep/api/src/main/java/org/opendaylight/protocol/pcep/PCEPDispatcher.java +++ b/pcep/api/src/main/java/org/opendaylight/protocol/pcep/PCEPDispatcher.java @@ -36,4 +36,6 @@ public interface PCEPDispatcher { * @return instance of PCEPServer */ ChannelFuture createServer(InetSocketAddress address, Optional keys, PCEPSessionListenerFactory listenerFactory, PCEPPeerProposal peerProposal); -} \ No newline at end of file + + PCEPSessionNegotiatorFactory getPCEPSessionNegotiatorFactory(); +} diff --git a/pcep/api/src/main/java/org/opendaylight/protocol/pcep/PCEPSessionNegotiatorFactory.java b/pcep/api/src/main/java/org/opendaylight/protocol/pcep/PCEPSessionNegotiatorFactory.java index 01e55ddb82..7f8449b434 100644 --- a/pcep/api/src/main/java/org/opendaylight/protocol/pcep/PCEPSessionNegotiatorFactory.java +++ b/pcep/api/src/main/java/org/opendaylight/protocol/pcep/PCEPSessionNegotiatorFactory.java @@ -27,4 +27,6 @@ public interface PCEPSessionNegotiatorFactory { * @return PCEPSessionNegotiator instance */ SessionNegotiator getSessionNegotiator(PCEPSessionListenerFactory sessionListenerFactory, Channel channel, Promise promise, final PCEPPeerProposal peerProposal); + + PCEPSessionProposalFactory getPCEPSessionProposalFactory(); } diff --git a/pcep/api/src/main/java/org/opendaylight/protocol/pcep/PCEPSessionProposalFactory.java b/pcep/api/src/main/java/org/opendaylight/protocol/pcep/PCEPSessionProposalFactory.java index 894f5a6c2b..d84db39758 100644 --- a/pcep/api/src/main/java/org/opendaylight/protocol/pcep/PCEPSessionProposalFactory.java +++ b/pcep/api/src/main/java/org/opendaylight/protocol/pcep/PCEPSessionProposalFactory.java @@ -8,6 +8,7 @@ package org.opendaylight.protocol.pcep; import java.net.InetSocketAddress; +import java.util.List; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Open; /** @@ -34,4 +35,6 @@ public interface PCEPSessionProposalFactory { * @return specific session proposal */ Open getSessionProposal(InetSocketAddress address, int sessionId, PCEPPeerProposal peerProposal); + + List getCapabilities(); } diff --git a/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful07/PCEPStatefulCapability.java b/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful07/PCEPStatefulCapability.java index da21c2eb68..ba76aad31b 100644 --- a/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful07/PCEPStatefulCapability.java +++ b/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful07/PCEPStatefulCapability.java @@ -55,6 +55,7 @@ public class PCEPStatefulCapability implements PCEPCapability { } } + @Override public boolean isStateful() { return this.stateful; } diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/BasePCEPSessionProposalFactory.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/BasePCEPSessionProposalFactory.java index 415944b138..22d76524fd 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/BasePCEPSessionProposalFactory.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/BasePCEPSessionProposalFactory.java @@ -79,4 +79,8 @@ public final class BasePCEPSessionProposalFactory implements PCEPSessionProposal return this.deadTimer; } + @Override + public List getCapabilities() { + return this.capabilities; + } } diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/DefaultPCEPSessionNegotiatorFactory.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/DefaultPCEPSessionNegotiatorFactory.java index eb7b38cd8b..b7a63514f8 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/DefaultPCEPSessionNegotiatorFactory.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/DefaultPCEPSessionNegotiatorFactory.java @@ -42,4 +42,9 @@ public final class DefaultPCEPSessionNegotiatorFactory extends AbstractPCEPSessi return new DefaultPCEPSessionNegotiator(promise, channel, listener, sessionId, this.maxUnknownMessages, this.spf.getSessionProposal((InetSocketAddress)channel.remoteAddress(), sessionId, peerProposal), this.tlsConfiguration); } + + @Override + public PCEPSessionProposalFactory getPCEPSessionProposalFactory() { + return this.spf; + } } diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/PCEPDispatcherImpl.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/PCEPDispatcherImpl.java index f85cde1509..fc6c6e2765 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/PCEPDispatcherImpl.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/PCEPDispatcherImpl.java @@ -145,4 +145,9 @@ public class PCEPDispatcherImpl implements PCEPDispatcher, Closeable { protected interface ChannelPipelineInitializer { void initializeChannel(SocketChannel socketChannel, Promise promise); } -} \ No newline at end of file + + @Override + public PCEPSessionNegotiatorFactory getPCEPSessionNegotiatorFactory() { + return this.snf; + } +} diff --git a/pcep/segment-routing/src/main/java/org/opendaylight/protocol/pcep/segment/routing/PCEPSegmentRoutingCapability.java b/pcep/segment-routing/src/main/java/org/opendaylight/protocol/pcep/segment/routing/PCEPSegmentRoutingCapability.java index 04f35d9e6d..cecfa807ab 100644 --- a/pcep/segment-routing/src/main/java/org/opendaylight/protocol/pcep/segment/routing/PCEPSegmentRoutingCapability.java +++ b/pcep/segment-routing/src/main/java/org/opendaylight/protocol/pcep/segment/routing/PCEPSegmentRoutingCapability.java @@ -35,4 +35,9 @@ public class PCEPSegmentRoutingCapability implements PCEPCapability { public boolean isSegmentRoutingCapable() { return this.isSegmentRoutingCapable; } + + @Override + public boolean isStateful() { + return false; + } } diff --git a/pcep/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTopologyProvider.java b/pcep/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTopologyProvider.java index 169a6c3bdc..1b307ebff1 100755 --- a/pcep/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTopologyProvider.java +++ b/pcep/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTopologyProvider.java @@ -12,6 +12,7 @@ import com.google.common.base.Preconditions; import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import java.net.InetSocketAddress; +import java.util.List; import java.util.concurrent.ExecutionException; import org.opendaylight.bgpcep.programming.spi.InstructionScheduler; import org.opendaylight.bgpcep.topology.DefaultTopologyReference; @@ -22,6 +23,7 @@ import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFaile import org.opendaylight.controller.sal.binding.api.BindingAwareBroker; import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; import org.opendaylight.protocol.concepts.KeyMapping; +import org.opendaylight.protocol.pcep.PCEPCapability; import org.opendaylight.protocol.pcep.PCEPDispatcher; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.topology.rev140113.NetworkTopologyContext; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.NetworkTopologyPcepProgrammingService; @@ -54,6 +56,17 @@ public final class PCEPTopologyProvider extends DefaultTopologyReference impleme final InstanceIdentifier topology, final TopologySessionListenerFactory listenerFactory, final Optional runtimeRootRegistrator, final int rpcTimeout) throws InterruptedException, ExecutionException, ReadFailedException, TransactionCommitFailedException { + List capabilities = dispatcher.getPCEPSessionNegotiatorFactory().getPCEPSessionProposalFactory().getCapabilities(); + boolean statefulCapability = false; + for (final PCEPCapability capability : capabilities) { + if (capability.isStateful()) { + statefulCapability = true; + break; + } + } + if (!statefulCapability && listenerFactory != null) { + throw new IllegalStateException("Stateful capability not defined, aborting PCEP Topology Provider instantiation"); + } final ServerSessionManager manager = new ServerSessionManager(dataBroker, topology, listenerFactory, rpcTimeout); if (runtimeRootRegistrator.isPresent()) { @@ -98,4 +111,4 @@ public final class PCEPTopologyProvider extends DefaultTopologyReference impleme LOG.error("Failed to shutdown session manager", e); } } -} \ No newline at end of file +} diff --git a/pcep/topology-provider/src/test/java/org/opendaylight/controller/config/yang/pcep/topology/provider/PCEPTopologyProviderModuleTest.java b/pcep/topology-provider/src/test/java/org/opendaylight/controller/config/yang/pcep/topology/provider/PCEPTopologyProviderModuleTest.java index 4f090e66e3..86f165cd99 100644 --- a/pcep/topology-provider/src/test/java/org/opendaylight/controller/config/yang/pcep/topology/provider/PCEPTopologyProviderModuleTest.java +++ b/pcep/topology-provider/src/test/java/org/opendaylight/controller/config/yang/pcep/topology/provider/PCEPTopologyProviderModuleTest.java @@ -27,6 +27,7 @@ import org.opendaylight.controller.config.yang.pcep.impl.PCEPDispatcherImplModul import org.opendaylight.controller.config.yang.programming.impl.AbstractInstructionSchedulerTest; import org.opendaylight.protocol.pcep.PCEPDispatcher; import org.opendaylight.protocol.pcep.PCEPSessionProposalFactory; +import org.opendaylight.protocol.pcep.ietf.stateful07.PCEPStatefulCapability; import org.opendaylight.protocol.pcep.impl.BasePCEPSessionProposalFactory; import org.opendaylight.protocol.pcep.impl.DefaultPCEPSessionNegotiatorFactory; import org.opendaylight.protocol.pcep.impl.PCEPDispatcherImpl; @@ -55,7 +56,7 @@ public class PCEPTopologyProviderModuleTest extends AbstractInstructionScheduler SimplePCEPExtensionProviderContext extContext = new SimplePCEPExtensionProviderContext(); setupMockService(PCEPExtensionProviderContext.class, extContext); BasePCEPSessionProposalFactory proposalFactory = new BasePCEPSessionProposalFactory(120, 30, - Collections.emptyList()); + Arrays.asList(new PCEPStatefulCapability(true, true, true, true, true, true, true))); setupMockService(PCEPSessionProposalFactory.class, proposalFactory); NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); setupMockService(PCEPDispatcher.class, new PCEPDispatcherImpl(extContext.getMessageHandlerRegistry(), diff --git a/pcep/tunnel-provider/src/test/java/org/opendaylight/controller/config/yang/pcep/tunnel/provider/PCEPTunnelTopologyProviderModuleTest.java b/pcep/tunnel-provider/src/test/java/org/opendaylight/controller/config/yang/pcep/tunnel/provider/PCEPTunnelTopologyProviderModuleTest.java index f2e3acb961..3d21ff947c 100644 --- a/pcep/tunnel-provider/src/test/java/org/opendaylight/controller/config/yang/pcep/tunnel/provider/PCEPTunnelTopologyProviderModuleTest.java +++ b/pcep/tunnel-provider/src/test/java/org/opendaylight/controller/config/yang/pcep/tunnel/provider/PCEPTunnelTopologyProviderModuleTest.java @@ -10,6 +10,7 @@ package org.opendaylight.controller.config.yang.pcep.tunnel.provider; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import io.netty.channel.nio.NioEventLoopGroup; +import java.util.Arrays; import java.util.Collections; import java.util.List; import javax.management.ObjectName; @@ -28,6 +29,7 @@ import org.opendaylight.controller.config.yang.pcep.topology.provider.Stateful07 import org.opendaylight.controller.config.yang.programming.impl.AbstractInstructionSchedulerTest; import org.opendaylight.protocol.pcep.PCEPDispatcher; import org.opendaylight.protocol.pcep.PCEPSessionProposalFactory; +import org.opendaylight.protocol.pcep.ietf.stateful07.PCEPStatefulCapability; import org.opendaylight.protocol.pcep.impl.BasePCEPSessionProposalFactory; import org.opendaylight.protocol.pcep.impl.DefaultPCEPSessionNegotiatorFactory; import org.opendaylight.protocol.pcep.impl.PCEPDispatcherImpl; @@ -50,7 +52,7 @@ public class PCEPTunnelTopologyProviderModuleTest extends AbstractInstructionSch SimplePCEPExtensionProviderContext extContext = new SimplePCEPExtensionProviderContext(); setupMockService(PCEPExtensionProviderContext.class, extContext); BasePCEPSessionProposalFactory proposalFactory = new BasePCEPSessionProposalFactory(120, 30, - Collections.emptyList()); + Arrays.asList(new PCEPStatefulCapability(true, true, true, true, true, true, true))); setupMockService(PCEPSessionProposalFactory.class, proposalFactory); NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); setupMockService(PCEPDispatcher.class, new PCEPDispatcherImpl(extContext.getMessageHandlerRegistry(), -- 2.36.6