cellect-server 1.2.0 → 1.3.0

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: 1efbe81e4f9f98a1badc9aea8141532d0ecfda51
4
- data.tar.gz: 52905f8f3f68771afeb1067dec99ad197644735f
3
+ metadata.gz: 74908885c875bf40e8557678c00d26c9cc53d8a2
4
+ data.tar.gz: 6710bfad63345a08390a2a98a5ea2a84d5ce9966
5
5
  SHA512:
6
- metadata.gz: 177f11e20220a38821d3f9385e064687f605f5a3dc86129529083f573c9d23c78c58d2ba07601250cf8b198ac464f1da36d4fb6138b2895dc68b00ed0b8a87bf
7
- data.tar.gz: 469c823c50b7166c72d85c97dfa542400ec0c09e32720e1c232a0034011c3f5bc582d5b965166466da978276adaa1308e8ce16147e3a6d840405713366adb866
6
+ metadata.gz: ebe51236bc8f2077127a20265ed0aba6dbbb980ea37b72cf0e82a1653caefa4f7477596319eb187a08ad78be6b48f3612dd5f11665db6313b2745f61eadf1f1f
7
+ data.tar.gz: 86ad844b31e3c21d45d4c9881499bdaf53db5c7452f2abde3f721bfbf7380b073d003a0e160ba6d8ca989ece79a07609c34a06f6d12678971795ab92da798802
@@ -16,10 +16,8 @@ module Cellect
16
16
 
17
17
  # Connect to ZooKeeper, setup this node, and change state
18
18
  def initialize_zk
19
- begin
20
- Timeout::timeout(timeout_duration) do
21
- self.zk = ZK.new zk_url, chroot: '/cellect'
22
- end
19
+ Timeout::timeout(timeout_duration) do
20
+ self.zk = ZK.new zk_url, chroot: '/cellect'
23
21
  end
24
22
  setup
25
23
  self.state = :ready
@@ -34,6 +34,11 @@ module Cellect
34
34
  raise NotImplementedError
35
35
  end
36
36
 
37
+ # Report adapter status as a Hash
38
+ def status
39
+ { }
40
+ end
41
+
37
42
  def load_workflows(*names)
38
43
  workflow_list(*names).each{ |workflow_info| load_workflow workflow_info }
39
44
  end
@@ -65,6 +65,12 @@ module Cellect
65
65
  end
66
66
  end
67
67
 
68
+ def status
69
+ {
70
+ connected: pg.status == PG::CONNECTION_OK
71
+ }
72
+ end
73
+
68
74
  def with_pg
69
75
  @pg.with{ |pg| yield pg }
70
76
  end
@@ -13,13 +13,19 @@ module Cellect
13
13
  #
14
14
  # Provides system load information
15
15
  get :stats do
16
+ node_set = Cellect::Server.node_set.actors.first
16
17
  usage = ->(keyword) do
17
18
  `ps axo #{ keyword }`.chomp.split("\n")[1..-1].collect(&:to_f).inject :+
18
19
  end
19
20
 
20
21
  {
21
22
  memory: usage.call('%mem'),
22
- cpu: usage.call('%cpu')
23
+ cpu: usage.call('%cpu'),
24
+ node_set: { id: node_set.id, ready: node_set.ready? },
25
+ status: Cellect::Server.adapter.status.merge({
26
+ workflows_ready: Cellect::Server.ready?,
27
+ workflows: Workflow.all.map(&:status)
28
+ })
23
29
  }
24
30
  end
25
31
 
@@ -3,6 +3,11 @@ module Cellect
3
3
  class Workflow
4
4
  include Celluloid
5
5
 
6
+ class << self
7
+ attr_accessor :workflow_names
8
+ end
9
+ self.workflow_names = { }
10
+
6
11
  attr_accessor :name, :users, :subjects, :state
7
12
  attr_accessor :pairwise, :prioritized
8
13
 
@@ -14,14 +19,14 @@ module Cellect
14
19
 
15
20
  # Load a workflow
16
21
  def self.[]=(name, opts)
22
+ Workflow.workflow_names[name] = true
17
23
  Actor[name] = supervise name, pairwise: opts['pairwise'], prioritized: opts['prioritized']
18
24
  end
19
25
 
20
26
  # The names of all workflows currently loaded
21
27
  def self.names
22
28
  actor_names = Celluloid.actor_system.registry.names.collect &:to_s
23
- workflow_actors = actor_names.select{ |key| key =~ /^workflow_/ }
24
- workflow_actors.collect{ |name| name.sub(/^workflow_/, '').to_sym }
29
+ actor_names.select{ |key| workflow_names[key] }
25
30
  end
26
31
 
27
32
  # All currently loaded workflows
@@ -146,6 +151,7 @@ module Cellect
146
151
  # General information about this workflow
147
152
  def status
148
153
  {
154
+ name: name,
149
155
  state: state,
150
156
  grouped: false,
151
157
  prioritized: prioritized,
@@ -1,3 +1,3 @@
1
1
  module Cellect
2
- VERSION = '1.2.0'
2
+ VERSION = '1.3.0'
3
3
  end
@@ -10,7 +10,7 @@ module Cellect::Server
10
10
  let(:workflow_type){ [grouping, set_type].compact.join '_' }
11
11
  let(:workflow){ Workflow[workflow_type] }
12
12
  let(:user){ workflow.user 123 }
13
- before(:each){ pass_until workflow, is: :ready }
13
+ before(:each){ pass_until_state_of workflow, is: :ready }
14
14
 
15
15
  it 'should add seen subjects' do
16
16
  async_workflow = double
@@ -10,7 +10,7 @@ module Cellect::Server
10
10
  let(:workflow_type){ [grouping, set_type].compact.join '_' }
11
11
  let(:workflow){ Workflow[workflow_type] }
12
12
  let(:user){ workflow.user 123 }
13
- before(:each){ pass_until workflow, is: :ready }
13
+ before(:each){ pass_until_state_of workflow, is: :ready }
14
14
 
15
15
  let(:opts) do
16
16
  { subject_id: 123 }.tap do |h|
@@ -10,7 +10,7 @@ module Cellect::Server
10
10
  let(:workflow_type){ [grouping, set_type].compact.join '_' }
11
11
  let(:workflow){ Workflow[workflow_type] }
12
12
  let(:user){ workflow.user 123 }
13
- before(:each){ pass_until workflow, is: :ready }
13
+ before(:each){ pass_until_state_of workflow, is: :ready }
14
14
 
15
15
  let(:opts) do
16
16
  { subject_id: 123 }.tap do |h|
@@ -10,7 +10,7 @@ module Cellect::Server
10
10
  let(:workflow_type){ [grouping, set_type].compact.join '_' }
11
11
  let(:workflow){ Workflow[workflow_type] }
12
12
  let(:user){ workflow.user 123 }
13
- before(:each){ pass_until workflow, is: :ready }
13
+ before(:each){ pass_until_state_of workflow, is: :ready }
14
14
 
15
15
  it 'should sample without a user, limit, or group' do
16
16
  expect(workflow).to receive(:sample).with(limit: 5, user_id: nil, group_id: nil).and_call_original
@@ -9,7 +9,7 @@ module Cellect::Server
9
9
  context "#{ grouping_type } #{ set_type }" do
10
10
  let(:workflow_type){ [grouping, set_type].compact.join '_' }
11
11
  let(:workflow){ Workflow[workflow_type] }
12
- before(:each){ pass_until workflow, is: :ready }
12
+ before(:each){ pass_until_state_of workflow, is: :ready }
13
13
 
14
14
  it 'should load users' do
15
15
  async_workflow = double
@@ -8,7 +8,7 @@ module Cellect::Server
8
8
  let(:workflow){ GroupedWorkflow[workflow_type] }
9
9
  let(:user){ workflow.user 123 }
10
10
  let(:set_klass){ workflow.prioritized? ? DiffSet::PrioritySet : DiffSet::RandomSet }
11
- before(:each){ pass_until workflow, is: :ready }
11
+ before(:each){ pass_until_state_of workflow, is: :ready }
12
12
 
13
13
  it 'should provide unseen from a random group for users' do
14
14
  workflow.groups = { }
@@ -20,5 +20,55 @@ module Cellect::Server
20
20
  expect(default.workflow_for('name' => 'e', 'pairwise' => true, 'prioritized' => true)).to be_prioritized
21
21
  end
22
22
  end
23
+
24
+ describe '/stats' do
25
+ include_context 'API'
26
+
27
+ let(:response){ JSON.parse last_response.body }
28
+ let(:all_workflows) do
29
+ [].tap do |list|
30
+ { 'Ungrouped' => nil, 'Grouped' => 'grouped' }.each_pair do |grouping_type, grouping|
31
+ SET_TYPES.each do |set_type|
32
+ workflow_type = [grouping, set_type].compact.join '_'
33
+ list << Workflow[workflow_type]
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ before(:each) do
40
+ pass_until{ all_workflows.all? &:ready? }
41
+ get :stats
42
+ end
43
+
44
+ it 'should include information' do
45
+ expect(response.keys).to match_array %w(memory cpu node_set status)
46
+ end
47
+
48
+ context 'node_set' do
49
+ let(:node_set){ response['node_set'] }
50
+
51
+ it 'should include information' do
52
+ expect(node_set['id']).to eql 'node0000000000'
53
+ expect(node_set['ready']).to eql true
54
+ end
55
+ end
56
+
57
+ context 'status' do
58
+ let(:status){ response['status'] }
59
+
60
+ it 'should include the aggregate workflow status' do
61
+ expect(status['workflows_ready']).to eql true
62
+ end
63
+
64
+ context 'workflows' do
65
+ let(:workflows){ status['workflows'] }
66
+
67
+ it 'should include all workflow statuses' do
68
+ expect(workflows.length).to eql all_workflows.length
69
+ end
70
+ end
71
+ end
72
+ end
23
73
  end
24
74
  end
@@ -12,7 +12,7 @@ module Cellect::Server
12
12
  it_behaves_like 'workflow', :workflow
13
13
  let(:workflow){ Workflow[workflow_type] }
14
14
  let(:user){ workflow.user 123 }
15
- before(:each){ pass_until workflow, is: :ready }
15
+ before(:each){ pass_until_state_of workflow, is: :ready }
16
16
 
17
17
  it 'should provide unseen for users' do
18
18
  expect(workflow.subjects).to receive(:subtract).with user.seen, 3
@@ -1,7 +1,16 @@
1
1
  require 'timeout'
2
2
 
3
3
  module CellectHelper
4
- def pass_until(obj, is:)
4
+ def pass_until(&block)
5
+ Timeout::timeout(1) do
6
+ Thread.pass until block.call
7
+ end
8
+ rescue => e
9
+ puts "Timeout waiting for condition #{ block.inspect }"
10
+ raise e
11
+ end
12
+
13
+ def pass_until_state_of(obj, is:)
5
14
  Timeout::timeout(1) do
6
15
  Thread.pass until obj.state == is
7
16
  end
@@ -3,20 +3,20 @@ shared_examples_for 'node set' do
3
3
 
4
4
  it 'should connect to zoo keeper' do
5
5
  expect(node_set.zk).to be_nil
6
- pass_until node_set, is: :ready
6
+ pass_until_state_of node_set, is: :ready
7
7
  expect(node_set.zk).to be_connected
8
8
  end
9
9
 
10
10
  it 'should know the connection state' do
11
11
  expect(node_set.state).to be :initializing
12
- pass_until node_set, is: :ready
12
+ pass_until_state_of node_set, is: :ready
13
13
  expect(node_set).to be_ready
14
14
  end
15
15
 
16
16
  it 'should accept a connection string' do
17
17
  url_before = ENV['ZK_URL']
18
18
  begin
19
- pass_until node_set, is: :ready
19
+ pass_until_state_of node_set, is: :ready
20
20
  ENV['ZK_URL'] = 'foobar'
21
21
  expect(node_set.send(:zk_url)).to eq 'foobar'
22
22
  ENV.delete 'ZK_URL'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cellect-server
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Parrish
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-22 00:00:00.000000000 Z
11
+ date: 2016-01-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler