logstash-output-elasticsearch 11.3.3-java → 11.5.0-java

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 (29) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -0
  3. data/Gemfile +2 -1
  4. data/docs/index.asciidoc +21 -3
  5. data/lib/logstash/outputs/elasticsearch/http_client.rb +2 -2
  6. data/lib/logstash/outputs/elasticsearch/http_client_builder.rb +8 -6
  7. data/lib/logstash/outputs/elasticsearch/templates/ecs-v1/elasticsearch-7x.json +2196 -288
  8. data/lib/logstash/outputs/elasticsearch/templates/ecs-v1/elasticsearch-8x.json +2196 -288
  9. data/lib/logstash/outputs/elasticsearch/templates/ecs-v8/elasticsearch-7x.json +1 -1
  10. data/lib/logstash/outputs/elasticsearch/templates/ecs-v8/elasticsearch-8x.json +1 -1
  11. data/lib/logstash/plugin_mixins/elasticsearch/api_configs.rb +2 -0
  12. data/logstash-output-elasticsearch.gemspec +2 -3
  13. data/spec/es_spec_helper.rb +5 -1
  14. data/spec/fixtures/test_certs/{ca/ca.crt → ca.crt} +0 -0
  15. data/spec/fixtures/test_certs/{ca/ca.key → ca.key} +0 -0
  16. data/spec/fixtures/test_certs/test.p12 +0 -0
  17. data/spec/fixtures/test_certs/test_invalid.crt +36 -0
  18. data/spec/fixtures/test_certs/test_invalid.key +51 -0
  19. data/spec/fixtures/test_certs/test_invalid.p12 +0 -0
  20. data/spec/fixtures/test_certs/test_self_signed.crt +32 -0
  21. data/spec/fixtures/test_certs/test_self_signed.key +54 -0
  22. data/spec/fixtures/test_certs/test_self_signed.p12 +0 -0
  23. data/spec/integration/outputs/ilm_spec.rb +2 -1
  24. data/spec/integration/outputs/index_spec.rb +143 -48
  25. data/spec/integration/outputs/ingest_pipeline_spec.rb +2 -1
  26. data/spec/integration/outputs/no_es_on_startup_spec.rb +12 -6
  27. data/spec/integration/outputs/retry_spec.rb +2 -1
  28. data/spec/unit/outputs/elasticsearch_ssl_spec.rb +1 -1
  29. metadata +22 -8
@@ -4,7 +4,7 @@
4
4
  ],
5
5
  "mappings": {
6
6
  "_meta": {
7
- "version": "8.0.0-dev"
7
+ "version": "8.0.1"
8
8
  },
9
9
  "date_detection": false,
10
10
  "dynamic_templates": [
@@ -15,7 +15,7 @@
15
15
  },
16
16
  "mappings": {
17
17
  "_meta": {
18
- "version": "8.0.0-dev"
18
+ "version": "8.0.1"
19
19
  },
20
20
  "date_detection": false,
21
21
  "dynamic_templates": [
@@ -66,6 +66,8 @@ module LogStash; module PluginMixins; module ElasticSearch
66
66
  # Set the keystore password
67
67
  :keystore_password => { :validate => :password },
68
68
 
69
+ :ssl_supported_protocols => { :validate => ['TLSv1.1', 'TLSv1.2', 'TLSv1.3'], :default => [], :list => true },
70
+
69
71
  # This setting asks Elasticsearch for the list of all cluster nodes and adds them to the hosts list.
70
72
  # Note: This will return ALL nodes with HTTP enabled (including master nodes!). If you use
71
73
  # this with master nodes, you probably want to disable HTTP on them by setting
@@ -1,7 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-output-elasticsearch'
3
- s.version = '11.3.3'
4
-
3
+ s.version = '11.5.0'
5
4
  s.licenses = ['apache-2.0']
6
5
  s.summary = "Stores logs in Elasticsearch"
7
6
  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"
@@ -21,7 +20,7 @@ Gem::Specification.new do |s|
21
20
  # Special flag to let us know this is actually a logstash plugin
22
21
  s.metadata = { "logstash_plugin" => "true", "logstash_group" => "output" }
23
22
 
24
- s.add_runtime_dependency "manticore", '>= 0.7.1', '< 1.0.0'
23
+ s.add_runtime_dependency "manticore", '>= 0.8.0', '< 1.0.0'
25
24
  s.add_runtime_dependency 'stud', ['>= 0.0.17', '~> 0.0']
26
25
  s.add_runtime_dependency "logstash-core-plugin-api", ">= 1.60", "<= 2.99"
27
26
  s.add_runtime_dependency 'logstash-mixin-ecs_compatibility_support', '~>1.0'
@@ -59,7 +59,11 @@ module ESHelper
59
59
  end
60
60
 
61
61
  def self.es_version
62
- RSpec.configuration.filter[:es_version] || ENV['ES_VERSION'] || ENV['ELASTIC_STACK_VERSION']
62
+ [
63
+ nilify(RSpec.configuration.filter[:es_version]),
64
+ nilify(ENV['ES_VERSION']),
65
+ nilify(ENV['ELASTIC_STACK_VERSION']),
66
+ ].compact.first
63
67
  end
64
68
 
65
69
  RSpec::Matchers.define :have_hits do |expected|
File without changes
File without changes
Binary file
@@ -0,0 +1,36 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIGVzCCBD+gAwIBAgIBAzANBgkqhkiG9w0BAQsFADBMMQswCQYDVQQGEwJQVDEL
3
+ MAkGA1UECAwCTkExDzANBgNVBAcMBkxpc2JvbjEOMAwGA1UECgwFTXlMYWIxDzAN
4
+ BgNVBAMMBlJvb3RDQTAeFw0yMjAxMTgwNTA0MDZaFw0yNTAxMTgwNTA0MDZaMFIx
5
+ CzAJBgNVBAYTAkxTMQswCQYDVQQIDAJOQTESMBAGA1UEBwwJRVMgT3V0cHV0MREw
6
+ DwYDVQQKDAhMb2dzdGFzaDEPMA0GA1UEAwwGc2VydmVyMIICIjANBgkqhkiG9w0B
7
+ AQEFAAOCAg8AMIICCgKCAgEAunKYkXLoAC14bdIveIZlImtrp2rkQ5Ugz/vGVWFJ
8
+ YatJh9x5dmqJQeO1gpGayNedbwDI/50CTDoqwCz4aunMKpgQdKHryjeuR1zqElhC
9
+ QLZtAkzM/pCkTnMYvXDfJrBZcSWP+ddlkH8ffmN0Fxf3LsKln+K5A4hASrVGSKYw
10
+ +eNDV7yIxdhthqD0xNRuw/j3lSLxwBbwKOs7Mh+xmdMa4vs3AKJvG9LdTm7xdHtD
11
+ 4rkQAA7TRQOR5pl+eDICRnNkGVzgPMdf2kM94ZU7TI1zUMqV1uPNE05Vps14kuWq
12
+ Z84r8ecExCo6mQxrQ1M7Y2UBGa5NM9kb+UP1famANadEOlS5kAGEtcpHnh1WK+98
13
+ 4mxtMQJHIOOASde/coA3mZ4Oa8Z0Hzy3fsNvD9ieLo2V8yQN9UAQshbB1BEuOaRr
14
+ 9wQKT4jlnCinZ4UU6FpEJ7NIiZ9wBKqNbN8iySPYmRihOj6BDuEQB/W/K54KQB5n
15
+ ctT6MsoTyTFgqe3Zn0owMrGCsSDJsvUcaAz7ZsnesoiFtKsYyRZAWJVcLO5R0FxZ
16
+ YjCGk9stspLT1cqmJ8VbMLhiW7T4ZP+sZj3B+aSZWnS5r78I4G9sB9swDMJMjNRP
17
+ O15zvQKIRluULhm9WhPET78Iy9Qg1zoiGdnzxBSZ9Sh8+yb57cCRD4da7eLne4Sb
18
+ uU8CAwEAAaOCATwwggE4MAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgZAMDMG
19
+ CWCGSAGG+EIBDQQmFiRPcGVuU1NMIEdlbmVyYXRlZCBTZXJ2ZXIgQ2VydGlmaWNh
20
+ dGUwHQYDVR0OBBYEFPqrHNv/8Io82JmzcNWBdaRmftvdMIGIBgNVHSMEgYAwfoAU
21
+ oVp0nHjq6mJ/UGuFhnSK7yjbPyuhUKROMEwxCzAJBgNVBAYTAlBUMQswCQYDVQQI
22
+ DAJOQTEPMA0GA1UEBwwGTGlzYm9uMQ4wDAYDVQQKDAVNeUxhYjEPMA0GA1UEAwwG
23
+ Um9vdENBghRT5Ucn3UmwssDUYlgL5RyE1/DeETAOBgNVHQ8BAf8EBAMCBaAwEwYD
24
+ VR0lBAwwCgYIKwYBBQUHAwEwFAYDVR0RBA0wC4IJbG9jYWxob3N0MA0GCSqGSIb3
25
+ DQEBCwUAA4ICAQDHt/3rR3rzESrZNNLIU+jbW6Vsfcr22mghhbdoU+pnkZB8Spzp
26
+ AUqgmSlOOuz/3OMLPP64sj+gm9kiU177uBoqJUsnaAaV0LNvp+EIWIdskw0OGU2X
27
+ uOslZK5EdYGqGgRlElnohPRXcFXwsh//QJYDmNnnC3Fk+ZjZQKjH4q4Ur8ECPqit
28
+ wVnRXqlKfLRjWWzvTgoPTAN42KHP2R7xxIHdV+cXH6riLLvtkWcGJbfoQaSuNOvc
29
+ GAIoQc2YmIiVsGZ82n9Ww2zO9ByqF+KfGgIFDTCp1CzpfLKLLhzMv/p4n2zf/BOb
30
+ MCJJfljOewqmzMo48Wj2vk/46IAGl5uA6PnDwa0LNgomA9c6loDcYEOsCr69xL+D
31
+ 7GL/Jzm9HaTE97lRGVwoKBG0hKabFEfOueKB6Oab8bVTuY99kbbRaFZs7I9QYVQy
32
+ eY38YJv5kN3yAjFclO39R8cAngqecbQDZ7xTl7dF7CvrpAoNI8olL01Kjy/+vfX4
33
+ WAMO9YONnVPwwB05voRZfKErVKi9iwAWa5m9DdtE5QdfjcsXZkITW2CF2skSgujw
34
+ BS8P8Z+HccKa+qEPQM+eBWjrlzlx/XC2iXKE1w4zZL0wRgY7+W4dIMgJmPmV/Gue
35
+ 5wSnZtMueBdyKy+xFrJcszoakKg/JfSesKfnVLC+60EL2FQqbrGCEiTp2A==
36
+ -----END CERTIFICATE-----
@@ -0,0 +1,51 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ 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
51
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,32 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIFdzCCA1+gAwIBAgIUNtmhsOlqXXLvFvsvImAvs9ZrnFkwDQYJKoZIhvcNAQEL
3
+ BQAwSzELMAkGA1UEBhMCTFMxCzAJBgNVBAgMAk5BMQswCQYDVQQHDAJFUzERMA8G
4
+ A1UECgwITG9nc3Rhc2gxDzANBgNVBAMMBmNsaWVudDAeFw0yMjAxMTgxMzIwMDNa
5
+ Fw0yNTAxMTgxMzIwMDNaMEsxCzAJBgNVBAYTAkxTMQswCQYDVQQIDAJOQTELMAkG
6
+ A1UEBwwCRVMxETAPBgNVBAoMCExvZ3N0YXNoMQ8wDQYDVQQDDAZjbGllbnQwggIi
7
+ MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDT+NYvZzi7y2RHvklPQ7BYV478
8
+ A+nN/ncakJ0JjmdekwDhUjb8VO/YxN68FyLargI89hsa9Aw20GRZrtibUYfl2qZy
9
+ CW5Gydl/t2evCbO2mIcObImsagp/wNbPfopX8efU1aK3KPSlES0qDX6oB2hl9Afx
10
+ oeJY+NBlg1xhVWC8/WAKxG/me9XPYhsOSVYR8UiA2RkPnhSND6dqqR+KGUdhxcZH
11
+ rB2Y/fHyy2uAgErWguNSvVRudy7yZn5eAIhV2cI+710SOGPIXPbMPzdJBiNFNhaK
12
+ QSCze+lC7xJg2lYhR+2H3DofhftemPMLPtFauVUe1xm5rP/hrVSbZuNN8DEffpAO
13
+ whhgsDDmkAh8oY+OTSWCdjKHrir+Dbqo/OfmMK5tkC12LP2e45nvGKLrJGsHtBeP
14
+ +l3edtYLy0lvKVXvF/3krujTQYrA04Gqb9JKsvUSFarlhiY3dmJ1+na3kCNRu5Ei
15
+ oFlvr8uWJLeEFTll6ahTGkCnWZ5bHP1NNYD4JRwTNtujArtWxEEomoiyjgw3RfHE
16
+ pGlSaljnCvP9OX72zfrpfbQJx937CEt22jVTyKls4TPvkX+bKXHUVNG0xDlMcUK/
17
+ +DdTDLxD+j0gBJofSD/uWeWd8VhwSG7jY5PimUhQxwrHouyKbktF3useuElH/3wn
18
+ pDy0hPKbgZmATChOBQIDAQABo1MwUTAdBgNVHQ4EFgQUKj3kW3xSP4/7D9djf8DM
19
+ XdAG0e8wHwYDVR0jBBgwFoAUKj3kW3xSP4/7D9djf8DMXdAG0e8wDwYDVR0TAQH/
20
+ BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAbNsBp/QUTXNKblQUPsjK97BDHVLs
21
+ pdcHAabLd5Cwveb+0RyqUoMGz+XmtOiCS4bX5uLnNbjiFQK1zMyen6RBmdfZ4+nv
22
+ /Uh5XMQx3oZCCrmXbTEsFjlSgQuQlTGlaJBZXKwN7KmBgqvsNEPRwteDPOLuQ4DP
23
+ 4zc/6euJDeHcrqTYEF4sYB5srkkL4A0Kw3ZaukopKMpdEaAzgqeQdQ5AqbKlfiiI
24
+ /XJxomGLQ7LWY9KWYeZZ3RhdN/mEREFYHZ+OkptPcKqjQimIq6JulHVQJar3A3ec
25
+ zaVsyT4UkDDn0nf8N/D9mjbCuO3Pd/8EHgqRzxMvglkCkDElrucrXjECK6SBpmgu
26
+ nCIvEIJxlHqLicBAQxdv6/N+UILZ37Wg1MyoIkzQA1j6lkw8kMLi0OIStZ6COOVA
27
+ 6x00SDH7GwkWEWJCGN7v8xOTd4ftN3Srhsai0wMyNtA39Wi3GiAWo8XwtfrtkWwk
28
+ 7zmWYZu/Q98WAKSv7V5UYkCCzI1R9L2ZRBYtl94kQyfCzwVAyw7+x+z2mFm9hKIo
29
+ g4Gc2UVOgMdYeghNwst7GUmCOJGo1hAr36UtZgDV4PnM1V41GAFNff+XArdZTpgu
30
+ dEEhFp2ITlM/+9c68EvFMUhoi8M0GBv7IPwOE70f4blkBvTnNLQqe0bRfwB4FUcI
31
+ 8X4SIgxrmMAlKIc=
32
+ -----END CERTIFICATE-----
@@ -0,0 +1,54 @@
1
+ -----BEGIN ENCRYPTED PRIVATE KEY-----
2
+ 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
53
+ q/eu/hnuc3qa580zbpgcAg==
54
+ -----END ENCRYPTED PRIVATE KEY-----
@@ -236,7 +236,8 @@ describe 'Elasticsearch has index lifecycle management enabled', :integration =>
236
236
  let (:settings) {
237
237
  {
238
238
  "ilm_enabled" => ilm_enabled,
239
- "hosts" => "#{get_host_port()}"
239
+ "hosts" => "#{get_host_port()}",
240
+ "ecs_compatibility" => "disabled", # specs are tightly tied to non-ECS defaults
240
241
  }
241
242
  }
242
243
  let (:small_max_doc_policy) { max_docs_policy(3) }
@@ -46,7 +46,8 @@ describe "TARGET_BULK_BYTES", :integration => true do
46
46
  end
47
47
 
48
48
  describe "indexing" do
49
- let(:event) { LogStash::Event.new("message" => "Hello World!", "type" => type) }
49
+ let(:message) { "Hello from #{__FILE__}" }
50
+ let(:event) { LogStash::Event.new("message" => message, "type" => type) }
50
51
  let(:index) { 10.times.collect { rand(10).to_s }.join("") }
51
52
  let(:type) { ESHelper.es_version_satisfies?("< 7") ? "doc" : "_doc" }
52
53
  let(:event_count) { 1 + rand(2) }
@@ -55,31 +56,66 @@ describe "indexing" do
55
56
  subject { LogStash::Outputs::ElasticSearch.new(config) }
56
57
 
57
58
  let(:es_url) { "http://#{get_host_port}" }
58
- let(:index_url) {"#{es_url}/#{index}"}
59
- let(:http_client_options) { {} }
60
- let(:http_client) do
61
- Manticore::Client.new(http_client_options)
59
+ let(:index_url) { "#{es_url}/#{index}" }
60
+
61
+ let(:curl_opts) { nil }
62
+
63
+ let(:es_admin) { 'admin' } # default user added in ES -> 8.x requires auth credentials for /_refresh etc
64
+ let(:es_admin_pass) { 'elastic' }
65
+
66
+ def curl_and_get_json_response(url, method: :get); require 'open3'
67
+ cmd = "curl -s -v --show-error #{curl_opts} -X #{method.to_s.upcase} -k #{url}"
68
+ begin
69
+ out, err, status = Open3.capture3(cmd)
70
+ rescue Errno::ENOENT
71
+ fail "curl not available, make sure curl binary is installed and available on $PATH"
72
+ end
73
+
74
+ if status.success?
75
+ http_status = err.match(/< HTTP\/1.1 (\d+)/)[1] || '0' # < HTTP/1.1 200 OK\r\n
76
+
77
+ if http_status.strip[0].to_i > 2
78
+ error = (LogStash::Json.load(out)['error']) rescue nil
79
+ if error
80
+ fail "#{cmd.inspect} received an error: #{http_status}\n\n#{error.inspect}"
81
+ else
82
+ warn out
83
+ fail "#{cmd.inspect} unexpected response: #{http_status}\n\n#{err}"
84
+ end
85
+ end
86
+
87
+ LogStash::Json.load(out)
88
+ else
89
+ warn out
90
+ fail "#{cmd.inspect} process failed: #{status}\n\n#{err}"
91
+ end
62
92
  end
63
93
 
94
+ let(:initial_events) { [] }
95
+
64
96
  before do
65
97
  subject.register
66
- subject.multi_receive([])
98
+ subject.multi_receive(initial_events) if initial_events
67
99
  end
68
-
100
+
101
+ after do
102
+ subject.do_close
103
+ end
104
+
69
105
  shared_examples "an indexer" do |secure|
70
106
  it "ships events" do
71
107
  subject.multi_receive(events)
72
108
 
73
- http_client.post("#{es_url}/_refresh").call
109
+ curl_and_get_json_response "#{es_url}/_refresh", method: :post
74
110
 
75
- response = http_client.get("#{index_url}/_count?q=*")
76
- result = LogStash::Json.load(response.body)
111
+ result = curl_and_get_json_response "#{index_url}/_count?q=*"
77
112
  cur_count = result["count"]
78
113
  expect(cur_count).to eq(event_count)
79
114
 
80
- response = http_client.get("#{index_url}/_search?q=*&size=1000")
81
- result = LogStash::Json.load(response.body)
115
+ result = curl_and_get_json_response "#{index_url}/_search?q=*&size=1000"
82
116
  result["hits"]["hits"].each do |doc|
117
+ expect(doc["_source"]["message"]).to eq(message)
118
+
83
119
  if ESHelper.es_version_satisfies?("< 8")
84
120
  expect(doc["_type"]).to eq(type)
85
121
  else
@@ -132,50 +168,109 @@ describe "indexing" do
132
168
  describe "a secured indexer", :secure_integration => true do
133
169
  let(:user) { "simpleuser" }
134
170
  let(:password) { "abc123" }
135
- let(:cacert) { "spec/fixtures/test_certs/test.crt" }
136
- let(:es_url) {"https://elasticsearch:9200"}
171
+ let(:cacert) { "spec/fixtures/test_certs/ca.crt" }
172
+ let(:es_url) { "https://#{get_host_port}" }
137
173
  let(:config) do
138
174
  {
139
- "hosts" => ["elasticsearch:9200"],
175
+ "hosts" => [ get_host_port ],
140
176
  "user" => user,
141
177
  "password" => password,
142
178
  "ssl" => true,
143
- "cacert" => "spec/fixtures/test_certs/test.crt",
179
+ "cacert" => cacert,
144
180
  "index" => index
145
181
  }
146
- end
147
- let(:http_client_options) do
148
- {
149
- :auth => {
150
- :user => user,
151
- :password => password
152
- },
153
- :ssl => {
154
- :enabled => true,
155
- :ca_file => cacert
156
- }
157
- }
158
- end
159
- it_behaves_like("an indexer", true)
160
-
161
- describe "with a password requiring escaping" do
162
- let(:user) { "f@ncyuser" }
163
- let(:password) { "ab%12#" }
164
-
165
- include_examples("an indexer", true)
166
- end
167
-
168
- describe "with a user/password requiring escaping in the URL" do
169
- let(:config) do
170
- {
171
- "hosts" => ["https://#{CGI.escape(user)}:#{CGI.escape(password)}@elasticsearch:9200"],
172
- "ssl" => true,
173
- "cacert" => "spec/fixtures/test_certs/test.crt",
174
- "index" => index
175
- }
182
+ end
183
+
184
+ let(:curl_opts) { "-u #{user}:#{password}" }
185
+
186
+ if ENV['ES_SSL_KEY_INVALID'] == 'true' # test_invalid.crt (configured in ES) has SAN: DNS:localhost
187
+ # javax.net.ssl.SSLPeerUnverifiedException: Host name 'elasticsearch' does not match the certificate subject ...
188
+
189
+ context "when no keystore nor ca cert set and verification is disabled" do
190
+ let(:config) do
191
+ super().tap { |config| config.delete('cacert') }.merge('ssl_certificate_verification' => false)
192
+ end
193
+
194
+ include_examples("an indexer", true)
176
195
  end
177
-
178
- include_examples("an indexer", true)
196
+
197
+ context "when keystore is set and verification is disabled" do
198
+ let(:config) do
199
+ super().merge(
200
+ 'ssl_certificate_verification' => false,
201
+ 'keystore' => 'spec/fixtures/test_certs/test.p12',
202
+ 'keystore_password' => '1234567890'
203
+ )
204
+ end
205
+
206
+ include_examples("an indexer", true)
207
+ end
208
+
209
+ context "when keystore has self-signed cert and verification is disabled" do
210
+ let(:config) do
211
+ super().tap { |config| config.delete('cacert') }.merge(
212
+ 'ssl_certificate_verification' => false,
213
+ 'keystore' => 'spec/fixtures/test_certs/test_self_signed.p12',
214
+ 'keystore_password' => '1234567890'
215
+ )
216
+ end
217
+
218
+ include_examples("an indexer", true)
219
+ end
220
+
221
+ else
222
+
223
+ let(:curl_opts) { "#{super()} --tlsv1.2 --tls-max 1.3 -u #{es_admin}:#{es_admin_pass}" } # due ES 8.x we need user/password
224
+
225
+ it_behaves_like("an indexer", true)
226
+
227
+ describe "with a password requiring escaping" do
228
+ let(:user) { "f@ncyuser" }
229
+ let(:password) { "ab%12#" }
230
+
231
+ include_examples("an indexer", true)
232
+ end
233
+
234
+ describe "with a user/password requiring escaping in the URL" do
235
+ let(:config) do
236
+ {
237
+ "hosts" => ["https://#{CGI.escape(user)}:#{CGI.escape(password)}@elasticsearch:9200"],
238
+ "ssl" => true,
239
+ "cacert" => "spec/fixtures/test_certs/test.crt",
240
+ "index" => index
241
+ }
242
+ end
243
+
244
+ include_examples("an indexer", true)
245
+ end
246
+
247
+ context 'with enforced TLSv1.3 protocol' do
248
+ let(:config) { super().merge 'ssl_supported_protocols' => [ 'TLSv1.3' ] }
249
+
250
+ it_behaves_like("an indexer", true)
251
+ end
252
+
253
+ context 'with enforced TLSv1.2 protocol (while ES only enabled TLSv1.3)' do
254
+ let(:config) { super().merge 'ssl_supported_protocols' => [ 'TLSv1.2' ] }
255
+
256
+ let(:initial_events) { nil }
257
+
258
+ it "does not ship events" do
259
+ curl_and_get_json_response index_url, method: :put # make sure index exists
260
+ Thread.start { subject.multi_receive(events) } # we'll be stuck in a retry loop
261
+ sleep 2.5
262
+
263
+ curl_and_get_json_response "#{es_url}/_refresh", method: :post
264
+
265
+ result = curl_and_get_json_response "#{index_url}/_count?q=*"
266
+ cur_count = result["count"]
267
+ expect(cur_count).to eq(0) # ES output keeps re-trying but ends up with a
268
+ # [Manticore::ClientProtocolException] Received fatal alert: protocol_version
269
+ end
270
+
271
+ end if ENV['ES_SSL_SUPPORTED_PROTOCOLS'] == 'TLSv1.3'
272
+
179
273
  end
274
+
180
275
  end
181
276
  end
@@ -6,7 +6,8 @@ describe "Ingest pipeline execution behavior", :integration => true do
6
6
  settings = {
7
7
  "hosts" => "#{get_host_port()}",
8
8
  "pipeline" => "apache-logs",
9
- "data_stream" => 'false'
9
+ "data_stream" => 'false',
10
+ "ecs_compatibility" => "disabled", # specs are tightly tied to non-ECS defaults
10
11
  }
11
12
  next LogStash::Outputs::ElasticSearch.new(settings)
12
13
  end
@@ -12,13 +12,13 @@ describe "elasticsearch is down on startup", :integration => true do
12
12
  "template_overwrite" => true,
13
13
  "hosts" => get_host_port(),
14
14
  "retry_max_interval" => 64,
15
- "retry_initial_interval" => 2
15
+ "retry_initial_interval" => 2,
16
+ 'ecs_compatibility' => 'disabled'
16
17
  })
17
18
  }
18
19
 
19
20
  before :each do
20
21
  # Delete all templates first.
21
- require "elasticsearch"
22
22
  allow(Stud).to receive(:stoppable_sleep)
23
23
 
24
24
  # Clean ES of data before we start.
@@ -33,7 +33,9 @@ describe "elasticsearch is down on startup", :integration => true do
33
33
  end
34
34
 
35
35
  it 'should ingest events when Elasticsearch recovers before documents are sent' do
36
- allow_any_instance_of(LogStash::Outputs::ElasticSearch::HttpClient::Pool).to receive(:get_es_version).and_raise(::LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError.new(StandardError.new, "big fail"))
36
+ allow_any_instance_of(LogStash::Outputs::ElasticSearch::HttpClient::Pool).to receive(:get_es_version).and_raise(
37
+ ::LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError.new StandardError.new("TEST: before docs are sent"), 'http://test.es/'
38
+ )
37
39
  subject.register
38
40
  allow_any_instance_of(LogStash::Outputs::ElasticSearch::HttpClient::Pool).to receive(:get_es_version).and_return(ESHelper.es_version)
39
41
  subject.multi_receive([event1, event2])
@@ -43,7 +45,9 @@ describe "elasticsearch is down on startup", :integration => true do
43
45
  end
44
46
 
45
47
  it 'should ingest events when Elasticsearch recovers after documents are sent' do
46
- allow_any_instance_of(LogStash::Outputs::ElasticSearch::HttpClient::Pool).to receive(:get_es_version).and_raise(::LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError.new(StandardError.new, "big fail"))
48
+ allow_any_instance_of(LogStash::Outputs::ElasticSearch::HttpClient::Pool).to receive(:get_es_version).and_raise(
49
+ ::LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError.new StandardError.new("TEST: after docs are sent"), 'http://test.es/'
50
+ )
47
51
  subject.register
48
52
  Thread.new do
49
53
  sleep 4
@@ -56,11 +60,13 @@ describe "elasticsearch is down on startup", :integration => true do
56
60
  end
57
61
 
58
62
  it 'should get cluster_uuid when Elasticsearch recovers from license check failure' do
59
- allow_any_instance_of(LogStash::Outputs::ElasticSearch::HttpClient::Pool).to receive(:get_license).with(instance_of(LogStash::Util::SafeURI)).and_raise(::LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError.new(StandardError.new, "big fail"))
63
+ allow_any_instance_of(LogStash::Outputs::ElasticSearch::HttpClient::Pool).to receive(:get_license).and_raise(
64
+ ::LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError.new StandardError.new("TEST: docs are sent"), 'http://test.es/_license'
65
+ )
60
66
  subject.register
61
67
  Thread.new do
62
68
  sleep 4
63
- allow_any_instance_of(LogStash::Outputs::ElasticSearch::HttpClient::Pool).to receive(:get_license).with(instance_of(LogStash::Util::SafeURI)).and_call_original
69
+ allow_any_instance_of(LogStash::Outputs::ElasticSearch::HttpClient::Pool).to receive(:get_license).and_call_original
64
70
  end
65
71
  subject.multi_receive([event1, event2])
66
72
  @es.indices.refresh
@@ -45,7 +45,8 @@ describe "failures in bulk class expected behavior", :integration => true do
45
45
  "template_overwrite" => true,
46
46
  "hosts" => get_host_port(),
47
47
  "retry_max_interval" => 64,
48
- "retry_initial_interval" => 2
48
+ "retry_initial_interval" => 2,
49
+ "ecs_compatibility" => "disabled", # specs are tightly tied to non-ECS defaults
49
50
  }
50
51
  next LogStash::Outputs::ElasticSearch.new(settings)
51
52
  end
@@ -33,7 +33,7 @@ describe "SSL option" do
33
33
 
34
34
  it "should pass the flag to the ES client" do
35
35
  expect(::Manticore::Client).to receive(:new) do |args|
36
- expect(args[:ssl]).to eq(:enabled => true, :verify => false)
36
+ expect(args[:ssl]).to match hash_including(:enabled => true, :verify => :disable)
37
37
  end.and_return(manticore_double)
38
38
 
39
39
  subject.register