2 * Copyright (c) 2014 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.conf;
10 import static java.util.Objects.requireNonNull;
12 import com.google.common.base.MoreObjects;
13 import com.google.common.base.MoreObjects.ToStringHelper;
14 import com.google.common.base.Preconditions;
15 import java.net.InetSocketAddress;
16 import java.util.List;
17 import java.util.Optional;
18 import org.checkerframework.checker.index.qual.NonNegative;
19 import org.opendaylight.netconf.api.messages.NetconfHelloMessageAdditionalHeader;
20 import org.opendaylight.netconf.client.NetconfClientSessionListener;
21 import org.opendaylight.netconf.client.SslHandlerFactory;
22 import org.opendaylight.netconf.nettyutil.handler.ssh.authentication.AuthenticationHandler;
23 import org.opendaylight.netconf.nettyutil.handler.ssh.client.NetconfSshClient;
24 import org.opendaylight.netconf.transport.ssh.ClientFactoryManagerConfigurator;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ssh.client.rev230417.SshClientGrouping;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.tcp.client.rev230417.TcpClientGrouping;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.tls.client.rev230417.TlsClientGrouping;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
32 public class NetconfClientConfiguration {
33 private static final Logger LOG = LoggerFactory.getLogger(NetconfClientConfiguration.class);
35 private final NetconfClientProtocol clientProtocol;
36 private final InetSocketAddress address;
37 private final Long connectionTimeoutMillis;
39 private final NetconfHelloMessageAdditionalHeader additionalHeader;
40 private final NetconfClientSessionListener sessionListener;
42 private final AuthenticationHandler authHandler;
43 private final SslHandlerFactory sslHandlerFactory;
44 private final NetconfSshClient sshClient;
46 private final List<Uri> odlHelloCapabilities;
47 private final @NonNegative int maximumIncomingChunkSize;
48 private final String name;
50 private final TcpClientGrouping tcpParameters;
51 private final TlsClientGrouping tlsParameters;
52 private final org.opendaylight.netconf.transport.tls.SslHandlerFactory transportSslHandlerFactory;
53 private final SshClientGrouping sshParameters;
54 private final ClientFactoryManagerConfigurator sshConfigurator;
56 NetconfClientConfiguration(final NetconfClientProtocol protocol, final InetSocketAddress address,
57 final Long connectionTimeoutMillis,
58 final NetconfHelloMessageAdditionalHeader additionalHeader,
59 final NetconfClientSessionListener sessionListener,
60 final AuthenticationHandler authHandler,
61 final SslHandlerFactory sslHandlerFactory, final NetconfSshClient sshClient,
62 final List<Uri> odlHelloCapabilities, final @NonNegative int maximumIncomingChunkSize,
64 this.address = address;
65 this.connectionTimeoutMillis = connectionTimeoutMillis;
66 this.additionalHeader = additionalHeader;
67 this.sessionListener = sessionListener;
68 clientProtocol = protocol;
69 this.authHandler = authHandler;
70 this.sslHandlerFactory = sslHandlerFactory;
71 this.sshClient = sshClient;
72 this.odlHelloCapabilities = odlHelloCapabilities;
73 this.maximumIncomingChunkSize = maximumIncomingChunkSize;
75 this.tcpParameters = null;
76 this.tlsParameters = null;
77 this.transportSslHandlerFactory = null;
78 this.sshParameters = null;
79 this.sshConfigurator = null;
80 validateConfiguration();
83 NetconfClientConfiguration(final NetconfClientProtocol protocol,
84 final TcpClientGrouping tcpParameters,
85 final TlsClientGrouping tlsParameters,
86 final org.opendaylight.netconf.transport.tls.SslHandlerFactory transportSslHandlerFactory,
87 final SshClientGrouping sshParameters,
88 final ClientFactoryManagerConfigurator sshConfigurator,
89 final NetconfClientSessionListener sessionListener,
90 final List<Uri> odlHelloCapabilities,
91 final Long connectionTimeoutMillis,
92 final @NonNegative int maximumIncomingChunkSize,
93 final NetconfHelloMessageAdditionalHeader additionalHeader,
95 this.clientProtocol = requireNonNull(protocol);
96 this.tcpParameters = requireNonNull(tcpParameters);
97 this.tlsParameters = tlsParameters;
98 this.transportSslHandlerFactory = transportSslHandlerFactory;
99 this.sshParameters = sshParameters;
100 this.sshConfigurator = sshConfigurator;
101 this.sessionListener = requireNonNull(sessionListener);
102 this.odlHelloCapabilities = odlHelloCapabilities;
103 this.connectionTimeoutMillis = connectionTimeoutMillis;
104 this.maximumIncomingChunkSize = maximumIncomingChunkSize;
105 this.additionalHeader = additionalHeader;
108 this.authHandler = null;
109 this.sslHandlerFactory = null;
110 this.sshClient = null;
112 if (NetconfClientProtocol.TLS.equals(protocol)) {
113 Preconditions.checkArgument(tlsParameters != null || transportSslHandlerFactory != null,
114 "Either tlsParameters or sslHandlerFactory is required");
115 } else if (NetconfClientProtocol.SSH.equals(protocol)) {
116 requireNonNull(sshParameters);
120 public final String getName() {
124 public final InetSocketAddress getAddress() {
128 public final Long getConnectionTimeoutMillis() {
129 return connectionTimeoutMillis;
132 public final Optional<NetconfHelloMessageAdditionalHeader> getAdditionalHeader() {
133 return Optional.ofNullable(additionalHeader);
136 public final NetconfClientSessionListener getSessionListener() {
137 return sessionListener;
140 public final AuthenticationHandler getAuthHandler() {
144 public NetconfClientProtocol getProtocol() {
145 return clientProtocol;
148 public SslHandlerFactory getSslHandlerFactory() {
149 return sslHandlerFactory;
152 public NetconfSshClient getSshClient() {
156 public List<Uri> getOdlHelloCapabilities() {
157 return odlHelloCapabilities;
160 public @NonNegative int getMaximumIncomingChunkSize() {
161 return maximumIncomingChunkSize;
164 public final TcpClientGrouping getTcpParameters() {
165 return tcpParameters;
168 public final TlsClientGrouping getTlsParameters() {
169 return tlsParameters;
172 public final org.opendaylight.netconf.transport.tls.SslHandlerFactory getTransportSslHandlerFactory() {
173 return transportSslHandlerFactory;
176 public final SshClientGrouping getSshParameters() {
177 return sshParameters;
180 public ClientFactoryManagerConfigurator getSshConfigurator() {
181 return sshConfigurator;
184 private void validateConfiguration() {
185 switch (requireNonNull(clientProtocol)) {
187 validateTcpConfiguration();
188 validateTlsConfiguration();
191 validateSshConfiguration();
192 validateTcpConfiguration();
195 validateTcpConfiguration();
198 LOG.warn("Unexpected protocol: {} in netconf client configuration.", clientProtocol);
202 protected final void validateTlsConfiguration() {
203 requireNonNull(sslHandlerFactory, "sslHandlerFactory");
206 protected final void validateSshConfiguration() {
207 requireNonNull(authHandler, "authHandler");
210 protected final void validateTcpConfiguration() {
211 requireNonNull(address, "address");
212 requireNonNull(clientProtocol, "clientProtocol");
213 requireNonNull(connectionTimeoutMillis, "connectionTimeoutMillis");
214 requireNonNull(sessionListener, "sessionListener");
218 public final String toString() {
219 return buildToStringHelper().toString();
222 protected ToStringHelper buildToStringHelper() {
223 return MoreObjects.toStringHelper(this)
224 .add("address", address)
225 .add("connectionTimeoutMillis", connectionTimeoutMillis)
226 .add("additionalHeader", additionalHeader)
227 .add("sessionListener", sessionListener)
228 .add("clientProtocol", clientProtocol)
229 .add("authHandler", authHandler)
230 .add("sslHandlerFactory", sslHandlerFactory);
233 public enum NetconfClientProtocol {