elasticsearch-transport 7.4.0 → 7.17.10
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.
- checksums.yaml +4 -4
- data/Gemfile +30 -13
- data/Gemfile-faraday1.gemfile +47 -0
- data/README.md +159 -64
- data/Rakefile +63 -13
- data/elasticsearch-transport.gemspec +55 -63
- data/lib/elasticsearch/transport/client.rb +184 -59
- data/lib/elasticsearch/transport/meta_header.rb +135 -0
- data/lib/elasticsearch/transport/redacted.rb +16 -3
- data/lib/elasticsearch/transport/transport/base.rb +69 -30
- data/lib/elasticsearch/transport/transport/connections/collection.rb +18 -8
- data/lib/elasticsearch/transport/transport/connections/connection.rb +25 -9
- data/lib/elasticsearch/transport/transport/connections/selector.rb +16 -3
- data/lib/elasticsearch/transport/transport/errors.rb +17 -3
- data/lib/elasticsearch/transport/transport/http/curb.rb +60 -35
- data/lib/elasticsearch/transport/transport/http/faraday.rb +32 -9
- data/lib/elasticsearch/transport/transport/http/manticore.rb +57 -32
- data/lib/elasticsearch/transport/transport/loggable.rb +16 -3
- data/lib/elasticsearch/transport/transport/response.rb +17 -5
- data/lib/elasticsearch/transport/transport/serializer/multi_json.rb +16 -3
- data/lib/elasticsearch/transport/transport/sniffer.rb +35 -15
- data/lib/elasticsearch/transport/version.rb +17 -4
- data/lib/elasticsearch/transport.rb +35 -33
- data/lib/elasticsearch-transport.rb +16 -3
- data/spec/elasticsearch/connections/collection_spec.rb +28 -3
- data/spec/elasticsearch/connections/selector_spec.rb +16 -3
- data/spec/elasticsearch/transport/base_spec.rb +107 -49
- data/spec/elasticsearch/transport/client_spec.rb +734 -164
- data/spec/elasticsearch/transport/http/curb_spec.rb +126 -0
- data/spec/elasticsearch/transport/http/faraday_spec.rb +141 -0
- data/spec/elasticsearch/transport/http/manticore_spec.rb +161 -0
- data/spec/elasticsearch/transport/meta_header_spec.rb +301 -0
- data/spec/elasticsearch/transport/sniffer_spec.rb +16 -16
- data/spec/spec_helper.rb +32 -6
- data/test/integration/jruby_test.rb +43 -0
- data/test/integration/transport_test.rb +109 -46
- data/test/profile/client_benchmark_test.rb +16 -3
- data/test/test_helper.rb +26 -25
- data/test/unit/adapters_test.rb +88 -0
- data/test/unit/connection_test.rb +23 -5
- data/test/unit/response_test.rb +18 -5
- data/test/unit/serializer_test.rb +16 -3
- data/test/unit/transport_base_test.rb +33 -11
- data/test/unit/transport_curb_test.rb +16 -4
- data/test/unit/transport_faraday_test.rb +18 -5
- data/test/unit/transport_manticore_test.rb +258 -158
- metadata +64 -76
| @@ -1,15 +1,25 @@ | |
| 1 | 
            -
            # Licensed to Elasticsearch B.V under one or more  | 
| 2 | 
            -
            #  | 
| 3 | 
            -
            #  | 
| 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::Transport::Base do
         | 
| 8 | 
            -
             | 
| 9 21 | 
             
              context 'when a host is printed in a logged message' do
         | 
| 10 | 
            -
             | 
| 11 22 | 
             
                shared_examples_for 'a redacted string' do
         | 
| 12 | 
            -
             | 
| 13 23 | 
             
                  let(:client) do
         | 
| 14 24 | 
             
                    Elasticsearch::Transport::Client.new(arguments)
         | 
| 15 25 | 
             
                  end
         | 
| @@ -20,88 +30,127 @@ describe Elasticsearch::Transport::Transport::Base do | |
| 20 30 |  | 
| 21 31 | 
             
                  it 'does not include the password in the logged string' do
         | 
| 22 32 | 
             
                    expect(logger).not_to receive(:error).with(/secret_password/)
         | 
| 33 | 
            +
             | 
| 23 34 | 
             
                    expect {
         | 
| 24 | 
            -
                      client. | 
| 35 | 
            +
                      client.perform_request('GET', '_cluster/stats')
         | 
| 25 36 | 
             
                    }.to raise_exception(Faraday::ConnectionFailed)
         | 
| 26 37 | 
             
                  end
         | 
| 27 38 |  | 
| 28 39 | 
             
                  it 'replaces the password with the string \'REDACTED\'' do
         | 
| 29 40 | 
             
                    expect(logger).to receive(:error).with(/REDACTED/)
         | 
| 30 41 | 
             
                    expect {
         | 
| 31 | 
            -
                      client. | 
| 42 | 
            +
                      client.perform_request('GET', '_cluster/stats')
         | 
| 32 43 | 
             
                    }.to raise_exception(Faraday::ConnectionFailed)
         | 
| 33 44 | 
             
                  end
         | 
| 34 45 | 
             
                end
         | 
| 35 46 |  | 
| 36 47 | 
             
                context 'when the user and password are provided as separate arguments' do
         | 
| 37 | 
            -
             | 
| 38 48 | 
             
                  let(:arguments) do
         | 
| 39 | 
            -
                    { | 
| 49 | 
            +
                    {
         | 
| 50 | 
            +
                      hosts: 'fake',
         | 
| 40 51 | 
             
                      logger: logger,
         | 
| 41 52 | 
             
                      password: 'secret_password',
         | 
| 42 | 
            -
                      user: 'test' | 
| 53 | 
            +
                      user: 'test'
         | 
| 54 | 
            +
                    }
         | 
| 43 55 | 
             
                  end
         | 
| 44 56 |  | 
| 45 57 | 
             
                  it_behaves_like 'a redacted string'
         | 
| 46 58 | 
             
                end
         | 
| 47 59 |  | 
| 48 60 | 
             
                context 'when the user and password are provided in the string URI' do
         | 
| 49 | 
            -
             | 
| 50 61 | 
             
                  let(:arguments) do
         | 
| 51 | 
            -
                    { | 
| 52 | 
            -
                       | 
| 62 | 
            +
                    {
         | 
| 63 | 
            +
                      hosts: 'https://test:secret_password@fake_local_elasticsearch',
         | 
| 64 | 
            +
                      logger: logger
         | 
| 65 | 
            +
                    }
         | 
| 53 66 | 
             
                  end
         | 
| 54 67 |  | 
| 55 | 
            -
                   | 
| 68 | 
            +
                  if jruby?
         | 
| 69 | 
            +
                    let(:client) { Elasticsearch::Transport::Client.new(arguments) }
         | 
| 70 | 
            +
                    let(:logger) { double('logger', fatal?: true, fatal: '') }
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                    it 'does not include the password in the logged string' do
         | 
| 73 | 
            +
                      expect(logger).not_to receive(:fatal).with(/secret_password/)
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                      expect {
         | 
| 76 | 
            +
                        client.perform_request('GET', '_cluster/stats')
         | 
| 77 | 
            +
                      }.to raise_exception(Faraday::SSLError)
         | 
| 78 | 
            +
                    end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                    it 'replaces the password with the string \'REDACTED\'' do
         | 
| 81 | 
            +
                      expect(logger).to receive(:fatal).with(/REDACTED/)
         | 
| 82 | 
            +
                      expect {
         | 
| 83 | 
            +
                        client.perform_request('GET', '_cluster/stats')
         | 
| 84 | 
            +
                      }.to raise_exception(Faraday::SSLError)
         | 
| 85 | 
            +
                    end
         | 
| 86 | 
            +
                  else
         | 
| 87 | 
            +
                    it_behaves_like 'a redacted string'
         | 
| 88 | 
            +
                  end
         | 
| 56 89 | 
             
                end
         | 
| 57 90 |  | 
| 58 91 | 
             
                context 'when the user and password are provided in the URI object' do
         | 
| 59 | 
            -
             | 
| 60 92 | 
             
                  let(:arguments) do
         | 
| 61 | 
            -
                    { | 
| 62 | 
            -
                       | 
| 93 | 
            +
                    {
         | 
| 94 | 
            +
                      hosts: URI.parse('https://test:secret_password@fake_local_elasticsearch'),
         | 
| 95 | 
            +
                      logger: logger
         | 
| 96 | 
            +
                    }
         | 
| 97 | 
            +
                  end
         | 
| 98 | 
            +
                  if jruby?
         | 
| 99 | 
            +
                    let(:client) { Elasticsearch::Transport::Client.new(arguments) }
         | 
| 100 | 
            +
                    let(:logger) { double('logger', fatal?: true, fatal: '') }
         | 
| 101 | 
            +
             | 
| 102 | 
            +
                    it 'does not include the password in the logged string' do
         | 
| 103 | 
            +
                      expect(logger).not_to receive(:fatal).with(/secret_password/)
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                      expect {
         | 
| 106 | 
            +
                        client.perform_request('GET', '_cluster/stats')
         | 
| 107 | 
            +
                      }.to raise_exception(Faraday::SSLError)
         | 
| 108 | 
            +
                    end
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                    it 'replaces the password with the string \'REDACTED\'' do
         | 
| 111 | 
            +
                      expect(logger).to receive(:fatal).with(/REDACTED/)
         | 
| 112 | 
            +
                      expect {
         | 
| 113 | 
            +
                        client.perform_request('GET', '_cluster/stats')
         | 
| 114 | 
            +
                      }.to raise_exception(Faraday::SSLError)
         | 
| 115 | 
            +
                    end
         | 
| 116 | 
            +
                  else
         | 
| 117 | 
            +
                    it_behaves_like 'a redacted string'
         | 
| 63 118 | 
             
                  end
         | 
| 64 | 
            -
             | 
| 65 | 
            -
                  it_behaves_like 'a redacted string'
         | 
| 66 119 | 
             
                end
         | 
| 67 120 | 
             
              end
         | 
| 68 121 |  | 
| 69 122 | 
             
              context 'when reload_on_failure is true and and hosts are unreachable' do
         | 
| 70 | 
            -
             | 
| 71 123 | 
             
                let(:client) do
         | 
| 72 124 | 
             
                  Elasticsearch::Transport::Client.new(arguments)
         | 
| 73 125 | 
             
                end
         | 
| 74 126 |  | 
| 75 127 | 
             
                let(:arguments) do
         | 
| 76 128 | 
             
                  {
         | 
| 77 | 
            -
             | 
| 78 | 
            -
             | 
| 79 | 
            -
             | 
| 129 | 
            +
                    hosts: ['http://unavailable:9200', 'http://unavailable:9201'],
         | 
| 130 | 
            +
                    reload_on_failure: true,
         | 
| 131 | 
            +
                    sniffer_timeout: 5
         | 
| 80 132 | 
             
                  }
         | 
| 81 133 | 
             
                end
         | 
| 82 134 |  | 
| 83 135 | 
             
                it 'raises an exception' do
         | 
| 84 | 
            -
                  expect {
         | 
| 85 | 
            -
                    client.info
         | 
| 86 | 
            -
                  }.to raise_exception(Faraday::ConnectionFailed)
         | 
| 136 | 
            +
                  expect { client.perform_request('GET', '/') }.to raise_exception(Faraday::ConnectionFailed)
         | 
| 87 137 | 
             
                end
         | 
| 88 138 | 
             
              end
         | 
| 89 139 |  | 
| 90 140 | 
             
              context 'when the client has `retry_on_failure` set to an integer' do
         | 
| 91 | 
            -
             | 
| 92 141 | 
             
                let(:client) do
         | 
| 93 142 | 
             
                  Elasticsearch::Transport::Client.new(arguments)
         | 
| 94 143 | 
             
                end
         | 
| 95 144 |  | 
| 96 145 | 
             
                let(:arguments) do
         | 
| 97 146 | 
             
                  {
         | 
| 98 | 
            -
             | 
| 99 | 
            -
             | 
| 147 | 
            +
                    hosts: ['http://unavailable:9200', 'http://unavailable:9201'],
         | 
| 148 | 
            +
                    retry_on_failure: 2,
         | 
| 149 | 
            +
                    adapter: :net_http
         | 
| 100 150 | 
             
                  }
         | 
| 101 151 | 
             
                end
         | 
| 102 152 |  | 
| 103 153 | 
             
                context 'when `perform_request` is called without a `retry_on_failure` option value' do
         | 
| 104 | 
            -
             | 
| 105 154 | 
             
                  before do
         | 
| 106 155 | 
             
                    expect(client.transport).to receive(:get_connection).exactly(3).times.and_call_original
         | 
| 107 156 | 
             
                  end
         | 
| @@ -113,22 +162,40 @@ describe Elasticsearch::Transport::Transport::Base do | |
| 113 162 | 
             
                  end
         | 
| 114 163 | 
             
                end
         | 
| 115 164 |  | 
| 116 | 
            -
                context 'when `perform_request` is called with a ` | 
| 165 | 
            +
                context 'when `perform_request` is called with a `retry_on_status` option value' do
         | 
| 166 | 
            +
                  before do
         | 
| 167 | 
            +
                    expect(client.transport).to receive(:__raise_transport_error).exactly(6).times.and_call_original
         | 
| 168 | 
            +
                  end
         | 
| 169 | 
            +
             | 
| 170 | 
            +
                  let(:arguments) do
         | 
| 171 | 
            +
                    {
         | 
| 172 | 
            +
                      hosts: ELASTICSEARCH_HOSTS,
         | 
| 173 | 
            +
                      retry_on_status: ['404'],
         | 
| 174 | 
            +
                      adapter: :net_http
         | 
| 175 | 
            +
                    }
         | 
| 176 | 
            +
                  end
         | 
| 177 | 
            +
             | 
| 178 | 
            +
                  it 'retries on 404 status the specified number of max_retries' do
         | 
| 179 | 
            +
                    expect do
         | 
| 180 | 
            +
                      client.transport.perform_request('GET', 'myindex/mydoc/1?routing=FOOBARBAZ', {}, nil, nil, retry_on_failure: 5)
         | 
| 181 | 
            +
                    end.to raise_exception(Elasticsearch::Transport::Transport::Errors::NotFound)
         | 
| 182 | 
            +
                  end
         | 
| 183 | 
            +
                end
         | 
| 117 184 |  | 
| 185 | 
            +
                context 'when `perform_request` is called with a `retry_on_failure` option value' do
         | 
| 118 186 | 
             
                  before do
         | 
| 119 187 | 
             
                    expect(client.transport).to receive(:get_connection).exactly(6).times.and_call_original
         | 
| 120 188 | 
             
                  end
         | 
| 121 189 |  | 
| 122 190 | 
             
                  it 'uses the option `retry_on_failure` value' do
         | 
| 123 | 
            -
                    expect  | 
| 191 | 
            +
                    expect do
         | 
| 124 192 | 
             
                      client.transport.perform_request('GET', '/info', {}, nil, nil, retry_on_failure: 5)
         | 
| 125 | 
            -
                     | 
| 193 | 
            +
                    end.to raise_exception(Faraday::ConnectionFailed)
         | 
| 126 194 | 
             
                  end
         | 
| 127 195 | 
             
                end
         | 
| 128 196 | 
             
              end
         | 
| 129 197 |  | 
| 130 198 | 
             
              context 'when the client has `retry_on_failure` set to true' do
         | 
| 131 | 
            -
             | 
| 132 199 | 
             
                let(:client) do
         | 
| 133 200 | 
             
                  Elasticsearch::Transport::Client.new(arguments)
         | 
| 134 201 | 
             
                end
         | 
| @@ -141,7 +208,6 @@ describe Elasticsearch::Transport::Transport::Base do | |
| 141 208 | 
             
                end
         | 
| 142 209 |  | 
| 143 210 | 
             
                context 'when `perform_request` is called without a `retry_on_failure` option value' do
         | 
| 144 | 
            -
             | 
| 145 211 | 
             
                  before do
         | 
| 146 212 | 
             
                    expect(client.transport).to receive(:get_connection).exactly(4).times.and_call_original
         | 
| 147 213 | 
             
                  end
         | 
| @@ -154,7 +220,6 @@ describe Elasticsearch::Transport::Transport::Base do | |
| 154 220 | 
             
                end
         | 
| 155 221 |  | 
| 156 222 | 
             
                context 'when `perform_request` is called with a `retry_on_failure` option value' do
         | 
| 157 | 
            -
             | 
| 158 223 | 
             
                  before do
         | 
| 159 224 | 
             
                    expect(client.transport).to receive(:get_connection).exactly(6).times.and_call_original
         | 
| 160 225 | 
             
                  end
         | 
| @@ -168,7 +233,6 @@ describe Elasticsearch::Transport::Transport::Base do | |
| 168 233 | 
             
              end
         | 
| 169 234 |  | 
| 170 235 | 
             
              context 'when the client has `retry_on_failure` set to false' do
         | 
| 171 | 
            -
             | 
| 172 236 | 
             
                let(:client) do
         | 
| 173 237 | 
             
                  Elasticsearch::Transport::Client.new(arguments)
         | 
| 174 238 | 
             
                end
         | 
| @@ -181,7 +245,6 @@ describe Elasticsearch::Transport::Transport::Base do | |
| 181 245 | 
             
                end
         | 
| 182 246 |  | 
| 183 247 | 
             
                context 'when `perform_request` is called without a `retry_on_failure` option value' do
         | 
| 184 | 
            -
             | 
| 185 248 | 
             
                  before do
         | 
| 186 249 | 
             
                    expect(client.transport).to receive(:get_connection).once.and_call_original
         | 
| 187 250 | 
             
                  end
         | 
| @@ -208,40 +271,35 @@ describe Elasticsearch::Transport::Transport::Base do | |
| 208 271 | 
             
              end
         | 
| 209 272 |  | 
| 210 273 | 
             
              context 'when the client has no `retry_on_failure` set' do
         | 
| 211 | 
            -
             | 
| 212 274 | 
             
                let(:client) do
         | 
| 213 275 | 
             
                  Elasticsearch::Transport::Client.new(arguments)
         | 
| 214 276 | 
             
                end
         | 
| 215 277 |  | 
| 216 278 | 
             
                let(:arguments) do
         | 
| 217 | 
            -
                  {
         | 
| 218 | 
            -
                      hosts: ['http://unavailable:9200', 'http://unavailable:9201'],
         | 
| 219 | 
            -
                  }
         | 
| 279 | 
            +
                  { hosts: ['http://unavailable:9200', 'http://unavailable:9201'] }
         | 
| 220 280 | 
             
                end
         | 
| 221 281 |  | 
| 222 282 | 
             
                context 'when `perform_request` is called without a `retry_on_failure` option value' do
         | 
| 223 | 
            -
             | 
| 224 283 | 
             
                  before do
         | 
| 225 284 | 
             
                    expect(client.transport).to receive(:get_connection).exactly(1).times.and_call_original
         | 
| 226 285 | 
             
                  end
         | 
| 227 286 |  | 
| 228 287 | 
             
                  it 'does not retry' do
         | 
| 229 | 
            -
                    expect  | 
| 288 | 
            +
                    expect do
         | 
| 230 289 | 
             
                      client.transport.perform_request('GET', '/info')
         | 
| 231 | 
            -
                     | 
| 290 | 
            +
                    end.to raise_exception(Faraday::ConnectionFailed)
         | 
| 232 291 | 
             
                  end
         | 
| 233 292 | 
             
                end
         | 
| 234 293 |  | 
| 235 294 | 
             
                context 'when `perform_request` is called with a `retry_on_failure` option value' do
         | 
| 236 | 
            -
             | 
| 237 295 | 
             
                  before do
         | 
| 238 296 | 
             
                    expect(client.transport).to receive(:get_connection).exactly(6).times.and_call_original
         | 
| 239 297 | 
             
                  end
         | 
| 240 298 |  | 
| 241 299 | 
             
                  it 'uses the option `retry_on_failure` value' do
         | 
| 242 | 
            -
                    expect  | 
| 300 | 
            +
                    expect do
         | 
| 243 301 | 
             
                      client.transport.perform_request('GET', '/info', {}, nil, nil, retry_on_failure: 5)
         | 
| 244 | 
            -
                     | 
| 302 | 
            +
                    end.to raise_exception(Faraday::ConnectionFailed)
         | 
| 245 303 | 
             
                  end
         | 
| 246 304 | 
             
                end
         | 
| 247 305 | 
             
              end
         |