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.util.Timer;
13 import io.netty.util.concurrent.Future;
14 import java.io.Closeable;
15 import org.opendaylight.netconf.client.conf.NetconfClientConfiguration;
16 import org.opendaylight.netconf.client.conf.NetconfReconnectingClientConfiguration;
17 import org.opendaylight.protocol.framework.AbstractDispatcher;
18 import org.slf4j.Logger;
19 import org.slf4j.LoggerFactory;
21 public class NetconfClientDispatcherImpl extends AbstractDispatcher<NetconfClientSession, NetconfClientSessionListener>
22 implements NetconfClientDispatcher, Closeable {
24 private static final Logger LOG = LoggerFactory.getLogger(NetconfClientDispatcherImpl.class);
26 private final Timer timer;
28 public NetconfClientDispatcherImpl(final EventLoopGroup bossGroup, final EventLoopGroup workerGroup,
30 super(bossGroup, workerGroup);
34 protected Timer getTimer() {
39 public Future<NetconfClientSession> createClient(final NetconfClientConfiguration clientConfiguration) {
40 switch (clientConfiguration.getProtocol()) {
42 return createTcpClient(clientConfiguration);
44 return createSshClient(clientConfiguration);
46 return createTlsClient(clientConfiguration);
48 throw new IllegalArgumentException("Unknown client protocol " + clientConfiguration.getProtocol());
53 public Future<Void> createReconnectingClient(final NetconfReconnectingClientConfiguration clientConfiguration) {
54 switch (clientConfiguration.getProtocol()) {
56 return createReconnectingTcpClient(clientConfiguration);
58 return createReconnectingSshClient(clientConfiguration);
60 return createReconnectingTlsClient(clientConfiguration);
62 throw new IllegalArgumentException("Unknown client protocol " + clientConfiguration.getProtocol());
66 private Future<NetconfClientSession> createTcpClient(final NetconfClientConfiguration currentConfiguration) {
67 LOG.debug("Creating TCP client with configuration: {}", currentConfiguration);
68 return super.createClient(currentConfiguration.getAddress(), currentConfiguration.getReconnectStrategy(),
69 (ch, promise) -> new TcpClientChannelInitializer(getNegotiatorFactory(currentConfiguration),
71 .getSessionListener()).initialize(ch, promise));
74 private Future<Void> createReconnectingTcpClient(
75 final NetconfReconnectingClientConfiguration currentConfiguration) {
76 LOG.debug("Creating reconnecting TCP client with configuration: {}", currentConfiguration);
77 final TcpClientChannelInitializer init =
78 new TcpClientChannelInitializer(getNegotiatorFactory(currentConfiguration),
79 currentConfiguration.getSessionListener());
81 return super.createReconnectingClient(currentConfiguration.getAddress(), currentConfiguration
82 .getConnectStrategyFactory(),
83 currentConfiguration.getReconnectStrategy(), init::initialize);
86 private Future<NetconfClientSession> createSshClient(final NetconfClientConfiguration currentConfiguration) {
87 LOG.debug("Creating SSH client with configuration: {}", currentConfiguration);
88 return super.createClient(currentConfiguration.getAddress(), currentConfiguration.getReconnectStrategy(),
89 (ch, sessionPromise) -> new SshClientChannelInitializer(currentConfiguration.getAuthHandler(),
90 getNegotiatorFactory(currentConfiguration), currentConfiguration.getSessionListener())
91 .initialize(ch, sessionPromise));
94 private Future<Void> createReconnectingSshClient(
95 final NetconfReconnectingClientConfiguration currentConfiguration) {
96 LOG.debug("Creating reconnecting SSH client with configuration: {}", currentConfiguration);
97 final SshClientChannelInitializer init = new SshClientChannelInitializer(currentConfiguration.getAuthHandler(),
98 getNegotiatorFactory(currentConfiguration), currentConfiguration.getSessionListener());
100 return super.createReconnectingClient(currentConfiguration.getAddress(), currentConfiguration
101 .getConnectStrategyFactory(), currentConfiguration.getReconnectStrategy(),
105 private Future<NetconfClientSession> createTlsClient(final NetconfClientConfiguration currentConfiguration) {
106 LOG.debug("Creating TLS client with configuration: {}", currentConfiguration);
107 return super.createClient(currentConfiguration.getAddress(), currentConfiguration.getReconnectStrategy(),
108 (ch, sessionPromise) -> new TlsClientChannelInitializer(currentConfiguration.getSslHandlerFactory(),
109 getNegotiatorFactory(currentConfiguration), currentConfiguration.getSessionListener())
110 .initialize(ch, sessionPromise));
113 private Future<Void> createReconnectingTlsClient(
114 final NetconfReconnectingClientConfiguration currentConfiguration) {
115 LOG.debug("Creating reconnecting TLS client with configuration: {}", currentConfiguration);
116 final TlsClientChannelInitializer init = new TlsClientChannelInitializer(
117 currentConfiguration.getSslHandlerFactory(), getNegotiatorFactory(currentConfiguration),
118 currentConfiguration.getSessionListener());
120 return super.createReconnectingClient(currentConfiguration.getAddress(), currentConfiguration
121 .getConnectStrategyFactory(), currentConfiguration.getReconnectStrategy(),
125 protected NetconfClientSessionNegotiatorFactory getNegotiatorFactory(final NetconfClientConfiguration cfg) {
126 return new NetconfClientSessionNegotiatorFactory(timer, cfg.getAdditionalHeader(),
127 cfg.getConnectionTimeoutMillis());