Merge "Allow specification of ODL's HELLO message"
[netconf.git] / netconf / netconf-client / src / main / java / org / opendaylight / netconf / client / conf / NetconfClientConfiguration.java
1 /*
2  * Copyright (c) 2014 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 package org.opendaylight.netconf.client.conf;
9
10 import com.google.common.base.MoreObjects;
11 import com.google.common.base.MoreObjects.ToStringHelper;
12 import com.google.common.base.Optional;
13 import com.google.common.base.Preconditions;
14 import java.net.InetSocketAddress;
15 import java.util.List;
16 import org.opendaylight.netconf.api.messages.NetconfHelloMessageAdditionalHeader;
17 import org.opendaylight.netconf.client.NetconfClientSessionListener;
18 import org.opendaylight.netconf.client.SslHandlerFactory;
19 import org.opendaylight.netconf.nettyutil.handler.ssh.authentication.AuthenticationHandler;
20 import org.opendaylight.protocol.framework.ReconnectStrategy;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
24
25 public class NetconfClientConfiguration {
26
27     private static final Logger LOG = LoggerFactory.getLogger(NetconfClientConfiguration.class);
28
29     private final NetconfClientProtocol clientProtocol;
30     private final InetSocketAddress address;
31     private final Long connectionTimeoutMillis;
32
33     private final NetconfHelloMessageAdditionalHeader additionalHeader;
34     private final NetconfClientSessionListener sessionListener;
35
36     private final ReconnectStrategy reconnectStrategy;
37
38     private final AuthenticationHandler authHandler;
39     private final SslHandlerFactory sslHandlerFactory;
40
41     private final List<Uri> odlHelloCapabilities;
42
43     NetconfClientConfiguration(final NetconfClientProtocol protocol, final InetSocketAddress address,
44                                final Long connectionTimeoutMillis,
45                                final NetconfHelloMessageAdditionalHeader additionalHeader,
46                                final NetconfClientSessionListener sessionListener,
47                                final ReconnectStrategy reconnectStrategy, final AuthenticationHandler authHandler,
48                                final SslHandlerFactory sslHandlerFactory,
49                                final List<Uri> odlHelloCapabilities) {
50         this.address = address;
51         this.connectionTimeoutMillis = connectionTimeoutMillis;
52         this.additionalHeader = additionalHeader;
53         this.sessionListener = sessionListener;
54         this.clientProtocol = protocol;
55         this.reconnectStrategy = reconnectStrategy;
56         this.authHandler = authHandler;
57         this.sslHandlerFactory = sslHandlerFactory;
58         this.odlHelloCapabilities = odlHelloCapabilities;
59         validateConfiguration();
60     }
61
62     public final InetSocketAddress getAddress() {
63         return address;
64     }
65
66     public final Long getConnectionTimeoutMillis() {
67         return connectionTimeoutMillis;
68     }
69
70     public final Optional<NetconfHelloMessageAdditionalHeader> getAdditionalHeader() {
71         return Optional.fromNullable(additionalHeader);
72     }
73
74     public final NetconfClientSessionListener getSessionListener() {
75         return sessionListener;
76     }
77
78     public final ReconnectStrategy getReconnectStrategy() {
79         return reconnectStrategy;
80     }
81
82     public final AuthenticationHandler getAuthHandler() {
83         return authHandler;
84     }
85
86     public NetconfClientProtocol getProtocol() {
87         return clientProtocol;
88     }
89
90     public SslHandlerFactory getSslHandlerFactory() {
91         return sslHandlerFactory;
92     }
93
94     public List<Uri> getOdlHelloCapabilities() {
95         return odlHelloCapabilities;
96     }
97
98     private void validateConfiguration() {
99         Preconditions.checkNotNull(clientProtocol, " ");
100         switch (clientProtocol) {
101             case TLS:
102                 validateTlsConfiguration();
103                 validateTcpConfiguration();
104                 break;
105             case SSH:
106                 validateSshConfiguration();
107                 validateTcpConfiguration();
108                 break;
109             case TCP:
110                 validateTcpConfiguration();
111                 break;
112             default:
113                 LOG.warn("Unexpected protocol: {} in netconf client configuration.", clientProtocol);
114         }
115     }
116
117     protected void validateTlsConfiguration() {
118         Preconditions.checkNotNull(sslHandlerFactory, "sslHandlerFactory");
119     }
120
121     protected void validateSshConfiguration() {
122         Preconditions.checkNotNull(authHandler, "authHandler");
123     }
124
125     protected void validateTcpConfiguration() {
126         Preconditions.checkNotNull(address, "address");
127         Preconditions.checkNotNull(clientProtocol, "clientProtocol");
128         Preconditions.checkNotNull(connectionTimeoutMillis, "connectionTimeoutMillis");
129         Preconditions.checkNotNull(sessionListener, "sessionListener");
130         Preconditions.checkNotNull(reconnectStrategy, "reconnectStrategy");
131     }
132
133     @Override
134     public final String toString() {
135         return buildToStringHelper().toString();
136     }
137
138     protected ToStringHelper buildToStringHelper() {
139         return MoreObjects.toStringHelper(this)
140                 .add("address", address)
141                 .add("connectionTimeoutMillis", connectionTimeoutMillis)
142                 .add("additionalHeader", additionalHeader)
143                 .add("sessionListener", sessionListener)
144                 .add("reconnectStrategy", reconnectStrategy)
145                 .add("clientProtocol", clientProtocol)
146                 .add("authHandler", authHandler)
147                 .add("sslHandlerFactory", sslHandlerFactory);
148     }
149
150     public enum NetconfClientProtocol {
151         TCP, SSH, TLS
152     }
153 }