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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 37d547c0a869c2c0e2a9ada0c1c81da42dd45633
4
- data.tar.gz: 84acc128fb9a4dee25dd1c8e0e6109491db3976b
3
+ metadata.gz: 2a7e7e17065382daf49bff625d1a8008a0a4c0ba
4
+ data.tar.gz: 9a6b746e175193312045d7a94dc67a57d55577bb
5
5
  SHA512:
6
- metadata.gz: cdc75baa084d6e000e2a2357f0ccd732c90dd228335110f7508a35066ec1680a410c614c32d9eb43ef73d4921521b0da739d3d0e764a9969353809915c917fa7
7
- data.tar.gz: a074e16db2d3496285cdc293596fb6863e77089cbbd888f188f38037bb99c6917b158825ca9b375193c8addee071fe4061e63c1d57281e82437aac3ed7f8a1d6
6
+ metadata.gz: b507ccf0d36fc1941ad3bfb8f4a2714ce0da6e435a6c7356016ecdaffd7d77a6617822803b8ec8e4521b349d9befc228220f1f311248690f87880cfb2a46cfa8
7
+ data.tar.gz: 9140cb6bc4ea4b6c7b0e13276b0474b4cb3365238cb7e9166d717e85cc80d3eed2f47d7f0997c706cfe6be91afbb662d8abfa09f6dc2a7f536738718e1dd2374
data/Gemfile.lock CHANGED
@@ -8,7 +8,7 @@ GIT
8
8
  PATH
9
9
  remote: .
10
10
  specs:
11
- roqua-support (0.1.29)
11
+ roqua-support (0.1.30)
12
12
  active_interaction (~> 3.0)
13
13
  activesupport (>= 3.2, < 6)
14
14
  naught (~> 1.0)
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
@@ -13,4 +13,3 @@ module Roqua
13
13
  end
14
14
  end
15
15
  end
16
-
@@ -1,5 +1,5 @@
1
1
  module Roqua
2
2
  module Support
3
- VERSION = '0.1.29'.freeze
3
+ VERSION = '0.1.30'.freeze
4
4
  end
5
5
  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,3 @@
1
+ Rails.application.routes.draw do
2
+ get '/status' => 'roqua/status_checks/status#balancer_status', as: :balancer_status
3
+ end
@@ -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.29
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 00:00:00.000000000 Z
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.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