2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.netconf.client;
11 import io.netty.channel.EventLoopGroup;
12 import io.netty.channel.socket.SocketChannel;
13 import io.netty.util.Timer;
14 import io.netty.util.concurrent.Future;
15 import io.netty.util.concurrent.Promise;
16 import java.io.Closeable;
17 import org.opendaylight.netconf.client.conf.NetconfClientConfiguration;
18 import org.opendaylight.netconf.client.conf.NetconfReconnectingClientConfiguration;
19 import org.opendaylight.protocol.framework.AbstractDispatcher;
20 import org.slf4j.Logger;
21 import org.slf4j.LoggerFactory;
23 public class NetconfClientDispatcherImpl extends AbstractDispatcher<NetconfClientSession, NetconfClientSessionListener>
24 implements NetconfClientDispatcher, Closeable {
26 private static final Logger LOG = LoggerFactory.getLogger(NetconfClientDispatcherImpl.class);
28 private final Timer timer;
30 public NetconfClientDispatcherImpl(final EventLoopGroup bossGroup, final EventLoopGroup workerGroup, final Timer timer) {
31 super(bossGroup, workerGroup);
35 protected Timer getTimer() {
40 public Future<NetconfClientSession> createClient(final NetconfClientConfiguration clientConfiguration) {
41 switch (clientConfiguration.getProtocol()) {
43 return createTcpClient(clientConfiguration);
45 return createSshClient(clientConfiguration);
47 throw new IllegalArgumentException("Unknown client protocol " + clientConfiguration.getProtocol());
51 public Future<Void> createReconnectingClient(final NetconfReconnectingClientConfiguration clientConfiguration) {
52 switch (clientConfiguration.getProtocol()) {
54 return createReconnectingTcpClient(clientConfiguration);
56 return createReconnectingSshClient(clientConfiguration);
58 throw new IllegalArgumentException("Unknown client protocol " + clientConfiguration.getProtocol());
62 private Future<NetconfClientSession> createTcpClient(final NetconfClientConfiguration currentConfiguration) {
63 LOG.debug("Creating TCP client with configuration: {}", currentConfiguration);
64 return super.createClient(currentConfiguration.getAddress(), currentConfiguration.getReconnectStrategy(),
65 new PipelineInitializer<NetconfClientSession>() {
68 public void initializeChannel(final SocketChannel ch, final Promise<NetconfClientSession> promise) {
69 initialize(ch, promise);
72 private void initialize(final SocketChannel ch, final Promise<NetconfClientSession> promise) {
73 new TcpClientChannelInitializer(getNegotiatorFactory(currentConfiguration), currentConfiguration
74 .getSessionListener()).initialize(ch, promise);
79 private Future<Void> createReconnectingTcpClient(final NetconfReconnectingClientConfiguration currentConfiguration) {
80 LOG.debug("Creating reconnecting TCP client with configuration: {}", currentConfiguration);
81 final TcpClientChannelInitializer init = new TcpClientChannelInitializer(getNegotiatorFactory(currentConfiguration),
82 currentConfiguration.getSessionListener());
84 return super.createReconnectingClient(currentConfiguration.getAddress(), currentConfiguration.getConnectStrategyFactory(),
85 currentConfiguration.getReconnectStrategy(), new PipelineInitializer<NetconfClientSession>() {
87 public void initializeChannel(final SocketChannel ch, final Promise<NetconfClientSession> promise) {
88 init.initialize(ch, promise);
93 private Future<NetconfClientSession> createSshClient(final NetconfClientConfiguration currentConfiguration) {
94 LOG.debug("Creating SSH client with configuration: {}", currentConfiguration);
95 return super.createClient(currentConfiguration.getAddress(), currentConfiguration.getReconnectStrategy(),
96 new PipelineInitializer<NetconfClientSession>() {
99 public void initializeChannel(final SocketChannel ch,
100 final Promise<NetconfClientSession> sessionPromise) {
101 new SshClientChannelInitializer(currentConfiguration.getAuthHandler(),
102 getNegotiatorFactory(currentConfiguration), currentConfiguration.getSessionListener())
103 .initialize(ch, sessionPromise);
109 private Future<Void> createReconnectingSshClient(final NetconfReconnectingClientConfiguration currentConfiguration) {
110 LOG.debug("Creating reconnecting SSH client with configuration: {}", currentConfiguration);
111 final SshClientChannelInitializer init = new SshClientChannelInitializer(currentConfiguration.getAuthHandler(),
112 getNegotiatorFactory(currentConfiguration), currentConfiguration.getSessionListener());
114 return super.createReconnectingClient(currentConfiguration.getAddress(), currentConfiguration.getConnectStrategyFactory(), currentConfiguration.getReconnectStrategy(),
115 new PipelineInitializer<NetconfClientSession>() {
117 public void initializeChannel(final SocketChannel ch, final Promise<NetconfClientSession> promise) {
118 init.initialize(ch, promise);
123 protected NetconfClientSessionNegotiatorFactory getNegotiatorFactory(final NetconfClientConfiguration cfg) {
124 return new NetconfClientSessionNegotiatorFactory(timer, cfg.getAdditionalHeader(),
125 cfg.getConnectionTimeoutMillis());