elasticsearch-transport 7.1.0 → 7.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +11 -0
- data/elasticsearch-transport.gemspec +1 -0
- data/lib/elasticsearch/transport/client.rb +22 -7
- data/lib/elasticsearch/transport/transport/base.rb +66 -4
- data/lib/elasticsearch/transport/transport/connections/selector.rb +17 -5
- data/lib/elasticsearch/transport/transport/http/curb.rb +24 -7
- data/lib/elasticsearch/transport/transport/http/faraday.rb +15 -1
- data/lib/elasticsearch/transport/transport/http/manticore.rb +23 -8
- data/lib/elasticsearch/transport/version.rb +1 -1
- data/spec/elasticsearch/connections/collection_spec.rb +254 -0
- data/spec/elasticsearch/connections/selector_spec.rb +174 -0
- data/spec/elasticsearch/transport/client_spec.rb +323 -3
- data/spec/spec_helper.rb +6 -0
- data/test/unit/transport_curb_test.rb +1 -1
- data/test/unit/transport_manticore_test.rb +27 -11
- metadata +20 -6
- data/test/unit/connection_collection_test.rb +0 -147
- data/test/unit/connection_selector_test.rb +0 -81
data/spec/spec_helper.rb
CHANGED
@@ -4,6 +4,12 @@ require 'logger'
|
|
4
4
|
require 'ansi/code'
|
5
5
|
require 'hashie/mash'
|
6
6
|
require 'pry-nav'
|
7
|
+
if defined?(JRUBY_VERSION)
|
8
|
+
require 'elasticsearch/transport/transport/http/manticore'
|
9
|
+
else
|
10
|
+
require 'elasticsearch/transport/transport/http/curb'
|
11
|
+
require 'curb'
|
12
|
+
end
|
7
13
|
|
8
14
|
# The hosts to use for creating a elasticsearch client.
|
9
15
|
#
|
@@ -57,7 +57,7 @@ else
|
|
57
57
|
should "perform request with headers" do
|
58
58
|
@transport.connections.first.connection.expects(:put_data=).with('{"foo":"bar"}')
|
59
59
|
@transport.connections.first.connection.expects(:http).with(:POST).returns(stub_everything)
|
60
|
-
@transport.connections.first.connection.expects(:
|
60
|
+
@transport.connections.first.connection.headers.expects(:merge!).with("Content-Type" => "application/x-ndjson")
|
61
61
|
|
62
62
|
@transport.perform_request 'POST', '/', {}, {:foo => 'bar'}, {"Content-Type" => "application/x-ndjson"}
|
63
63
|
end
|
@@ -56,32 +56,42 @@ else
|
|
56
56
|
|
57
57
|
should "set body for GET request" do
|
58
58
|
@transport.connections.first.connection.expects(:get).
|
59
|
-
with('http://127.0.0.1:8080//', {:body => '{"foo":"bar"}'
|
59
|
+
with('http://127.0.0.1:8080//', {:body => '{"foo":"bar"}',
|
60
|
+
:headers => {"Content-Type" => "application/json",
|
61
|
+
"User-Agent" => @transport.send(:user_agent_header)}}).returns(stub_everything)
|
60
62
|
@transport.perform_request 'GET', '/', {}, '{"foo":"bar"}'
|
61
63
|
end
|
62
64
|
|
63
65
|
should "set body for PUT request" do
|
64
66
|
@transport.connections.first.connection.expects(:put).
|
65
|
-
with('http://127.0.0.1:8080//', {:body => '{"foo":"bar"}'
|
67
|
+
with('http://127.0.0.1:8080//', {:body => '{"foo":"bar"}',
|
68
|
+
:headers => {"Content-Type" => "application/json",
|
69
|
+
"User-Agent" => @transport.send(:user_agent_header)}}).returns(stub_everything)
|
66
70
|
@transport.perform_request 'PUT', '/', {}, {:foo => 'bar'}
|
67
71
|
end
|
68
72
|
|
69
73
|
should "serialize the request body" do
|
70
74
|
@transport.connections.first.connection.expects(:post).
|
71
|
-
with('http://127.0.0.1:8080//', {:body => '{"foo":"bar"}'
|
75
|
+
with('http://127.0.0.1:8080//', {:body => '{"foo":"bar"}',
|
76
|
+
:headers => {"Content-Type" => "application/json",
|
77
|
+
"User-Agent" => @transport.send(:user_agent_header)}}).returns(stub_everything)
|
72
78
|
@transport.perform_request 'POST', '/', {}, {'foo' => 'bar'}
|
73
79
|
end
|
74
80
|
|
75
81
|
should "set custom headers for PUT request" do
|
76
82
|
@transport.connections.first.connection.expects(:put).
|
77
|
-
with('http://127.0.0.1:8080//', {:body => '{"foo":"bar"}',
|
83
|
+
with('http://127.0.0.1:8080//', {:body => '{"foo":"bar"}',
|
84
|
+
:headers => {"Content-Type" => "application/json",
|
85
|
+
"User-Agent" => @transport.send(:user_agent_header)}})
|
78
86
|
.returns(stub_everything)
|
79
87
|
@transport.perform_request 'PUT', '/', {}, '{"foo":"bar"}', {"Content-Type" => "application/x-ndjson"}
|
80
88
|
end
|
81
89
|
|
82
90
|
should "not serialize a String request body" do
|
83
91
|
@transport.connections.first.connection.expects(:post).
|
84
|
-
with('http://127.0.0.1:8080//', {:body => '{"foo":"bar"}'
|
92
|
+
with('http://127.0.0.1:8080//', {:body => '{"foo":"bar"}',
|
93
|
+
:headers => {"Content-Type" => "application/json",
|
94
|
+
"User-Agent" => @transport.send(:user_agent_header)}}).returns(stub_everything)
|
85
95
|
@transport.serializer.expects(:dump).never
|
86
96
|
@transport.perform_request 'POST', '/', {}, '{"foo":"bar"}'
|
87
97
|
end
|
@@ -93,7 +103,8 @@ else
|
|
93
103
|
|
94
104
|
transport = Manticore.new :hosts => [ { :host => 'localhost', :port => 8080 } ], :options => options
|
95
105
|
|
96
|
-
transport.connections.first.connection.stub("http://localhost:8080//", :body => "\"\"", :headers => {"
|
106
|
+
transport.connections.first.connection.stub("http://localhost:8080//", :body => "\"\"", :headers => {"Content-Type" => "application/x-ndjson",
|
107
|
+
"User-Agent" => @transport.send(:user_agent_header)}, :code => 200 )
|
97
108
|
|
98
109
|
response = transport.perform_request 'GET', '/', {}
|
99
110
|
assert_equal response.status, 200
|
@@ -113,11 +124,16 @@ else
|
|
113
124
|
end
|
114
125
|
|
115
126
|
should "handle HTTP methods" do
|
116
|
-
@transport.connections.first.connection.expects(:delete).with('http://127.0.0.1:8080//', {
|
117
|
-
|
118
|
-
@transport.connections.first.connection.expects(:
|
119
|
-
|
120
|
-
@transport.connections.first.connection.expects(:
|
127
|
+
@transport.connections.first.connection.expects(:delete).with('http://127.0.0.1:8080//', { headers: {"Content-Type" => "application/json",
|
128
|
+
"User-Agent" => @transport.send(:user_agent_header)}}).returns(stub_everything)
|
129
|
+
@transport.connections.first.connection.expects(:head).with('http://127.0.0.1:8080//', { headers: {"Content-Type" => "application/json",
|
130
|
+
"User-Agent" => @transport.send(:user_agent_header)}}).returns(stub_everything)
|
131
|
+
@transport.connections.first.connection.expects(:get).with('http://127.0.0.1:8080//', { headers: {"Content-Type" => "application/json",
|
132
|
+
"User-Agent" => @transport.send(:user_agent_header)}}).returns(stub_everything)
|
133
|
+
@transport.connections.first.connection.expects(:put).with('http://127.0.0.1:8080//', { headers: {"Content-Type" => "application/json",
|
134
|
+
"User-Agent" => @transport.send(:user_agent_header)}}).returns(stub_everything)
|
135
|
+
@transport.connections.first.connection.expects(:post).with('http://127.0.0.1:8080//', { headers: {"Content-Type" => "application/json",
|
136
|
+
"User-Agent" => @transport.send(:user_agent_header)}}).returns(stub_everything)
|
121
137
|
|
122
138
|
%w| HEAD GET PUT POST DELETE |.each { |method| @transport.perform_request method, '/' }
|
123
139
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elasticsearch-transport
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 7.
|
4
|
+
version: 7.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Karel Minarik
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-06-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: multi_json
|
@@ -192,6 +192,20 @@ dependencies:
|
|
192
192
|
- - ">="
|
193
193
|
- !ruby/object:Gem::Version
|
194
194
|
version: '0'
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: httpclient
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - ">="
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: '0'
|
202
|
+
type: :development
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - ">="
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: '0'
|
195
209
|
- !ruby/object:Gem::Dependency
|
196
210
|
name: hashie
|
197
211
|
requirement: !ruby/object:Gem::Requirement
|
@@ -367,6 +381,8 @@ files:
|
|
367
381
|
- lib/elasticsearch/transport/transport/serializer/multi_json.rb
|
368
382
|
- lib/elasticsearch/transport/transport/sniffer.rb
|
369
383
|
- lib/elasticsearch/transport/version.rb
|
384
|
+
- spec/elasticsearch/connections/collection_spec.rb
|
385
|
+
- spec/elasticsearch/connections/selector_spec.rb
|
370
386
|
- spec/elasticsearch/transport/base_spec.rb
|
371
387
|
- spec/elasticsearch/transport/client_spec.rb
|
372
388
|
- spec/elasticsearch/transport/sniffer_spec.rb
|
@@ -374,8 +390,6 @@ files:
|
|
374
390
|
- test/integration/transport_test.rb
|
375
391
|
- test/profile/client_benchmark_test.rb
|
376
392
|
- test/test_helper.rb
|
377
|
-
- test/unit/connection_collection_test.rb
|
378
|
-
- test/unit/connection_selector_test.rb
|
379
393
|
- test/unit/connection_test.rb
|
380
394
|
- test/unit/response_test.rb
|
381
395
|
- test/unit/serializer_test.rb
|
@@ -408,6 +422,8 @@ signing_key:
|
|
408
422
|
specification_version: 4
|
409
423
|
summary: Ruby client for Elasticsearch.
|
410
424
|
test_files:
|
425
|
+
- spec/elasticsearch/connections/collection_spec.rb
|
426
|
+
- spec/elasticsearch/connections/selector_spec.rb
|
411
427
|
- spec/elasticsearch/transport/base_spec.rb
|
412
428
|
- spec/elasticsearch/transport/client_spec.rb
|
413
429
|
- spec/elasticsearch/transport/sniffer_spec.rb
|
@@ -415,8 +431,6 @@ test_files:
|
|
415
431
|
- test/integration/transport_test.rb
|
416
432
|
- test/profile/client_benchmark_test.rb
|
417
433
|
- test/test_helper.rb
|
418
|
-
- test/unit/connection_collection_test.rb
|
419
|
-
- test/unit/connection_selector_test.rb
|
420
434
|
- test/unit/connection_test.rb
|
421
435
|
- test/unit/response_test.rb
|
422
436
|
- test/unit/serializer_test.rb
|
@@ -1,147 +0,0 @@
|
|
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.
|
17
|
-
|
18
|
-
require 'test_helper'
|
19
|
-
|
20
|
-
class Elasticsearch::Transport::Transport::Connections::CollectionTest < Minitest::Test
|
21
|
-
include Elasticsearch::Transport::Transport::Connections
|
22
|
-
|
23
|
-
context "Connection collection" do
|
24
|
-
|
25
|
-
should "have empty array as default connections array" do
|
26
|
-
assert_equal [], Collection.new.connections
|
27
|
-
end
|
28
|
-
|
29
|
-
should "have default selector class" do
|
30
|
-
assert_not_nil Collection.new.selector
|
31
|
-
end
|
32
|
-
|
33
|
-
should "initialize a custom selector class" do
|
34
|
-
c = Collection.new :selector_class => Selector::Random
|
35
|
-
assert_instance_of Selector::Random, c.selector
|
36
|
-
end
|
37
|
-
|
38
|
-
should "take a custom selector instance" do
|
39
|
-
c = Collection.new :selector => Selector::Random.new
|
40
|
-
assert_instance_of Selector::Random, c.selector
|
41
|
-
end
|
42
|
-
|
43
|
-
should "get connection from selector" do
|
44
|
-
c = Collection.new
|
45
|
-
c.selector.expects(:select).returns('OK')
|
46
|
-
assert_equal 'OK', c.get_connection
|
47
|
-
end
|
48
|
-
|
49
|
-
should "return an array of hosts" do
|
50
|
-
c = Collection.new :connections => [ Connection.new(:host => 'foo'), Connection.new(:host => 'bar') ]
|
51
|
-
assert_equal ['foo', 'bar'], c.hosts
|
52
|
-
end
|
53
|
-
|
54
|
-
should "be enumerable" do
|
55
|
-
c = Collection.new :connections => [ Connection.new(:host => 'foo'), Connection.new(:host => 'bar') ]
|
56
|
-
|
57
|
-
assert_equal ['FOO', 'BAR'], c.map { |i| i.host.upcase }
|
58
|
-
assert_equal 'foo', c[0].host
|
59
|
-
assert_equal 'bar', c[1].host
|
60
|
-
assert_equal 2, c.size
|
61
|
-
end
|
62
|
-
|
63
|
-
should "add connections" do
|
64
|
-
c = Collection.new :connections => [ Connection.new(:host => { :protocol => 'http', :host => 'foo', :port => 1}) ]
|
65
|
-
assert_equal 1, c.size
|
66
|
-
|
67
|
-
c.add([ Connection.new(:host => { :protocol => 'http', :host => 'bar', :port => 1 }),
|
68
|
-
Connection.new(:host => { :protocol => 'http', :host => 'bam', :port => 1 }) ])
|
69
|
-
assert_equal 3, c.size
|
70
|
-
end
|
71
|
-
|
72
|
-
should "add connection" do
|
73
|
-
c = Collection.new :connections => [ Connection.new(:host => { :protocol => 'http', :host => 'foo', :port => 1}) ]
|
74
|
-
assert_equal 1, c.size
|
75
|
-
|
76
|
-
c.add(Connection.new(:host => { :protocol => 'http', :host => 'bar', :port => 1 }))
|
77
|
-
assert_equal 2, c.size
|
78
|
-
end
|
79
|
-
|
80
|
-
should "remove connections" do
|
81
|
-
c = Collection.new :connections => [
|
82
|
-
Connection.new(:host => { :protocol => 'http', :host => 'foo', :port => 1 }),
|
83
|
-
Connection.new(:host => { :protocol => 'http', :host => 'bar', :port => 1 })
|
84
|
-
]
|
85
|
-
assert_equal 2, c.size
|
86
|
-
|
87
|
-
c.remove([c.first])
|
88
|
-
assert_equal 1, c.size
|
89
|
-
|
90
|
-
c.remove(c)
|
91
|
-
assert_equal 0, c.size
|
92
|
-
end
|
93
|
-
|
94
|
-
should "remove connection" do
|
95
|
-
c = Collection.new :connections => [
|
96
|
-
Connection.new(:host => { :protocol => 'http', :host => 'foo', :port => 1 }),
|
97
|
-
Connection.new(:host => { :protocol => 'http', :host => 'bar', :port => 1 })
|
98
|
-
]
|
99
|
-
assert_equal 2, c.size
|
100
|
-
|
101
|
-
c.remove(c.first)
|
102
|
-
assert_equal 1, c.size
|
103
|
-
end
|
104
|
-
|
105
|
-
context "with the dead pool" do
|
106
|
-
setup do
|
107
|
-
@collection = Collection.new :connections => [ Connection.new(:host => 'foo'), Connection.new(:host => 'bar') ]
|
108
|
-
@collection[1].dead!
|
109
|
-
end
|
110
|
-
|
111
|
-
should "not iterate over dead connections" do
|
112
|
-
assert_equal 1, @collection.size
|
113
|
-
assert_equal ['FOO'], @collection.map { |c| c.host.upcase }
|
114
|
-
assert_equal @collection.connections, @collection.alive
|
115
|
-
end
|
116
|
-
|
117
|
-
should "have dead connections collection" do
|
118
|
-
assert_equal 1, @collection.dead.size
|
119
|
-
assert_equal ['BAR'], @collection.dead.map { |c| c.host.upcase }
|
120
|
-
end
|
121
|
-
|
122
|
-
should "not return dead connections, when alive connections exist" do
|
123
|
-
assert_equal 1, @collection.size
|
124
|
-
@collection.all.size.times { refute @collection.get_connection.dead? }
|
125
|
-
end
|
126
|
-
|
127
|
-
should "resurrect dead connection with least failures when no alive is available" do
|
128
|
-
c1 = Connection.new(:host => { :protocol => 'http', :host => 'foo', :port => 123 }).dead!.dead!
|
129
|
-
c2 = Connection.new(:host => { :protocol => 'http', :host => 'bar', :port => 123 }).dead!
|
130
|
-
|
131
|
-
@collection = Collection.new :connections => [ c1, c2 ]
|
132
|
-
|
133
|
-
assert_equal 0, @collection.size
|
134
|
-
assert_not_nil @collection.get_connection
|
135
|
-
assert_equal 1, @collection.size
|
136
|
-
assert_equal c2, @collection.first
|
137
|
-
end
|
138
|
-
|
139
|
-
should "return all connections" do
|
140
|
-
assert_equal 2, @collection.all.size
|
141
|
-
end
|
142
|
-
|
143
|
-
end
|
144
|
-
|
145
|
-
end
|
146
|
-
|
147
|
-
end
|
@@ -1,81 +0,0 @@
|
|
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.
|
17
|
-
|
18
|
-
require 'test_helper'
|
19
|
-
|
20
|
-
class Elasticsearch::Transport::Transport::Connections::SelectorTest < Minitest::Test
|
21
|
-
include Elasticsearch::Transport::Transport::Connections::Selector
|
22
|
-
|
23
|
-
class DummyStrategySelector
|
24
|
-
include Elasticsearch::Transport::Transport::Connections::Selector::Base
|
25
|
-
end
|
26
|
-
|
27
|
-
class BackupStrategySelector
|
28
|
-
include Elasticsearch::Transport::Transport::Connections::Selector::Base
|
29
|
-
|
30
|
-
def select(options={})
|
31
|
-
connections.reject do |c|
|
32
|
-
c.host[:attributes] && c.host[:attributes][:backup]
|
33
|
-
end.send( defined?(RUBY_VERSION) && RUBY_VERSION > '1.9' ? :sample : :choice)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
context "Connection selector" do
|
38
|
-
|
39
|
-
should "be initialized with connections" do
|
40
|
-
assert_equal [1, 2], Random.new(:connections => [1, 2]).connections
|
41
|
-
end
|
42
|
-
|
43
|
-
should "have the abstract select method" do
|
44
|
-
assert_raise(NoMethodError) { DummyStrategySelector.new.select }
|
45
|
-
end
|
46
|
-
|
47
|
-
context "in random strategy" do
|
48
|
-
setup do
|
49
|
-
@selector = Random.new :connections => ['A', 'B', 'C']
|
50
|
-
end
|
51
|
-
|
52
|
-
should "pick a connection" do
|
53
|
-
assert_not_nil @selector.select
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
context "in round-robin strategy" do
|
58
|
-
setup do
|
59
|
-
@selector = RoundRobin.new :connections => ['A', 'B', 'C']
|
60
|
-
end
|
61
|
-
|
62
|
-
should "rotate over connections" do
|
63
|
-
assert_equal 'A', @selector.select
|
64
|
-
assert_equal 'B', @selector.select
|
65
|
-
assert_equal 'C', @selector.select
|
66
|
-
assert_equal 'A', @selector.select
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
context "with a custom strategy" do
|
71
|
-
|
72
|
-
should "return proper connection" do
|
73
|
-
selector = BackupStrategySelector.new :connections => [ stub(:host => { :hostname => 'host1' }),
|
74
|
-
stub(:host => { :hostname => 'host2', :attributes => { :backup => true }}) ]
|
75
|
-
10.times { assert_equal 'host1', selector.select.host[:hostname] }
|
76
|
-
end
|
77
|
-
|
78
|
-
end
|
79
|
-
|
80
|
-
end
|
81
|
-
end
|