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
8 package org.opendaylight.netconf.client;
10 import io.netty.channel.EventLoopGroup;
11 import io.netty.util.Timer;
12 import io.netty.util.concurrent.Future;
13 import java.util.LinkedHashSet;
14 import java.util.List;
16 import org.opendaylight.netconf.client.conf.NetconfClientConfiguration;
17 import org.opendaylight.netconf.client.conf.NetconfReconnectingClientConfiguration;
18 import org.opendaylight.netconf.nettyutil.AbstractNetconfDispatcher;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
20 import org.slf4j.Logger;
21 import org.slf4j.LoggerFactory;
23 public class NetconfClientDispatcherImpl
24 extends AbstractNetconfDispatcher<NetconfClientSession, NetconfClientSessionListener>
25 implements NetconfClientDispatcher {
27 private static final Logger LOG = LoggerFactory.getLogger(NetconfClientDispatcherImpl.class);
29 private final Timer timer;
31 public NetconfClientDispatcherImpl(final EventLoopGroup bossGroup, final EventLoopGroup workerGroup,
33 super(bossGroup, workerGroup);
37 protected Timer getTimer() {
42 public Future<NetconfClientSession> createClient(final NetconfClientConfiguration clientConfiguration) {
43 switch (clientConfiguration.getProtocol()) {
45 return createTcpClient(clientConfiguration);
47 return createSshClient(clientConfiguration);
49 return createTlsClient(clientConfiguration);
51 throw new IllegalArgumentException("Unknown client protocol " + clientConfiguration.getProtocol());
56 public Future<Void> createReconnectingClient(final NetconfReconnectingClientConfiguration clientConfiguration) {
57 switch (clientConfiguration.getProtocol()) {
59 return createReconnectingTcpClient(clientConfiguration);
61 return createReconnectingSshClient(clientConfiguration);
63 return createReconnectingTlsClient(clientConfiguration);
65 throw new IllegalArgumentException("Unknown client protocol " + clientConfiguration.getProtocol());
69 private Future<NetconfClientSession> createTcpClient(final NetconfClientConfiguration currentConfiguration) {
70 LOG.debug("Creating TCP client with configuration: {}", currentConfiguration);
71 return super.createClient(currentConfiguration.getAddress(), currentConfiguration.getReconnectStrategy(),
72 (ch, promise) -> new TcpClientChannelInitializer(getNegotiatorFactory(currentConfiguration),
73 currentConfiguration.getSessionListener()).initialize(ch, promise));
76 private Future<Void> createReconnectingTcpClient(
77 final NetconfReconnectingClientConfiguration currentConfiguration) {
78 LOG.debug("Creating reconnecting TCP client with configuration: {}", currentConfiguration);
79 final TcpClientChannelInitializer init =
80 new TcpClientChannelInitializer(getNegotiatorFactory(currentConfiguration),
81 currentConfiguration.getSessionListener());
83 return super.createReconnectingClient(currentConfiguration.getAddress(), currentConfiguration
84 .getConnectStrategyFactory(),
85 currentConfiguration.getReconnectStrategy(), init::initialize);
88 private Future<NetconfClientSession> createSshClient(final NetconfClientConfiguration currentConfiguration) {
89 LOG.debug("Creating SSH client with configuration: {}", currentConfiguration);
90 return super.createClient(currentConfiguration.getAddress(), currentConfiguration.getReconnectStrategy(),
91 (ch, sessionPromise) -> new SshClientChannelInitializer(currentConfiguration.getAuthHandler(),
92 getNegotiatorFactory(currentConfiguration), currentConfiguration.getSessionListener(),
93 currentConfiguration.getSshClient()).initialize(ch, sessionPromise));
96 private Future<Void> createReconnectingSshClient(
97 final NetconfReconnectingClientConfiguration currentConfiguration) {
98 LOG.debug("Creating reconnecting SSH client with configuration: {}", currentConfiguration);
99 final SshClientChannelInitializer init = new SshClientChannelInitializer(currentConfiguration.getAuthHandler(),
100 getNegotiatorFactory(currentConfiguration), currentConfiguration.getSessionListener(),
101 currentConfiguration.getSshClient());
103 return super.createReconnectingClient(currentConfiguration.getAddress(), currentConfiguration
104 .getConnectStrategyFactory(), currentConfiguration.getReconnectStrategy(),
108 private Future<NetconfClientSession> createTlsClient(final NetconfClientConfiguration currentConfiguration) {
109 LOG.debug("Creating TLS client with configuration: {}", currentConfiguration);
110 return super.createClient(currentConfiguration.getAddress(), currentConfiguration.getReconnectStrategy(),
111 (ch, sessionPromise) -> new TlsClientChannelInitializer(currentConfiguration.getSslHandlerFactory(),
112 getNegotiatorFactory(currentConfiguration), currentConfiguration.getSessionListener())
113 .initialize(ch, sessionPromise));
116 private Future<Void> createReconnectingTlsClient(
117 final NetconfReconnectingClientConfiguration currentConfiguration) {
118 LOG.debug("Creating reconnecting TLS client with configuration: {}", currentConfiguration);
119 final TlsClientChannelInitializer init = new TlsClientChannelInitializer(
120 currentConfiguration.getSslHandlerFactory(), getNegotiatorFactory(currentConfiguration),
121 currentConfiguration.getSessionListener());
123 return super.createReconnectingClient(currentConfiguration.getAddress(), currentConfiguration
124 .getConnectStrategyFactory(), currentConfiguration.getReconnectStrategy(),
128 protected NetconfClientSessionNegotiatorFactory getNegotiatorFactory(final NetconfClientConfiguration cfg) {
129 final List<Uri> odlHelloCapabilities = cfg.getOdlHelloCapabilities();
130 if (odlHelloCapabilities == null || odlHelloCapabilities.isEmpty()) {
131 return new NetconfClientSessionNegotiatorFactory(timer, cfg.getAdditionalHeader(),
132 cfg.getConnectionTimeoutMillis());
134 // LinkedHashSet since perhaps the device cares about order of hello message capabilities.
135 // This allows user control of the order while complying with the existing interface.
136 final Set<String> stringCapabilities = new LinkedHashSet<>();
137 for (final Uri uri : odlHelloCapabilities) {
138 stringCapabilities.add(uri.getValue());
140 return new NetconfClientSessionNegotiatorFactory(timer, cfg.getAdditionalHeader(),
141 cfg.getConnectionTimeoutMillis(), stringCapabilities);