20
20
21
21
import org .elasticsearch .Version ;
22
22
import org .elasticsearch .action .support .PlainActionFuture ;
23
+ import org .elasticsearch .cluster .ClusterName ;
23
24
import org .elasticsearch .cluster .node .DiscoveryNode ;
25
+ import org .elasticsearch .common .SuppressForbidden ;
24
26
import org .elasticsearch .common .io .stream .BytesStreamOutput ;
25
27
import org .elasticsearch .common .io .stream .StreamInput ;
28
+ import org .elasticsearch .common .transport .TransportAddress ;
26
29
import org .elasticsearch .common .unit .TimeValue ;
27
30
import org .elasticsearch .tasks .TaskId ;
28
31
import org .elasticsearch .test .ESTestCase ;
29
32
import org .elasticsearch .threadpool .TestThreadPool ;
30
33
import org .mockito .ArgumentCaptor ;
31
34
32
35
import java .io .IOException ;
36
+ import java .net .InetAddress ;
33
37
import java .util .Collections ;
34
38
import java .util .concurrent .TimeUnit ;
35
39
42
46
public class TransportHandshakerTests extends ESTestCase {
43
47
44
48
private TransportHandshaker handshaker ;
45
- private DiscoveryNode node ;
49
+ private DiscoveryNode remoteNode ;
46
50
private TcpChannel channel ;
47
51
private TestThreadPool threadPool ;
48
52
private TransportHandshaker .HandshakeRequestSender requestSender ;
49
53
private TransportHandshaker .HandshakeResponseSender responseSender ;
54
+ private ClusterName clusterName ;
55
+ private DiscoveryNode localNode ;
50
56
51
57
@ Override
58
+ @ SuppressForbidden (reason = "Allow accessing localhost" )
52
59
public void setUp () throws Exception {
53
60
super .setUp ();
54
- String nodeId = "node-id" ;
61
+ String nodeId = "remote- node-id" ;
55
62
channel = mock (TcpChannel .class );
56
63
requestSender = mock (TransportHandshaker .HandshakeRequestSender .class );
57
64
responseSender = mock (TransportHandshaker .HandshakeResponseSender .class );
58
- node = new DiscoveryNode (nodeId , nodeId , nodeId , "host" , "host_address" , buildNewFakeTransportAddress (), Collections . emptyMap (),
59
- Collections .emptySet (), Version .CURRENT );
65
+ remoteNode = new DiscoveryNode (nodeId , nodeId , nodeId , "host" , "host_address" , buildNewFakeTransportAddress (),
66
+ Collections .emptyMap (), Collections . emptySet (), Version .CURRENT );
60
67
threadPool = new TestThreadPool ("thread-poll" );
61
- handshaker = new TransportHandshaker (Version .CURRENT , threadPool , requestSender , responseSender );
68
+ clusterName = new ClusterName ("cluster" );
69
+ localNode = new DiscoveryNode ("local-node-id" , new TransportAddress (InetAddress .getLocalHost (), 0 ), Version .CURRENT );
70
+ handshaker = new TransportHandshaker (clusterName , Version .CURRENT , threadPool , requestSender , responseSender );
71
+ handshaker .setLocalNode (localNode );
62
72
}
63
73
64
74
@ Override
@@ -70,9 +80,9 @@ public void tearDown() throws Exception {
70
80
public void testHandshakeRequestAndResponse () throws IOException {
71
81
PlainActionFuture <Version > versionFuture = PlainActionFuture .newFuture ();
72
82
long reqId = randomLongBetween (1 , 10 );
73
- handshaker .sendHandshake (reqId , node , channel , new TimeValue (30 , TimeUnit .SECONDS ), versionFuture );
83
+ handshaker .sendHandshake (reqId , remoteNode , channel , new TimeValue (30 , TimeUnit .SECONDS ), versionFuture );
74
84
75
- verify (requestSender ).sendRequest (node , channel , reqId , Version .CURRENT .minimumCompatibilityVersion ());
85
+ verify (requestSender ).sendRequest (remoteNode , channel , reqId , Version .CURRENT .minimumCompatibilityVersion ());
76
86
77
87
assertFalse (versionFuture .isDone ());
78
88
@@ -88,18 +98,39 @@ public void testHandshakeRequestAndResponse() throws IOException {
88
98
verify (responseSender ).sendResponse (eq (Version .CURRENT ), eq (Collections .emptySet ()), eq (mockChannel ), responseCaptor .capture (),
89
99
eq (reqId ));
90
100
101
+
91
102
TransportResponseHandler <TransportHandshaker .HandshakeResponse > handler = handshaker .removeHandlerForHandshake (reqId );
92
103
handler .handleResponse ((TransportHandshaker .HandshakeResponse ) responseCaptor .getValue ());
93
104
94
105
assertTrue (versionFuture .isDone ());
95
106
assertEquals (Version .CURRENT , versionFuture .actionGet ());
107
+ TransportHandshaker .HandshakeResponse response = (TransportHandshaker .HandshakeResponse ) responseCaptor .getValue ();
108
+ assertEquals (Version .CURRENT , response .getVersion ());
109
+ assertEquals (clusterName , response .getClusterName ());
110
+ assertEquals (localNode , response .getDiscoveryNode ());
111
+ }
112
+
113
+ public void testHandshakeRequestAndResponsePreV7_6 () throws IOException {
114
+ PlainActionFuture <Version > versionFuture = PlainActionFuture .newFuture ();
115
+ long reqId = randomLongBetween (1 , 10 );
116
+ handshaker .sendHandshake (reqId , remoteNode , channel , new TimeValue (30 , TimeUnit .SECONDS ), versionFuture );
117
+
118
+ TransportResponseHandler <TransportHandshaker .HandshakeResponse > handler = handshaker .removeHandlerForHandshake (reqId );
119
+ try (BytesStreamOutput out = new BytesStreamOutput ()) {
120
+ new TransportHandshaker .HandshakeResponse (Version .V_7_5_0 , Version .V_7_5_0 , clusterName , localNode ).writeTo (out );
121
+ TransportHandshaker .HandshakeResponse response = handler .read (out .bytes ().streamInput ());
122
+ assertEquals (Version .V_7_5_0 , response .getVersion ());
123
+ // When writing or reading a 6.6 stream, these are not serialized
124
+ assertNull (response .getDiscoveryNode ());
125
+ assertNull (response .getClusterName ());
126
+ }
96
127
}
97
128
98
129
public void testHandshakeRequestFutureVersionsCompatibility () throws IOException {
99
130
long reqId = randomLongBetween (1 , 10 );
100
- handshaker .sendHandshake (reqId , node , channel , new TimeValue (30 , TimeUnit .SECONDS ), PlainActionFuture .newFuture ());
131
+ handshaker .sendHandshake (reqId , remoteNode , channel , new TimeValue (30 , TimeUnit .SECONDS ), PlainActionFuture .newFuture ());
101
132
102
- verify (requestSender ).sendRequest (node , channel , reqId , Version .CURRENT .minimumCompatibilityVersion ());
133
+ verify (requestSender ).sendRequest (remoteNode , channel , reqId , Version .CURRENT .minimumCompatibilityVersion ());
103
134
104
135
TcpChannel mockChannel = mock (TcpChannel .class );
105
136
TransportHandshaker .HandshakeRequest handshakeRequest = new TransportHandshaker .HandshakeRequest (Version .CURRENT );
@@ -131,15 +162,15 @@ public void testHandshakeRequestFutureVersionsCompatibility() throws IOException
131
162
132
163
TransportHandshaker .HandshakeResponse response = (TransportHandshaker .HandshakeResponse ) responseCaptor .getValue ();
133
164
134
- assertEquals (Version .CURRENT , response .getResponseVersion ());
165
+ assertEquals (Version .CURRENT , response .getVersion ());
135
166
}
136
167
137
168
public void testHandshakeError () throws IOException {
138
169
PlainActionFuture <Version > versionFuture = PlainActionFuture .newFuture ();
139
170
long reqId = randomLongBetween (1 , 10 );
140
- handshaker .sendHandshake (reqId , node , channel , new TimeValue (30 , TimeUnit .SECONDS ), versionFuture );
171
+ handshaker .sendHandshake (reqId , remoteNode , channel , new TimeValue (30 , TimeUnit .SECONDS ), versionFuture );
141
172
142
- verify (requestSender ).sendRequest (node , channel , reqId , Version .CURRENT .minimumCompatibilityVersion ());
173
+ verify (requestSender ).sendRequest (remoteNode , channel , reqId , Version .CURRENT .minimumCompatibilityVersion ());
143
174
144
175
assertFalse (versionFuture .isDone ());
145
176
@@ -155,9 +186,9 @@ public void testSendRequestThrowsException() throws IOException {
155
186
PlainActionFuture <Version > versionFuture = PlainActionFuture .newFuture ();
156
187
long reqId = randomLongBetween (1 , 10 );
157
188
Version compatibilityVersion = Version .CURRENT .minimumCompatibilityVersion ();
158
- doThrow (new IOException ("boom" )).when (requestSender ).sendRequest (node , channel , reqId , compatibilityVersion );
189
+ doThrow (new IOException ("boom" )).when (requestSender ).sendRequest (remoteNode , channel , reqId , compatibilityVersion );
159
190
160
- handshaker .sendHandshake (reqId , node , channel , new TimeValue (30 , TimeUnit .SECONDS ), versionFuture );
191
+ handshaker .sendHandshake (reqId , remoteNode , channel , new TimeValue (30 , TimeUnit .SECONDS ), versionFuture );
161
192
162
193
assertTrue (versionFuture .isDone ());
163
194
ConnectTransportException cte = expectThrows (ConnectTransportException .class , versionFuture ::actionGet );
@@ -168,9 +199,9 @@ public void testSendRequestThrowsException() throws IOException {
168
199
public void testHandshakeTimeout () throws IOException {
169
200
PlainActionFuture <Version > versionFuture = PlainActionFuture .newFuture ();
170
201
long reqId = randomLongBetween (1 , 10 );
171
- handshaker .sendHandshake (reqId , node , channel , new TimeValue (100 , TimeUnit .MILLISECONDS ), versionFuture );
202
+ handshaker .sendHandshake (reqId , remoteNode , channel , new TimeValue (100 , TimeUnit .MILLISECONDS ), versionFuture );
172
203
173
- verify (requestSender ).sendRequest (node , channel , reqId , Version .CURRENT .minimumCompatibilityVersion ());
204
+ verify (requestSender ).sendRequest (remoteNode , channel , reqId , Version .CURRENT .minimumCompatibilityVersion ());
174
205
175
206
ConnectTransportException cte = expectThrows (ConnectTransportException .class , versionFuture ::actionGet );
176
207
assertThat (cte .getMessage (), containsString ("handshake_timeout" ));
0 commit comments