logstash-input-elasticsearch 4.10.0 → 4.12.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 84fb0092d51b303586c275c6cfaef3222391d7aabe910450a989291b691930c0
4
- data.tar.gz: 955e27896dff25ec6568685f91cc7e34252bc54fbb5182133db1e4dd273efffe
3
+ metadata.gz: caea2fedebb629d87471f67b2b03f43186e7e2b02e854e3f6df7154a64316f16
4
+ data.tar.gz: 1d75f76b97d6d8ea481637399b1ea82668f5fb47ea52a2f1a51034594b55375f
5
5
  SHA512:
6
- metadata.gz: 2be653a935384617b32905f441060326f2b45eadcaacbf727d1ebe5c82711e3e9f0f3a038b9ca39aad6377e67bb5caf78c8b83a625d82aa8fca267b738dc9cab
7
- data.tar.gz: a19916b987c434dfeb396379fa9f552fd001901bc5b37ce60407e4b7df69f5bd3ff76d4122b2f71d27c5d37d983a1dd283dcdf3aa1693730e93c2875f2459a1a
6
+ metadata.gz: 07af682a46bc7aa7bd48b0d4c4f0a4baa9e8dd5a8848821863b67fe4b2ee5890655d76de1de782938be0b73bf3057228a94ccbf155b7fb9ecaa81077831362e5
7
+ data.tar.gz: 0031f21cc9d7e41dfdbf9de400b33e21a1b9abda7c9ca2159fb21623ff5cf21258b99670d22090eda39ad42141408166c10317874ea6682e4e3b756e031355a1
data/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## 4.12.2
2
+ - Fix: hosts => "es_host:port" regression [#168](https://github.com/logstash-plugins/logstash-input-elasticsearch/pull/168)
3
+
4
+ ## 4.12.1
5
+ - Fixed too_long_frame_exception by passing scroll_id in the body [#159](https://github.com/logstash-plugins/logstash-input-elasticsearch/pull/159)
6
+
7
+ ## 4.12.0
8
+ - Feat: Update Elasticsearch client to 7.14.0 [#157](https://github.com/logstash-plugins/logstash-input-elasticsearch/pull/157)
9
+
10
+ ## 4.11.0
11
+ - Feat: add user-agent header passed to the Elasticsearch HTTP connection [#158](https://github.com/logstash-plugins/logstash-input-elasticsearch/pull/158)
12
+
1
13
  ## 4.10.0
2
14
  - Feat: added ecs_compatibility + event_factory support [#149](https://github.com/logstash-plugins/logstash-input-elasticsearch/pull/149)
3
15
 
data/Gemfile CHANGED
@@ -9,3 +9,6 @@ if Dir.exist?(logstash_path) && use_logstash_source
9
9
  gem 'logstash-core', :path => "#{logstash_path}/logstash-core"
10
10
  gem 'logstash-core-plugin-api', :path => "#{logstash_path}/logstash-core-plugin-api"
11
11
  end
12
+
13
+ gem 'manticore', ENV['MANTICORE_VERSION'] if ENV['MANTICORE_VERSION']
14
+ gem 'elasticsearch', ENV['ELASTICSEARCH_VERSION'] if ENV['ELASTICSEARCH_VERSION']
@@ -20,7 +20,17 @@ if es_client_version >= Gem::Version.new('7.2') && es_client_version < Gem::Vers
20
20
  def apply_headers(request_options, options)
21
21
  headers = (options && options[:headers]) || {}
22
22
  headers[CONTENT_TYPE_STR] = find_value(headers, CONTENT_TYPE_REGEX) || DEFAULT_CONTENT_TYPE
23
- headers[USER_AGENT_STR] = find_value(headers, USER_AGENT_REGEX) || user_agent_header
23
+
24
+ # this code is necessary to grab the correct user-agent header
25
+ # when this method is invoked with apply_headers(@request_options, options)
26
+ # from https://github.com/elastic/elasticsearch-ruby/blob/v7.14.0/elasticsearch-transport/lib/elasticsearch/transport/transport/http/manticore.rb#L113-L114
27
+ transport_user_agent = nil
28
+ if (options && options[:transport_options] && options[:transport_options][:headers])
29
+ transport_headers = options[:transport_options][:headers]
30
+ transport_user_agent = find_value(transport_headers, USER_AGENT_REGEX)
31
+ end
32
+
33
+ headers[USER_AGENT_STR] = transport_user_agent || find_value(headers, USER_AGENT_REGEX) || user_agent_header
24
34
  headers[ACCEPT_ENCODING] = GZIP if use_compression?
25
35
  (request_options[:headers] ||= {}).merge!(headers) # this line was changed
26
36
  end
@@ -222,6 +222,7 @@ class LogStash::Inputs::Elasticsearch < LogStash::Inputs::Base
222
222
  transport_options = {:headers => {}}
223
223
  transport_options[:headers].merge!(setup_basic_auth(user, password))
224
224
  transport_options[:headers].merge!(setup_api_key(api_key))
225
+ transport_options[:headers].merge!({'user-agent' => prepare_user_agent()})
225
226
  transport_options[:request_timeout] = @request_timeout_seconds unless @request_timeout_seconds.nil?
226
227
  transport_options[:connect_timeout] = @connect_timeout_seconds unless @connect_timeout_seconds.nil?
227
228
  transport_options[:socket_timeout] = @socket_timeout_seconds unless @socket_timeout_seconds.nil?
@@ -239,6 +240,8 @@ class LogStash::Inputs::Elasticsearch < LogStash::Inputs::Base
239
240
  :transport_class => ::Elasticsearch::Transport::Transport::HTTP::Manticore,
240
241
  :ssl => ssl_options
241
242
  )
243
+ test_connection!
244
+ @client
242
245
  end
243
246
 
244
247
 
@@ -344,7 +347,7 @@ class LogStash::Inputs::Elasticsearch < LogStash::Inputs::Base
344
347
  end
345
348
 
346
349
  def clear_scroll(scroll_id)
347
- @client.clear_scroll(scroll_id: scroll_id) if scroll_id
350
+ @client.clear_scroll(:body => { :scroll_id => scroll_id }) if scroll_id
348
351
  rescue => e
349
352
  # ignore & log any clear_scroll errors
350
353
  logger.warn("Ignoring clear_scroll exception", message: e.message, exception: e.class)
@@ -383,13 +386,13 @@ class LogStash::Inputs::Elasticsearch < LogStash::Inputs::Base
383
386
 
384
387
  def setup_hosts
385
388
  @hosts = Array(@hosts).map { |host| host.to_s } # potential SafeURI#to_s
386
- if @ssl
387
- @hosts.map do |h|
388
- host, port = h.split(":")
389
- { :host => host, :scheme => 'https', :port => port }
389
+ @hosts.map do |h|
390
+ if h.start_with?('http:', 'https:')
391
+ h
392
+ else
393
+ host, port = h.split(':')
394
+ { host: host, port: port, scheme: (@ssl ? 'https' : 'http') }
390
395
  end
391
- else
392
- @hosts
393
396
  end
394
397
  end
395
398
 
@@ -407,6 +410,18 @@ class LogStash::Inputs::Elasticsearch < LogStash::Inputs::Base
407
410
  { 'Authorization' => "ApiKey #{token}" }
408
411
  end
409
412
 
413
+ def prepare_user_agent
414
+ os_name = java.lang.System.getProperty('os.name')
415
+ os_version = java.lang.System.getProperty('os.version')
416
+ os_arch = java.lang.System.getProperty('os.arch')
417
+ jvm_vendor = java.lang.System.getProperty('java.vendor')
418
+ jvm_version = java.lang.System.getProperty('java.version')
419
+
420
+ plugin_version = Gem.loaded_specs["logstash-input-elasticsearch"].version
421
+ # example: logstash/7.14.1 (OS=Linux-5.4.0-84-generic-amd64; JVM=AdoptOpenJDK-11.0.11) logstash-input-elasticsearch/4.10.0
422
+ "logstash/#{LOGSTASH_VERSION} (OS=#{os_name}-#{os_version}-#{os_arch}; JVM=#{jvm_vendor}-#{jvm_version}) logstash-#{@plugin_type}-#{config_name}/#{plugin_version}"
423
+ end
424
+
410
425
  def fill_user_password_from_cloud_auth
411
426
  return unless @cloud_auth
412
427
 
@@ -460,6 +475,12 @@ class LogStash::Inputs::Elasticsearch < LogStash::Inputs::Base
460
475
  # @private used by unit specs
461
476
  attr_reader :client
462
477
 
478
+ def test_connection!
479
+ @client.ping
480
+ rescue Elasticsearch::UnsupportedProductError
481
+ raise LogStash::ConfigurationError, "Could not connect to a compatible version of Elasticsearch"
482
+ end
483
+
463
484
  module URIOrEmptyValidator
464
485
  ##
465
486
  # @override to provide :uri_or_empty validator
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'logstash-input-elasticsearch'
4
- s.version = '4.10.0'
4
+ s.version = '4.12.2'
5
5
  s.licenses = ['Apache License (2.0)']
6
6
  s.summary = "Reads query results from an Elasticsearch cluster"
7
7
  s.description = "This gem is a Logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This gem is not a stand-alone program"
@@ -25,7 +25,7 @@ Gem::Specification.new do |s|
25
25
  s.add_runtime_dependency 'logstash-mixin-event_support', '~> 1.0'
26
26
  s.add_runtime_dependency "logstash-mixin-validator_support", '~> 1.0'
27
27
 
28
- s.add_runtime_dependency 'elasticsearch', '>= 5.0.5' # LS >= 6.7 and < 7.14 all used version 5.0.5
28
+ s.add_runtime_dependency 'elasticsearch', '>= 7.14.0' # LS >= 6.7 and < 7.14 all used version 5.0.5
29
29
 
30
30
  s.add_runtime_dependency 'tzinfo'
31
31
  s.add_runtime_dependency 'tzinfo-data'
@@ -33,7 +33,9 @@ Gem::Specification.new do |s|
33
33
  s.add_runtime_dependency 'manticore', ">= 0.7.1"
34
34
 
35
35
  s.add_development_dependency 'logstash-codec-plain'
36
- s.add_development_dependency 'faraday', "~> 0.15.4"
36
+ s.add_development_dependency 'faraday', "~> 1"
37
37
  s.add_development_dependency 'logstash-devutils'
38
38
  s.add_development_dependency 'timecop'
39
+ s.add_development_dependency 'cabin', ['~> 0.6']
40
+ s.add_development_dependency 'webrick'
39
41
  end
@@ -7,6 +7,9 @@ require "timecop"
7
7
  require "stud/temporary"
8
8
  require "time"
9
9
  require "date"
10
+ require "cabin"
11
+ require "webrick"
12
+ require "uri"
10
13
 
11
14
  require 'logstash/plugin_mixins/ecs_compatibility_support/spec_helper'
12
15
 
@@ -15,6 +18,34 @@ describe LogStash::Inputs::Elasticsearch, :ecs_compatibility_support do
15
18
  let(:plugin) { described_class.new(config) }
16
19
  let(:queue) { Queue.new }
17
20
 
21
+ before(:each) do
22
+ Elasticsearch::Client.send(:define_method, :ping) { } # define no-action ping method
23
+ end
24
+
25
+ context "register" do
26
+ let(:config) do
27
+ {
28
+ "schedule" => "* * * * * UTC"
29
+ }
30
+ end
31
+
32
+ context "against authentic Elasticsearch" do
33
+ it "should not raise an exception" do
34
+ expect { plugin.register }.to_not raise_error
35
+ end
36
+ end
37
+
38
+ context "against not authentic Elasticsearch" do
39
+ before(:each) do
40
+ Elasticsearch::Client.send(:define_method, :ping) { raise Elasticsearch::UnsupportedProductError.new("Fake error") } # define error ping method
41
+ end
42
+
43
+ it "should raise ConfigurationError" do
44
+ expect { plugin.register }.to raise_error(LogStash::ConfigurationError)
45
+ end
46
+ end
47
+ end
48
+
18
49
  it_behaves_like "an interruptible input plugin" do
19
50
  let(:esclient) { double("elasticsearch-client") }
20
51
  let(:config) do
@@ -35,6 +66,7 @@ describe LogStash::Inputs::Elasticsearch, :ecs_compatibility_support do
35
66
  allow(esclient).to receive(:search) { { "hits" => { "hits" => [hit] } } }
36
67
  allow(esclient).to receive(:scroll) { { "hits" => { "hits" => [hit] } } }
37
68
  allow(esclient).to receive(:clear_scroll).and_return(nil)
69
+ allow(esclient).to receive(:ping)
38
70
  end
39
71
  end
40
72
 
@@ -93,6 +125,7 @@ describe LogStash::Inputs::Elasticsearch, :ecs_compatibility_support do
93
125
  expect(client).to receive(:search).with(any_args).and_return(mock_response)
94
126
  expect(client).to receive(:scroll).with({ :body => { :scroll_id => "cXVlcnlUaGVuRmV0Y2g" }, :scroll=> "1m" }).and_return(mock_scroll_response)
95
127
  expect(client).to receive(:clear_scroll).and_return(nil)
128
+ expect(client).to receive(:ping)
96
129
  end
97
130
 
98
131
  it 'creates the events from the hits' do
@@ -308,6 +341,7 @@ describe LogStash::Inputs::Elasticsearch, :ecs_compatibility_support do
308
341
  expect(client).to receive(:search).with(hash_including(:body => slice0_query)).and_return(slice0_response0)
309
342
  expect(client).to receive(:scroll).with(hash_including(:body => { :scroll_id => slice0_scroll1 })).and_return(slice0_response1)
310
343
  expect(client).to receive(:scroll).with(hash_including(:body => { :scroll_id => slice0_scroll2 })).and_return(slice0_response2)
344
+ allow(client).to receive(:ping)
311
345
 
312
346
  # SLICE1 is a two-page scroll in which the last page has no next scroll id
313
347
  slice1_query = LogStash::Json.dump(query.merge('slice' => { 'id' => 1, 'max' => 2}))
@@ -407,6 +441,7 @@ describe LogStash::Inputs::Elasticsearch, :ecs_compatibility_support do
407
441
  expect(client).to receive(:search).with(any_args).and_return(response)
408
442
  allow(client).to receive(:scroll).with({ :body => {:scroll_id => "cXVlcnlUaGVuRmV0Y2g"}, :scroll => "1m" }).and_return(scroll_reponse)
409
443
  allow(client).to receive(:clear_scroll).and_return(nil)
444
+ allow(client).to receive(:ping).and_return(nil)
410
445
  end
411
446
 
412
447
  ecs_compatibility_matrix(:disabled, :v1, :v8) do |ecs_select|
@@ -583,13 +618,14 @@ describe LogStash::Inputs::Elasticsearch, :ecs_compatibility_support do
583
618
  it "should set host(s)" do
584
619
  plugin.register
585
620
  client = plugin.send(:client)
586
- expect( extract_transport(client).hosts ).to eql [{
587
- :scheme => "https",
588
- :host => "ac31ebb90241773157043c34fd26fd46.us-central1.gcp.cloud.es.io",
589
- :port => 9243,
590
- :path => "",
591
- :protocol => "https"
592
- }]
621
+
622
+ expect( client.transport.instance_variable_get(:@seeds) ).to eql [{
623
+ :scheme => "https",
624
+ :host => "ac31ebb90241773157043c34fd26fd46.us-central1.gcp.cloud.es.io",
625
+ :port => 9243,
626
+ :path => "",
627
+ :protocol => "https"
628
+ }]
593
629
  end
594
630
 
595
631
  context 'invalid' do
@@ -690,7 +726,157 @@ describe LogStash::Inputs::Elasticsearch, :ecs_compatibility_support do
690
726
  end
691
727
  end
692
728
 
693
- shared_examples'configurable timeout' do |config_name, manticore_transport_option|
729
+ class StoppableServer
730
+
731
+ attr_reader :port
732
+
733
+ def initialize()
734
+ queue = Queue.new
735
+ @first_req_waiter = java.util.concurrent.CountDownLatch.new(1)
736
+ @first_request = nil
737
+
738
+ @t = java.lang.Thread.new(
739
+ proc do
740
+ begin
741
+ @server = WEBrick::HTTPServer.new :Port => 0, :DocumentRoot => ".",
742
+ :Logger => Cabin::Channel.get, # silence WEBrick logging
743
+ :StartCallback => Proc.new {
744
+ queue.push("started")
745
+ }
746
+ @port = @server.config[:Port]
747
+ @server.mount_proc '/' do |req, res|
748
+ res.body = '''
749
+ {
750
+ "name": "ce7ccfb438e8",
751
+ "cluster_name": "docker-cluster",
752
+ "cluster_uuid": "DyR1hN03QvuCWXRy3jtb0g",
753
+ "version": {
754
+ "number": "7.13.1",
755
+ "build_flavor": "default",
756
+ "build_type": "docker",
757
+ "build_hash": "9a7758028e4ea59bcab41c12004603c5a7dd84a9",
758
+ "build_date": "2021-05-28T17:40:59.346932922Z",
759
+ "build_snapshot": false,
760
+ "lucene_version": "8.8.2",
761
+ "minimum_wire_compatibility_version": "6.8.0",
762
+ "minimum_index_compatibility_version": "6.0.0-beta1"
763
+ },
764
+ "tagline": "You Know, for Search"
765
+ }
766
+ '''
767
+ res.status = 200
768
+ res['Content-Type'] = 'application/json'
769
+ @first_request = req
770
+ @first_req_waiter.countDown()
771
+ end
772
+
773
+ @server.mount_proc '/logstash_unit_test/_search' do |req, res|
774
+ res.body = '''
775
+ {
776
+ "took" : 1,
777
+ "timed_out" : false,
778
+ "_shards" : {
779
+ "total" : 1,
780
+ "successful" : 1,
781
+ "skipped" : 0,
782
+ "failed" : 0
783
+ },
784
+ "hits" : {
785
+ "total" : {
786
+ "value" : 10000,
787
+ "relation" : "gte"
788
+ },
789
+ "max_score" : 1.0,
790
+ "hits" : [
791
+ {
792
+ "_index" : "test_bulk_index_2",
793
+ "_type" : "_doc",
794
+ "_id" : "sHe6A3wBesqF7ydicQvG",
795
+ "_score" : 1.0,
796
+ "_source" : {
797
+ "@timestamp" : "2021-09-20T15:02:02.557Z",
798
+ "message" : "{\"name\": \"Andrea\"}",
799
+ "@version" : "1",
800
+ "host" : "kalispera",
801
+ "sequence" : 5
802
+ }
803
+ }
804
+ ]
805
+ }
806
+ }
807
+ '''
808
+ res.status = 200
809
+ res['Content-Type'] = 'application/json'
810
+ @first_request = req
811
+ @first_req_waiter.countDown()
812
+ end
813
+
814
+
815
+
816
+ @server.start
817
+ rescue => e
818
+ puts "Error in webserver thread #{e}"
819
+ # ignore
820
+ end
821
+ end
822
+ )
823
+ @t.daemon = true
824
+ @t.start
825
+ queue.pop # blocks until the server is up
826
+ end
827
+
828
+ def stop
829
+ @server.shutdown
830
+ end
831
+
832
+ def wait_receive_request
833
+ @first_req_waiter.await(2, java.util.concurrent.TimeUnit::SECONDS)
834
+ @first_request
835
+ end
836
+ end
837
+
838
+ describe "'user-agent' header" do
839
+ let!(:webserver) { StoppableServer.new } # webserver must be started before the call, so no lazy "let"
840
+
841
+ after :each do
842
+ webserver.stop
843
+ end
844
+
845
+ it "server should be started" do
846
+ require 'net/http'
847
+ response = nil
848
+ Net::HTTP.start('localhost', webserver.port) {|http|
849
+ response = http.request_get('/')
850
+ }
851
+ expect(response.code.to_i).to eq(200)
852
+ end
853
+
854
+ context "used by plugin" do
855
+ let(:config) do
856
+ {
857
+ "hosts" => ["localhost:#{webserver.port}"],
858
+ "query" => '{ "query": { "match": { "statuscode": 200 } }, "sort": [ "_doc" ] }',
859
+ "index" => "logstash_unit_test"
860
+ }
861
+ end
862
+ let(:plugin) { described_class.new(config) }
863
+ let(:event) { LogStash::Event.new({}) }
864
+
865
+ it "client should sent the expect user-agent" do
866
+ plugin.register
867
+
868
+ queue = []
869
+ plugin.run(queue)
870
+
871
+ request = webserver.wait_receive_request
872
+
873
+ expect(request.header['user-agent'].size).to eq(1)
874
+ expect(request.header['user-agent'][0]).to match(/logstash\/\d*\.\d*\.\d* \(OS=.*; JVM=.*\) logstash-input-elasticsearch\/\d*\.\d*\.\d*/)
875
+ end
876
+ end
877
+ end
878
+
879
+ shared_examples 'configurable timeout' do |config_name, manticore_transport_option|
694
880
  let(:config_value) { fail NotImplementedError }
695
881
  let(:config) { super().merge(config_name => config_value) }
696
882
  {
@@ -721,6 +907,9 @@ describe LogStash::Inputs::Elasticsearch, :ecs_compatibility_support do
721
907
  transport_options = new_elasticsearch_client_params[:transport_options]
722
908
  expect(transport_options).to include(manticore_transport_option)
723
909
  expect(transport_options[manticore_transport_option]).to eq(config_value.to_i)
910
+ mock_client = double("fake_client")
911
+ allow(mock_client).to receive(:ping)
912
+ mock_client
724
913
  end
725
914
 
726
915
  plugin.register
@@ -6,13 +6,19 @@ require_relative "../../../spec/es_helper"
6
6
 
7
7
  describe LogStash::Inputs::Elasticsearch do
8
8
 
9
- let(:config) { { 'hosts' => [ESHelper.get_host_port],
9
+ SECURE_INTEGRATION = ENV['SECURE_INTEGRATION'].eql? 'true'
10
+
11
+ let(:config) { { 'hosts' => ["http#{SECURE_INTEGRATION ? 's' : nil}://#{ESHelper.get_host_port}"],
10
12
  'index' => 'logs',
11
13
  'query' => '{ "query": { "match": { "message": "Not found"} }}' } }
12
14
  let(:plugin) { described_class.new(config) }
13
15
  let(:event) { LogStash::Event.new({}) }
14
16
  let(:client_options) { Hash.new }
15
17
 
18
+ let(:user) { ENV['ELASTIC_USER'] || 'simpleuser' }
19
+ let(:password) { ENV['ELASTIC_PASSWORD'] || 'abc123' }
20
+ let(:ca_file) { "spec/fixtures/test_certs/ca.crt" }
21
+
16
22
  before(:each) do
17
23
  @es = ESHelper.get_client(client_options)
18
24
  # Delete all templates first.
@@ -24,7 +30,6 @@ describe LogStash::Inputs::Elasticsearch do
24
30
  ESHelper.index_doc(@es, :index => 'logs', :body => { :response => 404, :message=> 'Not Found'})
25
31
  end
26
32
  @es.indices.refresh
27
- plugin.register
28
33
  end
29
34
 
30
35
  after(:each) do
@@ -33,6 +38,10 @@ describe LogStash::Inputs::Elasticsearch do
33
38
  end
34
39
 
35
40
  shared_examples 'an elasticsearch index plugin' do
41
+ before(:each) do
42
+ plugin.register
43
+ end
44
+
36
45
  it 'should retrieve json event from elasticsearch' do
37
46
  queue = []
38
47
  plugin.run(queue)
@@ -42,14 +51,15 @@ describe LogStash::Inputs::Elasticsearch do
42
51
  end
43
52
  end
44
53
 
45
- describe 'against an unsecured elasticsearch', :integration => true do
54
+ describe 'against an unsecured elasticsearch', integration: true do
55
+ before(:each) do
56
+ plugin.register
57
+ end
58
+
46
59
  it_behaves_like 'an elasticsearch index plugin'
47
60
  end
48
61
 
49
- describe 'against a secured elasticsearch', :secure_integration => true do
50
- let(:user) { ENV['ELASTIC_USER'] || 'simpleuser' }
51
- let(:password) { ENV['ELASTIC_PASSWORD'] || 'abc123' }
52
- let(:ca_file) { "spec/fixtures/test_certs/ca.crt" }
62
+ describe 'against a secured elasticsearch', secure_integration: true do
53
63
 
54
64
  let(:client_options) { { :ca_file => ca_file, :user => user, :password => password } }
55
65
 
@@ -66,10 +76,33 @@ describe LogStash::Inputs::Elasticsearch do
66
76
  let(:queue) { [] }
67
77
 
68
78
  it "fails to run the plugin" do
69
- plugin.register
70
- expect { plugin.run queue }.to raise_error Elasticsearch::Transport::Transport::Errors::Unauthorized
79
+ expect { plugin.register }.to raise_error Elasticsearch::Transport::Transport::Errors::Unauthorized
71
80
  end
72
81
  end
73
82
 
74
83
  end
84
+
85
+ context 'setting host:port', integration: true do
86
+
87
+ let(:config) do
88
+ super().merge "hosts" => [ESHelper.get_host_port]
89
+ end
90
+
91
+ it_behaves_like 'an elasticsearch index plugin'
92
+
93
+ end
94
+
95
+ context 'setting host:port (and ssl)', secure_integration: true do
96
+
97
+ let(:client_options) { { :ca_file => ca_file, :user => user, :password => password } }
98
+
99
+ let(:config) do
100
+ config = super().merge "hosts" => [ESHelper.get_host_port]
101
+ config.merge('user' => user, 'password' => password, 'ssl' => true, 'ca_file' => ca_file)
102
+ end
103
+
104
+ it_behaves_like 'an elasticsearch index plugin'
105
+
106
+ end
107
+
75
108
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-input-elasticsearch
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.10.0
4
+ version: 4.12.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-08-23 00:00:00.000000000 Z
11
+ date: 2022-02-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -20,8 +20,8 @@ dependencies:
20
20
  - !ruby/object:Gem::Version
21
21
  version: '2.99'
22
22
  name: logstash-core-plugin-api
23
- type: :runtime
24
23
  prerelease: false
24
+ type: :runtime
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - ">="
@@ -37,8 +37,8 @@ dependencies:
37
37
  - !ruby/object:Gem::Version
38
38
  version: '1.3'
39
39
  name: logstash-mixin-ecs_compatibility_support
40
- type: :runtime
41
40
  prerelease: false
41
+ type: :runtime
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
@@ -51,8 +51,8 @@ dependencies:
51
51
  - !ruby/object:Gem::Version
52
52
  version: '1.0'
53
53
  name: logstash-mixin-event_support
54
- type: :runtime
55
54
  prerelease: false
55
+ type: :runtime
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
@@ -65,8 +65,8 @@ dependencies:
65
65
  - !ruby/object:Gem::Version
66
66
  version: '1.0'
67
67
  name: logstash-mixin-validator_support
68
- type: :runtime
69
68
  prerelease: false
69
+ type: :runtime
70
70
  version_requirements: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - "~>"
@@ -77,15 +77,15 @@ dependencies:
77
77
  requirements:
78
78
  - - ">="
79
79
  - !ruby/object:Gem::Version
80
- version: 5.0.5
80
+ version: 7.14.0
81
81
  name: elasticsearch
82
- type: :runtime
83
82
  prerelease: false
83
+ type: :runtime
84
84
  version_requirements: !ruby/object:Gem::Requirement
85
85
  requirements:
86
86
  - - ">="
87
87
  - !ruby/object:Gem::Version
88
- version: 5.0.5
88
+ version: 7.14.0
89
89
  - !ruby/object:Gem::Dependency
90
90
  requirement: !ruby/object:Gem::Requirement
91
91
  requirements:
@@ -93,8 +93,8 @@ dependencies:
93
93
  - !ruby/object:Gem::Version
94
94
  version: '0'
95
95
  name: tzinfo
96
- type: :runtime
97
96
  prerelease: false
97
+ type: :runtime
98
98
  version_requirements: !ruby/object:Gem::Requirement
99
99
  requirements:
100
100
  - - ">="
@@ -107,8 +107,8 @@ dependencies:
107
107
  - !ruby/object:Gem::Version
108
108
  version: '0'
109
109
  name: tzinfo-data
110
- type: :runtime
111
110
  prerelease: false
111
+ type: :runtime
112
112
  version_requirements: !ruby/object:Gem::Requirement
113
113
  requirements:
114
114
  - - ">="
@@ -121,8 +121,8 @@ dependencies:
121
121
  - !ruby/object:Gem::Version
122
122
  version: '0'
123
123
  name: rufus-scheduler
124
- type: :runtime
125
124
  prerelease: false
125
+ type: :runtime
126
126
  version_requirements: !ruby/object:Gem::Requirement
127
127
  requirements:
128
128
  - - ">="
@@ -135,8 +135,8 @@ dependencies:
135
135
  - !ruby/object:Gem::Version
136
136
  version: 0.7.1
137
137
  name: manticore
138
- type: :runtime
139
138
  prerelease: false
139
+ type: :runtime
140
140
  version_requirements: !ruby/object:Gem::Requirement
141
141
  requirements:
142
142
  - - ">="
@@ -149,8 +149,8 @@ dependencies:
149
149
  - !ruby/object:Gem::Version
150
150
  version: '0'
151
151
  name: logstash-codec-plain
152
- type: :development
153
152
  prerelease: false
153
+ type: :development
154
154
  version_requirements: !ruby/object:Gem::Requirement
155
155
  requirements:
156
156
  - - ">="
@@ -161,15 +161,15 @@ dependencies:
161
161
  requirements:
162
162
  - - "~>"
163
163
  - !ruby/object:Gem::Version
164
- version: 0.15.4
164
+ version: '1'
165
165
  name: faraday
166
- type: :development
167
166
  prerelease: false
167
+ type: :development
168
168
  version_requirements: !ruby/object:Gem::Requirement
169
169
  requirements:
170
170
  - - "~>"
171
171
  - !ruby/object:Gem::Version
172
- version: 0.15.4
172
+ version: '1'
173
173
  - !ruby/object:Gem::Dependency
174
174
  requirement: !ruby/object:Gem::Requirement
175
175
  requirements:
@@ -177,8 +177,8 @@ dependencies:
177
177
  - !ruby/object:Gem::Version
178
178
  version: '0'
179
179
  name: logstash-devutils
180
- type: :development
181
180
  prerelease: false
181
+ type: :development
182
182
  version_requirements: !ruby/object:Gem::Requirement
183
183
  requirements:
184
184
  - - ">="
@@ -191,8 +191,36 @@ dependencies:
191
191
  - !ruby/object:Gem::Version
192
192
  version: '0'
193
193
  name: timecop
194
+ prerelease: false
195
+ type: :development
196
+ version_requirements: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ version: '0'
201
+ - !ruby/object:Gem::Dependency
202
+ requirement: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - "~>"
205
+ - !ruby/object:Gem::Version
206
+ version: '0.6'
207
+ name: cabin
208
+ prerelease: false
194
209
  type: :development
210
+ version_requirements: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - "~>"
213
+ - !ruby/object:Gem::Version
214
+ version: '0.6'
215
+ - !ruby/object:Gem::Dependency
216
+ requirement: !ruby/object:Gem::Requirement
217
+ requirements:
218
+ - - ">="
219
+ - !ruby/object:Gem::Version
220
+ version: '0'
221
+ name: webrick
195
222
  prerelease: false
223
+ type: :development
196
224
  version_requirements: !ruby/object:Gem::Requirement
197
225
  requirements:
198
226
  - - ">="
@@ -220,8 +248,6 @@ files:
220
248
  - spec/es_helper.rb
221
249
  - spec/fixtures/test_certs/ca.crt
222
250
  - spec/fixtures/test_certs/ca.key
223
- - spec/fixtures/test_certs/client/ls.crt
224
- - spec/fixtures/test_certs/client/ls.key
225
251
  - spec/fixtures/test_certs/es.crt
226
252
  - spec/fixtures/test_certs/es.key
227
253
  - spec/inputs/elasticsearch_spec.rb
@@ -247,7 +273,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
247
273
  - !ruby/object:Gem::Version
248
274
  version: '0'
249
275
  requirements: []
250
- rubygems_version: 3.0.6
276
+ rubygems_version: 3.1.6
251
277
  signing_key:
252
278
  specification_version: 4
253
279
  summary: Reads query results from an Elasticsearch cluster
@@ -255,8 +281,6 @@ test_files:
255
281
  - spec/es_helper.rb
256
282
  - spec/fixtures/test_certs/ca.crt
257
283
  - spec/fixtures/test_certs/ca.key
258
- - spec/fixtures/test_certs/client/ls.crt
259
- - spec/fixtures/test_certs/client/ls.key
260
284
  - spec/fixtures/test_certs/es.crt
261
285
  - spec/fixtures/test_certs/es.key
262
286
  - spec/inputs/elasticsearch_spec.rb
@@ -1,20 +0,0 @@
1
- -----BEGIN CERTIFICATE-----
2
- MIIDMTCCAhmgAwIBAgIUCJ5+zdYJIlL04EOwC0tqVbZYKQUwDQYJKoZIhvcNAQEL
3
- BQAwNDEyMDAGA1UEAxMpRWxhc3RpYyBDZXJ0aWZpY2F0ZSBUb29sIEF1dG9nZW5l
4
- cmF0ZWQgQ0EwHhcNMjEwODEyMDUxNTI3WhcNMjQwODExMDUxNTI3WjANMQswCQYD
5
- VQQDEwJsczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMFY71j9Proa
6
- x95bWoBQOcc0ncqVvQO+Tk/Do4ynoe64pOJEf3txh1viHbnzFUGf+NF5WW6trlZ2
7
- ErP81vy7Ds5J5ngXjjdzOOGsTs9+l7KkqPfUwXqGoldWFtr//9mkLvWpd8uPvVtO
8
- dRnpcjQSlHHEB/HaqxkyBAvHLv1Fi1jTgIgn32NEM2mlCJ3M8OVfO9pqlO/6gjjs
9
- Miow8zZqtczeuv0JPu7V5xPDrcX0xh0kZdpH4gSh9r314TwZXFCofNUbkZrPV+Q9
10
- XJs64NlBjJZkd5qwKeXujZRV4eVvAOTlp+4Nh4eDqXE323s5yiPuov0StvNrbh3d
11
- rcg+IM+RTdMCAwEAAaNiMGAwHQYDVR0OBBYEFGnXHJEJ+LGmQTqDNr50C8FE8pcF
12
- MB8GA1UdIwQYMBaAFMgkye5+2l+TE0I6RsXRHjGBwpBGMBMGA1UdEQQMMAqCCGxv
13
- Z3N0YXNoMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAI08C6IeweN3LrEq
14
- ZauDVoiE2IdA1/nN3sxl+wL2xfauv1nctxej9TYR3mNoWiacgbbfJkPMCSIYk2Vc
15
- G396yLiGC1V96FfonnKfr3tKd0BiijTu3u5pOTgNNf5n4TZaTHTYmuKPtWoXyuLR
16
- QbH3jdgq9aq/9bwK0E5FOmuv6LGatnKzLf56aHjzerSZCnRw7V/1J/Yj3cy6TB1l
17
- 9Lc7IAk4dGyrgwfKCuZOSzAtCWpOA/FfqCqMSuW6lrZ1zAXnk6VI3RkmBCuLE6kj
18
- aAjwORJHyiwBsMQbaYcQaXXjhguS+iHrnWdR0DFs9gHJSTuf6EoOeygdtMDutb2O
19
- 4xfHWG8=
20
- -----END CERTIFICATE-----
@@ -1,27 +0,0 @@
1
- -----BEGIN RSA PRIVATE KEY-----
2
- MIIEpAIBAAKCAQEAwVjvWP0+uhrH3ltagFA5xzSdypW9A75OT8OjjKeh7rik4kR/
3
- e3GHW+IdufMVQZ/40XlZbq2uVnYSs/zW/LsOzknmeBeON3M44axOz36XsqSo99TB
4
- eoaiV1YW2v//2aQu9al3y4+9W051GelyNBKUccQH8dqrGTIEC8cu/UWLWNOAiCff
5
- Y0QzaaUInczw5V872mqU7/qCOOwyKjDzNmq1zN66/Qk+7tXnE8OtxfTGHSRl2kfi
6
- BKH2vfXhPBlcUKh81RuRms9X5D1cmzrg2UGMlmR3mrAp5e6NlFXh5W8A5OWn7g2H
7
- h4OpcTfbeznKI+6i/RK282tuHd2tyD4gz5FN0wIDAQABAoIBAGLHVvC14PgfeoEl
8
- VuU7F2moffzj5z8kWMnzf3j6o4ZcmxBmQmMEq0zMBrfbcr6mRe5u+rvKy8isZf3C
9
- bOuNfZDyvGYaUrQNj7/r0g+78zB3Y0PKVFaOth28g8y7ATFl6f/j5qn+85TUTotA
10
- cvIbk+9TYWO0fblPjjWeO2l1wC1ObV0pFrXVzthFTQk0oxl3Gyq54P5rPp7QPOdM
11
- jB0lSAhvkEEA7nIZ0dF1zm3RuByahSQC45kYEp5TCC8SDwO3WCJ32Q/dhPw0y9Go
12
- gbIEY9QBFc8Rn3HDYGTSRPVVDM3HctDqzCihWOgFQlv718yCAZYq43fdOcy+6BY/
13
- UT3xRhECgYEA5wWcYD8bY5x0fk2ubxKJTE4Fm2HvUrexvLX00yF3sX9XqrsiBBC4
14
- 14mB2yFEKQL+M/ZqLNV9IfJhfRmBffoRvf9lAuHhUrw4wGijERoO9xkmS3lGvzw+
15
- hqLIMnd986wyWC8FdU+dStDg8PC97xK4bg0tKYo9jmKf3kb0Ov2UWQ0CgYEA1kCK
16
- w30P3ZgYakXUjbwv3KoRXIVm6cIqgvm8iPh7B0GeTUCIgGBSNzJ8LVts/m6V7xtU
17
- RJ8RKw2gqqUTiFqrRKefr0APFv0YeVgZ7zK2EGLrL2rFWNZZQqA97Mh/5CwFh+zs
18
- 1/IYuqRUVDaLq0sAPcZA5KEoO91eChBVK/RAyl8CgYAqgVPGOZY2e6DLZEuF0ClG
19
- yswpTJmV5IplKC1Fc1DsbXuZxBh8Gv+HWJt1z+cUjKJsuRfL6/O7/TaGp9y1av88
20
- r/LL1vd4G31tmVL3YI4EVLJBDK1Bnjn615RyBJ496R7SLsSYUu+jxk68xe6MQCuC
21
- xBXdILw2qFq1sORavjE/OQKBgQCJlwNGDX9t2Cn9vYCF0Q+Pjyv9FbKEdevlFsor
22
- 0B76BvrJM6M1hiXmSqaSXj89mfjxh8RzGQ/mbSb7z20eyNNqEJes7N+D7N+Vta1Z
23
- /mALX+sXFWNM7MJ/1fZOpGf1OQwIQW/MMi4NVlDNkAXb6BtskG/GI3R6FWw53ElG
24
- I+Kj0wKBgQDUCfiYYSA9wYug53uvE0LirZwMQjWTbqxMO/S3H0Be8rf+BLo+YY5X
25
- fF6L/NaKxNZzs2Uu6+xYLXhSMimiv8412t7qnjK5DLwTZfnj7EuNxd44cZ4cXDPx
26
- JtD9GgPJ5V3js1gA2usPnKLYPw5Pp3ayZn1q4Tg9A5cextKnyOV/Fg==
27
- -----END RSA PRIVATE KEY-----