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.controller.netconf.client;
11 import java.io.Closeable;
13 import org.opendaylight.controller.netconf.client.conf.NetconfClientConfiguration;
14 import org.opendaylight.controller.netconf.client.conf.NetconfReconnectingClientConfiguration;
15 import org.opendaylight.protocol.framework.AbstractDispatcher;
16 import org.slf4j.Logger;
17 import org.slf4j.LoggerFactory;
19 import io.netty.channel.EventLoopGroup;
20 import io.netty.channel.socket.SocketChannel;
21 import io.netty.util.Timer;
22 import io.netty.util.concurrent.Future;
23 import io.netty.util.concurrent.Promise;
25 public class NetconfClientDispatcherImpl extends AbstractDispatcher<NetconfClientSession, NetconfClientSessionListener>
26 implements NetconfClientDispatcher, Closeable {
28 private static final Logger logger = LoggerFactory.getLogger(NetconfClientDispatcherImpl.class);
30 private final Timer timer;
32 public NetconfClientDispatcherImpl(final EventLoopGroup bossGroup, final EventLoopGroup workerGroup, final Timer timer) {
33 super(bossGroup, workerGroup);
38 public Future<NetconfClientSession> createClient(final NetconfClientConfiguration clientConfiguration) {
39 switch (clientConfiguration.getProtocol()) {
41 return createTcpClient(clientConfiguration);
43 return createSshClient(clientConfiguration);
45 throw new IllegalArgumentException("Unknown client protocol " + clientConfiguration.getProtocol());
49 public Future<Void> createReconnectingClient(final NetconfReconnectingClientConfiguration clientConfiguration) {
50 switch (clientConfiguration.getProtocol()) {
51 case TCP: return createReconnectingTcpClient(clientConfiguration);
52 case SSH: return createReconnectingSshClient(clientConfiguration);
53 default: throw new IllegalArgumentException("Unknown client protocol " + clientConfiguration.getProtocol());
57 private Future<NetconfClientSession> createTcpClient(final NetconfClientConfiguration currentConfiguration) {
58 logger.debug("Creating TCP client with configuration: {}", currentConfiguration);
59 return super.createClient(currentConfiguration.getAddress(), currentConfiguration.getReconnectStrategy(),
60 new PipelineInitializer<NetconfClientSession>() {
63 public void initializeChannel(final SocketChannel ch, final Promise<NetconfClientSession> promise) {
64 initialize(ch, promise);
67 private void initialize(final SocketChannel ch, final Promise<NetconfClientSession> promise) {
68 new TcpClientChannelInitializer(getNegotiatorFactory(currentConfiguration), currentConfiguration
69 .getSessionListener()).initialize(ch, promise);
74 private Future<Void> createReconnectingTcpClient(final NetconfReconnectingClientConfiguration currentConfiguration) {
75 logger.debug("Creating reconnecting TCP client with configuration: {}", currentConfiguration);
76 final TcpClientChannelInitializer init = new TcpClientChannelInitializer(getNegotiatorFactory(currentConfiguration),
77 currentConfiguration.getSessionListener());
79 return super.createReconnectingClient(currentConfiguration.getAddress(), currentConfiguration.getConnectStrategyFactory(),
80 currentConfiguration.getReconnectStrategy(), new PipelineInitializer<NetconfClientSession>() {
82 public void initializeChannel(final SocketChannel ch, final Promise<NetconfClientSession> promise) {
83 init.initialize(ch, promise);
88 private Future<NetconfClientSession> createSshClient(final NetconfClientConfiguration currentConfiguration) {
89 logger.debug("Creating SSH client with configuration: {}", currentConfiguration);
90 return super.createClient(currentConfiguration.getAddress(), currentConfiguration.getReconnectStrategy(),
91 new PipelineInitializer<NetconfClientSession>() {
94 public void initializeChannel(final SocketChannel ch,
95 final Promise<NetconfClientSession> sessionPromise) {
96 new SshClientChannelInitializer(currentConfiguration.getAuthHandler(),
97 getNegotiatorFactory(currentConfiguration), currentConfiguration.getSessionListener())
98 .initialize(ch, sessionPromise);
104 private Future<Void> createReconnectingSshClient(final NetconfReconnectingClientConfiguration currentConfiguration) {
105 logger.debug("Creating reconnecting SSH client with configuration: {}", currentConfiguration);
106 final SshClientChannelInitializer init = new SshClientChannelInitializer(currentConfiguration.getAuthHandler(),
107 getNegotiatorFactory(currentConfiguration), currentConfiguration.getSessionListener());
109 return super.createReconnectingClient(currentConfiguration.getAddress(), currentConfiguration.getConnectStrategyFactory(), currentConfiguration.getReconnectStrategy(),
110 new PipelineInitializer<NetconfClientSession>() {
112 public void initializeChannel(final SocketChannel ch, final Promise<NetconfClientSession> promise) {
113 init.initialize(ch, promise);
118 protected NetconfClientSessionNegotiatorFactory getNegotiatorFactory(final NetconfClientConfiguration cfg) {
119 return new NetconfClientSessionNegotiatorFactory(timer, cfg.getAdditionalHeader(),
120 cfg.getConnectionTimeoutMillis());