Skip to content

Commit 46815e2

Browse files
committed
Resolve template ILM settings based on given template and template_api.
1 parent 815594d commit 46815e2

File tree

4 files changed

+92
-24
lines changed

4 files changed

+92
-24
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## 11.12.5
2+
- Fixes the failure when legacy template (`template_api=>'legacy'`) API is used with custom template, the plugin doesn't resolve ILM settings and crash. [#1102](https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/1102)
3+
14
## 11.12.4
25
- Changed the `manage_template` default value to `false` when data streams is enabled [#1111](https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/1111)
36
- Added the `manage_template => false` as a valid data stream option

lib/logstash/outputs/elasticsearch/template_manager.rb

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,30 @@ def self.add_ilm_settings_to_template(plugin, template)
4646
# definition - remove any existing definition of 'template'
4747
template.delete('template') if template.include?('template') if plugin.maximum_seen_major_version < 8
4848
template['index_patterns'] = "#{plugin.ilm_rollover_alias}-*"
49-
settings = template_settings(plugin, template)
49+
settings = resolve_template_settings(plugin, template)
5050
if settings && (settings['index.lifecycle.name'] || settings['index.lifecycle.rollover_alias'])
5151
plugin.logger.info("Overwriting index lifecycle name and rollover alias as ILM is enabled")
5252
end
5353
settings.update({ 'index.lifecycle.name' => plugin.ilm_policy, 'index.lifecycle.rollover_alias' => plugin.ilm_rollover_alias})
5454
end
5555

56-
def self.template_settings(plugin, template)
57-
plugin.maximum_seen_major_version < 8 ? template['settings']: template['template']['settings']
56+
def self.resolve_template_settings(plugin, template)
57+
return composable_index_template_settings(template) if template.key?('template')
58+
return legacy_index_template_settings(template) if template.key?('settings')
59+
return template_endpoint(plugin) == INDEX_TEMPLATE_ENDPOINT ?
60+
composable_index_template_settings(template) :
61+
legacy_index_template_settings(template)
62+
end
63+
64+
# Returns (if exists) or creates _template API compatible template settings
65+
def self.legacy_index_template_settings(template)
66+
template['settings'] ||= {}
67+
end
68+
69+
# Returns (if exists) or creates _index_template API compatible template settings
70+
def self.composable_index_template_settings(template)
71+
template['template'] ||= {}
72+
template['template']['settings'] ||= {}
5873
end
5974

6075
# Template name - if template_name set, use it

logstash-output-elasticsearch.gemspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Gem::Specification.new do |s|
22
s.name = 'logstash-output-elasticsearch'
3-
s.version = '11.12.4'
3+
s.version = '11.12.5'
44
s.licenses = ['apache-2.0']
55
s.summary = "Stores logs in Elasticsearch"
66
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"

spec/unit/outputs/elasticsearch/template_manager_spec.rb

Lines changed: 70 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
require "logstash/devutils/rspec/spec_helper"
1+
require_relative "../../../../spec/spec_helper"
22
require "logstash/outputs/elasticsearch/template_manager"
33

44
describe LogStash::Outputs::ElasticSearch::TemplateManager do
@@ -33,33 +33,83 @@
3333
end
3434
end
3535

36-
describe "index template with ilm settings" do
36+
context "index template with ilm settings" do
3737
let(:plugin_settings) { {"manage_template" => true, "template_overwrite" => true} }
3838
let(:plugin) { LogStash::Outputs::ElasticSearch.new(plugin_settings) }
3939

40-
describe "in version 8+" do
41-
let(:file_path) { described_class.default_template_path(8) }
42-
let(:template) { described_class.read_template_file(file_path)}
40+
describe "with custom template" do
4341

44-
it "should update settings" do
45-
expect(plugin).to receive(:maximum_seen_major_version).at_least(:once).and_return(8)
46-
described_class.add_ilm_settings_to_template(plugin, template)
47-
expect(template['template']['settings']['index.lifecycle.name']).not_to eq(nil)
48-
expect(template['template']['settings']['index.lifecycle.rollover_alias']).not_to eq(nil)
49-
expect(template.include?('settings')).to be_falsey
42+
describe "in version 8+" do
43+
let(:file_path) { described_class.default_template_path(8) }
44+
let(:template) { described_class.read_template_file(file_path)}
45+
46+
it "should update settings" do
47+
expect(plugin).to receive(:maximum_seen_major_version).at_least(:once).and_return(8)
48+
described_class.add_ilm_settings_to_template(plugin, template)
49+
expect(template['template']['settings']['index.lifecycle.name']).not_to eq(nil)
50+
expect(template['template']['settings']['index.lifecycle.rollover_alias']).not_to eq(nil)
51+
expect(template.include?('settings')).to be_falsey
52+
end
53+
end
54+
55+
describe "in version < 8" do
56+
let(:file_path) { described_class.default_template_path(7) }
57+
let(:template) { described_class.read_template_file(file_path)}
58+
59+
it "should update settings" do
60+
expect(plugin).to receive(:maximum_seen_major_version).at_least(:once).and_return(7)
61+
described_class.add_ilm_settings_to_template(plugin, template)
62+
expect(template['settings']['index.lifecycle.name']).not_to eq(nil)
63+
expect(template['settings']['index.lifecycle.rollover_alias']).not_to eq(nil)
64+
expect(template.include?('template')).to be_falsey
65+
end
5066
end
5167
end
5268

53-
describe "in version < 8" do
54-
let(:file_path) { described_class.default_template_path(7) }
55-
let(:template) { described_class.read_template_file(file_path)}
69+
context "resolve template setting" do
70+
let(:plugin_settings) { super().merge({"template_api" => template_api}) }
71+
72+
describe "with composable template API" do
73+
let(:template_api) { "composable" }
5674

57-
it "should update settings" do
58-
expect(plugin).to receive(:maximum_seen_major_version).at_least(:once).and_return(7)
59-
described_class.add_ilm_settings_to_template(plugin, template)
60-
expect(template['settings']['index.lifecycle.name']).not_to eq(nil)
61-
expect(template['settings']['index.lifecycle.rollover_alias']).not_to eq(nil)
62-
expect(template.include?('template')).to be_falsey
75+
it 'resolves composable index template API compatible setting' do
76+
template = {}
77+
described_class.resolve_template_settings(plugin, template)
78+
expect(template["template"]["settings"]).not_to eq(nil)
79+
end
80+
end
81+
82+
describe "with legacy template API" do
83+
let(:template_api) { "legacy" }
84+
85+
it 'resolves legacy index template API compatible setting' do
86+
template = {}
87+
described_class.resolve_template_settings(plugin, template)
88+
expect(template["settings"]).not_to eq(nil)
89+
end
90+
end
91+
92+
describe "with `template_api => 'auto'`" do
93+
let(:template_api) { "auto" }
94+
95+
describe "with ES < 8 versions" do
96+
97+
it 'resolves legacy index template API compatible setting' do
98+
expect(plugin).to receive(:maximum_seen_major_version).at_least(:once).and_return(7)
99+
template = {}
100+
described_class.resolve_template_settings(plugin, template)
101+
expect(template["settings"]).not_to eq(nil)
102+
end
103+
end
104+
105+
describe "with ES >= 8 versions" do
106+
it 'resolves composable index template API compatible setting' do
107+
expect(plugin).to receive(:maximum_seen_major_version).at_least(:once).and_return(8)
108+
template = {}
109+
described_class.resolve_template_settings(plugin, template)
110+
expect(template["template"]["settings"]).not_to eq(nil)
111+
end
112+
end
63113
end
64114
end
65115
end

0 commit comments

Comments
 (0)