roqua-support 0.1.29 → 0.1.30
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/roqua-support.rb +6 -0
- data/lib/roqua-support/railtie.rb +0 -1
- data/lib/roqua-support/version.rb +1 -1
- data/lib/roqua/status_checks/check_db_connection.rb +13 -0
- data/lib/roqua/status_checks/check_load_balancer_member.rb +15 -0
- data/lib/roqua/status_checks/status_controller.rb +43 -0
- data/spec/internal/config/balancer_state +1 -0
- data/spec/internal/config/routes.rb +3 -0
- data/spec/roqua/status_checks/check_db_connection_spec.rb +15 -0
- data/spec/roqua/status_checks/check_load_balancer_member_spec.rb +22 -0
- data/spec/roqua/status_checks/status_controller_spec.rb +63 -0
- metadata +16 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2a7e7e17065382daf49bff625d1a8008a0a4c0ba
|
4
|
+
data.tar.gz: 9a6b746e175193312045d7a94dc67a57d55577bb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b507ccf0d36fc1941ad3bfb8f4a2714ce0da6e435a6c7356016ecdaffd7d77a6617822803b8ec8e4521b349d9befc228220f1f311248690f87880cfb2a46cfa8
|
7
|
+
data.tar.gz: 9140cb6bc4ea4b6c7b0e13276b0474b4cb3365238cb7e9166d717e85cc80d3eed2f47d7f0997c706cfe6be91afbb662d8abfa09f6dc2a7f536738718e1dd2374
|
data/Gemfile.lock
CHANGED
data/lib/roqua-support.rb
CHANGED
@@ -21,4 +21,10 @@ module Roqua
|
|
21
21
|
autoload :Schedule, 'roqua/scheduling/schedule'
|
22
22
|
autoload :Task, 'roqua/scheduling/task'
|
23
23
|
end
|
24
|
+
|
25
|
+
module StatusChecks
|
26
|
+
autoload :CheckDbConnection, 'roqua/status_checks/check_db_connection'
|
27
|
+
autoload :CheckLoadBalancerMember, 'roqua/status_checks/check_load_balancer_member'
|
28
|
+
autoload :StatusController, 'roqua/status_checks/status_controller'
|
29
|
+
end
|
24
30
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Roqua
|
2
|
+
module StatusChecks
|
3
|
+
module CheckDbConnection
|
4
|
+
def self.connected?
|
5
|
+
ActiveRecord::Base.establish_connection
|
6
|
+
ActiveRecord::Base.connection
|
7
|
+
ActiveRecord::Base.connected?
|
8
|
+
rescue
|
9
|
+
false # Check must return boolean, not an exception.
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Roqua
|
2
|
+
module StatusChecks
|
3
|
+
module CheckLoadBalancerMember
|
4
|
+
InvalidStatus = Class.new(StandardError)
|
5
|
+
|
6
|
+
VALID_STATES = %w(on off)
|
7
|
+
|
8
|
+
def self.balancer_member?(path)
|
9
|
+
state = ::File.read(path).strip
|
10
|
+
raise InvalidStatus, "Invalid state: #{state}" unless VALID_STATES.include?(state)
|
11
|
+
state == "on"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Roqua
|
2
|
+
module StatusChecks
|
3
|
+
# To use this status controller in a Rails application, add a route:
|
4
|
+
#
|
5
|
+
# get '/status' => 'roqua/status_checks/status#balancer_status'
|
6
|
+
#
|
7
|
+
# If you want to add more logic to the status controller, extend it:
|
8
|
+
#
|
9
|
+
# get '/status' => 'status#balancer_status'
|
10
|
+
#
|
11
|
+
# class StatusController < Roqua::StatusChecks::StatusController
|
12
|
+
# skip_before_action :foo
|
13
|
+
# skip_before_action :bar
|
14
|
+
# end
|
15
|
+
class StatusController < ActionController::Base
|
16
|
+
def balancer_status
|
17
|
+
balancer_member = balancer_member?
|
18
|
+
db_connected = db_connected?
|
19
|
+
|
20
|
+
http_code = balancer_member && db_connected ? 200 : 503
|
21
|
+
status = db_connected ? 'ok' : 'error'
|
22
|
+
|
23
|
+
render json: {status: status, member: balancer_member}, status: http_code
|
24
|
+
rescue CheckLoadBalancerMember::InvalidStatus
|
25
|
+
render json: {status: "unknown status"}, status: 500
|
26
|
+
end
|
27
|
+
|
28
|
+
protected
|
29
|
+
|
30
|
+
def balancer_state_file
|
31
|
+
Rails.root.join('config/balancer_state')
|
32
|
+
end
|
33
|
+
|
34
|
+
def balancer_member?
|
35
|
+
CheckLoadBalancerMember.balancer_member?(balancer_state_file)
|
36
|
+
end
|
37
|
+
|
38
|
+
def db_connected?
|
39
|
+
CheckDbConnection.connected?
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
on
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Roqua::StatusChecks::CheckDbConnection' do
|
4
|
+
it 'returns true when there is a db connection' do
|
5
|
+
allow(ActiveRecord::Base).to receive(:establish_connection).and_return(true)
|
6
|
+
allow(ActiveRecord::Base).to receive(:connection).and_return(true)
|
7
|
+
allow(ActiveRecord::Base).to receive(:connected?).and_return(true)
|
8
|
+
|
9
|
+
expect(Roqua::StatusChecks::CheckDbConnection.connected?).to be_truthy
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'returns false when there is no db configured' do
|
13
|
+
expect(Roqua::StatusChecks::CheckDbConnection.connected?).to be_falsey
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Roqua::StatusChecks::CheckLoadBalancerMember' do
|
4
|
+
it 'returns true when the status file contains on' do
|
5
|
+
allow(File).to receive(:read).and_return('on')
|
6
|
+
|
7
|
+
expect(Roqua::StatusChecks::CheckLoadBalancerMember.balancer_member?('foo/bar')).to be_truthy
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'returns false when the status file does not contain off' do
|
11
|
+
allow(File).to receive(:read).and_return('off')
|
12
|
+
|
13
|
+
expect(Roqua::StatusChecks::CheckLoadBalancerMember.balancer_member?('foo/bar')).to be_falsey
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'raises InvalidStatus error when the status file contains something else' do
|
17
|
+
allow(File).to receive(:read).and_return('foo')
|
18
|
+
|
19
|
+
expect { Roqua::StatusChecks::CheckLoadBalancerMember.balancer_member?('foo/bar') }
|
20
|
+
.to raise_error(Roqua::StatusChecks::CheckLoadBalancerMember::InvalidStatus, 'Invalid state: foo')
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Roqua::StatusChecks::StatusController, type: :controller do
|
4
|
+
context 'visiting the status page while balancer member and database is up' do
|
5
|
+
it 'returns the correct status' do
|
6
|
+
allow(Roqua::StatusChecks::CheckLoadBalancerMember).to receive(:balancer_member?).and_return(true)
|
7
|
+
allow(Roqua::StatusChecks::CheckDbConnection).to receive(:connected?).and_return(true)
|
8
|
+
|
9
|
+
get :balancer_status
|
10
|
+
|
11
|
+
expect(response.status).to eq(200)
|
12
|
+
expect(response.body).to eq("{\"status\":\"ok\",\"member\":true}")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'visiting the status page while not balancer member and database is up' do
|
17
|
+
it 'returns the correct status' do
|
18
|
+
allow(Roqua::StatusChecks::CheckLoadBalancerMember).to receive(:balancer_member?).and_return(false)
|
19
|
+
allow(Roqua::StatusChecks::CheckDbConnection).to receive(:connected?).and_return(true)
|
20
|
+
|
21
|
+
get :balancer_status
|
22
|
+
|
23
|
+
expect(response.status).to eq(503)
|
24
|
+
expect(response.body).to eq("{\"status\":\"ok\",\"member\":false}")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'visiting the status page while balancer member and database is down' do
|
29
|
+
it 'returns the correct status' do
|
30
|
+
allow(Roqua::StatusChecks::CheckLoadBalancerMember).to receive(:balancer_member?).and_return(true)
|
31
|
+
allow(Roqua::StatusChecks::CheckDbConnection).to receive(:connected?).and_return(false)
|
32
|
+
|
33
|
+
get :balancer_status
|
34
|
+
|
35
|
+
expect(response.status).to eq(503)
|
36
|
+
expect(response.body).to eq("{\"status\":\"error\",\"member\":true}")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'visiting the status page while not balancer member and database is down' do
|
41
|
+
it 'returns the correct status' do
|
42
|
+
allow(Roqua::StatusChecks::CheckLoadBalancerMember).to receive(:balancer_member?).and_return(false)
|
43
|
+
allow(Roqua::StatusChecks::CheckDbConnection).to receive(:connected?).and_return(false)
|
44
|
+
|
45
|
+
get :balancer_status
|
46
|
+
|
47
|
+
expect(response.status).to eq(503)
|
48
|
+
expect(response.body).to eq("{\"status\":\"error\",\"member\":false}")
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'visiting the status page while balancer_state is on nor off' do
|
53
|
+
it 'returns the correct status' do
|
54
|
+
allow(Roqua::StatusChecks::CheckLoadBalancerMember).to receive(:balancer_member?)
|
55
|
+
.and_raise(Roqua::StatusChecks::CheckLoadBalancerMember::InvalidStatus)
|
56
|
+
|
57
|
+
get :balancer_status
|
58
|
+
|
59
|
+
expect(response.status).to eq(500)
|
60
|
+
expect(response.body).to eq("{\"status\":\"unknown status\"}")
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: roqua-support
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.30
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marten Veldthuis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-04-
|
11
|
+
date: 2018-04-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: active_interaction
|
@@ -221,6 +221,9 @@ files:
|
|
221
221
|
- lib/roqua/scheduling/schedule.rb
|
222
222
|
- lib/roqua/scheduling/scheduler.rb
|
223
223
|
- lib/roqua/scheduling/task.rb
|
224
|
+
- lib/roqua/status_checks/check_db_connection.rb
|
225
|
+
- lib/roqua/status_checks/check_load_balancer_member.rb
|
226
|
+
- lib/roqua/status_checks/status_controller.rb
|
224
227
|
- lib/roqua/support.rb
|
225
228
|
- lib/roqua/support/command_runner.rb
|
226
229
|
- lib/roqua/support/errors.rb
|
@@ -231,6 +234,8 @@ files:
|
|
231
234
|
- lib/roqua/support/stats/hosted_graphite_backend.rb
|
232
235
|
- lib/roqua/validators/subset_validator.rb
|
233
236
|
- roqua-support.gemspec
|
237
|
+
- spec/internal/config/balancer_state
|
238
|
+
- spec/internal/config/routes.rb
|
234
239
|
- spec/roqua/core_ext/active_interaction/date_time_as_unix_extension_spec.rb
|
235
240
|
- spec/roqua/core_ext/active_interaction/duration_filter_spec.rb
|
236
241
|
- spec/roqua/core_ext/active_interaction/rails_intrumentation_spec.rb
|
@@ -244,6 +249,9 @@ files:
|
|
244
249
|
- spec/roqua/responders/active_interaction_aware_responder_spec.rb
|
245
250
|
- spec/roqua/responders/api_errors_responder_spec.rb
|
246
251
|
- spec/roqua/scheduling/scheduler_spec.rb
|
252
|
+
- spec/roqua/status_checks/check_db_connection_spec.rb
|
253
|
+
- spec/roqua/status_checks/check_load_balancer_member_spec.rb
|
254
|
+
- spec/roqua/status_checks/status_controller_spec.rb
|
247
255
|
- spec/roqua/support/errors_spec.rb
|
248
256
|
- spec/roqua/support/helpers_spec.rb
|
249
257
|
- spec/roqua/support/logwrapper_spec.rb
|
@@ -273,11 +281,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
273
281
|
version: '0'
|
274
282
|
requirements: []
|
275
283
|
rubyforge_project:
|
276
|
-
rubygems_version: 2.5.2
|
284
|
+
rubygems_version: 2.5.2
|
277
285
|
signing_key:
|
278
286
|
specification_version: 4
|
279
287
|
summary: Helper objects and proxies used by a lot of RoQua applications
|
280
288
|
test_files:
|
289
|
+
- spec/internal/config/balancer_state
|
290
|
+
- spec/internal/config/routes.rb
|
281
291
|
- spec/roqua/core_ext/active_interaction/date_time_as_unix_extension_spec.rb
|
282
292
|
- spec/roqua/core_ext/active_interaction/duration_filter_spec.rb
|
283
293
|
- spec/roqua/core_ext/active_interaction/rails_intrumentation_spec.rb
|
@@ -291,6 +301,9 @@ test_files:
|
|
291
301
|
- spec/roqua/responders/active_interaction_aware_responder_spec.rb
|
292
302
|
- spec/roqua/responders/api_errors_responder_spec.rb
|
293
303
|
- spec/roqua/scheduling/scheduler_spec.rb
|
304
|
+
- spec/roqua/status_checks/check_db_connection_spec.rb
|
305
|
+
- spec/roqua/status_checks/check_load_balancer_member_spec.rb
|
306
|
+
- spec/roqua/status_checks/status_controller_spec.rb
|
294
307
|
- spec/roqua/support/errors_spec.rb
|
295
308
|
- spec/roqua/support/helpers_spec.rb
|
296
309
|
- spec/roqua/support/logwrapper_spec.rb
|