roqua-support 0.1.29 → 0.1.30

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 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