package org.opendaylight.protocol.pcep;
import io.netty.channel.ChannelFuture;
+import java.net.InetSocketAddress;
import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.protocol.concepts.KeyMapping;
/**
* Dispatcher class for creating servers and clients.
/**
* Creates server. Each server needs three factories to pass their instances to client sessions.
*
- * @param dispatcherDependencies contains required dependencies for instantiate a PCEP Server
- * @return instance of PCEPServer
+ * @param listenAddress Server listen address
+ * @param tcpKeys RFC2385 TCP-MD5 keys
+ * @param negotiatorDependencies PCEPSessionNegotiatorFactoryDependencies
+ * @return A future completing when the PCEP server is created
*/
- @NonNull ChannelFuture createServer(@NonNull PCEPDispatcherDependencies dispatcherDependencies);
+ @NonNull ChannelFuture createServer(@NonNull InetSocketAddress listenAddress, @NonNull KeyMapping tcpKeys,
+ @NonNull PCEPSessionNegotiatorFactoryDependencies negotiatorDependencies);
@NonNull PCEPSessionNegotiatorFactory getPCEPSessionNegotiatorFactory();
}
+++ /dev/null
-/*
- * Copyright (c) 2017 AT&T Intellectual Property. 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;
-
-import java.net.InetSocketAddress;
-import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.opendaylight.protocol.concepts.KeyMapping;
-
-/**
- * Contains all required dependencies for instantiate a PCEPDispatcher.
- */
-@NonNullByDefault
-public interface PCEPDispatcherDependencies extends PCEPSessionNegotiatorFactoryDependencies {
- /**
- * Return the address to be bound with the server.
- *
- * @return ip address
- */
- InetSocketAddress getAddress();
-
- /**
- * RFC2385 key mapping.
- *
- * @return map containing Keys
- */
- KeyMapping getKeys();
-}
import static java.util.Objects.requireNonNull;
+import com.google.common.annotations.VisibleForTesting;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.buffer.PooledByteBufAllocator;
import io.netty.channel.ChannelFuture;
import java.io.Closeable;
import java.net.InetSocketAddress;
import java.util.concurrent.TimeUnit;
-import org.checkerframework.checker.lock.qual.GuardedBy;
import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.protocol.concepts.KeyMapping;
import org.opendaylight.protocol.pcep.MessageRegistry;
import org.opendaylight.protocol.pcep.PCEPDispatcher;
-import org.opendaylight.protocol.pcep.PCEPDispatcherDependencies;
import org.opendaylight.protocol.pcep.PCEPSession;
import org.opendaylight.protocol.pcep.PCEPSessionNegotiatorFactory;
+import org.opendaylight.protocol.pcep.PCEPSessionNegotiatorFactoryDependencies;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger LOG = LoggerFactory.getLogger(PCEPDispatcherImpl.class);
private static final Integer SOCKET_BACKLOG_SIZE = 128;
private static final long TIMEOUT = 10;
+
private final PCEPSessionNegotiatorFactory snf;
private final PCEPHandlerFactory hf;
private final EventLoopGroup bossGroup;
private final EventLoopGroup workerGroup;
private final EventExecutor executor;
- @GuardedBy("this")
- private KeyMapping keys;
/**
* Creates an instance of PCEPDispatcherImpl, gets the default selector and opens it.
}
@Override
- public final synchronized ChannelFuture createServer(final PCEPDispatcherDependencies dispatcherDependencies) {
- keys = dispatcherDependencies.getKeys();
-
+ public final synchronized ChannelFuture createServer(final InetSocketAddress listenAddress,
+ final KeyMapping tcpKeys, final PCEPSessionNegotiatorFactoryDependencies negotiatorDependencies) {
final ChannelPipelineInitializer initializer = (ch, promise) -> {
ch.pipeline().addLast(hf.getDecoders());
- ch.pipeline().addLast("negotiator", snf
- .getSessionNegotiator(dispatcherDependencies, ch, promise));
+ ch.pipeline().addLast("negotiator", snf.getSessionNegotiator(negotiatorDependencies, ch, promise));
ch.pipeline().addLast(hf.getEncoders());
};
- final ServerBootstrap b = createServerBootstrap(initializer);
- final InetSocketAddress address = dispatcherDependencies.getAddress();
- final ChannelFuture f = b.bind(address);
- LOG.debug("Initiated server {} at {}.", f, address);
+ final ServerBootstrap b = createServerBootstrap(initializer, tcpKeys);
+ final ChannelFuture f = b.bind(listenAddress);
+ LOG.debug("Initiated server {} at {}.", f, listenAddress);
- // FIXME: err, why are we resetting this?
- keys = KeyMapping.of();
return f;
}
- synchronized ServerBootstrap createServerBootstrap(final ChannelPipelineInitializer initializer) {
+ @VisibleForTesting
+ ServerBootstrap createServerBootstrap(final ChannelPipelineInitializer initializer,
+ final KeyMapping tcpKeys) {
final ServerBootstrap b = new ServerBootstrap();
b.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
} else {
b.channel(NioServerSocketChannel.class);
}
- if (!keys.isEmpty()) {
+ if (!tcpKeys.isEmpty()) {
if (Epoll.isAvailable()) {
- b.option(EpollChannelOption.TCP_MD5SIG, keys.asMap());
+ b.option(EpollChannelOption.TCP_MD5SIG, tcpKeys.asMap());
} else {
throw new UnsupportedOperationException("Setting TCP-MD5 signatures is not supported",
Epoll.unavailabilityCause().getCause());
import static org.junit.Assert.assertThrows;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.same;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import org.mockito.junit.MockitoJUnitRunner;
import org.opendaylight.protocol.concepts.KeyMapping;
import org.opendaylight.protocol.pcep.MessageRegistry;
-import org.opendaylight.protocol.pcep.PCEPDispatcherDependencies;
import org.opendaylight.protocol.pcep.PCEPSession;
import org.opendaylight.protocol.pcep.PCEPSessionListenerFactory;
import org.opendaylight.protocol.pcep.PCEPSessionNegotiatorFactory;
+import org.opendaylight.protocol.pcep.PCEPSessionNegotiatorFactoryDependencies;
import org.opendaylight.protocol.pcep.PCEPSessionProposalFactory;
import org.opendaylight.protocol.pcep.spi.pojo.DefaultPCEPExtensionConsumerContext;
import org.opendaylight.protocol.util.InetSocketAddressUtil;
@Mock
private Channel mockChannel;
@Mock
- private PCEPDispatcherDependencies dispatcherDependencies;
+ private PCEPSessionNegotiatorFactoryDependencies negotiatorDependencies;
@Mock
private PCEPSessionListenerFactory listenerFactory;
@Mock
new DefaultPCEPSessionNegotiatorFactory(sessionProposal, errorPolicy),
eventLoopGroup, eventLoopGroup);
- doReturn(KeyMapping.of()).when(dispatcherDependencies).getKeys();
- doReturn(null).when(dispatcherDependencies).getPeerProposal();
+ doReturn(null).when(negotiatorDependencies).getPeerProposal();
final PCEPDispatcherImpl dispatcher2 = new PCEPDispatcherImpl(msgReg,
new DefaultPCEPSessionNegotiatorFactory(sessionProposal, errorPolicy),
final InetSocketAddress clientAddr1 = InetSocketAddressUtil.getRandomLoopbackInetSocketAddress(port);
final InetSocketAddress clientAddr2 = InetSocketAddressUtil.getRandomLoopbackInetSocketAddress(port);
- doReturn(serverAddr).when(dispatcherDependencies).getAddress();
- doReturn(listenerFactory).when(dispatcherDependencies).getListenerFactory();
+ doReturn(listenerFactory).when(negotiatorDependencies).getListenerFactory();
doReturn(new SimpleSessionListener()).when(listenerFactory).getSessionListener();
- final ChannelFuture futureChannel = dispatcher.createServer(dispatcherDependencies);
+ final ChannelFuture futureChannel = dispatcher.createServer(serverAddr, KeyMapping.of(),
+ negotiatorDependencies);
futureChannel.sync();
try (var session1 = (PCEPSessionImpl) pccMock.createClient(clientAddr1,
final InetSocketAddress serverAddr = new InetSocketAddress("0.0.0.0", port);
final InetSocketAddress clientAddr = InetSocketAddressUtil.getRandomLoopbackInetSocketAddress(port);
- doReturn(serverAddr).when(dispatcherDependencies).getAddress();
- doReturn(listenerFactory).when(dispatcherDependencies).getListenerFactory();
+ doReturn(listenerFactory).when(negotiatorDependencies).getListenerFactory();
doReturn(new SimpleSessionListener()).when(listenerFactory).getSessionListener();
- dispatcher.createServer(dispatcherDependencies).sync();
+ dispatcher.createServer(serverAddr, KeyMapping.of(), negotiatorDependencies).sync();
final Future<PCEPSession> futureClient = pccMock.createClient(clientAddr, RETRY_TIMER, CONNECT_TIMEOUT,
SimpleSessionListener::new);
futureClient.sync();
final int port = InetSocketAddressUtil.getRandomPort();
final InetSocketAddress clientAddr = InetSocketAddressUtil.getRandomLoopbackInetSocketAddress(port);
- doReturn(new InetSocketAddress("0.0.0.0", port)).when(dispatcherDependencies).getAddress();
- doReturn(listenerFactory).when(dispatcherDependencies).getListenerFactory();
+ doReturn(listenerFactory).when(negotiatorDependencies).getListenerFactory();
doReturn(new SimpleSessionListener()).when(listenerFactory).getSessionListener();
- dispatcher.createServer(dispatcherDependencies).sync();
+ dispatcher.createServer(new InetSocketAddress("0.0.0.0", port), KeyMapping.of(), negotiatorDependencies).sync();
final PCEPSessionImpl session1 = (PCEPSessionImpl) pccMock.createClient(clientAddr,
RETRY_TIMER, CONNECT_TIMEOUT, SimpleSessionListener::new).get();
clientAddr1.getAddress(), "CLIENT1_ADDRESS",
clientAddr2.getAddress(), "CLIENT2_ADDRESS"));
- doReturn(new InetSocketAddress("0.0.0.0", port)).when(dispatcherDependencies).getAddress();
-
- final ChannelFuture futureChannel = disp2Spy.createServer(dispatcherDependencies);
- futureChannel.sync();
- verify(disp2Spy).createServerBootstrap(any(PCEPDispatcherImpl.ChannelPipelineInitializer.class));
+ final ChannelFuture futureChannel = disp2Spy.createServer(new InetSocketAddress("0.0.0.0", port),
+ keys, negotiatorDependencies).sync();
+ verify(disp2Spy).createServerBootstrap(any(PCEPDispatcherImpl.ChannelPipelineInitializer.class), same(keys));
}
@After
import org.opendaylight.protocol.concepts.KeyMapping;
import org.opendaylight.protocol.pcep.MessageRegistry;
import org.opendaylight.protocol.pcep.PCEPDispatcher;
-import org.opendaylight.protocol.pcep.PCEPDispatcherDependencies;
import org.opendaylight.protocol.pcep.PCEPSession;
+import org.opendaylight.protocol.pcep.PCEPSessionNegotiatorFactoryDependencies;
import org.opendaylight.protocol.pcep.PCEPSessionProposalFactory;
import org.opendaylight.protocol.pcep.impl.BasePCEPSessionProposalFactory;
import org.opendaylight.protocol.pcep.impl.DefaultPCEPSessionNegotiatorFactory;
private MessageRegistry registry;
@Mock
- PCEPDispatcherDependencies dispatcherDependencies;
+ PCEPSessionNegotiatorFactoryDependencies negotiatorDependencies;
@Before
public void setUp() {
pcepDispatcher = new PCEPDispatcherImpl(registry, nf, bossGroup, workerGroup);
serverAddress = InetSocketAddressUtil.getRandomLoopbackInetSocketAddress();
clientAddress = InetSocketAddressUtil.getRandomLoopbackInetSocketAddress(0);
- doReturn(KeyMapping.of()).when(dispatcherDependencies).getKeys();
- doReturn(serverAddress).when(dispatcherDependencies).getAddress();
- doReturn(null).when(dispatcherDependencies).getPeerProposal();
+ doReturn(null).when(negotiatorDependencies).getPeerProposal();
}
@After
final Future<PCEPSession> futureSession = dispatcher.createClient(serverAddress, 1,
new TestingSessionListenerFactory(), nf, KeyMapping.of(), clientAddress);
final TestingSessionListenerFactory slf = new TestingSessionListenerFactory();
- doReturn(slf).when(dispatcherDependencies).getListenerFactory();
+ doReturn(slf).when(negotiatorDependencies).getListenerFactory();
- final ChannelFuture futureServer = pcepDispatcher.createServer(dispatcherDependencies);
+ final ChannelFuture futureServer = pcepDispatcher.createServer(serverAddress, KeyMapping.of(),
+ negotiatorDependencies);
futureServer.sync();
final Channel channel = futureServer.channel();
assertNotNull(futureSession.get());
pcepDispatcher = new PCEPDispatcherImpl(registry, nf, bossGroup, workerGroup);
final TestingSessionListenerFactory slf2 = new TestingSessionListenerFactory();
- doReturn(slf2).when(dispatcherDependencies).getListenerFactory();
- final ChannelFuture future2 = pcepDispatcher.createServer(dispatcherDependencies);
+ doReturn(slf2).when(negotiatorDependencies).getListenerFactory();
+ final ChannelFuture future2 = pcepDispatcher.createServer(serverAddress, KeyMapping.of(),
+ negotiatorDependencies);
future2.sync();
final Channel channel2 = future2.channel();
final TestingSessionListener sl2 = checkSessionListenerNotNull(slf2,
import org.opendaylight.protocol.pcep.MessageRegistry;
import org.opendaylight.protocol.pcep.PCEPCapability;
import org.opendaylight.protocol.pcep.PCEPDispatcher;
-import org.opendaylight.protocol.pcep.PCEPDispatcherDependencies;
import org.opendaylight.protocol.pcep.PCEPPeerProposal;
import org.opendaylight.protocol.pcep.PCEPSession;
import org.opendaylight.protocol.pcep.PCEPSessionListenerFactory;
import org.opendaylight.protocol.pcep.PCEPSessionNegotiatorFactory;
+import org.opendaylight.protocol.pcep.PCEPSessionNegotiatorFactoryDependencies;
import org.opendaylight.protocol.pcep.ietf.stateful.StatefulActivator;
import org.opendaylight.protocol.pcep.impl.BasePCEPSessionProposalFactory;
import org.opendaylight.protocol.pcep.impl.DefaultPCEPSessionNegotiatorFactory;
optimizationsActivator.start(extensionProvider);
final ChannelFuture future = pceDispatcher
- .createServer(new DispatcherDependencies(serverAddress2, factory, peerProposal));
+ .createServer(serverAddress2, KeyMapping.of(), new NegotiatorDependencies(factory, peerProposal));
waitFutureSuccess(future);
return future.channel();
}
return checkSessionListenerNotNull(factory, localAddress.getHostString());
}
- private static class DispatcherDependencies implements PCEPDispatcherDependencies {
- private final KeyMapping keys = KeyMapping.of();
- private final InetSocketAddress address;
+ private static class NegotiatorDependencies implements PCEPSessionNegotiatorFactoryDependencies {
private final TestingSessionListenerFactory listenerFactory;
private final PCEPPeerProposal peerProposal;
- DispatcherDependencies(
- final InetSocketAddress address,
- final TestingSessionListenerFactory listenerFactory,
+ NegotiatorDependencies(final TestingSessionListenerFactory listenerFactory,
final PCEPPeerProposal peerProposal) {
- this.address = address;
this.listenerFactory = listenerFactory;
this.peerProposal = peerProposal;
}
- @Override
- public InetSocketAddress getAddress() {
- return address;
- }
-
- @Override
- public KeyMapping getKeys() {
- return keys;
- }
-
@Override
public PCEPSessionListenerFactory getListenerFactory() {
return listenerFactory;
import java.util.List;
import java.util.ServiceLoader;
import java.util.concurrent.ExecutionException;
+import org.opendaylight.protocol.concepts.KeyMapping;
import org.opendaylight.protocol.pcep.MessageRegistry;
import org.opendaylight.protocol.pcep.PCEPCapability;
import org.opendaylight.protocol.pcep.PCEPSessionProposalFactory;
final PCEPDispatcherImpl dispatcher = new PCEPDispatcherImpl(handlerRegistry,
new DefaultPCEPSessionNegotiatorFactory(spf, ERROR_POLICY),
new NioEventLoopGroup(), new NioEventLoopGroup());
- dispatcher.createServer(new TestToolPCEPDispatcherDependencies(address)).get();
+ dispatcher.createServer(address, KeyMapping.of(), new TestToolPCEPNegotiatorDependencies()).get();
}
}
*/
package org.opendaylight.protocol.pcep.testtool;
-import java.net.InetSocketAddress;
import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.protocol.concepts.KeyMapping;
-import org.opendaylight.protocol.pcep.PCEPDispatcherDependencies;
import org.opendaylight.protocol.pcep.PCEPSessionListenerFactory;
+import org.opendaylight.protocol.pcep.PCEPSessionNegotiatorFactoryDependencies;
-public final class TestToolPCEPDispatcherDependencies implements PCEPDispatcherDependencies {
+public final class TestToolPCEPNegotiatorDependencies implements PCEPSessionNegotiatorFactoryDependencies {
private final @NonNull PCEPSessionListenerFactory listenerFactory = new TestingSessionListenerFactory();
- private final InetSocketAddress address;
-
- TestToolPCEPDispatcherDependencies(final InetSocketAddress address) {
- this.address = address;
- }
-
- @Override
- public InetSocketAddress getAddress() {
- return address;
- }
-
- @Override
- public KeyMapping getKeys() {
- return KeyMapping.of();
- }
@Override
public PCEPSessionListenerFactory getListenerFactory() {
import static java.util.Objects.requireNonNull;
-import java.net.InetSocketAddress;
import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.protocol.concepts.KeyMapping;
-import org.opendaylight.protocol.pcep.PCEPDispatcherDependencies;
import org.opendaylight.protocol.pcep.PCEPPeerProposal;
import org.opendaylight.protocol.pcep.PCEPSessionListenerFactory;
+import org.opendaylight.protocol.pcep.PCEPSessionNegotiatorFactoryDependencies;
-final class PCEPDispatcherDependenciesImpl implements PCEPDispatcherDependencies {
+final class PCEPSessionNegotiatorFactoryDependenciesImpl implements PCEPSessionNegotiatorFactoryDependencies {
private final @NonNull PCEPSessionListenerFactory listenerFactory;
private final @NonNull PCEPPeerProposal peerProposal;
- private final @NonNull PCEPTopologyConfiguration topologyConfig;
-
- PCEPDispatcherDependenciesImpl(final PCEPSessionListenerFactory listenerFactory,
- final PCEPPeerProposal peerProposal, final PCEPTopologyConfiguration topologyConfig) {
+ PCEPSessionNegotiatorFactoryDependenciesImpl(final PCEPSessionListenerFactory listenerFactory,
+ final PCEPPeerProposal peerProposal) {
this.listenerFactory = requireNonNull(listenerFactory);
this.peerProposal = requireNonNull(peerProposal);
- this.topologyConfig = requireNonNull(topologyConfig);
}
@Override
public PCEPPeerProposal getPeerProposal() {
return peerProposal;
}
-
- @Override
- public InetSocketAddress getAddress() {
- return topologyConfig.getAddress();
- }
-
- @Override
- public KeyMapping getKeys() {
- return topologyConfig.getKeys();
- }
}
proposal = new PCEPStatefulPeerProposal(dependencies.getDataBroker(), instanceIdentifier);
LOG.info("PCEP Topology Provider {} starting server channel", topologyId());
- final var channelFuture = dependencies.getPCEPDispatcher().createServer(
- new PCEPDispatcherDependenciesImpl(manager, proposal, currentConfig));
+ final var channelFuture = dependencies.getPCEPDispatcher().createServer(currentConfig.getAddress(),
+ currentConfig.getKeys(), new PCEPSessionNegotiatorFactoryDependenciesImpl(manager, proposal));
channelFuture.addListener(ignored -> enableRPCs(future, channelFuture));
}