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.
@@ -0,0 +1,52 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ 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
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