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.
@@ -0,0 +1,52 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQDnyKWaGkRr3N8z
3
+ 7lG7cD49FZlk8p26AVG213xKZaj4VlfJfcQZQ8AoGXzOFI5ow6qhnChglT7tyngZ
4
+ U16TZdY0Iosh1ZFvt7S3N00tamYQdAH1IUQPvygHPZvs66Ik3G/+NOFeGVQKYFkU
5
+ iuxUgGJ13Q+lFMRSshDay0rf8ekRnFE73roHBveo8Pr7TWDB/eacphQe+RPEVB4V
6
+ YILqv/J+PByzYxidFMdhY5rlMYyRk/SOsOqUcXVLw94yo2D42OIcNMSkpdpxxTH4
7
+ 2iInWeGgyWkMCDZV9aUWNcXdZ+zRLO0IZD3LxRJ0c/QSFjwrfIVoSkNQyMq7b9HP
8
+ imsc3Ud+YsRQiYuRsMIeAVFNrIZxbbC61o///hWvM2loTai8uOhdxj72l2pCq3Vz
9
+ I+i3rkX0x0/oFx00h686batF+bPHwBUuJpzf+KMJPCiV5Z916TnjHA1OrtBd6WH+
10
+ ckFmL+6TwjzLk9mg9iYWVFnky9+mG6c2svgjn05KA++2r2rVsXQPx8DwppgDdEk5
11
+ 70ciu0EhP94oZlw0smtf/uhp/wVym9Z1IOjo3i19DKeF+DzPTD2ylSi/43ubICeK
12
+ GG70ZT3eP2Nes58z/GXhxHFYHLUJcg6KjvaPWiv6KciGWwtR/XuT2aoShlppsZv6
13
+ u5ckPWxYvhZK0+07yxyoCrLgGGO1XQIDAQABAoICAAVm/FEgrpqS/dLQibAkOBcl
14
+ YztimkGFGVn5IMj9IJiVLpugJktudFKa8Xk+KmmPsfDtWlWR9PMG5pC0jD5EP99c
15
+ NMD3oNmpPvmMPOzDj5hvk8IaYeM6Ed1FVtaJUXCpgKS8p8oRLg/F2h2r9UEs8t6L
16
+ ZftzhfXld5YZ6edZVJTX/161XMGgLHKQF1F3Jruuxsq85jgolwja6w6Vfseo7KZ7
17
+ kTGvLBoxK0p+T1RrOLsF50vSHM2T7Wd0K8AjZbW3HGIK6tBpmzNOpNEHiIdBRYyB
18
+ VUT2Bgov3Qas/y0faHohoW6yI2yV7c2wDC7FvOZIkzVwkawW2f7PZuT+9WspTyq8
19
+ GKsWfeBaCvzT62LHzJuLIs6kpiQbS5yYQu+9Q2FOCTpqaNHpsgA5MHUvTCKEgqa7
20
+ H4CI055eVKgktaCt2j1ShcryYjlYGgJ0opssVxk7EUQD+H28MeJ9BOcvpRv2YjZn
21
+ hRzK3QO2eJWKAbdibVnwBrFeBY007AXj+c8NONPxMUVybWZeCLMNJ/U0/yf6JAmZ
22
+ HfkDZsGN0AlovrvYV/n/ngg3JPdWOHLIwPHjJOfDLx+YaJA7VEEF961HAno66nH+
23
+ CZQClSZsxl3+76IMG7ZpNDddFGYYXC6zSyHbcoo/f1Nz+syG9zC/q6lutd6Y/Pkb
24
+ +FMx1HZMhTzWXDYbdrZRAoIBAQDzyIAHWE4J7f0rBe1YLNwtX2K3TO6UK8qVg4jT
25
+ 1BM7uyCgFe4qU2Yv69oVx3TMAefiPh6DxL6zZRbOYdFFPNWyxFxz129P2mRCTads
26
+ trS+2+nF5F8114zy4vfxn9TC1SDWuGFmukUdvLWAmSJOjrQQn5OPoEZgiP5N8Oq2
27
+ yxrE84qdUGBXEtTaF2RvqpfytB5hepTsDN7/GCUCpVPp+jTNFV7t7LaZIEWUEemD
28
+ VssmdPg4SgV3CNujjuip+RmJr40YeuTk80IqrquOmNOU/mOkRHa/8cwBxmbaH0L2
29
+ AzEAehJYisb0jk3cAm1kNA8VxhTvlPr6jpId47LEbwEGRYAZAoIBAQDzZjSz+1Bn
30
+ AI/3sZM/QHhiXUfJ/iTdhFlzfcwAY4ZO6ksJS2tjTKwvABum7BTFaUyzwfx4Ffn8
31
+ VyHNFBiIENn1VJhaAGUf4kbY/xSGcFOH+BAW+c6XygbcSTF7eFJpd4E116gbOOd0
32
+ I/4ZWHNcbaBx/prj1rHXvt/ytvpjvJzWWAXYQq1mN9Kzf/StuQmaNWc7Tts6qazr
33
+ 9Ovq5GFnHHI/tSG7y5jjzJu+A4d+ES/1Xle6cdozYoQfC48h6TQJHLQehD8fV2Rh
34
+ 4abIYp43JBVaC1gNvRZYRDbNot6SzVq33GRgJdSIiwvaOUCFV0ynAldsuZiPGWzC
35
+ VU4qsA8OoPflAoIBAQDIh5Qw9oVzC44mFsEOuBABTqYwK5tQzNjetg0WWivcBWin
36
+ 5oI71NCI+NQy+BfuPF8XLowBThSkErJ43+O5tXn/jCCUtZD9uaKhG6lt9rilCta4
37
+ jst2ybFKlkLoQdZM0e4qUg7k5rI17OXMO6sJvb8GsY07JtbdT7MIP/WCmX2SptbN
38
+ 4rDszzPBll5qsIQ/A8S94Iyhw1Cnu5+uFnr5S3Slgj/NLNtjCDXTwAw6mmmPX8ZS
39
+ 3yixqtqpJsPiFWLZbEt+6JBieGtkGrxKFxJsS/mAxUR9TZPHngE6yV5WaXekccWn
40
+ ibhwsKIBKQn81AnYmlDcZssw0ZgF+Cg0By9rjj35AoIBAQDmWTjRiKsr/+1AJk9L
41
+ UjFcLhmNwbaT6fhaA5i4WXg3YSaIclb8UAi4JmsFC3IQ7jnH+XN9FpdSSAfWNQmO
42
+ ZBxSQLA6pRsPFK+mF6oOHWoASTS4+cuZ/XmGqsJorpOX+qBPG3yd3rm1QYbt57at
43
+ p5Zrq+BcdcgzfRImeyL2lv77H6zQYTIHhhcjB5rBelfrGFVNXLC/kOr1GALZdy/z
44
+ TImXX03Ak8tq8y4FowNsvMlddt6htbQiYz7UvrTEDBbR9NdF9jRi7eszc0HLbQF8
45
+ /+oxIIFB50ypVk1jSZtI5Y3QaYSZNdQxMR6TdRFp4BfMCrxASllmPFKgi+kBH0Pw
46
+ vUg9AoIBAFzfj1wFuaa6xNyRpS5kde7fVLn3FXfD91noB+UNVEkmqzxPdhCW3OjO
47
+ TGwdtME5pQ8RKMCGrCw0LHQvniAibtuzZQFY+NpYzusZghvoaj/A6bmCTiTGrTuh
48
+ K2Qn+AdMttY2QxWrj217AXEkPzfIAlkJdF9DMH2k3v09EyqrW5ljVbfx5t6SXwK9
49
+ i9RU4YNgDH5nf96iJd3k/ulFlJkUy1yqJCFk6JbDfYQXB0eOP3ORRH8vaOYbrDdT
50
+ mhBJMrVZiMPVxDt24vF+JpLA9+PefhOoXzmAH/CUEn92sBJStgBNm9BnXT59NRxa
51
+ kt/GbqpcVj20znJbbvFRlGLnSyk/9dA=
52
+ -----END PRIVATE KEY-----
@@ -0,0 +1,34 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ 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
33
+ AQ==
34
+ -----END CERTIFICATE-----
@@ -1,11 +1,16 @@
1
1
  # encoding: utf-8
2
- require "logstash/devutils/rspec/spec_helper"
3
- require "logstash/outputs/elastic_app_search"
4
- require "logstash/codecs/plain"
5
- require "logstash/event"
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 "indexing against running App Search", :integration => true do
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
- "api_key" => ENV['APP_SEARCH_PRIVATE_KEY'],
17
- "engine" => engine_name,
18
- "url" => "http://enterprise_search:3002"
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, "http://enterprise_search:3002", ENV['APP_SEARCH_PRIVATE_KEY'])
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 "search and private keys are configured" do
35
+ describe 'search and private keys are configured' do
38
36
  let(:api_key_settings) do
39
37
  {
40
- :private => ENV['APP_SEARCH_PRIVATE_KEY'],
41
- :search => ENV['APP_SEARCH_SEARCH_KEY']
38
+ :private => private_api_key,
39
+ :search => search_api_key
42
40
  }
43
41
  end
44
42
 
45
- it "setup apikeys" do
46
- expect(api_key_settings[:private]).to start_with("private-")
47
- expect(api_key_settings[:search]).to start_with("search-")
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 "register" do
52
- let(:config) do
53
- {
54
- "api_key" => ENV['APP_SEARCH_PRIVATE_KEY'],
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
- context "when engine is defined in sprintf format" do
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 "single event" do
74
- let(:event) { LogStash::Event.new("message" => "an event to index") }
56
+ describe 'single event' do
57
+ let(:event) { LogStash::Event.new('message' => 'an event to index') }
75
58
 
76
- it "should be indexed" do
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 "using sprintf-ed engine" do
90
- let(:config) do
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 "should be indexed" do
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
- private
116
- def execute_search_call(engine_name)
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 "all should be indexed" do
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 "multiple sprintf engines" do
135
- let(:config) do
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 "all should be indexed" do
144
- create_engine('testengin1', "http://enterprise_search:3002", ENV['APP_SEARCH_PRIVATE_KEY'])
145
- create_engine('testengin2', "http://enterprise_search:3002", ENV['APP_SEARCH_PRIVATE_KEY'])
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
- def expect_indexed(engine_name, expected_docs_count)
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("meta", "page", "total_results")).to eq(expected_docs_count)
165
- parsed_resp["results"]
176
+ expect(parsed_resp.dig(*total_property_keys)).to eq(total_expected)
177
+ parsed_resp['results']
166
178
  end
167
- expect(results.first.dig("message", "raw")).to start_with("an event to index")
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("message" => "an event to index #{i}", "engine_name_field" => engine_name)
186
+ LogStash::Event.new('message' => "an event to index #{i}", 'engine_name_field' => engine_name)
174
187
  else
175
- LogStash::Event.new("message" => "an event to index #{i}")
188
+ LogStash::Event.new('message' => "an event to index #{i}")
176
189
  end
177
190
  end
178
191
  end
179
192
  end
180
- end
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