logstash-integration-elastic_enterprise_search 2.2.1 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/README.md +10 -0
- data/lib/logstash/outputs/elastic_app_search.rb +45 -81
- data/lib/logstash/outputs/elastic_workplace_search.rb +67 -37
- data/lib/logstash/plugin_mixins/enterprise_search/client.rb +35 -0
- data/lib/logstash/plugin_mixins/enterprise_search/manticore_transport.rb +84 -0
- data/lib/logstash/plugin_mixins/enterprise_search/ssl_configs.rb +32 -0
- data/logstash-integration-elastic_enterprise_search.gemspec +3 -4
- data/spec/fixtures/certificates/generate.sh +10 -0
- data/spec/fixtures/certificates/root_ca.crt +34 -0
- data/spec/fixtures/certificates/root_ca.key +52 -0
- data/spec/fixtures/certificates/root_keystore.jks +0 -0
- data/spec/fixtures/certificates/root_untrusted_ca.crt +34 -0
- data/spec/fixtures/certificates/root_untrusted_keystore.jks +0 -0
- data/spec/fixtures/certificates/root_untrusted_keystore.p12 +0 -0
- data/spec/integration/outputs/elastic_app_search_spec.rb +133 -105
- data/spec/integration/outputs/elastic_workplace_search_spec.rb +162 -95
- data/spec/unit/outputs/client_spec.rb +26 -0
- data/spec/unit/outputs/elastic_app_search_spec.rb +117 -0
- data/spec/unit/outputs/elastic_workplace_search_spec.rb +117 -0
- data/spec/unit/outputs/manticore_transport_spec.rb +124 -0
- metadata +50 -35
- data/spec/unit/outputs/appsearch_spec.rb +0 -64
@@ -0,0 +1,52 @@
|
|
1
|
+
-----BEGIN PRIVATE KEY-----
|
2
|
+
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
|
51
|
+
kt/GbqpcVj20znJbbvFRlGLnSyk/9dA=
|
52
|
+
-----END PRIVATE KEY-----
|
Binary file
|
@@ -0,0 +1,34 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
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
|
33
|
+
AQ==
|
34
|
+
-----END CERTIFICATE-----
|
Binary file
|
Binary file
|
@@ -1,11 +1,16 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require "json"
|
2
|
+
require 'logstash/devutils/rspec/spec_helper'
|
3
|
+
require 'logstash/codecs/plain'
|
4
|
+
require 'logstash/event'
|
5
|
+
require 'json'
|
7
6
|
|
8
|
-
describe
|
7
|
+
describe 'indexing against running App Search', :integration => true do
|
8
|
+
|
9
|
+
require 'logstash/outputs/elastic_app_search'
|
10
|
+
|
11
|
+
let(:url) { ENV['ENTERPRISE_SEARCH_URL'] }
|
12
|
+
let(:private_api_key) { ENV['APP_SEARCH_PRIVATE_KEY'] }
|
13
|
+
let(:search_api_key) { ENV['APP_SEARCH_SEARCH_KEY'] }
|
9
14
|
|
10
15
|
let(:engine_name) do
|
11
16
|
(0...10).map { ('a'..'z').to_a[rand(26)] }.join
|
@@ -13,136 +18,76 @@ describe "indexing against running App Search", :integration => true do
|
|
13
18
|
|
14
19
|
let(:config) do
|
15
20
|
{
|
16
|
-
|
17
|
-
|
18
|
-
|
21
|
+
'api_key' => private_api_key,
|
22
|
+
'engine' => engine_name,
|
23
|
+
'url' => url
|
19
24
|
}
|
20
25
|
end
|
21
26
|
|
22
27
|
subject(:app_search_output) { LogStash::Outputs::ElasticAppSearch.new(config) }
|
23
28
|
|
24
29
|
before(:each) do
|
25
|
-
create_engine(engine_name
|
30
|
+
create_engine(engine_name)
|
26
31
|
end
|
27
32
|
|
28
33
|
private
|
29
|
-
def create_engine(engine_name, host, api_key)
|
30
|
-
url = host + "/api/as/v1/engines"
|
31
|
-
resp = Faraday.post(url, "{\"name\": \"#{engine_name}\"}",
|
32
|
-
"Content-Type" => "application/json",
|
33
|
-
"Authorization" => "Bearer " + api_key)
|
34
|
-
expect(resp.status).to eq(200)
|
35
|
-
end
|
36
34
|
|
37
|
-
describe
|
35
|
+
describe 'search and private keys are configured' do
|
38
36
|
let(:api_key_settings) do
|
39
37
|
{
|
40
|
-
:private =>
|
41
|
-
:search =>
|
38
|
+
:private => private_api_key,
|
39
|
+
:search => search_api_key
|
42
40
|
}
|
43
41
|
end
|
44
42
|
|
45
|
-
it
|
46
|
-
expect(api_key_settings[:private]).to start_with(
|
47
|
-
expect(api_key_settings[:search]).to start_with(
|
43
|
+
it 'setup api keys' do
|
44
|
+
expect(api_key_settings[:private]).to start_with('private-')
|
45
|
+
expect(api_key_settings[:search]).to start_with('search-')
|
48
46
|
end
|
49
47
|
end
|
50
48
|
|
51
|
-
describe
|
52
|
-
let(:config)
|
53
|
-
|
54
|
-
|
55
|
-
"engine" => "%{engine_name_field}",
|
56
|
-
"url" => "http://enterprise_search:3002"
|
57
|
-
}
|
58
|
-
end
|
49
|
+
describe 'indexing' do
|
50
|
+
let(:config) { super().merge('ssl_verification_mode' => 'none') }
|
51
|
+
let(:total_property_keys) { %w[meta page total_pages] }
|
52
|
+
let(:register) { true }
|
59
53
|
|
60
|
-
|
61
|
-
it "does not raise an error" do
|
62
|
-
expect { subject.register }.to_not raise_error
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
describe "indexing" do
|
68
|
-
|
69
|
-
before do
|
70
|
-
app_search_output.register
|
71
|
-
end
|
54
|
+
before(:each) { app_search_output.register if register }
|
72
55
|
|
73
|
-
describe
|
74
|
-
let(:event) { LogStash::Event.new(
|
56
|
+
describe 'single event' do
|
57
|
+
let(:event) { LogStash::Event.new('message' => 'an event to index') }
|
75
58
|
|
76
|
-
it
|
59
|
+
it 'should be indexed' do
|
77
60
|
app_search_output.multi_receive([event])
|
78
|
-
|
79
|
-
results = Stud.try(20.times, RSpec::Expectations::ExpectationNotMetError) do
|
80
|
-
attempt_response = execute_search_call(engine_name)
|
81
|
-
expect(attempt_response.status).to eq(200)
|
82
|
-
parsed_resp = JSON.parse(attempt_response.body)
|
83
|
-
expect(parsed_resp.dig("meta", "page", "total_pages")).to eq(1)
|
84
|
-
parsed_resp["results"]
|
85
|
-
end
|
86
|
-
expect(results.first.dig("message", "raw")).to eq "an event to index"
|
61
|
+
expect_indexed(engine_name, 1, total_property_keys)
|
87
62
|
end
|
88
63
|
|
89
|
-
context
|
90
|
-
let(:config)
|
91
|
-
|
92
|
-
"api_key" => ENV['APP_SEARCH_PRIVATE_KEY'],
|
93
|
-
"engine" => "%{engine_name_field}",
|
94
|
-
"url" => "http://enterprise_search:3002"
|
95
|
-
}
|
96
|
-
end
|
97
|
-
|
98
|
-
let(:event) { LogStash::Event.new("message" => "an event to index", "engine_name_field" => engine_name) }
|
64
|
+
context 'using sprintf-ed engine' do
|
65
|
+
let(:config) { super().merge('engine' => '%{engine_name_field}') }
|
66
|
+
let(:event) { LogStash::Event.new('message' => 'an event to index', 'engine_name_field' => engine_name) }
|
99
67
|
|
100
|
-
it
|
68
|
+
it 'should be indexed' do
|
101
69
|
app_search_output.multi_receive([event])
|
102
|
-
|
103
|
-
results = Stud.try(20.times, RSpec::Expectations::ExpectationNotMetError) do
|
104
|
-
attempt_response = execute_search_call(engine_name)
|
105
|
-
expect(attempt_response.status).to eq(200)
|
106
|
-
parsed_resp = JSON.parse(attempt_response.body)
|
107
|
-
expect(parsed_resp.dig("meta", "page", "total_pages")).to eq(1)
|
108
|
-
parsed_resp["results"]
|
109
|
-
end
|
110
|
-
expect(results.first.dig("message", "raw")).to eq "an event to index"
|
70
|
+
expect_indexed(engine_name, 1, total_property_keys)
|
111
71
|
end
|
112
72
|
end
|
113
73
|
end
|
114
74
|
|
115
|
-
|
116
|
-
|
117
|
-
url = config["url"] + "/api/as/v1/engines/#{engine_name}/search"
|
118
|
-
resp = Faraday.post(url, '{"query": "event"}',
|
119
|
-
"Content-Type" => "application/json",
|
120
|
-
"Authorization" => "Bearer " + config["api_key"])
|
121
|
-
end
|
122
|
-
|
123
|
-
describe "multiple events" do
|
124
|
-
context "single static engine" do
|
75
|
+
describe 'multiple events' do
|
76
|
+
context 'single static engine' do
|
125
77
|
let(:events) { generate_events(200) } #2 times the slice size used to batch
|
126
78
|
|
127
|
-
it
|
79
|
+
it 'all should be indexed' do
|
128
80
|
app_search_output.multi_receive(events)
|
129
|
-
|
130
81
|
expect_indexed(engine_name, 200)
|
131
82
|
end
|
132
83
|
end
|
133
84
|
|
134
|
-
context
|
135
|
-
let(:config)
|
136
|
-
{
|
137
|
-
"api_key" => ENV['APP_SEARCH_PRIVATE_KEY'],
|
138
|
-
"engine" => "%{engine_name_field}",
|
139
|
-
"url" => "http://enterprise_search:3002"
|
140
|
-
}
|
141
|
-
end
|
85
|
+
context 'with sprintf engines' do
|
86
|
+
let(:config) { super().merge('engine' => '%{engine_name_field}') }
|
142
87
|
|
143
|
-
it
|
144
|
-
create_engine('testengin1'
|
145
|
-
create_engine('testengin2'
|
88
|
+
it 'all should be indexed' do
|
89
|
+
create_engine('testengin1')
|
90
|
+
create_engine('testengin2')
|
146
91
|
events = generate_events(100, 'testengin1')
|
147
92
|
events += generate_events(100, 'testengin2')
|
148
93
|
events.shuffle!
|
@@ -155,26 +100,109 @@ describe "indexing against running App Search", :integration => true do
|
|
155
100
|
end
|
156
101
|
end
|
157
102
|
|
103
|
+
describe 'with ssl enabled using a self-signed certificate', :secure_integration => true do
|
104
|
+
let(:ca_cert) { 'spec/fixtures/certificates/root_ca.crt' }
|
105
|
+
let(:event_message) { 'an event to index with ssl enabled' }
|
106
|
+
let(:event) { LogStash::Event.new('message' => event_message) }
|
107
|
+
|
108
|
+
context 'and ssl_verification_mode set to `full`' do
|
109
|
+
let(:config) { super().merge('ssl_verification_mode' => 'full') }
|
110
|
+
let(:register) { false }
|
111
|
+
|
112
|
+
it 'should raise an error' do
|
113
|
+
allow(app_search_output).to receive(:check_connection!).and_return(nil)
|
114
|
+
app_search_output.register
|
115
|
+
app_search_output.instance_variable_set(:@retry_disabled, true)
|
116
|
+
|
117
|
+
expect { app_search_output.multi_receive([event]) }.to raise_error(/PKIX path/)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
context 'and ssl_certificate_authorities set to a valid CA' do
|
122
|
+
let(:config) { super().merge('ssl_certificate_authorities' => ca_cert) }
|
123
|
+
it 'should be indexed' do
|
124
|
+
app_search_output.multi_receive([event])
|
125
|
+
expect_indexed(engine_name, 1, %w[meta page total_pages], event_message)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
context 'and ssl_truststore_path set to a valid CA' do
|
130
|
+
let(:config) do
|
131
|
+
super().merge(
|
132
|
+
'ssl_truststore_path' => 'spec/fixtures/certificates/root_keystore.jks',
|
133
|
+
'ssl_truststore_password' => 'changeme'
|
134
|
+
)
|
135
|
+
end
|
136
|
+
|
137
|
+
it 'should be indexed' do
|
138
|
+
app_search_output.multi_receive([event])
|
139
|
+
expect_indexed(engine_name, 1, %w[meta page total_pages], event_message)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
context 'and ssl_supported_protocols configured' do
|
144
|
+
let(:config) { super().merge('ssl_certificate_authorities' => ca_cert, 'ssl_supported_protocols' => 'TLSv1.3') }
|
145
|
+
|
146
|
+
it 'should be indexed' do
|
147
|
+
app_search_output.multi_receive([event])
|
148
|
+
expect_indexed(engine_name, 1, %w[meta page total_pages], event_message)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
context 'and ssl_cipher_suites configured' do
|
153
|
+
let(:config) { super().merge('ssl_certificate_authorities' => ca_cert, 'ssl_cipher_suites' => 'TLS_AES_256_GCM_SHA384') }
|
154
|
+
|
155
|
+
it 'should be indexed' do
|
156
|
+
app_search_output.multi_receive([event])
|
157
|
+
expect_indexed(engine_name, 1, %w[meta page total_pages], event_message)
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
158
162
|
private
|
159
|
-
|
163
|
+
|
164
|
+
def execute_search_call(engine_name)
|
165
|
+
faraday_client.post("#{url}/api/as/v1/engines/#{engine_name}/search",
|
166
|
+
'{"query": "event"}',
|
167
|
+
'Content-Type' => 'application/json',
|
168
|
+
'Authorization' => "Bearer #{private_api_key}")
|
169
|
+
end
|
170
|
+
|
171
|
+
def expect_indexed(engine_name, total_expected, total_property_keys = %w[meta page total_results], message_prefix = 'an event to index')
|
160
172
|
results = Stud.try(20.times, RSpec::Expectations::ExpectationNotMetError) do
|
161
173
|
attempt_response = execute_search_call(engine_name)
|
162
174
|
expect(attempt_response.status).to eq(200)
|
163
175
|
parsed_resp = JSON.parse(attempt_response.body)
|
164
|
-
expect(parsed_resp.dig(
|
165
|
-
parsed_resp[
|
176
|
+
expect(parsed_resp.dig(*total_property_keys)).to eq(total_expected)
|
177
|
+
parsed_resp['results']
|
166
178
|
end
|
167
|
-
|
179
|
+
|
180
|
+
expect(results.first.dig('message', 'raw')).to start_with(message_prefix)
|
168
181
|
end
|
169
182
|
|
170
183
|
def generate_events(num_events, engine_name = nil)
|
171
184
|
(1..num_events).map do |i|
|
172
185
|
if engine_name
|
173
|
-
LogStash::Event.new(
|
186
|
+
LogStash::Event.new('message' => "an event to index #{i}", 'engine_name_field' => engine_name)
|
174
187
|
else
|
175
|
-
LogStash::Event.new(
|
188
|
+
LogStash::Event.new('message' => "an event to index #{i}")
|
176
189
|
end
|
177
190
|
end
|
178
191
|
end
|
179
192
|
end
|
180
|
-
|
193
|
+
|
194
|
+
private
|
195
|
+
|
196
|
+
def faraday_client
|
197
|
+
Faraday.new url, ssl: { verify: false }
|
198
|
+
end
|
199
|
+
|
200
|
+
def create_engine(engine_name)
|
201
|
+
resp = faraday_client.post("#{url}/api/as/v1/engines",
|
202
|
+
"{\"name\": \"#{engine_name}\"}",
|
203
|
+
'Content-Type' => 'application/json',
|
204
|
+
'Authorization' => "Bearer #{private_api_key}")
|
205
|
+
|
206
|
+
expect(resp.status).to eq(200)
|
207
|
+
end
|
208
|
+
end
|