logstash-output-elasticsearch-test 11.16.0-x86_64-linux

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 (88) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +649 -0
  3. data/CONTRIBUTORS +34 -0
  4. data/Gemfile +16 -0
  5. data/LICENSE +202 -0
  6. data/NOTICE.TXT +5 -0
  7. data/README.md +106 -0
  8. data/docs/index.asciidoc +1369 -0
  9. data/lib/logstash/outputs/elasticsearch/data_stream_support.rb +282 -0
  10. data/lib/logstash/outputs/elasticsearch/default-ilm-policy.json +14 -0
  11. data/lib/logstash/outputs/elasticsearch/http_client/manticore_adapter.rb +155 -0
  12. data/lib/logstash/outputs/elasticsearch/http_client/pool.rb +534 -0
  13. data/lib/logstash/outputs/elasticsearch/http_client.rb +497 -0
  14. data/lib/logstash/outputs/elasticsearch/http_client_builder.rb +201 -0
  15. data/lib/logstash/outputs/elasticsearch/ilm.rb +92 -0
  16. data/lib/logstash/outputs/elasticsearch/license_checker.rb +52 -0
  17. data/lib/logstash/outputs/elasticsearch/template_manager.rb +131 -0
  18. data/lib/logstash/outputs/elasticsearch/templates/ecs-disabled/elasticsearch-6x.json +45 -0
  19. data/lib/logstash/outputs/elasticsearch/templates/ecs-disabled/elasticsearch-7x.json +44 -0
  20. data/lib/logstash/outputs/elasticsearch/templates/ecs-disabled/elasticsearch-8x.json +50 -0
  21. data/lib/logstash/outputs/elasticsearch.rb +699 -0
  22. data/lib/logstash/plugin_mixins/elasticsearch/api_configs.rb +237 -0
  23. data/lib/logstash/plugin_mixins/elasticsearch/common.rb +409 -0
  24. data/lib/logstash/plugin_mixins/elasticsearch/noop_license_checker.rb +9 -0
  25. data/logstash-output-elasticsearch.gemspec +40 -0
  26. data/spec/es_spec_helper.rb +225 -0
  27. data/spec/fixtures/_nodes/6x.json +81 -0
  28. data/spec/fixtures/_nodes/7x.json +92 -0
  29. data/spec/fixtures/htpasswd +2 -0
  30. data/spec/fixtures/license_check/active.json +16 -0
  31. data/spec/fixtures/license_check/inactive.json +5 -0
  32. data/spec/fixtures/nginx_reverse_proxy.conf +22 -0
  33. data/spec/fixtures/scripts/painless/scripted_update.painless +2 -0
  34. data/spec/fixtures/scripts/painless/scripted_update_nested.painless +1 -0
  35. data/spec/fixtures/scripts/painless/scripted_upsert.painless +1 -0
  36. data/spec/fixtures/template-with-policy-es6x.json +48 -0
  37. data/spec/fixtures/template-with-policy-es7x.json +45 -0
  38. data/spec/fixtures/template-with-policy-es8x.json +50 -0
  39. data/spec/fixtures/test_certs/ca.crt +29 -0
  40. data/spec/fixtures/test_certs/ca.der.sha256 +1 -0
  41. data/spec/fixtures/test_certs/ca.key +51 -0
  42. data/spec/fixtures/test_certs/renew.sh +13 -0
  43. data/spec/fixtures/test_certs/test.crt +30 -0
  44. data/spec/fixtures/test_certs/test.der.sha256 +1 -0
  45. data/spec/fixtures/test_certs/test.key +51 -0
  46. data/spec/fixtures/test_certs/test.p12 +0 -0
  47. data/spec/fixtures/test_certs/test_invalid.crt +36 -0
  48. data/spec/fixtures/test_certs/test_invalid.key +51 -0
  49. data/spec/fixtures/test_certs/test_invalid.p12 +0 -0
  50. data/spec/fixtures/test_certs/test_self_signed.crt +32 -0
  51. data/spec/fixtures/test_certs/test_self_signed.key +54 -0
  52. data/spec/fixtures/test_certs/test_self_signed.p12 +0 -0
  53. data/spec/integration/outputs/compressed_indexing_spec.rb +70 -0
  54. data/spec/integration/outputs/create_spec.rb +67 -0
  55. data/spec/integration/outputs/data_stream_spec.rb +68 -0
  56. data/spec/integration/outputs/delete_spec.rb +63 -0
  57. data/spec/integration/outputs/ilm_spec.rb +534 -0
  58. data/spec/integration/outputs/index_spec.rb +421 -0
  59. data/spec/integration/outputs/index_version_spec.rb +98 -0
  60. data/spec/integration/outputs/ingest_pipeline_spec.rb +75 -0
  61. data/spec/integration/outputs/metrics_spec.rb +66 -0
  62. data/spec/integration/outputs/no_es_on_startup_spec.rb +78 -0
  63. data/spec/integration/outputs/painless_update_spec.rb +99 -0
  64. data/spec/integration/outputs/parent_spec.rb +94 -0
  65. data/spec/integration/outputs/retry_spec.rb +182 -0
  66. data/spec/integration/outputs/routing_spec.rb +61 -0
  67. data/spec/integration/outputs/sniffer_spec.rb +94 -0
  68. data/spec/integration/outputs/templates_spec.rb +133 -0
  69. data/spec/integration/outputs/unsupported_actions_spec.rb +75 -0
  70. data/spec/integration/outputs/update_spec.rb +114 -0
  71. data/spec/spec_helper.rb +10 -0
  72. data/spec/support/elasticsearch/api/actions/delete_ilm_policy.rb +19 -0
  73. data/spec/support/elasticsearch/api/actions/get_alias.rb +18 -0
  74. data/spec/support/elasticsearch/api/actions/get_ilm_policy.rb +18 -0
  75. data/spec/support/elasticsearch/api/actions/put_alias.rb +24 -0
  76. data/spec/support/elasticsearch/api/actions/put_ilm_policy.rb +25 -0
  77. data/spec/unit/http_client_builder_spec.rb +185 -0
  78. data/spec/unit/outputs/elasticsearch/data_stream_support_spec.rb +612 -0
  79. data/spec/unit/outputs/elasticsearch/http_client/manticore_adapter_spec.rb +151 -0
  80. data/spec/unit/outputs/elasticsearch/http_client/pool_spec.rb +501 -0
  81. data/spec/unit/outputs/elasticsearch/http_client_spec.rb +339 -0
  82. data/spec/unit/outputs/elasticsearch/template_manager_spec.rb +189 -0
  83. data/spec/unit/outputs/elasticsearch_proxy_spec.rb +103 -0
  84. data/spec/unit/outputs/elasticsearch_spec.rb +1573 -0
  85. data/spec/unit/outputs/elasticsearch_ssl_spec.rb +197 -0
  86. data/spec/unit/outputs/error_whitelist_spec.rb +56 -0
  87. data/spec/unit/outputs/license_check_spec.rb +57 -0
  88. metadata +423 -0
@@ -0,0 +1,534 @@
1
+ require_relative "../../../spec/es_spec_helper"
2
+
3
+ shared_examples_for 'an ILM enabled Logstash' do
4
+
5
+ context 'with a policy with a maximum number of documents' do
6
+ let (:policy) { small_max_doc_policy }
7
+ let (:ilm_policy_name) { "logstash-policy-custom"}
8
+ let (:settings) { super().merge("ilm_policy" => ilm_policy_name)}
9
+
10
+ it 'should rollover when the policy max docs is reached' do
11
+ put_policy(@es, ilm_policy_name, policy)
12
+ subject.register
13
+
14
+ subject.multi_receive([
15
+ LogStash::Event.new("message" => "sample message here"),
16
+ LogStash::Event.new("somemessage" => { "message" => "sample nested message here" }),
17
+ LogStash::Event.new("somevalue" => 100),
18
+ ])
19
+
20
+ sleep(6)
21
+
22
+ subject.multi_receive([
23
+ LogStash::Event.new("country" => "us"),
24
+ LogStash::Event.new("country" => "at"),
25
+ LogStash::Event.new("geoip" => { "location" => [ 0.0, 0.0 ] })
26
+ ])
27
+
28
+ sleep(6)
29
+
30
+ subject.multi_receive([
31
+ LogStash::Event.new("country" => "uk"),
32
+ LogStash::Event.new("country" => "fr"),
33
+ LogStash::Event.new("geoip" => { "location" => [ 0.1, 1.0 ] })
34
+ ])
35
+
36
+ @es.indices.refresh
37
+
38
+ # Wait or fail until everything's indexed.
39
+ Stud::try(20.times) do
40
+ r = @es.search(index: "#{expected_index}-*")
41
+ expect(r).to have_hits(9)
42
+ end
43
+ indexes_written = @es.search(index: "#{expected_index}-*")['hits']['hits'].each_with_object(Hash.new(0)) do |x, res|
44
+ index_written = x['_index']
45
+ res[index_written] += 1
46
+ end
47
+ expect(indexes_written.count).to eq(3)
48
+ expect(indexes_written["#{expected_index}-#{todays_date}-000001"]).to eq(3)
49
+ expect(indexes_written["#{expected_index}-#{todays_date}-000002"]).to eq(3)
50
+ expect(indexes_written["#{expected_index}-#{todays_date}-000003"]).to eq(3)
51
+ end
52
+ end
53
+
54
+ context 'with a policy where the maximum number of documents is not reached' do
55
+ let (:policy) { large_max_doc_policy }
56
+ let (:ilm_policy_name) { "logstash-policy-custom-policy"}
57
+ let (:settings) { super().merge("ilm_policy" => ilm_policy_name)}
58
+
59
+ it 'should ingest into a single index when max docs is not reached' do
60
+ put_policy(@es,ilm_policy_name, policy)
61
+ subject.register
62
+
63
+ subject.multi_receive([
64
+ LogStash::Event.new("message" => "sample message here"),
65
+ LogStash::Event.new("somemessage" => { "message" => "sample nested message here" }),
66
+ LogStash::Event.new("somevalue" => 100),
67
+ ])
68
+
69
+ sleep(6)
70
+
71
+ subject.multi_receive([
72
+ LogStash::Event.new("country" => "us"),
73
+ LogStash::Event.new("country" => "at"),
74
+ LogStash::Event.new("geoip" => { "location" => [ 0.0, 0.0 ] })
75
+ ])
76
+
77
+ @es.indices.refresh
78
+
79
+ # Wait or fail until everything's indexed.
80
+ Stud::try(20.times) do
81
+ r = @es.search(index: "#{expected_index}-*")
82
+ expect(r).to have_hits(6)
83
+ end
84
+ indexes_written = @es.search(index: "#{expected_index}-*")['hits']['hits'].each_with_object(Hash.new(0)) do |x, res|
85
+ index_written = x['_index']
86
+ res[index_written] += 1
87
+ end
88
+ expect(indexes_written.count).to eq(1)
89
+ expect(indexes_written["#{expected_index}-#{todays_date}-000001"]).to eq(6)
90
+ end
91
+ end
92
+ end
93
+
94
+ shared_examples_for 'an ILM disabled Logstash' do
95
+ it 'should not create a rollover alias' do
96
+ expect(@es.indices.exists_alias(name: "logstash")).to be_falsey
97
+ subject.register
98
+ sleep(1)
99
+ expect(@es.indices.exists_alias(name: "logstash")).to be_falsey
100
+ end
101
+
102
+ it 'should not install the default policy' do
103
+ subject.register
104
+ sleep(1)
105
+ expect{get_policy(@es, LogStash::Outputs::ElasticSearch::DEFAULT_POLICY)}.to raise_error(Elasticsearch::Transport::Transport::Errors::NotFound)
106
+ end
107
+
108
+ it 'should not write the ILM settings into the template' do
109
+ subject.register
110
+ sleep(1)
111
+
112
+ template = get_template(@es, "logstash")
113
+ expect(template).to have_index_pattern("logstash-*")
114
+ expect(get_template_settings(template)['index']['lifecycle']).to be_nil
115
+ end
116
+
117
+ context 'with an existing policy that will roll over' do
118
+ let (:policy) { small_max_doc_policy }
119
+ let (:ilm_policy_name) { "logstash-policy-3_docs"}
120
+ let (:settings) { super().merge("ilm_policy" => ilm_policy_name)}
121
+
122
+ it 'should not roll over indices' do
123
+ subject.register
124
+ subject.multi_receive([
125
+ LogStash::Event.new("message" => "sample message here"),
126
+ LogStash::Event.new("somemessage" => { "message" => "sample nested message here" }),
127
+ LogStash::Event.new("somevalue" => 100),
128
+ ])
129
+
130
+ sleep(6)
131
+
132
+ subject.multi_receive([
133
+ LogStash::Event.new("country" => "us"),
134
+ LogStash::Event.new("country" => "at"),
135
+ LogStash::Event.new("geoip" => { "location" => [ 0.0, 0.0 ] })
136
+ ])
137
+
138
+ @es.indices.refresh
139
+
140
+ # Wait or fail until everything's indexed.
141
+ Stud::try(20.times) do
142
+ r = @es.search(index: 'logstash-*')
143
+ expect(r).to have_hits(6)
144
+ end
145
+ indexes_written = @es.search(index: 'logstash-*')['hits']['hits'].each_with_object(Hash.new(0)) do |x, res|
146
+ index_written = x['_index']
147
+ res[index_written] += 1
148
+ end
149
+ expect(indexes_written.count).to eq(1)
150
+ expect(indexes_written.values.first).to eq(6)
151
+ end
152
+ end
153
+
154
+ context 'with a custom template name' do
155
+ let (:template_name) { "logstash_custom_template_name" }
156
+ let (:settings) { super().merge('template_name' => template_name)}
157
+
158
+ it 'should not write the ILM settings into the template' do
159
+ subject.register
160
+ sleep(1)
161
+
162
+ template = get_template(@es, template_name)
163
+ expect(template).to have_index_pattern("logstash-*")
164
+ expect(get_template_settings(template)['index']['lifecycle']).to be_nil
165
+ end
166
+ end
167
+ end
168
+
169
+ shared_examples_for 'an Elasticsearch instance that does not support index lifecycle management' do
170
+ require "logstash/outputs/elasticsearch"
171
+
172
+ let (:ilm_enabled) { false }
173
+ let (:settings) {
174
+ {
175
+ "hosts" => "#{get_host_port()}"
176
+ }
177
+ }
178
+
179
+ before :each do
180
+ require "elasticsearch"
181
+
182
+ # Clean ES of data before we start.
183
+ @es = get_client
184
+ clean(@es)
185
+ end
186
+
187
+ after :each do
188
+ clean(@es)
189
+ end
190
+
191
+ subject { LogStash::Outputs::ElasticSearch.new(settings) }
192
+
193
+ context 'when ilm is enabled in Logstash' do
194
+ let (:settings) { super().merge!({ 'ilm_enabled' => true }) }
195
+
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)
200
+ expect do
201
+ begin
202
+ subject.register
203
+ finish_register.call
204
+ sleep(1.5) # wait_for_successful_connection (for the thread to raise)
205
+ ensure
206
+ subject.send :stop_after_successful_connection_thread
207
+ end
208
+ end.to raise_error(LogStash::ConfigurationError)
209
+ end
210
+ end
211
+
212
+ context 'when ilm is disabled in Logstash' do
213
+ let (:settings) { super().merge!({ 'ilm_enabled' => false }) }
214
+
215
+ it_behaves_like 'an ILM disabled Logstash'
216
+ end
217
+
218
+ context 'when ilm is set to auto in Logstash' do
219
+ let (:settings) { super().merge!({ 'ilm_enabled' => 'auto' }) }
220
+
221
+ it_behaves_like 'an ILM disabled Logstash'
222
+ end
223
+
224
+ context 'when ilm is not set in Logstash' do
225
+ it_behaves_like 'an ILM disabled Logstash'
226
+ end
227
+
228
+ end
229
+
230
+ describe 'Elasticsearch has index lifecycle management enabled', :integration => true do
231
+
232
+ DEFAULT_INTERVAL = '600s'
233
+
234
+ let (:ilm_enabled) { true }
235
+
236
+ let (:settings) {
237
+ {
238
+ "ilm_enabled" => ilm_enabled,
239
+ "hosts" => "#{get_host_port()}",
240
+ "ecs_compatibility" => "disabled", # specs are tightly tied to non-ECS defaults
241
+ }
242
+ }
243
+ let (:small_max_doc_policy) { max_docs_policy(3) }
244
+ let (:large_max_doc_policy) { max_docs_policy(1000000) }
245
+ let (:expected_index) { elasticsearch_output_plugin.default_ilm_rollover_alias }
246
+
247
+ subject(:elasticsearch_output_plugin) { LogStash::Outputs::ElasticSearch.new(settings) }
248
+
249
+ before :each do
250
+ # Delete all templates first.
251
+ require "elasticsearch"
252
+
253
+ # Clean ES of data before we start.
254
+ @es = get_client
255
+ clean(@es)
256
+ # Set the poll interval for lifecycle management to be short so changes get picked up in time.
257
+ set_cluster_settings(@es, {
258
+ "persistent" => {
259
+ "indices.lifecycle.poll_interval" => "1s"
260
+ }
261
+ })
262
+ end
263
+
264
+ after :each do
265
+ # Set poll interval back to default
266
+ set_cluster_settings(@es, {
267
+ "persistent" => {
268
+ "indices.lifecycle.poll_interval" => DEFAULT_INTERVAL
269
+ }
270
+ })
271
+ clean(@es)
272
+ end
273
+
274
+ context 'with ilm enabled' do
275
+ let (:ilm_enabled) { true }
276
+
277
+ context 'when using the default policy' do
278
+ context 'with a custom pattern' do
279
+ let (:settings) { super().merge("ilm_pattern" => "000001")}
280
+ it 'should create a rollover alias' do
281
+ expect(@es.indices.exists_alias(name: "logstash")).to be_falsey
282
+ subject.register
283
+ sleep(1)
284
+ expect(@es.indices.exists_alias(name: "logstash")).to be_truthy
285
+ expect(@es.get_alias(name: "logstash")).to include("logstash-000001")
286
+ end
287
+ end
288
+
289
+ it 'should install it if it is not present' do
290
+ expect{get_policy(@es, LogStash::Outputs::ElasticSearch::DEFAULT_POLICY)}.to raise_error(Elasticsearch::Transport::Transport::Errors::NotFound)
291
+ subject.register
292
+ sleep(1)
293
+ expect{get_policy(@es, LogStash::Outputs::ElasticSearch::DEFAULT_POLICY)}.not_to raise_error
294
+ end
295
+
296
+ it 'should create the default rollover alias' do
297
+ expect(@es.indices.exists_alias(name: "logstash")).to be_falsey
298
+ subject.register
299
+ sleep(1)
300
+ expect(@es.indices.exists_alias(name: "logstash")).to be_truthy
301
+ expect(@es.get_alias(name: "logstash")).to include("logstash-#{todays_date}-000001")
302
+ end
303
+
304
+ it 'should ingest into a single index' do
305
+ subject.register
306
+ subject.multi_receive([
307
+ LogStash::Event.new("message" => "sample message here"),
308
+ LogStash::Event.new("somemessage" => { "message" => "sample nested message here" }),
309
+ LogStash::Event.new("somevalue" => 100),
310
+ ])
311
+
312
+ sleep(6)
313
+
314
+ subject.multi_receive([
315
+ LogStash::Event.new("country" => "us"),
316
+ LogStash::Event.new("country" => "at"),
317
+ LogStash::Event.new("geoip" => { "location" => [ 0.0, 0.0 ] })
318
+ ])
319
+
320
+ @es.indices.refresh
321
+
322
+ # Wait or fail until everything's indexed.
323
+ Stud::try(20.times) do
324
+ r = @es.search(index: "logstash-*")
325
+ expect(r).to have_hits(6)
326
+ end
327
+ indexes_written = @es.search(index: "logstash-*")['hits']['hits'].each_with_object(Hash.new(0)) do |x, res|
328
+ index_written = x['_index']
329
+ res[index_written] += 1
330
+ end
331
+
332
+ expect(indexes_written.count).to eq(1)
333
+ expect(indexes_written["logstash-#{todays_date}-000001"]).to eq(6)
334
+ end
335
+ end
336
+
337
+ context 'when not using the default policy' do
338
+ let (:ilm_policy_name) {"logstash-policy-small"}
339
+ let (:settings) { super().merge("ilm_policy" => ilm_policy_name)}
340
+ let (:policy) { small_max_doc_policy }
341
+
342
+ before do
343
+ expect{get_policy(@es, LogStash::Outputs::ElasticSearch::DEFAULT_POLICY)}.to raise_error(Elasticsearch::Transport::Transport::Errors::NotFound)
344
+ put_policy(@es,ilm_policy_name, policy)
345
+ end
346
+
347
+ it 'should not install the default policy if it is not used' do
348
+ subject.register
349
+ sleep(1)
350
+ expect{get_policy(@es, LogStash::Outputs::ElasticSearch::DEFAULT_POLICY)}.to raise_error(Elasticsearch::Transport::Transport::Errors::NotFound)
351
+ end
352
+ end
353
+
354
+ context 'when using a time based policy' do
355
+ let (:ilm_policy_name) {"logstash-policy-time"}
356
+ let (:settings) { super().merge("ilm_policy" => ilm_policy_name)}
357
+ let (:policy) { max_age_policy("1d") }
358
+
359
+ before do
360
+ expect{get_policy(@es, LogStash::Outputs::ElasticSearch::DEFAULT_POLICY)}.to raise_error(Elasticsearch::Transport::Transport::Errors::NotFound)
361
+ put_policy(@es,ilm_policy_name, policy)
362
+ end
363
+
364
+ it 'should not install the default policy if it is not used' do
365
+ subject.register
366
+ sleep(1)
367
+ expect{get_policy(@es, LogStash::Outputs::ElasticSearch::DEFAULT_POLICY)}.to raise_error(Elasticsearch::Transport::Transport::Errors::NotFound)
368
+ end
369
+ end
370
+
371
+ context 'with the default template' do
372
+ it 'should create the rollover alias' do
373
+ expect(@es.indices.exists_alias(name: expected_index)).to be_falsey
374
+ subject.register
375
+ sleep(1)
376
+ expect(@es.indices.exists_alias(name: expected_index)).to be_truthy
377
+ expect(@es.get_alias(name: expected_index)).to include("#{expected_index}-#{todays_date}-000001")
378
+ end
379
+
380
+ it 'should write the ILM settings into the template' do
381
+ subject.register
382
+ sleep(1)
383
+
384
+ template = get_template(@es, "logstash")
385
+ expect(template).to have_index_pattern("logstash-*")
386
+ expect(get_template_settings(template)['index']['lifecycle']['name']).to eq("logstash-policy")
387
+ expect(get_template_settings(template)['index']['lifecycle']['rollover_alias']).to eq("logstash")
388
+ end
389
+
390
+ it_behaves_like 'an ILM enabled Logstash'
391
+ end
392
+
393
+ context 'with a set index and a custom index pattern' do
394
+ if ESHelper.es_version_satisfies?(">= 8.0")
395
+ let (:template) { "spec/fixtures/template-with-policy-es8x.json" }
396
+ elsif ESHelper.es_version_satisfies?(">= 7.0")
397
+ let (:template) { "spec/fixtures/template-with-policy-es7x.json" }
398
+ else
399
+ let (:template) { "spec/fixtures/template-with-policy-es6x.json" }
400
+ end
401
+
402
+ let (:settings) { super().merge("template" => template,
403
+ "index" => "overwrite-4")}
404
+
405
+ it 'should not overwrite the index patterns' do
406
+ subject.register
407
+ sleep(1)
408
+
409
+ template = get_template(@es, "logstash")
410
+ expect(template).to have_index_pattern("overwrite-*")
411
+ end
412
+ end
413
+
414
+
415
+ context 'with a custom template' do
416
+ let (:ilm_rollover_alias) { "logstash_the_cat_in_the_hat" }
417
+ let (:index) { ilm_rollover_alias }
418
+ let(:expected_index) { index }
419
+ let (:settings) { super().merge("ilm_policy" => ilm_policy_name,
420
+ "template" => template,
421
+ "ilm_rollover_alias" => ilm_rollover_alias)}
422
+
423
+
424
+ if ESHelper.es_version_satisfies?(">= 8.0")
425
+ let (:template) { "spec/fixtures/template-with-policy-es8x.json" }
426
+ elsif ESHelper.es_version_satisfies?(">= 7.0")
427
+ let (:template) { "spec/fixtures/template-with-policy-es7x.json" }
428
+ else
429
+ let (:template) { "spec/fixtures/template-with-policy-es6x.json" }
430
+ end
431
+ let (:ilm_enabled) { true }
432
+ let (:ilm_policy_name) { "logstash-policy-custom-policy" }
433
+ let (:policy) { small_max_doc_policy }
434
+
435
+ before :each do
436
+ put_policy(@es,ilm_policy_name, policy)
437
+ end
438
+
439
+ it_behaves_like 'an ILM enabled Logstash'
440
+
441
+ it 'should create the rollover alias' do
442
+ expect(@es.indices.exists_alias(name: ilm_rollover_alias)).to be_falsey
443
+ subject.register
444
+ sleep(1)
445
+ expect(@es.indices.exists_alias(name: ilm_rollover_alias)).to be_truthy
446
+ expect(@es.get_alias(name: ilm_rollover_alias)).to include("#{ilm_rollover_alias}-#{todays_date}-000001")
447
+ end
448
+
449
+ context 'when the custom rollover alias already exists' do
450
+ it 'should ignore the already exists error' do
451
+ expect(@es.indices.exists_alias(name: ilm_rollover_alias)).to be_falsey
452
+ put_alias(@es, "#{ilm_rollover_alias}-#{todays_date}-000001", ilm_rollover_alias)
453
+ expect(@es.indices.exists_alias(name: ilm_rollover_alias)).to be_truthy
454
+ subject.register
455
+ sleep(1)
456
+ expect(@es.get_alias(name: ilm_rollover_alias)).to include("#{ilm_rollover_alias}-#{todays_date}-000001")
457
+ end
458
+
459
+ end
460
+
461
+ it 'should write the ILM settings into the template' do
462
+ subject.register
463
+ sleep(1)
464
+
465
+ template = get_template(@es, ilm_rollover_alias)
466
+ expect(template).to have_index_pattern("#{ilm_rollover_alias}-*")
467
+ expect(get_template_settings(template)['index']['lifecycle']['name']).to eq(ilm_policy_name)
468
+ expect(get_template_settings(template)['index']['lifecycle']['rollover_alias']).to eq(ilm_rollover_alias)
469
+ end
470
+
471
+ context 'with a different template_name' do
472
+ let (:template_name) { "logstash_custom_template_name" }
473
+ let (:settings) { super().merge('template_name' => template_name)}
474
+
475
+ it_behaves_like 'an ILM enabled Logstash'
476
+
477
+ it 'should write the ILM settings into the template' do
478
+ subject.register
479
+ sleep(1)
480
+ template = get_template(@es, template_name)
481
+ expect(template).to have_index_pattern("#{ilm_rollover_alias}-*")
482
+ expect(get_template_settings(template)['index']['lifecycle']['name']).to eq(ilm_policy_name)
483
+ expect(get_template_settings(template)['index']['lifecycle']['rollover_alias']).to eq(ilm_rollover_alias)
484
+ end
485
+ end
486
+
487
+ end
488
+ end
489
+
490
+ context 'when ilm_enabled is set to "auto"' do
491
+ let (:ilm_enabled) { 'auto' }
492
+
493
+ if ESHelper.es_version_satisfies?(">=7.0")
494
+ context 'when Elasticsearch is version 7 or above' do
495
+ it_behaves_like 'an ILM enabled Logstash'
496
+ end
497
+ end
498
+
499
+ if ESHelper.es_version_satisfies?('< 7.0')
500
+ context 'when Elasticsearch is version 7 or below' do
501
+ it_behaves_like 'an ILM disabled Logstash'
502
+ end
503
+ end
504
+ end
505
+
506
+ context 'when ilm_enabled is the default' do
507
+ let (:settings) { super().tap{|x|x.delete('ilm_enabled')}}
508
+
509
+ if ESHelper.es_version_satisfies?(">=7.0")
510
+ context 'when Elasticsearch is version 7 or above' do
511
+ it_behaves_like 'an ILM enabled Logstash'
512
+ end
513
+ end
514
+
515
+ if ESHelper.es_version_satisfies?('< 7.0')
516
+ context 'when Elasticsearch is version 7 or below' do
517
+ it_behaves_like 'an ILM disabled Logstash'
518
+ end
519
+ end
520
+ end
521
+
522
+ context 'with ilm disabled' do
523
+ let (:settings) { super().merge('ilm_enabled' => false )}
524
+
525
+ it_behaves_like 'an ILM disabled Logstash'
526
+ end
527
+
528
+ context 'with ilm disabled using a string' do
529
+ let (:settings) { super().merge('ilm_enabled' => 'false' )}
530
+
531
+ it_behaves_like 'an ILM disabled Logstash'
532
+ end
533
+
534
+ end