logstash-output-elasticsearch 10.8.6-java → 11.0.3-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +17 -0
  3. data/docs/index.asciidoc +132 -22
  4. data/lib/logstash/outputs/elasticsearch.rb +125 -64
  5. data/lib/logstash/outputs/elasticsearch/data_stream_support.rb +233 -0
  6. data/lib/logstash/outputs/elasticsearch/http_client.rb +9 -7
  7. data/lib/logstash/outputs/elasticsearch/http_client/pool.rb +49 -62
  8. data/lib/logstash/outputs/elasticsearch/ilm.rb +13 -45
  9. data/lib/logstash/outputs/elasticsearch/license_checker.rb +26 -23
  10. data/lib/logstash/outputs/elasticsearch/template_manager.rb +4 -6
  11. data/lib/logstash/outputs/elasticsearch/templates/ecs-v1/elasticsearch-8x.json +1 -0
  12. data/lib/logstash/plugin_mixins/elasticsearch/api_configs.rb +157 -153
  13. data/lib/logstash/plugin_mixins/elasticsearch/common.rb +71 -58
  14. data/logstash-output-elasticsearch.gemspec +3 -3
  15. data/spec/es_spec_helper.rb +7 -12
  16. data/spec/fixtures/_nodes/{5x_6x.json → 6x.json} +5 -5
  17. data/spec/integration/outputs/compressed_indexing_spec.rb +47 -46
  18. data/spec/integration/outputs/data_stream_spec.rb +61 -0
  19. data/spec/integration/outputs/delete_spec.rb +49 -51
  20. data/spec/integration/outputs/ilm_spec.rb +236 -248
  21. data/spec/integration/outputs/index_spec.rb +5 -2
  22. data/spec/integration/outputs/index_version_spec.rb +78 -82
  23. data/spec/integration/outputs/ingest_pipeline_spec.rb +58 -58
  24. data/spec/integration/outputs/painless_update_spec.rb +74 -164
  25. data/spec/integration/outputs/parent_spec.rb +67 -75
  26. data/spec/integration/outputs/retry_spec.rb +6 -6
  27. data/spec/integration/outputs/sniffer_spec.rb +15 -54
  28. data/spec/integration/outputs/templates_spec.rb +79 -81
  29. data/spec/integration/outputs/update_spec.rb +99 -101
  30. data/spec/spec_helper.rb +10 -0
  31. data/spec/unit/outputs/elasticsearch/data_stream_support_spec.rb +528 -0
  32. data/spec/unit/outputs/elasticsearch/http_client/manticore_adapter_spec.rb +1 -0
  33. data/spec/unit/outputs/elasticsearch/http_client/pool_spec.rb +36 -29
  34. data/spec/unit/outputs/elasticsearch/http_client_spec.rb +2 -3
  35. data/spec/unit/outputs/elasticsearch/template_manager_spec.rb +10 -12
  36. data/spec/unit/outputs/elasticsearch_proxy_spec.rb +1 -2
  37. data/spec/unit/outputs/elasticsearch_spec.rb +176 -41
  38. data/spec/unit/outputs/elasticsearch_ssl_spec.rb +1 -2
  39. data/spec/unit/outputs/error_whitelist_spec.rb +3 -2
  40. data/spec/unit/outputs/license_check_spec.rb +0 -16
  41. metadata +29 -36
  42. data/lib/logstash/outputs/elasticsearch/templates/ecs-disabled/elasticsearch-2x.json +0 -95
  43. data/lib/logstash/outputs/elasticsearch/templates/ecs-disabled/elasticsearch-5x.json +0 -46
  44. data/spec/fixtures/_nodes/2x_1x.json +0 -27
  45. data/spec/fixtures/scripts/groovy/scripted_update.groovy +0 -2
  46. data/spec/fixtures/scripts/groovy/scripted_update_nested.groovy +0 -2
  47. data/spec/fixtures/scripts/groovy/scripted_upsert.groovy +0 -2
  48. data/spec/integration/outputs/groovy_update_spec.rb +0 -150
  49. data/spec/integration/outputs/templates_5x_spec.rb +0 -98
@@ -0,0 +1,61 @@
1
+ require_relative "../../../spec/es_spec_helper"
2
+ require "logstash/outputs/elasticsearch"
3
+
4
+ describe "data streams", :integration => true do
5
+
6
+ let(:ds_name) { "logs-#{ds_dataset}-default" }
7
+ let(:ds_dataset) { 'integration_test' }
8
+
9
+ let(:options) do
10
+ { "data_stream" => 'true', "data_stream_dataset" => ds_dataset, "hosts" => get_host_port() }
11
+ end
12
+
13
+ subject { LogStash::Outputs::ElasticSearch.new(options) }
14
+
15
+ before :each do
16
+ @es = get_client
17
+ @es.delete_by_query(index: ".ds-#{ds_name}-*", expand_wildcards: :all, body: { query: { match_all: {} } }) rescue nil
18
+
19
+ es_version = @es.info['version']['number']
20
+ if Gem::Version.create(es_version) < Gem::Version.create('7.9.0')
21
+ skip "ES version #{es_version} does not support data-streams"
22
+ end
23
+ end
24
+
25
+ it "creates a new document" do
26
+ subject.register
27
+ subject.multi_receive([LogStash::Event.new("message" => "MSG 111")])
28
+
29
+ @es.indices.refresh
30
+
31
+ Stud::try(3.times) do
32
+ r = @es.search(index: ds_name)
33
+
34
+ expect( r['hits']['total']['value'] ).to eq 1
35
+ doc = r['hits']['hits'].first
36
+ expect( doc['_source'] ).to include "message"=>"MSG 111"
37
+ expect( doc['_source'] ).to include "data_stream"=>{"dataset"=>ds_dataset, "type"=>"logs", "namespace"=>"default"}
38
+ end
39
+ end
40
+
41
+ context "with document_id" do
42
+
43
+ let(:document_id) { '1234567890' }
44
+ let(:options) { super().merge("document_id" => document_id) }
45
+
46
+ it "creates a new document" do
47
+ subject.register
48
+ subject.multi_receive([LogStash::Event.new("message" => "foo")])
49
+
50
+ @es.indices.refresh
51
+
52
+ Stud::try(3.times) do
53
+ r = @es.search(index: ds_name, body: { query: { match: { _id: document_id } } })
54
+ expect( r['hits']['total']['value'] ).to eq 1
55
+ doc = r['hits']['hits'].first
56
+ expect( doc['_source'] ).to include "message"=>"foo"
57
+ end
58
+ end
59
+
60
+ end
61
+ end
@@ -2,64 +2,62 @@ require_relative "../../../spec/es_spec_helper"
2
2
  require "logstash/outputs/elasticsearch"
3
3
 
4
4
 
5
- if ESHelper.es_version_satisfies?(">= 2")
6
- describe "Versioned delete", :integration => true do
7
- require "logstash/outputs/elasticsearch"
5
+ describe "Versioned delete", :integration => true do
6
+ require "logstash/outputs/elasticsearch"
7
+
8
+ let(:es) { get_client }
9
+
10
+ before :each do
11
+ # Delete all templates first.
12
+ # Clean ES of data before we start.
13
+ es.indices.delete_template(:name => "*")
14
+ # This can fail if there are no indexes, ignore failure.
15
+ es.indices.delete(:index => "*") rescue nil
16
+ es.indices.refresh
17
+ end
8
18
 
9
- let(:es) { get_client }
19
+ context "when delete only" do
20
+ subject { LogStash::Outputs::ElasticSearch.new(settings) }
10
21
 
11
- before :each do
12
- # Delete all templates first.
13
- # Clean ES of data before we start.
14
- es.indices.delete_template(:name => "*")
15
- # This can fail if there are no indexes, ignore failure.
16
- es.indices.delete(:index => "*") rescue nil
17
- es.indices.refresh
22
+ before do
23
+ subject.register
18
24
  end
19
25
 
20
- context "when delete only" do
21
- subject { LogStash::Outputs::ElasticSearch.new(settings) }
22
-
23
- before do
24
- subject.register
25
- end
26
-
27
- let(:settings) do
28
- {
29
- "manage_template" => true,
30
- "index" => "logstash-delete",
31
- "template_overwrite" => true,
32
- "hosts" => get_host_port(),
33
- "document_id" => "%{my_id}",
34
- "version" => "%{my_version}",
35
- "version_type" => "external",
36
- "action" => "%{my_action}"
37
- }
38
- end
39
-
40
- it "should ignore non-monotonic external version updates" do
41
- id = "ev2"
42
- subject.multi_receive([LogStash::Event.new("my_id" => id, "my_action" => "index", "message" => "foo", "my_version" => 99)])
43
- r = es.get(:index => 'logstash-delete', :type => doc_type, :id => id, :refresh => true)
44
- expect(r['_version']).to eq(99)
45
- expect(r['_source']['message']).to eq('foo')
26
+ let(:settings) do
27
+ {
28
+ "manage_template" => true,
29
+ "index" => "logstash-delete",
30
+ "template_overwrite" => true,
31
+ "hosts" => get_host_port(),
32
+ "document_id" => "%{my_id}",
33
+ "version" => "%{my_version}",
34
+ "version_type" => "external",
35
+ "action" => "%{my_action}"
36
+ }
37
+ end
46
38
 
47
- subject.multi_receive([LogStash::Event.new("my_id" => id, "my_action" => "delete", "message" => "foo", "my_version" => 98)])
48
- r2 = es.get(:index => 'logstash-delete', :type => doc_type, :id => id, :refresh => true)
49
- expect(r2['_version']).to eq(99)
50
- expect(r2['_source']['message']).to eq('foo')
51
- end
39
+ it "should ignore non-monotonic external version updates" do
40
+ id = "ev2"
41
+ subject.multi_receive([LogStash::Event.new("my_id" => id, "my_action" => "index", "message" => "foo", "my_version" => 99)])
42
+ r = es.get(:index => 'logstash-delete', :type => doc_type, :id => id, :refresh => true)
43
+ expect(r['_version']).to eq(99)
44
+ expect(r['_source']['message']).to eq('foo')
45
+
46
+ subject.multi_receive([LogStash::Event.new("my_id" => id, "my_action" => "delete", "message" => "foo", "my_version" => 98)])
47
+ r2 = es.get(:index => 'logstash-delete', :type => doc_type, :id => id, :refresh => true)
48
+ expect(r2['_version']).to eq(99)
49
+ expect(r2['_source']['message']).to eq('foo')
50
+ end
52
51
 
53
- it "should commit monotonic external version updates" do
54
- id = "ev3"
55
- subject.multi_receive([LogStash::Event.new("my_id" => id, "my_action" => "index", "message" => "foo", "my_version" => 99)])
56
- r = es.get(:index => 'logstash-delete', :type => doc_type, :id => id, :refresh => true)
57
- expect(r['_version']).to eq(99)
58
- expect(r['_source']['message']).to eq('foo')
52
+ it "should commit monotonic external version updates" do
53
+ id = "ev3"
54
+ subject.multi_receive([LogStash::Event.new("my_id" => id, "my_action" => "index", "message" => "foo", "my_version" => 99)])
55
+ r = es.get(:index => 'logstash-delete', :type => doc_type, :id => id, :refresh => true)
56
+ expect(r['_version']).to eq(99)
57
+ expect(r['_source']['message']).to eq('foo')
59
58
 
60
- subject.multi_receive([LogStash::Event.new("my_id" => id, "my_action" => "delete", "message" => "foo", "my_version" => 100)])
61
- expect { es.get(:index => 'logstash-delete', :type => doc_type, :id => id, :refresh => true) }.to raise_error(Elasticsearch::Transport::Transport::Errors::NotFound)
62
- end
59
+ subject.multi_receive([LogStash::Event.new("my_id" => id, "my_action" => "delete", "message" => "foo", "my_version" => 100)])
60
+ expect { es.get(:index => 'logstash-delete', :type => doc_type, :id => id, :refresh => true) }.to raise_error(Elasticsearch::Transport::Transport::Errors::NotFound)
63
61
  end
64
62
  end
65
63
  end
@@ -111,9 +111,7 @@ shared_examples_for 'an ILM disabled Logstash' do
111
111
 
112
112
  template = get_template(@es, "logstash")
113
113
  expect(template).to have_index_pattern("logstash-*")
114
- if ESHelper.es_version_satisfies?(">= 2")
115
- expect(get_template_settings(template)['index']['lifecycle']).to be_nil
116
- end
114
+ expect(get_template_settings(template)['index']['lifecycle']).to be_nil
117
115
  end
118
116
 
119
117
  context 'with an existing policy that will roll over' do
@@ -163,9 +161,7 @@ shared_examples_for 'an ILM disabled Logstash' do
163
161
 
164
162
  template = get_template(@es, template_name)
165
163
  expect(template).to have_index_pattern("logstash-*")
166
- if ESHelper.es_version_satisfies?(">= 2")
167
- expect(get_template_settings(template)['index']['lifecycle']).to be_nil
168
- end
164
+ expect(get_template_settings(template)['index']['lifecycle']).to be_nil
169
165
  end
170
166
  end
171
167
  end
@@ -198,12 +194,16 @@ shared_examples_for 'an Elasticsearch instance that does not support index lifec
198
194
  let (:settings) { super().merge!({ 'ilm_enabled' => true }) }
199
195
 
200
196
  it 'should raise a configuration error' do
197
+ # TODO should be refactored not to rely on plugin internals
198
+ finish_register = subject.method(:finish_register)
199
+ expect(subject).to receive(:finish_register)
201
200
  expect do
202
201
  begin
203
202
  subject.register
204
- sleep(1)
203
+ finish_register.call
204
+ sleep(1.5) # wait_for_successful_connection (for the thread to raise)
205
205
  ensure
206
- subject.stop_template_installer
206
+ subject.send :stop_after_successful_connection_thread
207
207
  end
208
208
  end.to raise_error(LogStash::ConfigurationError)
209
209
  end
@@ -227,319 +227,307 @@ shared_examples_for 'an Elasticsearch instance that does not support index lifec
227
227
 
228
228
  end
229
229
 
230
- if ESHelper.es_version_satisfies?("<= 6.5")
231
- describe 'Pre-ILM versions of Elasticsearch', :integration => true do
232
- it_behaves_like 'an Elasticsearch instance that does not support index lifecycle management'
233
- end
234
- end
230
+ describe 'Elasticsearch has index lifecycle management enabled', :integration => true do
235
231
 
236
- if ESHelper.es_version_satisfies?(">= 6.6")
237
- describe 'OSS Elasticsearch', :distribution => 'oss', :integration => true do
238
- it_behaves_like 'an Elasticsearch instance that does not support index lifecycle management'
239
- end
232
+ DEFAULT_INTERVAL = '600s'
240
233
 
241
- describe 'Elasticsearch has index lifecycle management enabled', :distribution => 'xpack', :integration => true do
234
+ let (:ilm_enabled) { true }
242
235
 
243
- DEFAULT_INTERVAL = '600s'
244
-
245
- let (:ilm_enabled) { true }
246
-
247
- let (:settings) {
248
- {
249
- "ilm_enabled" => ilm_enabled,
250
- "hosts" => "#{get_host_port()}"
251
- }
236
+ let (:settings) {
237
+ {
238
+ "ilm_enabled" => ilm_enabled,
239
+ "hosts" => "#{get_host_port()}"
252
240
  }
253
- let (:small_max_doc_policy) { max_docs_policy(3) }
254
- let (:large_max_doc_policy) { max_docs_policy(1000000) }
255
- let (:expected_index) { elasticsearch_output_plugin.default_ilm_rollover_alias }
256
-
257
- subject(:elasticsearch_output_plugin) { LogStash::Outputs::ElasticSearch.new(settings) }
258
-
259
- before :each do
260
- # Delete all templates first.
261
- require "elasticsearch"
262
-
263
- # Clean ES of data before we start.
264
- @es = get_client
265
- clean(@es)
266
- # Set the poll interval for lifecycle management to be short so changes get picked up in time.
267
- set_cluster_settings(@es, {
268
- "persistent" => {
269
- "indices.lifecycle.poll_interval" => "1s"
270
- }
271
- })
272
- end
241
+ }
242
+ let (:small_max_doc_policy) { max_docs_policy(3) }
243
+ let (:large_max_doc_policy) { max_docs_policy(1000000) }
244
+ let (:expected_index) { elasticsearch_output_plugin.default_ilm_rollover_alias }
273
245
 
274
- after :each do
275
- # Set poll interval back to default
276
- set_cluster_settings(@es, {
277
- "persistent" => {
278
- "indices.lifecycle.poll_interval" => DEFAULT_INTERVAL
279
- }
280
- })
281
- clean(@es)
282
- end
246
+ subject(:elasticsearch_output_plugin) { LogStash::Outputs::ElasticSearch.new(settings) }
283
247
 
284
- context 'with ilm enabled' do
285
- let (:ilm_enabled) { true }
248
+ before :each do
249
+ # Delete all templates first.
250
+ require "elasticsearch"
286
251
 
287
- context 'when using the default policy' do
288
- context 'with a custom pattern' do
289
- let (:settings) { super().merge("ilm_pattern" => "000001")}
290
- it 'should create a rollover alias' do
291
- expect(@es.indices.exists_alias(name: "logstash")).to be_falsey
292
- subject.register
293
- sleep(1)
294
- expect(@es.indices.exists_alias(name: "logstash")).to be_truthy
295
- expect(@es.get_alias(name: "logstash")).to include("logstash-000001")
296
- end
297
- end
252
+ # Clean ES of data before we start.
253
+ @es = get_client
254
+ clean(@es)
255
+ # Set the poll interval for lifecycle management to be short so changes get picked up in time.
256
+ set_cluster_settings(@es, {
257
+ "persistent" => {
258
+ "indices.lifecycle.poll_interval" => "1s"
259
+ }
260
+ })
261
+ end
298
262
 
299
- it 'should install it if it is not present' do
300
- expect{get_policy(@es, LogStash::Outputs::ElasticSearch::DEFAULT_POLICY)}.to raise_error(Elasticsearch::Transport::Transport::Errors::NotFound)
301
- subject.register
302
- sleep(1)
303
- expect{get_policy(@es, LogStash::Outputs::ElasticSearch::DEFAULT_POLICY)}.not_to raise_error
304
- end
263
+ after :each do
264
+ # Set poll interval back to default
265
+ set_cluster_settings(@es, {
266
+ "persistent" => {
267
+ "indices.lifecycle.poll_interval" => DEFAULT_INTERVAL
268
+ }
269
+ })
270
+ clean(@es)
271
+ end
272
+
273
+ context 'with ilm enabled' do
274
+ let (:ilm_enabled) { true }
305
275
 
306
- it 'should create the default rollover alias' do
276
+ context 'when using the default policy' do
277
+ context 'with a custom pattern' do
278
+ let (:settings) { super().merge("ilm_pattern" => "000001")}
279
+ it 'should create a rollover alias' do
307
280
  expect(@es.indices.exists_alias(name: "logstash")).to be_falsey
308
281
  subject.register
309
282
  sleep(1)
310
283
  expect(@es.indices.exists_alias(name: "logstash")).to be_truthy
311
- expect(@es.get_alias(name: "logstash")).to include("logstash-#{todays_date}-000001")
284
+ expect(@es.get_alias(name: "logstash")).to include("logstash-000001")
312
285
  end
286
+ end
313
287
 
314
- it 'should ingest into a single index' do
315
- subject.register
316
- subject.multi_receive([
317
- LogStash::Event.new("message" => "sample message here"),
318
- LogStash::Event.new("somemessage" => { "message" => "sample nested message here" }),
319
- LogStash::Event.new("somevalue" => 100),
320
- ])
321
-
322
- sleep(6)
323
-
324
- subject.multi_receive([
325
- LogStash::Event.new("country" => "us"),
326
- LogStash::Event.new("country" => "at"),
327
- LogStash::Event.new("geoip" => { "location" => [ 0.0, 0.0 ] })
328
- ])
329
-
330
- @es.indices.refresh
331
-
332
- # Wait or fail until everything's indexed.
333
- Stud::try(20.times) do
334
- r = @es.search(index: "logstash-*")
335
- expect(r).to have_hits(6)
336
- end
337
- indexes_written = @es.search(index: "logstash-*")['hits']['hits'].each_with_object(Hash.new(0)) do |x, res|
338
- index_written = x['_index']
339
- res[index_written] += 1
340
- end
341
-
342
- expect(indexes_written.count).to eq(1)
343
- expect(indexes_written["logstash-#{todays_date}-000001"]).to eq(6)
344
- end
288
+ it 'should install it if it is not present' do
289
+ expect{get_policy(@es, LogStash::Outputs::ElasticSearch::DEFAULT_POLICY)}.to raise_error(Elasticsearch::Transport::Transport::Errors::NotFound)
290
+ subject.register
291
+ sleep(1)
292
+ expect{get_policy(@es, LogStash::Outputs::ElasticSearch::DEFAULT_POLICY)}.not_to raise_error
345
293
  end
346
294
 
347
- context 'when not using the default policy' do
348
- let (:ilm_policy_name) {"logstash-policy-small"}
349
- let (:settings) { super().merge("ilm_policy" => ilm_policy_name)}
350
- let (:policy) { small_max_doc_policy }
295
+ it 'should create the default rollover alias' do
296
+ expect(@es.indices.exists_alias(name: "logstash")).to be_falsey
297
+ subject.register
298
+ sleep(1)
299
+ expect(@es.indices.exists_alias(name: "logstash")).to be_truthy
300
+ expect(@es.get_alias(name: "logstash")).to include("logstash-#{todays_date}-000001")
301
+ end
351
302
 
352
- before do
353
- expect{get_policy(@es, LogStash::Outputs::ElasticSearch::DEFAULT_POLICY)}.to raise_error(Elasticsearch::Transport::Transport::Errors::NotFound)
354
- put_policy(@es,ilm_policy_name, policy)
355
- end
303
+ it 'should ingest into a single index' do
304
+ subject.register
305
+ subject.multi_receive([
306
+ LogStash::Event.new("message" => "sample message here"),
307
+ LogStash::Event.new("somemessage" => { "message" => "sample nested message here" }),
308
+ LogStash::Event.new("somevalue" => 100),
309
+ ])
356
310
 
357
- it 'should not install the default policy if it is not used' do
358
- subject.register
359
- sleep(1)
360
- expect{get_policy(@es, LogStash::Outputs::ElasticSearch::DEFAULT_POLICY)}.to raise_error(Elasticsearch::Transport::Transport::Errors::NotFound)
311
+ sleep(6)
312
+
313
+ subject.multi_receive([
314
+ LogStash::Event.new("country" => "us"),
315
+ LogStash::Event.new("country" => "at"),
316
+ LogStash::Event.new("geoip" => { "location" => [ 0.0, 0.0 ] })
317
+ ])
318
+
319
+ @es.indices.refresh
320
+
321
+ # Wait or fail until everything's indexed.
322
+ Stud::try(20.times) do
323
+ r = @es.search(index: "logstash-*")
324
+ expect(r).to have_hits(6)
325
+ end
326
+ indexes_written = @es.search(index: "logstash-*")['hits']['hits'].each_with_object(Hash.new(0)) do |x, res|
327
+ index_written = x['_index']
328
+ res[index_written] += 1
361
329
  end
330
+
331
+ expect(indexes_written.count).to eq(1)
332
+ expect(indexes_written["logstash-#{todays_date}-000001"]).to eq(6)
362
333
  end
334
+ end
363
335
 
364
- context 'when using a time based policy' do
365
- let (:ilm_policy_name) {"logstash-policy-time"}
366
- let (:settings) { super().merge("ilm_policy" => ilm_policy_name)}
367
- let (:policy) { max_age_policy("1d") }
336
+ context 'when not using the default policy' do
337
+ let (:ilm_policy_name) {"logstash-policy-small"}
338
+ let (:settings) { super().merge("ilm_policy" => ilm_policy_name)}
339
+ let (:policy) { small_max_doc_policy }
368
340
 
369
- before do
370
- expect{get_policy(@es, LogStash::Outputs::ElasticSearch::DEFAULT_POLICY)}.to raise_error(Elasticsearch::Transport::Transport::Errors::NotFound)
371
- put_policy(@es,ilm_policy_name, policy)
372
- end
341
+ before do
342
+ expect{get_policy(@es, LogStash::Outputs::ElasticSearch::DEFAULT_POLICY)}.to raise_error(Elasticsearch::Transport::Transport::Errors::NotFound)
343
+ put_policy(@es,ilm_policy_name, policy)
344
+ end
373
345
 
374
- it 'should not install the default policy if it is not used' do
375
- subject.register
376
- sleep(1)
377
- expect{get_policy(@es, LogStash::Outputs::ElasticSearch::DEFAULT_POLICY)}.to raise_error(Elasticsearch::Transport::Transport::Errors::NotFound)
378
- end
346
+ it 'should not install the default policy if it is not used' do
347
+ subject.register
348
+ sleep(1)
349
+ expect{get_policy(@es, LogStash::Outputs::ElasticSearch::DEFAULT_POLICY)}.to raise_error(Elasticsearch::Transport::Transport::Errors::NotFound)
379
350
  end
351
+ end
380
352
 
381
- context 'with the default template' do
382
- it 'should create the rollover alias' do
383
- expect(@es.indices.exists_alias(name: expected_index)).to be_falsey
384
- subject.register
385
- sleep(1)
386
- expect(@es.indices.exists_alias(name: expected_index)).to be_truthy
387
- expect(@es.get_alias(name: expected_index)).to include("#{expected_index}-#{todays_date}-000001")
388
- end
353
+ context 'when using a time based policy' do
354
+ let (:ilm_policy_name) {"logstash-policy-time"}
355
+ let (:settings) { super().merge("ilm_policy" => ilm_policy_name)}
356
+ let (:policy) { max_age_policy("1d") }
389
357
 
390
- it 'should write the ILM settings into the template' do
391
- subject.register
392
- sleep(1)
358
+ before do
359
+ expect{get_policy(@es, LogStash::Outputs::ElasticSearch::DEFAULT_POLICY)}.to raise_error(Elasticsearch::Transport::Transport::Errors::NotFound)
360
+ put_policy(@es,ilm_policy_name, policy)
361
+ end
393
362
 
394
- template = get_template(@es, "logstash")
395
- expect(template).to have_index_pattern("logstash-*")
396
- expect(get_template_settings(template)['index']['lifecycle']['name']).to eq("logstash-policy")
397
- expect(get_template_settings(template)['index']['lifecycle']['rollover_alias']).to eq("logstash")
398
- end
363
+ it 'should not install the default policy if it is not used' do
364
+ subject.register
365
+ sleep(1)
366
+ expect{get_policy(@es, LogStash::Outputs::ElasticSearch::DEFAULT_POLICY)}.to raise_error(Elasticsearch::Transport::Transport::Errors::NotFound)
367
+ end
368
+ end
399
369
 
400
- it_behaves_like 'an ILM enabled Logstash'
370
+ context 'with the default template' do
371
+ it 'should create the rollover alias' do
372
+ expect(@es.indices.exists_alias(name: expected_index)).to be_falsey
373
+ subject.register
374
+ sleep(1)
375
+ expect(@es.indices.exists_alias(name: expected_index)).to be_truthy
376
+ expect(@es.get_alias(name: expected_index)).to include("#{expected_index}-#{todays_date}-000001")
401
377
  end
402
378
 
403
- context 'with a set index and a custom index pattern' do
404
- if ESHelper.es_version_satisfies?(">= 8.0")
405
- let (:template) { "spec/fixtures/template-with-policy-es8x.json" }
406
- elsif ESHelper.es_version_satisfies?(">= 7.0")
407
- let (:template) { "spec/fixtures/template-with-policy-es7x.json" }
408
- else
409
- let (:template) { "spec/fixtures/template-with-policy-es6x.json" }
410
- end
379
+ it 'should write the ILM settings into the template' do
380
+ subject.register
381
+ sleep(1)
411
382
 
412
- let (:settings) { super().merge("template" => template,
413
- "index" => "overwrite-4")}
383
+ template = get_template(@es, "logstash")
384
+ expect(template).to have_index_pattern("logstash-*")
385
+ expect(get_template_settings(template)['index']['lifecycle']['name']).to eq("logstash-policy")
386
+ expect(get_template_settings(template)['index']['lifecycle']['rollover_alias']).to eq("logstash")
387
+ end
414
388
 
415
- it 'should not overwrite the index patterns' do
416
- subject.register
417
- sleep(1)
389
+ it_behaves_like 'an ILM enabled Logstash'
390
+ end
418
391
 
419
- template = get_template(@es, "logstash")
420
- expect(template).to have_index_pattern("overwrite-*")
421
- end
392
+ context 'with a set index and a custom index pattern' do
393
+ if ESHelper.es_version_satisfies?(">= 8.0")
394
+ let (:template) { "spec/fixtures/template-with-policy-es8x.json" }
395
+ elsif ESHelper.es_version_satisfies?(">= 7.0")
396
+ let (:template) { "spec/fixtures/template-with-policy-es7x.json" }
397
+ else
398
+ let (:template) { "spec/fixtures/template-with-policy-es6x.json" }
422
399
  end
423
400
 
401
+ let (:settings) { super().merge("template" => template,
402
+ "index" => "overwrite-4")}
424
403
 
425
- context 'with a custom template' do
426
- let (:ilm_rollover_alias) { "logstash_the_cat_in_the_hat" }
427
- let (:index) { ilm_rollover_alias }
428
- let(:expected_index) { index }
429
- let (:settings) { super().merge("ilm_policy" => ilm_policy_name,
430
- "template" => template,
431
- "ilm_rollover_alias" => ilm_rollover_alias)}
404
+ it 'should not overwrite the index patterns' do
405
+ subject.register
406
+ sleep(1)
432
407
 
408
+ template = get_template(@es, "logstash")
409
+ expect(template).to have_index_pattern("overwrite-*")
410
+ end
411
+ end
433
412
 
434
- if ESHelper.es_version_satisfies?(">= 8.0")
435
- let (:template) { "spec/fixtures/template-with-policy-es8x.json" }
436
- elsif ESHelper.es_version_satisfies?(">= 7.0")
437
- let (:template) { "spec/fixtures/template-with-policy-es7x.json" }
438
- else
439
- let (:template) { "spec/fixtures/template-with-policy-es6x.json" }
440
- end
441
- let (:ilm_enabled) { true }
442
- let (:ilm_policy_name) { "logstash-policy-custom-policy" }
443
- let (:policy) { small_max_doc_policy }
444
413
 
445
- before :each do
446
- put_policy(@es,ilm_policy_name, policy)
447
- end
414
+ context 'with a custom template' do
415
+ let (:ilm_rollover_alias) { "logstash_the_cat_in_the_hat" }
416
+ let (:index) { ilm_rollover_alias }
417
+ let(:expected_index) { index }
418
+ let (:settings) { super().merge("ilm_policy" => ilm_policy_name,
419
+ "template" => template,
420
+ "ilm_rollover_alias" => ilm_rollover_alias)}
448
421
 
449
- it_behaves_like 'an ILM enabled Logstash'
450
422
 
451
- it 'should create the rollover alias' do
423
+ if ESHelper.es_version_satisfies?(">= 8.0")
424
+ let (:template) { "spec/fixtures/template-with-policy-es8x.json" }
425
+ elsif ESHelper.es_version_satisfies?(">= 7.0")
426
+ let (:template) { "spec/fixtures/template-with-policy-es7x.json" }
427
+ else
428
+ let (:template) { "spec/fixtures/template-with-policy-es6x.json" }
429
+ end
430
+ let (:ilm_enabled) { true }
431
+ let (:ilm_policy_name) { "logstash-policy-custom-policy" }
432
+ let (:policy) { small_max_doc_policy }
433
+
434
+ before :each do
435
+ put_policy(@es,ilm_policy_name, policy)
436
+ end
437
+
438
+ it_behaves_like 'an ILM enabled Logstash'
439
+
440
+ it 'should create the rollover alias' do
441
+ expect(@es.indices.exists_alias(name: ilm_rollover_alias)).to be_falsey
442
+ subject.register
443
+ sleep(1)
444
+ expect(@es.indices.exists_alias(name: ilm_rollover_alias)).to be_truthy
445
+ expect(@es.get_alias(name: ilm_rollover_alias)).to include("#{ilm_rollover_alias}-#{todays_date}-000001")
446
+ end
447
+
448
+ context 'when the custom rollover alias already exists' do
449
+ it 'should ignore the already exists error' do
452
450
  expect(@es.indices.exists_alias(name: ilm_rollover_alias)).to be_falsey
451
+ put_alias(@es, "#{ilm_rollover_alias}-#{todays_date}-000001", ilm_rollover_alias)
452
+ expect(@es.indices.exists_alias(name: ilm_rollover_alias)).to be_truthy
453
453
  subject.register
454
454
  sleep(1)
455
- expect(@es.indices.exists_alias(name: ilm_rollover_alias)).to be_truthy
456
455
  expect(@es.get_alias(name: ilm_rollover_alias)).to include("#{ilm_rollover_alias}-#{todays_date}-000001")
457
456
  end
458
457
 
459
- context 'when the custom rollover alias already exists' do
460
- it 'should ignore the already exists error' do
461
- expect(@es.indices.exists_alias(name: ilm_rollover_alias)).to be_falsey
462
- put_alias(@es, "#{ilm_rollover_alias}-#{todays_date}-000001", ilm_rollover_alias)
463
- expect(@es.indices.exists_alias(name: ilm_rollover_alias)).to be_truthy
464
- subject.register
465
- sleep(1)
466
- expect(@es.get_alias(name: ilm_rollover_alias)).to include("#{ilm_rollover_alias}-#{todays_date}-000001")
467
- end
458
+ end
468
459
 
469
- end
460
+ it 'should write the ILM settings into the template' do
461
+ subject.register
462
+ sleep(1)
463
+
464
+ template = get_template(@es, ilm_rollover_alias)
465
+ expect(template).to have_index_pattern("#{ilm_rollover_alias}-*")
466
+ expect(get_template_settings(template)['index']['lifecycle']['name']).to eq(ilm_policy_name)
467
+ expect(get_template_settings(template)['index']['lifecycle']['rollover_alias']).to eq(ilm_rollover_alias)
468
+ end
469
+
470
+ context 'with a different template_name' do
471
+ let (:template_name) { "logstash_custom_template_name" }
472
+ let (:settings) { super().merge('template_name' => template_name)}
473
+
474
+ it_behaves_like 'an ILM enabled Logstash'
470
475
 
471
476
  it 'should write the ILM settings into the template' do
472
477
  subject.register
473
478
  sleep(1)
474
-
475
- template = get_template(@es, ilm_rollover_alias)
479
+ template = get_template(@es, template_name)
476
480
  expect(template).to have_index_pattern("#{ilm_rollover_alias}-*")
477
481
  expect(get_template_settings(template)['index']['lifecycle']['name']).to eq(ilm_policy_name)
478
482
  expect(get_template_settings(template)['index']['lifecycle']['rollover_alias']).to eq(ilm_rollover_alias)
479
483
  end
480
-
481
- context 'with a different template_name' do
482
- let (:template_name) { "logstash_custom_template_name" }
483
- let (:settings) { super().merge('template_name' => template_name)}
484
-
485
- it_behaves_like 'an ILM enabled Logstash'
486
-
487
- it 'should write the ILM settings into the template' do
488
- subject.register
489
- sleep(1)
490
- template = get_template(@es, template_name)
491
- expect(template).to have_index_pattern("#{ilm_rollover_alias}-*")
492
- expect(get_template_settings(template)['index']['lifecycle']['name']).to eq(ilm_policy_name)
493
- expect(get_template_settings(template)['index']['lifecycle']['rollover_alias']).to eq(ilm_rollover_alias)
494
- end
495
- end
496
-
497
484
  end
485
+
498
486
  end
487
+ end
499
488
 
500
- context 'when ilm_enabled is set to "auto"' do
501
- let (:ilm_enabled) { 'auto' }
489
+ context 'when ilm_enabled is set to "auto"' do
490
+ let (:ilm_enabled) { 'auto' }
502
491
 
503
- if ESHelper.es_version_satisfies?(">=7.0")
504
- context 'when Elasticsearch is version 7 or above' do
505
- it_behaves_like 'an ILM enabled Logstash'
506
- end
492
+ if ESHelper.es_version_satisfies?(">=7.0")
493
+ context 'when Elasticsearch is version 7 or above' do
494
+ it_behaves_like 'an ILM enabled Logstash'
507
495
  end
496
+ end
508
497
 
509
- if ESHelper.es_version_satisfies?('< 7.0')
510
- context 'when Elasticsearch is version 7 or below' do
511
- it_behaves_like 'an ILM disabled Logstash'
512
- end
498
+ if ESHelper.es_version_satisfies?('< 7.0')
499
+ context 'when Elasticsearch is version 7 or below' do
500
+ it_behaves_like 'an ILM disabled Logstash'
513
501
  end
514
502
  end
503
+ end
515
504
 
516
- context 'when ilm_enabled is the default' do
517
- let (:settings) { super().tap{|x|x.delete('ilm_enabled')}}
505
+ context 'when ilm_enabled is the default' do
506
+ let (:settings) { super().tap{|x|x.delete('ilm_enabled')}}
518
507
 
519
- if ESHelper.es_version_satisfies?(">=7.0")
520
- context 'when Elasticsearch is version 7 or above' do
521
- it_behaves_like 'an ILM enabled Logstash'
522
- end
508
+ if ESHelper.es_version_satisfies?(">=7.0")
509
+ context 'when Elasticsearch is version 7 or above' do
510
+ it_behaves_like 'an ILM enabled Logstash'
523
511
  end
512
+ end
524
513
 
525
- if ESHelper.es_version_satisfies?('< 7.0')
526
- context 'when Elasticsearch is version 7 or below' do
527
- it_behaves_like 'an ILM disabled Logstash'
528
- end
514
+ if ESHelper.es_version_satisfies?('< 7.0')
515
+ context 'when Elasticsearch is version 7 or below' do
516
+ it_behaves_like 'an ILM disabled Logstash'
529
517
  end
530
518
  end
519
+ end
531
520
 
532
- context 'with ilm disabled' do
533
- let (:settings) { super().merge('ilm_enabled' => false )}
534
-
535
- it_behaves_like 'an ILM disabled Logstash'
536
- end
521
+ context 'with ilm disabled' do
522
+ let (:settings) { super().merge('ilm_enabled' => false )}
537
523
 
538
- context 'with ilm disabled using a string' do
539
- let (:settings) { super().merge('ilm_enabled' => 'false' )}
524
+ it_behaves_like 'an ILM disabled Logstash'
525
+ end
540
526
 
541
- it_behaves_like 'an ILM disabled Logstash'
542
- end
527
+ context 'with ilm disabled using a string' do
528
+ let (:settings) { super().merge('ilm_enabled' => 'false' )}
543
529
 
530
+ it_behaves_like 'an ILM disabled Logstash'
544
531
  end
545
- end
532
+
533
+ end