logstash-integration-elastic_enterprise_search 2.2.1 → 3.0.1
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 +10 -0
- data/README.md +10 -0
- data/lib/logstash/outputs/elastic_app_search.rb +51 -79
- data/lib/logstash/outputs/elastic_workplace_search.rb +75 -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 +55 -40
- 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
|
+
MIIFzTCCA7WgAwIBAgIUEezrYIhX47jUGV7OZsBZF8jv1FswDQYJKoZIhvcNAQEL
|
3
|
+
BQAwdjELMAkGA1UEBhMCRVMxFDASBgNVBAgMC1RoZSBEYXJrbmV0MRQwEgYDVQQH
|
4
|
+
DAtUaGUgRGFya25ldDEUMBIGA1UECgwLTG9nc3Rhc2ggQ0ExETAPBgNVBAsMCExv
|
5
|
+
Z3N0YXNoMRIwEAYDVQQDDAkxMjcuMC4wLjEwHhcNMjMxMDE2MTQ1MDQ2WhcNMjQx
|
6
|
+
MDE1MTQ1MDQ2WjB2MQswCQYDVQQGEwJFUzEUMBIGA1UECAwLVGhlIERhcmtuZXQx
|
7
|
+
FDASBgNVBAcMC1RoZSBEYXJrbmV0MRQwEgYDVQQKDAtMb2dzdGFzaCBDQTERMA8G
|
8
|
+
A1UECwwITG9nc3Rhc2gxEjAQBgNVBAMMCTEyNy4wLjAuMTCCAiIwDQYJKoZIhvcN
|
9
|
+
AQEBBQADggIPADCCAgoCggIBAOfIpZoaRGvc3zPuUbtwPj0VmWTynboBUbbXfEpl
|
10
|
+
qPhWV8l9xBlDwCgZfM4UjmjDqqGcKGCVPu3KeBlTXpNl1jQiiyHVkW+3tLc3TS1q
|
11
|
+
ZhB0AfUhRA+/KAc9m+zroiTcb/404V4ZVApgWRSK7FSAYnXdD6UUxFKyENrLSt/x
|
12
|
+
6RGcUTveugcG96jw+vtNYMH95pymFB75E8RUHhVgguq/8n48HLNjGJ0Ux2FjmuUx
|
13
|
+
jJGT9I6w6pRxdUvD3jKjYPjY4hw0xKSl2nHFMfjaIidZ4aDJaQwINlX1pRY1xd1n
|
14
|
+
7NEs7QhkPcvFEnRz9BIWPCt8hWhKQ1DIyrtv0c+KaxzdR35ixFCJi5Gwwh4BUU2s
|
15
|
+
hnFtsLrWj//+Fa8zaWhNqLy46F3GPvaXakKrdXMj6LeuRfTHT+gXHTSHrzptq0X5
|
16
|
+
s8fAFS4mnN/4owk8KJXln3XpOeMcDU6u0F3pYf5yQWYv7pPCPMuT2aD2JhZUWeTL
|
17
|
+
36Ybpzay+COfTkoD77avatWxdA/HwPCmmAN0STnvRyK7QSE/3ihmXDSya1/+6Gn/
|
18
|
+
BXKb1nUg6OjeLX0Mp4X4PM9MPbKVKL/je5sgJ4oYbvRlPd4/Y16znzP8ZeHEcVgc
|
19
|
+
tQlyDoqO9o9aK/opyIZbC1H9e5PZqhKGWmmxm/q7lyQ9bFi+FkrT7TvLHKgKsuAY
|
20
|
+
Y7VdAgMBAAGjUzBRMB0GA1UdDgQWBBT6mRpxJs4yBEmTQaLgKFmtajy+szAfBgNV
|
21
|
+
HSMEGDAWgBT6mRpxJs4yBEmTQaLgKFmtajy+szAPBgNVHRMBAf8EBTADAQH/MA0G
|
22
|
+
CSqGSIb3DQEBCwUAA4ICAQCxbhhE07kRLXsYSfmSRyKM0yn4MfNkCco8rm8lFOig
|
23
|
+
ux9Cq49vEojLT2ohKrkap7aJ1ldQCxGPsndbcRuMu+Pge4BiYmRMhuvbXkj1dgMe
|
24
|
+
ILsJ4j4cq5l4qH4o5pWE619gaOMmegBTiitslMyP3YR0GU42n17HPjiXpa5W7mJm
|
25
|
+
Y7kVnHv+KIfPwLTqEQx23YjHIwUdTtc4SuiQr32F5o4+Yh/hig9KHhv61e9OrjQG
|
26
|
+
hE/lpW8xjpzWDNPU3+bvIKwF5RIQ0t4IHU/RasMZZCyv5F9nBv59Z4pnzgp284iA
|
27
|
+
0rCodNrCS+f6n76WjyRpAuunweOHE5zXsIXBQJhcGtd9ciKk8DiLkCXTWRpfgMfv
|
28
|
+
D6TrH7AJZ6j+6jH7aDmar8QmQ+R2uD2srvrlU8hGYfA/RSr2Npp/kTfJ8IZOLTxk
|
29
|
+
kP4uheroByjkXbYKlagLlCbHDGrmFi58zXHflT/v+3MU1G9J0aVVzpNETBo1bvTQ
|
30
|
+
+LBRoxwICXr9EGI501iuiQI6r9EkI6IpZo1vrz0k4GvekOLscda08pZTmVEkSNl6
|
31
|
+
/c3k5BO5QoV57IDgg8f+csEKrCWFaPxj47Bhc+VOriSNuxD8ML/aJJ3JsXYurLmc
|
32
|
+
fW13vjENTGpwx84D07vWpeXKcgAwAekXEYiQXoyxPHP2olyrvAX9sQZ6xQLI02OM
|
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
|