d0dc480299b97192a7a5495daf2e3fed344525c6
[netconf.git] / netconf / netconf-client / src / main / java / org / opendaylight / netconf / client / NetconfClientDispatcherImpl.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.netconf.client;
10
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;
20
21 public class NetconfClientDispatcherImpl extends AbstractDispatcher<NetconfClientSession, NetconfClientSessionListener>
22         implements NetconfClientDispatcher, Closeable {
23
24     private static final Logger LOG = LoggerFactory.getLogger(NetconfClientDispatcherImpl.class);
25
26     private final Timer timer;
27
28     public NetconfClientDispatcherImpl(final EventLoopGroup bossGroup, final EventLoopGroup workerGroup,
29                                        final Timer timer) {
30         super(bossGroup, workerGroup);
31         this.timer = timer;
32     }
33
34     protected Timer getTimer() {
35         return timer;
36     }
37
38     @Override
39     public Future<NetconfClientSession> createClient(final NetconfClientConfiguration clientConfiguration) {
40         switch (clientConfiguration.getProtocol()) {
41             case TCP:
42                 return createTcpClient(clientConfiguration);
43             case SSH:
44                 return createSshClient(clientConfiguration);
45             case TLS:
46                 return createTlsClient(clientConfiguration);
47             default:
48                 throw new IllegalArgumentException("Unknown client protocol " + clientConfiguration.getProtocol());
49         }
50     }
51
52     @Override
53     public Future<Void> createReconnectingClient(final NetconfReconnectingClientConfiguration clientConfiguration) {
54         switch (clientConfiguration.getProtocol()) {
55             case TCP:
56                 return createReconnectingTcpClient(clientConfiguration);
57             case SSH:
58                 return createReconnectingSshClient(clientConfiguration);
59             case TLS:
60                 return createReconnectingTlsClient(clientConfiguration);
61             default:
62                 throw new IllegalArgumentException("Unknown client protocol " + clientConfiguration.getProtocol());
63         }
64     }
65
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),
70                         currentConfiguration
71                         .getSessionListener()).initialize(ch, promise));
72     }
73
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());
80
81         return super.createReconnectingClient(currentConfiguration.getAddress(), currentConfiguration
82                 .getConnectStrategyFactory(),
83                 currentConfiguration.getReconnectStrategy(), init::initialize);
84     }
85
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));
92     }
93
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());
99
100         return super.createReconnectingClient(currentConfiguration.getAddress(), currentConfiguration
101                 .getConnectStrategyFactory(), currentConfiguration.getReconnectStrategy(),
102                 init::initialize);
103     }
104
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));
111     }
112
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());
119
120         return super.createReconnectingClient(currentConfiguration.getAddress(), currentConfiguration
121                 .getConnectStrategyFactory(), currentConfiguration.getReconnectStrategy(),
122                 init::initialize);
123     }
124
125     protected NetconfClientSessionNegotiatorFactory getNegotiatorFactory(final NetconfClientConfiguration cfg) {
126         return new NetconfClientSessionNegotiatorFactory(timer, cfg.getAdditionalHeader(),
127                 cfg.getConnectionTimeoutMillis());
128     }
129 }