elasticsearch-transport 7.5.0 → 7.8.0.pre

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +27 -10
  3. data/README.md +142 -53
  4. data/Rakefile +16 -3
  5. data/elasticsearch-transport.gemspec +57 -63
  6. data/lib/elasticsearch-transport.rb +16 -3
  7. data/lib/elasticsearch/transport.rb +16 -3
  8. data/lib/elasticsearch/transport/client.rb +61 -13
  9. data/lib/elasticsearch/transport/redacted.rb +16 -3
  10. data/lib/elasticsearch/transport/transport/base.rb +23 -4
  11. data/lib/elasticsearch/transport/transport/connections/collection.rb +16 -3
  12. data/lib/elasticsearch/transport/transport/connections/connection.rb +16 -3
  13. data/lib/elasticsearch/transport/transport/connections/selector.rb +16 -3
  14. data/lib/elasticsearch/transport/transport/errors.rb +16 -3
  15. data/lib/elasticsearch/transport/transport/http/curb.rb +16 -3
  16. data/lib/elasticsearch/transport/transport/http/faraday.rb +17 -4
  17. data/lib/elasticsearch/transport/transport/http/manticore.rb +16 -3
  18. data/lib/elasticsearch/transport/transport/loggable.rb +16 -3
  19. data/lib/elasticsearch/transport/transport/response.rb +16 -4
  20. data/lib/elasticsearch/transport/transport/serializer/multi_json.rb +16 -3
  21. data/lib/elasticsearch/transport/transport/sniffer.rb +16 -3
  22. data/lib/elasticsearch/transport/version.rb +17 -4
  23. data/spec/elasticsearch/connections/collection_spec.rb +16 -3
  24. data/spec/elasticsearch/connections/selector_spec.rb +16 -3
  25. data/spec/elasticsearch/transport/base_spec.rb +16 -10
  26. data/spec/elasticsearch/transport/client_spec.rb +154 -28
  27. data/spec/elasticsearch/transport/sniffer_spec.rb +16 -3
  28. data/spec/spec_helper.rb +19 -1
  29. data/test/integration/transport_test.rb +16 -3
  30. data/test/profile/client_benchmark_test.rb +16 -3
  31. data/test/test_helper.rb +16 -3
  32. data/test/unit/connection_test.rb +16 -3
  33. data/test/unit/response_test.rb +17 -4
  34. data/test/unit/serializer_test.rb +16 -3
  35. data/test/unit/transport_base_test.rb +16 -3
  36. data/test/unit/transport_curb_test.rb +16 -3
  37. data/test/unit/transport_faraday_test.rb +16 -3
  38. data/test/unit/transport_manticore_test.rb +16 -3
  39. metadata +68 -70
@@ -1,6 +1,19 @@
1
- # Licensed to Elasticsearch B.V under one or more agreements.
2
- # Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
3
- # See the LICENSE file in the project root for more information
1
+ # Licensed to Elasticsearch B.V. under one or more contributor
2
+ # license agreements. See the NOTICE file distributed with
3
+ # this work for additional information regarding copyright
4
+ # ownership. Elasticsearch B.V. licenses this file to you under
5
+ # the Apache License, Version 2.0 (the "License"); you may
6
+ # not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
4
17
 
5
18
  module Elasticsearch
6
19
  module Transport
@@ -1,6 +1,19 @@
1
- # Licensed to Elasticsearch B.V under one or more agreements.
2
- # Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
3
- # See the LICENSE file in the project root for more information
1
+ # Licensed to Elasticsearch B.V. under one or more contributor
2
+ # license agreements. See the NOTICE file distributed with
3
+ # this work for additional information regarding copyright
4
+ # ownership. Elasticsearch B.V. licenses this file to you under
5
+ # the Apache License, Version 2.0 (the "License"); you may
6
+ # not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
4
17
 
5
18
  module Elasticsearch
6
19
  module Transport
@@ -1,9 +1,22 @@
1
- # Licensed to Elasticsearch B.V under one or more agreements.
2
- # Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
3
- # See the LICENSE file in the project root for more information
1
+ # Licensed to Elasticsearch B.V. under one or more contributor
2
+ # license agreements. See the NOTICE file distributed with
3
+ # this work for additional information regarding copyright
4
+ # ownership. Elasticsearch B.V. licenses this file to you under
5
+ # the Apache License, Version 2.0 (the "License"); you may
6
+ # not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
4
17
 
5
18
  module Elasticsearch
6
19
  module Transport
7
- VERSION = "7.5.0"
20
+ VERSION = "7.8.0.pre"
8
21
  end
9
22
  end
@@ -1,6 +1,19 @@
1
- # Licensed to Elasticsearch B.V under one or more agreements.
2
- # Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
3
- # See the LICENSE file in the project root for more information
1
+ # Licensed to Elasticsearch B.V. under one or more contributor
2
+ # license agreements. See the NOTICE file distributed with
3
+ # this work for additional information regarding copyright
4
+ # ownership. Elasticsearch B.V. licenses this file to you under
5
+ # the Apache License, Version 2.0 (the "License"); you may
6
+ # not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
4
17
 
5
18
  require 'spec_helper'
6
19
 
@@ -1,6 +1,19 @@
1
- # Licensed to Elasticsearch B.V under one or more agreements.
2
- # Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
3
- # See the LICENSE file in the project root for more information
1
+ # Licensed to Elasticsearch B.V. under one or more contributor
2
+ # license agreements. See the NOTICE file distributed with
3
+ # this work for additional information regarding copyright
4
+ # ownership. Elasticsearch B.V. licenses this file to you under
5
+ # the Apache License, Version 2.0 (the "License"); you may
6
+ # not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
4
17
 
5
18
  require 'spec_helper'
6
19
 
@@ -1,6 +1,19 @@
1
- # Licensed to Elasticsearch B.V under one or more agreements.
2
- # Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
3
- # See the LICENSE file in the project root for more information
1
+ # Licensed to Elasticsearch B.V. under one or more contributor
2
+ # license agreements. See the NOTICE file distributed with
3
+ # this work for additional information regarding copyright
4
+ # ownership. Elasticsearch B.V. licenses this file to you under
5
+ # the Apache License, Version 2.0 (the "License"); you may
6
+ # not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
4
17
 
5
18
  require 'spec_helper'
6
19
 
@@ -96,7 +109,6 @@ describe Elasticsearch::Transport::Transport::Base do
96
109
  end
97
110
 
98
111
  context 'when `perform_request` is called without a `retry_on_failure` option value' do
99
-
100
112
  before do
101
113
  expect(client.transport).to receive(:get_connection).exactly(3).times.and_call_original
102
114
  end
@@ -109,7 +121,6 @@ describe Elasticsearch::Transport::Transport::Base do
109
121
  end
110
122
 
111
123
  context 'when `perform_request` is called with a `retry_on_failure` option value' do
112
-
113
124
  before do
114
125
  expect(client.transport).to receive(:get_connection).exactly(6).times.and_call_original
115
126
  end
@@ -123,7 +134,6 @@ describe Elasticsearch::Transport::Transport::Base do
123
134
  end
124
135
 
125
136
  context 'when the client has `retry_on_failure` set to true' do
126
-
127
137
  let(:client) do
128
138
  Elasticsearch::Transport::Client.new(arguments)
129
139
  end
@@ -136,7 +146,6 @@ describe Elasticsearch::Transport::Transport::Base do
136
146
  end
137
147
 
138
148
  context 'when `perform_request` is called without a `retry_on_failure` option value' do
139
-
140
149
  before do
141
150
  expect(client.transport).to receive(:get_connection).exactly(4).times.and_call_original
142
151
  end
@@ -149,7 +158,6 @@ describe Elasticsearch::Transport::Transport::Base do
149
158
  end
150
159
 
151
160
  context 'when `perform_request` is called with a `retry_on_failure` option value' do
152
-
153
161
  before do
154
162
  expect(client.transport).to receive(:get_connection).exactly(6).times.and_call_original
155
163
  end
@@ -163,7 +171,6 @@ describe Elasticsearch::Transport::Transport::Base do
163
171
  end
164
172
 
165
173
  context 'when the client has `retry_on_failure` set to false' do
166
-
167
174
  let(:client) do
168
175
  Elasticsearch::Transport::Client.new(arguments)
169
176
  end
@@ -176,7 +183,6 @@ describe Elasticsearch::Transport::Transport::Base do
176
183
  end
177
184
 
178
185
  context 'when `perform_request` is called without a `retry_on_failure` option value' do
179
-
180
186
  before do
181
187
  expect(client.transport).to receive(:get_connection).once.and_call_original
182
188
  end
@@ -1,11 +1,23 @@
1
- # Licensed to Elasticsearch B.V under one or more agreements.
2
- # Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
3
- # See the LICENSE file in the project root for more information
1
+ # Licensed to Elasticsearch B.V. under one or more contributor
2
+ # license agreements. See the NOTICE file distributed with
3
+ # this work for additional information regarding copyright
4
+ # ownership. Elasticsearch B.V. licenses this file to you under
5
+ # the Apache License, Version 2.0 (the "License"); you may
6
+ # not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
4
17
 
5
18
  require 'spec_helper'
6
19
 
7
20
  describe Elasticsearch::Transport::Client do
8
-
9
21
  let(:client) do
10
22
  described_class.new.tap do |_client|
11
23
  allow(_client).to receive(:__build_connections)
@@ -49,7 +61,6 @@ describe Elasticsearch::Transport::Client do
49
61
  end
50
62
 
51
63
  context 'when a User-Agent header is specified as client option' do
52
-
53
64
  let(:client) do
54
65
  described_class.new(transport_options: { headers: { 'User-Agent' => 'testing' } })
55
66
  end
@@ -59,6 +70,49 @@ describe Elasticsearch::Transport::Client do
59
70
  end
60
71
  end
61
72
 
73
+ context 'when an encoded api_key is provided' do
74
+ let(:client) do
75
+ described_class.new(api_key: 'an_api_key')
76
+ end
77
+ let(:authorization_header) do
78
+ client.transport.connections.first.connection.headers['Authorization']
79
+ end
80
+
81
+ it 'Adds the ApiKey header to the connection' do
82
+ expect(authorization_header).to eq('ApiKey an_api_key')
83
+ end
84
+ end
85
+
86
+ context 'when an un-encoded api_key is provided' do
87
+ let(:client) do
88
+ described_class.new(api_key: { id: 'my_id', api_key: 'my_api_key' })
89
+ end
90
+ let(:authorization_header) do
91
+ client.transport.connections.first.connection.headers['Authorization']
92
+ end
93
+
94
+ it 'Adds the ApiKey header to the connection' do
95
+ expect(authorization_header).to eq("ApiKey #{Base64.strict_encode64('my_id:my_api_key')}")
96
+ end
97
+ end
98
+
99
+ context 'when basic auth and api_key are provided' do
100
+ let(:client) do
101
+ described_class.new(
102
+ api_key: { id: 'my_id', api_key: 'my_api_key' },
103
+ host: 'http://elastic:password@localhost:9200'
104
+ )
105
+ end
106
+ let(:authorization_header) do
107
+ client.transport.connections.first.connection.headers['Authorization']
108
+ end
109
+
110
+ it 'removes basic auth credentials' do
111
+ expect(authorization_header).not_to match(/^Basic/)
112
+ expect(authorization_header).to match(/^ApiKey/)
113
+ end
114
+ end
115
+
62
116
  context 'when a user-agent header is specified as client option in lower-case' do
63
117
 
64
118
  let(:client) do
@@ -176,45 +230,43 @@ describe Elasticsearch::Transport::Client do
176
230
  end
177
231
 
178
232
  describe 'adapter' do
179
-
180
233
  context 'when no adapter is specified' do
181
-
182
234
  let(:adapter) do
183
- client.transport.connections.all.first.connection.builder.handlers
235
+ client.transport.connections.all.first.connection.builder.adapter
184
236
  end
185
237
 
186
238
  it 'uses Faraday NetHttp' do
187
- expect(adapter).to include(Faraday::Adapter::NetHttp)
239
+ expect(adapter).to eq Faraday::Adapter::NetHttp
188
240
  end
189
241
  end
190
242
 
191
243
  context 'when the adapter is specified' do
192
244
 
193
245
  let(:adapter) do
194
- client.transport.connections.all.first.connection.builder.handlers
246
+ client.transport.connections.all.first.connection.builder.adapter
195
247
  end
196
248
 
197
249
  let(:client) do
198
- described_class.new(adapter: :typhoeus)
250
+ described_class.new(adapter: :patron)
199
251
  end
200
252
 
201
253
  it 'uses Faraday with the adapter' do
202
- expect(adapter).to include(Faraday::Adapter::Typhoeus)
254
+ expect(adapter).to eq Faraday::Adapter::Patron
203
255
  end
204
256
  end
205
257
 
206
258
  context 'when the adapter is specified as a string key' do
207
259
 
208
260
  let(:adapter) do
209
- client.transport.connections.all.first.connection.builder.handlers
261
+ client.transport.connections.all.first.connection.builder.adapter
210
262
  end
211
263
 
212
264
  let(:client) do
213
- described_class.new('adapter' => :typhoeus)
265
+ described_class.new('adapter' => :patron)
214
266
  end
215
267
 
216
268
  it 'uses Faraday with the adapter' do
217
- expect(adapter).to include(Faraday::Adapter::Typhoeus)
269
+ expect(adapter).to eq Faraday::Adapter::Patron
218
270
  end
219
271
  end
220
272
 
@@ -226,11 +278,11 @@ describe Elasticsearch::Transport::Client do
226
278
  end
227
279
 
228
280
  let(:adapter) do
229
- client.transport.connections.all.first.connection.builder.handlers
281
+ client.transport.connections.all.first.connection.builder.adapter
230
282
  end
231
283
 
232
284
  it 'uses the detected adapter' do
233
- expect(adapter).to include(Faraday::Adapter::Patron)
285
+ expect(adapter).to eq Faraday::Adapter::Patron
234
286
  end
235
287
  end
236
288
 
@@ -238,17 +290,21 @@ describe Elasticsearch::Transport::Client do
238
290
 
239
291
  let(:client) do
240
292
  described_class.new do |faraday|
241
- faraday.adapter :typhoeus
293
+ faraday.adapter :patron
242
294
  faraday.response :logger
243
295
  end
244
296
  end
245
297
 
298
+ let(:adapter) do
299
+ client.transport.connections.all.first.connection.builder.adapter
300
+ end
301
+
246
302
  let(:handlers) do
247
303
  client.transport.connections.all.first.connection.builder.handlers
248
304
  end
249
305
 
250
306
  it 'sets the adapter' do
251
- expect(handlers).to include(Faraday::Adapter::Typhoeus)
307
+ expect(adapter).to eq Faraday::Adapter::Patron
252
308
  end
253
309
 
254
310
  it 'sets the logger' do
@@ -1055,10 +1111,81 @@ describe Elasticsearch::Transport::Client do
1055
1111
  expect(request).to be(true)
1056
1112
  end
1057
1113
  end
1114
+
1115
+ context 'when x-opaque-id is set' do
1116
+ let(:client) { described_class.new(host: hosts) }
1117
+
1118
+ it 'uses x-opaque-id on a request' do
1119
+ expect(client.perform_request('GET', '/', { opaque_id: '12345' }).headers['x-opaque-id']).to eq('12345')
1120
+ end
1121
+ end
1122
+
1123
+ context 'when an x-opaque-id prefix is set on initialization' do
1124
+ let(:prefix) { 'elastic_cloud' }
1125
+ let(:client) do
1126
+ described_class.new(host: hosts, opaque_id_prefix: prefix)
1127
+ end
1128
+
1129
+ it 'uses x-opaque-id on a request' do
1130
+ expect(client.perform_request('GET', '/', { opaque_id: '12345' }).headers['x-opaque-id']).to eq("#{prefix}12345")
1131
+ end
1132
+
1133
+ context 'when using an API call' do
1134
+ let(:client) { described_class.new(host: hosts) }
1135
+
1136
+ it 'doesnae raise an ArgumentError' do
1137
+ expect { client.search(opaque_id: 'no_error') }.not_to raise_error
1138
+ end
1139
+
1140
+ it 'uses X-Opaque-Id in the header' do
1141
+ allow(client).to receive(:perform_request) { OpenStruct.new(body: '') }
1142
+ expect { client.search(opaque_id: 'opaque_id') }.not_to raise_error
1143
+ expect(client).to have_received(:perform_request)
1144
+ .with('GET', '_search', { opaque_id: 'opaque_id' }, nil, {})
1145
+ end
1146
+ end
1147
+ end
1148
+
1149
+ context 'when Elasticsearch response includes a warning header' do
1150
+ let(:client) do
1151
+ Elasticsearch::Transport::Client.new(hosts: hosts)
1152
+ end
1153
+
1154
+ let(:warning) { 'Elasticsearch warning: "deprecation warning"' }
1155
+
1156
+ it 'prints a warning' do
1157
+ allow_any_instance_of(Elasticsearch::Transport::Transport::Response).to receive(:headers) do
1158
+ { 'warning' => warning }
1159
+ end
1160
+
1161
+ begin
1162
+ stderr = $stderr
1163
+ fake_stderr = StringIO.new
1164
+ $stderr = fake_stderr
1165
+
1166
+ client.perform_request('GET', '/')
1167
+ fake_stderr.rewind
1168
+ expect(fake_stderr.string).to eq("warning: #{warning}\n")
1169
+ ensure
1170
+ $stderr = stderr
1171
+ end
1172
+ end
1173
+ end
1174
+
1175
+ context 'when a header is set on an endpoint request' do
1176
+ let(:client) { described_class.new(host: hosts) }
1177
+ let(:headers) { { 'user-agent' => 'my ruby app' } }
1178
+
1179
+ it 'performs the request with the header' do
1180
+ allow(client).to receive(:perform_request) { OpenStruct.new(body: '') }
1181
+ expect { client.search(headers: headers) }.not_to raise_error
1182
+ expect(client).to have_received(:perform_request)
1183
+ .with('GET', '_search', {}, nil, headers)
1184
+ end
1185
+ end
1058
1186
  end
1059
1187
 
1060
1188
  context 'when the client connects to Elasticsearch' do
1061
-
1062
1189
  let(:logger) do
1063
1190
  Logger.new(STDERR).tap do |logger|
1064
1191
  logger.formatter = proc do |severity, datetime, progname, msg|
@@ -1136,15 +1263,14 @@ describe Elasticsearch::Transport::Client do
1136
1263
  end
1137
1264
 
1138
1265
  context 'when the Faraday adapter is set in the block' do
1139
-
1140
1266
  let(:client) do
1141
1267
  Elasticsearch::Client.new(host: ELASTICSEARCH_HOSTS.first, logger: logger) do |client|
1142
1268
  client.adapter(:net_http_persistent)
1143
1269
  end
1144
1270
  end
1145
1271
 
1146
- let(:connection_handler) do
1147
- client.transport.connections.first.connection.builder.handlers.first
1272
+ let(:handler_name) do
1273
+ client.transport.connections.first.connection.builder.adapter.name
1148
1274
  end
1149
1275
 
1150
1276
  let(:response) do
@@ -1152,7 +1278,7 @@ describe Elasticsearch::Transport::Client do
1152
1278
  end
1153
1279
 
1154
1280
  it 'sets the adapter' do
1155
- expect(connection_handler.name).to eq('Faraday::Adapter::NetHttpPersistent')
1281
+ expect(handler_name).to eq('Faraday::Adapter::NetHttpPersistent')
1156
1282
  end
1157
1283
 
1158
1284
  it 'uses the adapter to connect' do
@@ -1202,7 +1328,7 @@ describe Elasticsearch::Transport::Client do
1202
1328
  expect(client.perform_request('GET', '_nodes/_local'))
1203
1329
  expect {
1204
1330
  client.perform_request('GET', '_nodes/_local')
1205
- }.to raise_exception(Faraday::Error::ConnectionFailed)
1331
+ }.to raise_exception(Faraday::ConnectionFailed)
1206
1332
  end
1207
1333
  end
1208
1334
 
@@ -1486,12 +1612,12 @@ describe Elasticsearch::Transport::Client do
1486
1612
  { adapter: :patron }
1487
1613
  end
1488
1614
 
1489
- let(:connection_handler) do
1490
- client.transport.connections.first.connection.builder.handlers.first
1615
+ let(:adapter) do
1616
+ client.transport.connections.first.connection.builder.adapter
1491
1617
  end
1492
1618
 
1493
1619
  it 'uses the patron connection handler' do
1494
- expect(connection_handler).to eq('Faraday::Adapter::Patron')
1620
+ expect(adapter).to eq('Faraday::Adapter::Patron')
1495
1621
  end
1496
1622
 
1497
1623
  it 'keeps connections open' do