logstash-output-elasticsearch 11.15.8-java → 11.16.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/lib/logstash/outputs/elasticsearch/http_client/pool.rb +17 -2
- data/lib/logstash/outputs/elasticsearch/http_client.rb +4 -0
- data/lib/logstash/outputs/elasticsearch/ilm.rb +9 -2
- data/lib/logstash/outputs/elasticsearch/license_checker.rb +2 -0
- data/lib/logstash/outputs/elasticsearch/template_manager.rb +27 -9
- data/lib/logstash/outputs/elasticsearch.rb +0 -8
- data/lib/logstash/plugin_mixins/elasticsearch/api_configs.rb +9 -1
- data/lib/logstash/plugin_mixins/elasticsearch/common.rb +4 -0
- data/logstash-output-elasticsearch.gemspec +1 -1
- data/spec/es_spec_helper.rb +8 -5
- data/spec/fixtures/license_check/active.json +16 -0
- data/spec/fixtures/license_check/inactive.json +5 -0
- data/spec/unit/outputs/elasticsearch/data_stream_support_spec.rb +3 -1
- data/spec/unit/outputs/elasticsearch/http_client/pool_spec.rb +29 -5
- data/spec/unit/outputs/elasticsearch/template_manager_spec.rb +23 -1
- data/spec/unit/outputs/license_check_spec.rb +32 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c03b46351b4d27e176925ab6aeac172bd2aa8ba7060e73240059489349190af6
|
4
|
+
data.tar.gz: 5e80945b9fd0410587071545e368b0819da30bade44b487db6cbf516410237a1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7b396ead52eefce52b2f4331f92682654ba4532df52a76020897c9a33b043c72e840e2d9c5c6980b7913360101ad64110f9494808fdae39600658d2541d4c699
|
7
|
+
data.tar.gz: d038c717aa4a7588545f14379fbb76ad1218f9c213030f0dc2d9853a8074e24816dc664e09a0eadcfc6fd42d9daa173d5f90032ae15f10808a187579f7d9ee93
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
## 11.16.0
|
2
|
+
- Added support to Serverless Elasticsearch [#1445](https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/1145)
|
3
|
+
|
4
|
+
## 11.15.9
|
5
|
+
- allow dlq_ settings when using data streams [#1144](https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/1144)
|
6
|
+
|
1
7
|
## 11.15.8
|
2
8
|
- Fixes a regression introduced in 11.14.0 which could prevent Logstash 8.8 from establishing a connection to Elasticsearch for Central Management and Monitoring core features [#1141](https://github.com/logstash-plugins/logstash-output-elasticsearch/issues/1141)
|
3
9
|
|
@@ -48,6 +48,8 @@ module LogStash; module Outputs; class ElasticSearch; class HttpClient;
|
|
48
48
|
:sniffer_delay => 10,
|
49
49
|
}.freeze
|
50
50
|
|
51
|
+
BUILD_FLAVOUR_SERVERLESS = 'serverless'.freeze
|
52
|
+
|
51
53
|
def initialize(logger, adapter, initial_urls=[], options={})
|
52
54
|
@logger = logger
|
53
55
|
@adapter = adapter
|
@@ -75,6 +77,7 @@ module LogStash; module Outputs; class ElasticSearch; class HttpClient;
|
|
75
77
|
@license_checker = options[:license_checker] || LogStash::PluginMixins::ElasticSearch::NoopLicenseChecker::INSTANCE
|
76
78
|
|
77
79
|
@last_es_version = Concurrent::AtomicReference.new
|
80
|
+
@build_flavour = Concurrent::AtomicReference.new
|
78
81
|
end
|
79
82
|
|
80
83
|
def start
|
@@ -250,7 +253,10 @@ module LogStash; module Outputs; class ElasticSearch; class HttpClient;
|
|
250
253
|
# If no exception was raised it must have succeeded!
|
251
254
|
logger.warn("Restored connection to ES instance", url: url.sanitized.to_s)
|
252
255
|
# We reconnected to this node, check its ES version
|
253
|
-
|
256
|
+
version_info = get_es_version(url)
|
257
|
+
es_version = version_info.fetch('number', nil)
|
258
|
+
build_flavour = version_info.fetch('build_flavor', nil)
|
259
|
+
|
254
260
|
if es_version.nil?
|
255
261
|
logger.warn("Failed to retrieve Elasticsearch version data from connected endpoint, connection aborted", :url => url.sanitized.to_s)
|
256
262
|
next
|
@@ -258,6 +264,7 @@ module LogStash; module Outputs; class ElasticSearch; class HttpClient;
|
|
258
264
|
@state_mutex.synchronize do
|
259
265
|
meta[:version] = es_version
|
260
266
|
set_last_es_version(es_version, url)
|
267
|
+
set_build_flavour(build_flavour)
|
261
268
|
|
262
269
|
alive = @license_checker.appropriate_license?(self, url)
|
263
270
|
meta[:state] = alive ? :alive : :dead
|
@@ -475,7 +482,7 @@ module LogStash; module Outputs; class ElasticSearch; class HttpClient;
|
|
475
482
|
|
476
483
|
response = LogStash::Json.load(response.body)
|
477
484
|
|
478
|
-
response.fetch('version', {})
|
485
|
+
response.fetch('version', {})
|
479
486
|
end
|
480
487
|
|
481
488
|
def last_es_version
|
@@ -486,6 +493,10 @@ module LogStash; module Outputs; class ElasticSearch; class HttpClient;
|
|
486
493
|
@state_mutex.synchronize { @maximum_seen_major_version }
|
487
494
|
end
|
488
495
|
|
496
|
+
def serverless?
|
497
|
+
@build_flavour.get == BUILD_FLAVOUR_SERVERLESS
|
498
|
+
end
|
499
|
+
|
489
500
|
private
|
490
501
|
|
491
502
|
# @private executing within @state_mutex
|
@@ -515,5 +526,9 @@ module LogStash; module Outputs; class ElasticSearch; class HttpClient;
|
|
515
526
|
previous_major: @maximum_seen_major_version, new_major: major, node_url: url.sanitized.to_s)
|
516
527
|
end
|
517
528
|
|
529
|
+
def set_build_flavour(flavour)
|
530
|
+
@build_flavour.set(flavour)
|
531
|
+
end
|
532
|
+
|
518
533
|
end
|
519
534
|
end; end; end; end;
|
@@ -14,11 +14,18 @@ module LogStash; module Outputs; class ElasticSearch
|
|
14
14
|
return @ilm_actually_enabled if defined?(@ilm_actually_enabled)
|
15
15
|
@ilm_actually_enabled =
|
16
16
|
begin
|
17
|
-
if
|
17
|
+
if serverless?
|
18
|
+
raise LogStash::ConfigurationError, "Invalid ILM configuration `ilm_enabled => true`. " +
|
19
|
+
"Serverless Elasticsearch cluster does not support Index Lifecycle Management." if @ilm_enabled.to_s == 'true'
|
20
|
+
@logger.info("ILM auto configuration (`ilm_enabled => auto` or unset) resolved to `false`. "\
|
21
|
+
"Serverless Elasticsearch cluster does not support Index Lifecycle Management.") if @ilm_enabled == 'auto'
|
22
|
+
false
|
23
|
+
elsif @ilm_enabled == 'auto'
|
18
24
|
if ilm_on_by_default?
|
19
25
|
ilm_alias_set?
|
20
26
|
else
|
21
|
-
@logger.info("
|
27
|
+
@logger.info("ILM auto configuration (`ilm_enabled => auto` or unset) resolved to `false`."\
|
28
|
+
" Elasticsearch cluster is before 7.0.0, which is the minimum version required to automatically run Index Lifecycle Management")
|
22
29
|
false
|
23
30
|
end
|
24
31
|
elsif @ilm_enabled.to_s == 'true'
|
@@ -11,6 +11,8 @@ module LogStash; module Outputs; class ElasticSearch
|
|
11
11
|
# @param url [LogStash::Util::SafeURI] ES node URL
|
12
12
|
# @return [Boolean] true if provided license is deemed appropriate
|
13
13
|
def appropriate_license?(pool, url)
|
14
|
+
return true if pool.serverless?
|
15
|
+
|
14
16
|
license = extract_license(pool.get_license(url))
|
15
17
|
case license_status(license)
|
16
18
|
when 'active'
|
@@ -13,8 +13,11 @@ module LogStash; module Outputs; class ElasticSearch
|
|
13
13
|
"We recommend either setting `template_api => legacy` to continue providing legacy-style templates, " +
|
14
14
|
"or migrating your template to the composable style and setting `template_api => composable`. " +
|
15
15
|
"The legacy template API is slated for removal in Elasticsearch 9.")
|
16
|
+
elsif plugin.template_api == 'legacy' && plugin.serverless?
|
17
|
+
raise LogStash::ConfigurationError, "Invalid template configuration `template_api => legacy`. Serverless Elasticsearch does not support legacy template API."
|
16
18
|
end
|
17
19
|
|
20
|
+
|
18
21
|
if plugin.template
|
19
22
|
plugin.logger.info("Using mapping template from", :path => plugin.template)
|
20
23
|
template = read_template_file(plugin.template)
|
@@ -61,11 +64,13 @@ module LogStash; module Outputs; class ElasticSearch
|
|
61
64
|
plugin.logger.trace("Resolving ILM template settings: under 'settings' key", :template => template, :template_api => plugin.template_api, :es_version => plugin.maximum_seen_major_version)
|
62
65
|
legacy_index_template_settings(template)
|
63
66
|
else
|
64
|
-
|
65
|
-
plugin.logger.trace("Resolving ILM template settings: template doesn't have 'settings' or 'template' fields, falling back to auto detection", :template => template, :template_api => plugin.template_api, :es_version => plugin.maximum_seen_major_version, :
|
66
|
-
|
67
|
-
composable_index_template_settings(template)
|
67
|
+
use_index_template_api = index_template_api?(plugin)
|
68
|
+
plugin.logger.trace("Resolving ILM template settings: template doesn't have 'settings' or 'template' fields, falling back to auto detection", :template => template, :template_api => plugin.template_api, :es_version => plugin.maximum_seen_major_version, :index_template_api => use_index_template_api)
|
69
|
+
if use_index_template_api
|
70
|
+
composable_index_template_settings(template)
|
71
|
+
else
|
68
72
|
legacy_index_template_settings(template)
|
73
|
+
end
|
69
74
|
end
|
70
75
|
end
|
71
76
|
|
@@ -100,12 +105,25 @@ module LogStash; module Outputs; class ElasticSearch
|
|
100
105
|
end
|
101
106
|
|
102
107
|
def self.template_endpoint(plugin)
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
108
|
+
index_template_api?(plugin) ? INDEX_TEMPLATE_ENDPOINT : LEGACY_TEMPLATE_ENDPOINT
|
109
|
+
end
|
110
|
+
|
111
|
+
def self.index_template_api?(plugin)
|
112
|
+
case plugin.serverless?
|
113
|
+
when true
|
114
|
+
true
|
107
115
|
else
|
108
|
-
|
116
|
+
case plugin.template_api
|
117
|
+
when 'auto'
|
118
|
+
plugin.maximum_seen_major_version >= 8
|
119
|
+
when 'composable'
|
120
|
+
true
|
121
|
+
when 'legacy'
|
122
|
+
false
|
123
|
+
else
|
124
|
+
plugin.logger.warn("Invalid template_api value #{plugin.template_api}")
|
125
|
+
true
|
126
|
+
end
|
109
127
|
end
|
110
128
|
end
|
111
129
|
|
@@ -267,14 +267,6 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
|
|
267
267
|
# ILM policy to use, if undefined the default policy will be used.
|
268
268
|
config :ilm_policy, :validate => :string, :default => DEFAULT_POLICY
|
269
269
|
|
270
|
-
# List extra HTTP's error codes that are considered valid to move the events into the dead letter queue.
|
271
|
-
# It's considered a configuration error to re-use the same predefined codes for success, DLQ or conflict.
|
272
|
-
# The option accepts a list of natural numbers corresponding to HTTP errors codes.
|
273
|
-
config :dlq_custom_codes, :validate => :number, :list => true, :default => []
|
274
|
-
|
275
|
-
# if enabled, failed index name interpolation events go into dead letter queue.
|
276
|
-
config :dlq_on_failed_indexname_interpolation, :validate => :boolean, :default => true
|
277
|
-
|
278
270
|
attr_reader :client
|
279
271
|
attr_reader :default_index
|
280
272
|
attr_reader :default_ilm_rollover_alias
|
@@ -213,7 +213,15 @@ module LogStash; module PluginMixins; module ElasticSearch
|
|
213
213
|
:retry_initial_interval => { :validate => :number, :default => 2 },
|
214
214
|
|
215
215
|
# Set max interval in seconds between bulk retries.
|
216
|
-
:retry_max_interval => { :validate => :number, :default => 64 }
|
216
|
+
:retry_max_interval => { :validate => :number, :default => 64 },
|
217
|
+
|
218
|
+
# List extra HTTP's error codes that are considered valid to move the events into the dead letter queue.
|
219
|
+
# It's considered a configuration error to re-use the same predefined codes for success, DLQ or conflict.
|
220
|
+
# The option accepts a list of natural numbers corresponding to HTTP errors codes.
|
221
|
+
:dlq_custom_codes => { :validate => :number, :list => true, :default => [] },
|
222
|
+
|
223
|
+
# if enabled, failed index name interpolation events go into dead letter queue.
|
224
|
+
:dlq_on_failed_indexname_interpolation => { :validate => :boolean, :default => true }
|
217
225
|
}.freeze
|
218
226
|
|
219
227
|
def self.included(base)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'logstash-output-elasticsearch'
|
3
|
-
s.version = '11.
|
3
|
+
s.version = '11.16.0'
|
4
4
|
s.licenses = ['apache-2.0']
|
5
5
|
s.summary = "Stores logs in Elasticsearch"
|
6
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"
|
data/spec/es_spec_helper.rb
CHANGED
@@ -59,11 +59,14 @@ module ESHelper
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def self.es_version
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
62
|
+
{
|
63
|
+
"number" => [
|
64
|
+
nilify(RSpec.configuration.filter[:es_version]),
|
65
|
+
nilify(ENV['ES_VERSION']),
|
66
|
+
nilify(ENV['ELASTIC_STACK_VERSION']),
|
67
|
+
].compact.first,
|
68
|
+
"build_flavor" => 'default'
|
69
|
+
}
|
67
70
|
end
|
68
71
|
|
69
72
|
RSpec::Matchers.define :have_hits do |expected|
|
@@ -0,0 +1,16 @@
|
|
1
|
+
{
|
2
|
+
"license": {
|
3
|
+
"status": "active",
|
4
|
+
"uid": "d85d2c6a-b96d-3cc6-96db-5571a789b156",
|
5
|
+
"type": "enterprise",
|
6
|
+
"issue_date": "1970-01-01T00:00:00.000Z",
|
7
|
+
"issue_date_in_millis": 0,
|
8
|
+
"expiry_date": "2100-01-01T00:00:00.000Z",
|
9
|
+
"expiry_date_in_millis": 4102444800000,
|
10
|
+
"max_nodes": null,
|
11
|
+
"max_resource_units": 100000,
|
12
|
+
"issued_to": "Elastic Cloud",
|
13
|
+
"issuer": "API",
|
14
|
+
"start_date_in_millis": 0
|
15
|
+
}
|
16
|
+
}
|
@@ -164,7 +164,9 @@ describe LogStash::Outputs::ElasticSearch::DataStreamSupport do
|
|
164
164
|
'data_stream_dataset' => 'any',
|
165
165
|
'data_stream_namespace' => 'any',
|
166
166
|
'data_stream_sync_fields' => true,
|
167
|
-
'data_stream_auto_routing' => true
|
167
|
+
'data_stream_auto_routing' => true,
|
168
|
+
'dlq_custom_codes' => [ 404 ],
|
169
|
+
'dlq_on_failed_indexname_interpolation' => false)
|
168
170
|
}
|
169
171
|
|
170
172
|
it 'should enable data-streams by default' do
|
@@ -6,8 +6,8 @@ describe LogStash::Outputs::ElasticSearch::HttpClient::Pool do
|
|
6
6
|
let(:logger) { Cabin::Channel.get }
|
7
7
|
let(:adapter) { LogStash::Outputs::ElasticSearch::HttpClient::ManticoreAdapter.new(logger, {}) }
|
8
8
|
let(:initial_urls) { [::LogStash::Util::SafeURI.new("http://localhost:9200")] }
|
9
|
-
let(:options) { {:resurrect_delay =>
|
10
|
-
let(:
|
9
|
+
let(:options) { {:resurrect_delay => 3, :url_normalizer => proc {|u| u}} } # Shorten the delay a bit to speed up tests
|
10
|
+
let(:es_version_info) { [ { "number" => '0.0.0', "build_flavor" => 'default'} ] }
|
11
11
|
let(:license_status) { 'active' }
|
12
12
|
|
13
13
|
subject { described_class.new(logger, adapter, initial_urls, options) }
|
@@ -22,7 +22,7 @@ describe LogStash::Outputs::ElasticSearch::HttpClient::Pool do
|
|
22
22
|
|
23
23
|
allow(::Manticore::Client).to receive(:new).and_return(manticore_double)
|
24
24
|
|
25
|
-
allow(subject).to receive(:get_es_version).with(any_args).and_return(*
|
25
|
+
allow(subject).to receive(:get_es_version).with(any_args).and_return(*es_version_info)
|
26
26
|
allow(subject.license_checker).to receive(:license_status).and_return(license_status)
|
27
27
|
end
|
28
28
|
|
@@ -267,13 +267,37 @@ describe LogStash::Outputs::ElasticSearch::HttpClient::Pool do
|
|
267
267
|
end
|
268
268
|
|
269
269
|
context "if there are nodes with multiple major versions" do
|
270
|
-
let(:
|
270
|
+
let(:es_version_info) { [ { "number" => '0.0.0', "build_flavor" => 'default'}, { "number" => '6.0.0', "build_flavor" => 'default'} ] }
|
271
271
|
it "picks the largest major version" do
|
272
272
|
expect(subject.maximum_seen_major_version).to eq(6)
|
273
273
|
end
|
274
274
|
end
|
275
275
|
end
|
276
276
|
|
277
|
+
|
278
|
+
describe "build flavour tracking" do
|
279
|
+
let(:initial_urls) { [::LogStash::Util::SafeURI.new("http://somehost:9200")] }
|
280
|
+
|
281
|
+
let(:es_version_info) { [ { "number" => '8.9.0', "build_flavor" => "serverless" } ] }
|
282
|
+
|
283
|
+
let(:valid_response) { MockResponse.new(200,
|
284
|
+
{"tagline" => "You Know, for Search",
|
285
|
+
"version" => {
|
286
|
+
"number" => '8.9.0',
|
287
|
+
"build_flavor" => LogStash::Outputs::ElasticSearch::HttpClient::Pool::BUILD_FLAVOUR_SERVERLESS} },
|
288
|
+
{ "X-Elastic-Product" => "Elasticsearch" }
|
289
|
+
) }
|
290
|
+
|
291
|
+
before(:each) do
|
292
|
+
allow(subject).to receive(:perform_request_to_url).and_return(valid_response)
|
293
|
+
subject.start
|
294
|
+
end
|
295
|
+
|
296
|
+
it "picks the build flavour" do
|
297
|
+
expect(subject.serverless?).to be_truthy
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
277
301
|
describe "license checking" do
|
278
302
|
before(:each) do
|
279
303
|
allow(subject).to receive(:health_check_request)
|
@@ -364,7 +388,7 @@ describe "#elasticsearch?" do
|
|
364
388
|
let(:adapter) { double("Manticore Adapter") }
|
365
389
|
let(:initial_urls) { [::LogStash::Util::SafeURI.new("http://localhost:9200")] }
|
366
390
|
let(:options) { {:resurrect_delay => 2, :url_normalizer => proc {|u| u}} } # Shorten the delay a bit to speed up tests
|
367
|
-
let(:
|
391
|
+
let(:es_version_info) { [{ "number" => '0.0.0', "build_flavor" => 'default'}] }
|
368
392
|
let(:license_status) { 'active' }
|
369
393
|
|
370
394
|
subject { LogStash::Outputs::ElasticSearch::HttpClient::Pool.new(logger, adapter, initial_urls, options) }
|
@@ -73,6 +73,7 @@ describe LogStash::Outputs::ElasticSearch::TemplateManager do
|
|
73
73
|
let(:template_api) { "composable" }
|
74
74
|
|
75
75
|
it 'resolves composable index template API compatible setting' do
|
76
|
+
expect(plugin).to receive(:serverless?).and_return(false)
|
76
77
|
expect(plugin).to receive(:maximum_seen_major_version).at_least(:once).and_return(8) # required to log
|
77
78
|
template = {}
|
78
79
|
described_class.resolve_template_settings(plugin, template)
|
@@ -84,6 +85,7 @@ describe LogStash::Outputs::ElasticSearch::TemplateManager do
|
|
84
85
|
let(:template_api) { "legacy" }
|
85
86
|
|
86
87
|
it 'resolves legacy index template API compatible setting' do
|
88
|
+
expect(plugin).to receive(:serverless?).and_return(false)
|
87
89
|
expect(plugin).to receive(:maximum_seen_major_version).at_least(:once).and_return(7) # required to log
|
88
90
|
template = {}
|
89
91
|
described_class.resolve_template_settings(plugin, template)
|
@@ -97,6 +99,7 @@ describe LogStash::Outputs::ElasticSearch::TemplateManager do
|
|
97
99
|
describe "with ES < 8 versions" do
|
98
100
|
|
99
101
|
it 'resolves legacy index template API compatible setting' do
|
102
|
+
expect(plugin).to receive(:serverless?).and_return(false)
|
100
103
|
expect(plugin).to receive(:maximum_seen_major_version).at_least(:once).and_return(7)
|
101
104
|
template = {}
|
102
105
|
described_class.resolve_template_settings(plugin, template)
|
@@ -106,6 +109,7 @@ describe LogStash::Outputs::ElasticSearch::TemplateManager do
|
|
106
109
|
|
107
110
|
describe "with ES >= 8 versions" do
|
108
111
|
it 'resolves composable index template API compatible setting' do
|
112
|
+
expect(plugin).to receive(:serverless?).and_return(false)
|
109
113
|
expect(plugin).to receive(:maximum_seen_major_version).at_least(:once).and_return(8)
|
110
114
|
template = {}
|
111
115
|
described_class.resolve_template_settings(plugin, template)
|
@@ -123,6 +127,7 @@ describe LogStash::Outputs::ElasticSearch::TemplateManager do
|
|
123
127
|
|
124
128
|
describe "in version 8+" do
|
125
129
|
it "should use index template API" do
|
130
|
+
expect(plugin).to receive(:serverless?).and_return(false)
|
126
131
|
expect(plugin).to receive(:maximum_seen_major_version).at_least(:once).and_return(8)
|
127
132
|
endpoint = described_class.template_endpoint(plugin)
|
128
133
|
expect(endpoint).to be_equal(LogStash::Outputs::ElasticSearch::TemplateManager::INDEX_TEMPLATE_ENDPOINT)
|
@@ -131,6 +136,7 @@ describe LogStash::Outputs::ElasticSearch::TemplateManager do
|
|
131
136
|
|
132
137
|
describe "in version < 8" do
|
133
138
|
it "should use legacy template API" do
|
139
|
+
expect(plugin).to receive(:serverless?).and_return(false)
|
134
140
|
expect(plugin).to receive(:maximum_seen_major_version).at_least(:once).and_return(7)
|
135
141
|
endpoint = described_class.template_endpoint(plugin)
|
136
142
|
expect(endpoint).to be_equal(LogStash::Outputs::ElasticSearch::TemplateManager::LEGACY_TEMPLATE_ENDPOINT)
|
@@ -144,6 +150,7 @@ describe LogStash::Outputs::ElasticSearch::TemplateManager do
|
|
144
150
|
|
145
151
|
describe "in version 8+" do
|
146
152
|
it "should use legacy template API" do
|
153
|
+
expect(plugin).to receive(:serverless?).and_return(false)
|
147
154
|
expect(plugin).to receive(:maximum_seen_major_version).never
|
148
155
|
endpoint = described_class.template_endpoint(plugin)
|
149
156
|
expect(endpoint).to be_equal(LogStash::Outputs::ElasticSearch::TemplateManager::LEGACY_TEMPLATE_ENDPOINT)
|
@@ -157,11 +164,26 @@ describe LogStash::Outputs::ElasticSearch::TemplateManager do
|
|
157
164
|
|
158
165
|
describe "in version 8+" do
|
159
166
|
it "should use legacy template API" do
|
167
|
+
expect(plugin).to receive(:serverless?).and_return(false)
|
160
168
|
expect(plugin).to receive(:maximum_seen_major_version).never
|
161
169
|
endpoint = described_class.template_endpoint(plugin)
|
162
|
-
expect(endpoint).to be_equal(LogStash::Outputs::ElasticSearch::TemplateManager::
|
170
|
+
expect(endpoint).to be_equal(LogStash::Outputs::ElasticSearch::TemplateManager::INDEX_TEMPLATE_ENDPOINT)
|
163
171
|
end
|
164
172
|
end
|
165
173
|
end
|
174
|
+
|
175
|
+
describe "in serverless" do
|
176
|
+
[:auto, :composable, :legacy].each do |api|
|
177
|
+
let(:plugin_settings) { {"manage_template" => true, "template_api" => api.to_s} }
|
178
|
+
let(:plugin) { LogStash::Outputs::ElasticSearch.new(plugin_settings) }
|
179
|
+
|
180
|
+
it "use index template API when template_api set to #{api}" do
|
181
|
+
expect(plugin).to receive(:serverless?).and_return(true)
|
182
|
+
endpoint = described_class.template_endpoint(plugin)
|
183
|
+
expect(endpoint).to be_equal(LogStash::Outputs::ElasticSearch::TemplateManager::INDEX_TEMPLATE_ENDPOINT)
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
end
|
166
188
|
end
|
167
189
|
end
|
@@ -21,5 +21,37 @@ describe LogStash::Outputs::ElasticSearch::LicenseChecker do
|
|
21
21
|
expect(LogStash::Outputs::ElasticSearch::HttpClient::Pool.instance_methods).to include(:get_license)
|
22
22
|
end
|
23
23
|
end
|
24
|
+
|
25
|
+
context "appropriate license" do
|
26
|
+
let(:logger) { double("logger") }
|
27
|
+
let(:url) { LogStash::Util::SafeURI.new("https://cloud.elastic.co") }
|
28
|
+
let(:pool) { double("pool") }
|
29
|
+
subject { described_class.new(logger) }
|
30
|
+
|
31
|
+
it "is true when connect to serverless" do
|
32
|
+
allow(pool).to receive(:serverless?).and_return(true)
|
33
|
+
expect(subject.appropriate_license?(pool, url)).to eq true
|
34
|
+
end
|
35
|
+
|
36
|
+
it "is true when license status is active" do
|
37
|
+
allow(pool).to receive(:serverless?).and_return(false)
|
38
|
+
allow(pool).to receive(:get_license).with(url).and_return(LogStash::Json.load File.read("spec/fixtures/license_check/active.json"))
|
39
|
+
expect(subject.appropriate_license?(pool, url)).to eq true
|
40
|
+
end
|
41
|
+
|
42
|
+
it "is true when license status is inactive" do
|
43
|
+
allow(logger).to receive(:warn).with(instance_of(String), anything)
|
44
|
+
allow(pool).to receive(:serverless?).and_return(false)
|
45
|
+
allow(pool).to receive(:get_license).with(url).and_return(LogStash::Json.load File.read("spec/fixtures/license_check/inactive.json"))
|
46
|
+
expect(subject.appropriate_license?(pool, url)).to eq true
|
47
|
+
end
|
48
|
+
|
49
|
+
it "is false when no license return" do
|
50
|
+
allow(logger).to receive(:error).with(instance_of(String), anything)
|
51
|
+
allow(pool).to receive(:serverless?).and_return(false)
|
52
|
+
allow(pool).to receive(:get_license).with(url).and_return(LogStash::Json.load('{}'))
|
53
|
+
expect(subject.appropriate_license?(pool, url)).to eq false
|
54
|
+
end
|
55
|
+
end
|
24
56
|
end
|
25
57
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-output-elasticsearch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 11.
|
4
|
+
version: 11.16.0
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Elastic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-08-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
@@ -279,6 +279,8 @@ files:
|
|
279
279
|
- spec/fixtures/_nodes/6x.json
|
280
280
|
- spec/fixtures/_nodes/7x.json
|
281
281
|
- spec/fixtures/htpasswd
|
282
|
+
- spec/fixtures/license_check/active.json
|
283
|
+
- spec/fixtures/license_check/inactive.json
|
282
284
|
- spec/fixtures/nginx_reverse_proxy.conf
|
283
285
|
- spec/fixtures/scripts/painless/scripted_update.painless
|
284
286
|
- spec/fixtures/scripts/painless/scripted_update_nested.painless
|
@@ -365,6 +367,8 @@ test_files:
|
|
365
367
|
- spec/fixtures/_nodes/6x.json
|
366
368
|
- spec/fixtures/_nodes/7x.json
|
367
369
|
- spec/fixtures/htpasswd
|
370
|
+
- spec/fixtures/license_check/active.json
|
371
|
+
- spec/fixtures/license_check/inactive.json
|
368
372
|
- spec/fixtures/nginx_reverse_proxy.conf
|
369
373
|
- spec/fixtures/scripts/painless/scripted_update.painless
|
370
374
|
- spec/fixtures/scripts/painless/scripted_update_nested.painless
|