cellect-client 0.1.3 → 1.0.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: 0d18d3658bb52800a79bd803aefafff0263d2ce8
4
- data.tar.gz: cc4dce1522594061908ef7cd649e0156c04be786
3
+ metadata.gz: afa825f4a300482bd14b901c3329bb4cdbbdefc5
4
+ data.tar.gz: b05da041f863b7236b51d7589a13f105b8c0b7cb
5
5
  SHA512:
6
- metadata.gz: 8917a3f2a0371147d7d0a77cad67b95d29c53d3d0dc08c2ca35532b2a350fcd967ac2a3e1347dfd8c2ee3e812eb869efb6286038ebae0a774a286b900eb3d109
7
- data.tar.gz: ccae5ce575a0e831efd936d7699ef54a8b6cfb180761bf8c4c7497afd018f4baebb1d2d2855466bdfc9bd247727df85a8dcb4603622fd72ee1a742cfc0159ad9
6
+ metadata.gz: 1c91dc81813eb58e9801a8d05859e06134cc62b845deaa911d75cf9817ccdd083468cadc9af959e0bd4f5ae748ba463535103d3b82c0dded2e8a9d51c2250543
7
+ data.tar.gz: 61131fff07cc2d147b83ad68edea75dcc1238f3be3ca8baaf1c5895f7bb1cd10ae6eaaf5cac585c53ff3febc6e50ec0c19d016843deb8c335451660fb063e4bc
data/.gitignore CHANGED
@@ -16,3 +16,4 @@ pkg/*
16
16
  *.swp
17
17
  ext/
18
18
  /coverage
19
+ /Gemfile.lock
data/.travis.yml CHANGED
@@ -5,16 +5,10 @@ before_install:
5
5
  - sudo add-apt-repository ppa:boost-latest/ppa -y
6
6
  - sudo apt-get update -q
7
7
  - sudo apt-get install -y autoconf automake boost1.55 libffi-dev
8
-
9
- before_script:
10
- - test `which zkServer.sh` && zkServer.sh stop && rm -rf /tmp/zookeeper/*; true
11
- - wget -q -O - "http://mirrors.koehn.com/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz" | tar zx -C "$HOME/"
12
- - export PATH="$PATH:/$HOME/zookeeper-3.4.6/bin"
13
- - cp "$HOME/zookeeper-3.4.6/conf/zoo_sample.cfg" "$HOME/zookeeper-3.4.6/conf/zoo.cfg"
14
- - zkServer.sh start
8
+ - gem update bundler
15
9
 
16
10
  rvm:
17
11
  - 2.1.5
18
12
  - 2.2.1
19
13
 
20
- script: ZK_URL=localhost:2181 bundle exec rake
14
+ script: bundle exec rake spec
@@ -25,6 +25,7 @@ Gem::Specification.new do |spec|
25
25
  spec.add_development_dependency 'rake'
26
26
  spec.add_development_dependency 'oj'
27
27
  spec.add_development_dependency 'rspec'
28
+ spec.add_development_dependency 'zk-server'
28
29
  spec.add_development_dependency 'rack-test'
29
30
  spec.add_development_dependency 'pry'
30
31
 
data/cellect.gemspec CHANGED
@@ -12,23 +12,24 @@ Gem::Specification.new do |spec|
12
12
  spec.description = ''
13
13
  spec.homepage = 'https://github.com/parrish/Cellect'
14
14
  spec.license = 'MIT'
15
-
15
+
16
16
  spec.files = ['lib/cellect.rb', 'lib/cellect/version.rb']
17
17
  spec.executables = []
18
18
  spec.test_files = []
19
19
  spec.require_paths = ['lib']
20
-
20
+
21
21
  spec.add_development_dependency 'bundler', '~> 1.5'
22
22
  spec.add_development_dependency 'rake'
23
23
  spec.add_development_dependency 'oj'
24
24
  spec.add_development_dependency 'rspec'
25
25
  spec.add_development_dependency 'rack-test'
26
+ spec.add_development_dependency 'zk-server'
26
27
  spec.add_development_dependency 'pry'
27
28
  spec.add_development_dependency 'puma', '~> 2.8'
28
29
  spec.add_development_dependency 'pg', '~> 0.17'
29
30
  spec.add_development_dependency 'connection_pool', '~> 2.0'
30
31
  spec.add_development_dependency 'codeclimate-test-reporter'
31
-
32
+
32
33
  spec.add_runtime_dependency 'cellect-server', Cellect::VERSION
33
34
  spec.add_runtime_dependency 'cellect-client', Cellect::VERSION
34
35
  end
@@ -7,53 +7,53 @@ module Cellect
7
7
  class Connection
8
8
  include Celluloid
9
9
  include Celluloid::IO
10
-
10
+
11
11
  # Reload the data for a workflow on all servers
12
12
  def reload_workflow(id)
13
13
  broadcast :post, "/workflows/#{ id }/reload"
14
14
  end
15
-
15
+
16
16
  # Remove the workflow from all servers
17
17
  def delete_workflow(id)
18
18
  broadcast :delete, "/workflows/#{ id }"
19
19
  end
20
-
20
+
21
21
  # Adds or updates a subject on all servers
22
22
  def add_subject(id, workflow_id:, group_id: nil, priority: nil)
23
23
  broadcast :put, "/workflows/#{ workflow_id }/add", querystring(subject_id: id, group_id: group_id, priority: priority)
24
24
  end
25
-
25
+
26
26
  # Removes a subject on all servers
27
27
  def remove_subject(id, workflow_id:, group_id: nil)
28
28
  broadcast :put, "/workflows/#{ workflow_id }/remove", querystring(subject_id: id, group_id: group_id)
29
29
  end
30
-
30
+
31
31
  # Preload a user on a server
32
32
  def load_user(user_id:, host:, workflow_id:)
33
33
  send_http host, :post, "/workflows/#{ workflow_id }/users/#{ user_id }/load"
34
34
  end
35
-
35
+
36
36
  # Adds a subject to a users seen set
37
37
  def add_seen(subject_id:, user_id:, host:, workflow_id:)
38
38
  send_http host, :put, "/workflows/#{ workflow_id }/users/#{ user_id }/add_seen", querystring(subject_id: subject_id)
39
39
  end
40
-
40
+
41
41
  # Gets unseen subjects for a user
42
42
  def get_subjects(user_id:, host:, workflow_id:, limit: nil, group_id: nil)
43
43
  response = send_http host, :get, "/workflows/#{ workflow_id }", querystring(user_id: user_id, group_id: group_id, limit: limit)
44
44
  ensure_valid_response response
45
45
  MultiJson.load response.body
46
46
  end
47
-
47
+
48
48
  protected
49
-
49
+
50
50
  # Broadcast by iterating over each server
51
51
  def broadcast(action, path, query = '')
52
52
  Cellect::Client.node_set.nodes.each_pair do |node, host|
53
53
  send_http host, action, path, query
54
54
  end
55
55
  end
56
-
56
+
57
57
  # Makes an API call through an evented Celluloid Socket
58
58
  def send_http(host, action, path, query = '')
59
59
  params = { host: host, path: path }
@@ -61,7 +61,7 @@ module Cellect
61
61
  uri = URI::HTTP.build params
62
62
  HTTP.send action, uri.to_s, socket_class: Celluloid::IO::TCPSocket
63
63
  end
64
-
64
+
65
65
  # Builds a querystring from a hash
66
66
  def querystring(hash = { })
67
67
  [].tap do |list|
@@ -71,7 +71,7 @@ module Cellect
71
71
  end
72
72
  end.join('&')
73
73
  end
74
-
74
+
75
75
  # Ensure the API response was OK
76
76
  def ensure_valid_response(response)
77
77
  unless response.code == 200
@@ -4,15 +4,15 @@ module Cellect
4
4
  module Client
5
5
  class NodeSet < Cellect::NodeSet
6
6
  attr_accessor :nodes
7
-
7
+
8
8
  # Sets up an empty node set
9
9
  def initialize(zk_url = nil)
10
10
  self.nodes = { }
11
11
  super
12
12
  end
13
-
13
+
14
14
  protected
15
-
15
+
16
16
  # Respond to a node coming online or timing out
17
17
  def nodes_changed(nodes)
18
18
  self.nodes = { }
@@ -20,14 +20,14 @@ module Cellect
20
20
  self.nodes[node] = zk.get("/nodes/#{ node }").first
21
21
  end
22
22
  end
23
-
23
+
24
24
  # Register with ZooKeeper and get the list of nodes
25
25
  def setup
26
26
  watch_nodes
27
27
  zk.mkdir_p '/nodes'
28
28
  nodes_changed zk.children('/nodes', watch: true)
29
29
  end
30
-
30
+
31
31
  # Watch ZooKeeper for changes to the node set
32
32
  def watch_nodes
33
33
  zk.register('/nodes') do |event|
@@ -1,7 +1,7 @@
1
1
  module Cellect
2
2
  module Client
3
3
  class ConfigurationError < StandardError; end;
4
-
4
+
5
5
  # Allow YAML configuration from config/cellect.yml
6
6
  #
7
7
  # development:
@@ -16,33 +16,33 @@ module Cellect
16
16
  ensure_config_url config
17
17
  connect_zookeeper config if load_zookeeper
18
18
  end
19
-
19
+
20
20
  private
21
-
21
+
22
22
  def config_file
23
23
  Rails.root.join 'config/cellect.yml'
24
24
  end
25
-
25
+
26
26
  def ensure_config_file
27
27
  return if File.exists?(config_file)
28
28
  raise ConfigurationError.new 'No configuration file found. Create config/cellect.yml first'
29
29
  end
30
-
30
+
31
31
  def ensure_config_environment(yaml)
32
32
  return if yaml[Rails.env].is_a?(Hash)
33
33
  raise ConfigurationError.new "No configuration for #{ Rails.env } found"
34
34
  end
35
-
35
+
36
36
  def ensure_config_url(hash)
37
37
  return if hash[:zk_url].present?
38
38
  raise ConfigurationError.new "No Zookeeper URL provided for #{ Rails.env } environment"
39
39
  end
40
-
40
+
41
41
  def connect_zookeeper(config)
42
42
  Client.node_set config[:zk_url]
43
43
  Client.connection = Connection.pool size: config.fetch(:pool_size, 100)
44
44
  end
45
-
45
+
46
46
  def load_zookeeper
47
47
  !Client.mock_zookeeper?
48
48
  rescue NoMethodError
@@ -4,31 +4,31 @@ module Cellect
4
4
  module Client
5
5
  require 'cellect/client/node_set'
6
6
  require 'cellect/client/connection'
7
-
7
+
8
8
  class << self
9
9
  attr_accessor :connection, :_node_set
10
10
  end
11
-
11
+
12
12
  # Sets up the set of server nodes
13
13
  def self.node_set(zk_url=nil)
14
14
  self._node_set ||= NodeSet.supervise(zk_url)
15
15
  _node_set.actors.first
16
16
  end
17
-
17
+
18
18
  def self.ready?
19
19
  node_set.ready?
20
20
  end
21
-
21
+
22
22
  # Selects a server for a user
23
23
  def self.choose_host
24
24
  node_set.nodes.values.sample
25
25
  end
26
-
26
+
27
27
  # Ensure a previously selected server is still available
28
28
  def self.host_exists?(ip)
29
29
  node_set.nodes.values.include? ip
30
30
  end
31
-
31
+
32
32
  if defined?(::Rails)
33
33
  require 'cellect/client/railtie'
34
34
  else
@@ -1,39 +1,39 @@
1
1
  require 'zk'
2
- require 'timeout'
3
2
 
4
3
  module Cellect
5
4
  class NodeSet
6
5
  include Celluloid
7
-
6
+ ConnectionError = Class.new(StandardError)
7
+
8
8
  attr_accessor :zk, :state
9
-
9
+
10
10
  # Sets up the node set and starts connecting to ZooKeeper
11
11
  def initialize(zk_url = nil)
12
12
  @zk_url = zk_url
13
13
  self.state = :initializing
14
14
  after(0.001){ async.initialize_zk } # don't block waiting for ZK to connect
15
15
  end
16
-
16
+
17
17
  # Connect to ZooKeeper, setup this node, and change state
18
18
  def initialize_zk
19
- # don't let ZK hang the thread, just retry connection on restart
20
- Timeout::timeout(5) do
21
- self.zk = ZK.new zk_url, chroot: '/cellect'
22
- end
19
+ # don't let ZK hang the thread, timeout and check connection status
20
+ zk = ZK::Client.new zk_url, timeout: 0.5, chroot: '/cellect'
21
+ raise ConnectionError.new("Can't connect to ZK server.") unless zk.connected?
22
+ self.zk = zk
23
23
  setup
24
24
  self.state = :ready
25
25
  end
26
-
26
+
27
27
  def ready?
28
28
  state == :ready
29
29
  end
30
-
30
+
31
31
  protected
32
-
32
+
33
33
  def zk_url
34
34
  @zk_url || ENV.fetch('ZK_URL', 'localhost:2181')
35
35
  end
36
-
36
+
37
37
  def setup
38
38
  # Specialized in subclasses
39
39
  end
@@ -1,3 +1,3 @@
1
1
  module Cellect
2
- VERSION = '0.1.3'
2
+ VERSION = '1.0.0'
3
3
  end
data/lib/cellect.rb CHANGED
@@ -3,5 +3,5 @@ require 'celluloid/io'
3
3
  require 'cellect/version'
4
4
 
5
5
  module Cellect
6
-
6
+
7
7
  end
@@ -3,85 +3,85 @@ require 'spec_helper'
3
3
  module Cellect::Client
4
4
  describe Connection do
5
5
  let(:connection){ Cellect::Client.connection }
6
-
6
+
7
7
  before(:each) do
8
8
  allow(Cellect::Client.node_set).to receive(:nodes).and_return 'a' => '1', 'b' => '2'
9
9
  end
10
-
10
+
11
11
  def should_send(action:, url:, to:)
12
12
  expect(HTTP).to receive(:send).with(action, "http://#{ to }/#{ url }", socket_class: Celluloid::IO::TCPSocket).and_return(HTTP::Response.new(200, nil, nil, "{ \"this response\": \"intentionally blank\" }"))
13
13
  end
14
-
14
+
15
15
  def should_broadcast(action:, url:)
16
16
  [1, 2].each{ |i| should_send action: action, url: url, to: i }
17
17
  end
18
-
18
+
19
19
  it 'should reload workflows' do
20
20
  should_broadcast action: :post, url: 'workflows/random/reload'
21
21
  connection.reload_workflow 'random'
22
22
  end
23
-
23
+
24
24
  it 'should delete workflows' do
25
25
  should_broadcast action: :delete, url: 'workflows/random'
26
26
  connection.delete_workflow 'random'
27
27
  end
28
-
28
+
29
29
  it 'should add subjects' do
30
30
  should_broadcast action: :put, url: 'workflows/random/add?subject_id=123'
31
31
  connection.add_subject 123, workflow_id: 'random'
32
32
  end
33
-
33
+
34
34
  it 'should add grouped subjects' do
35
35
  should_broadcast action: :put, url: 'workflows/random/add?subject_id=123&group_id=321'
36
36
  connection.add_subject 123, workflow_id: 'random', group_id: 321
37
37
  end
38
-
38
+
39
39
  it 'should add prioritized grouped subjects' do
40
40
  should_broadcast action: :put, url: 'workflows/random/add?subject_id=123&group_id=321&priority=0.123'
41
41
  connection.add_subject 123, workflow_id: 'random', group_id: 321, priority: 0.123
42
42
  end
43
-
43
+
44
44
  it 'should remove subjects' do
45
45
  should_broadcast action: :put, url: 'workflows/random/remove?subject_id=123'
46
46
  connection.remove_subject 123, workflow_id: 'random'
47
47
  end
48
-
48
+
49
49
  it 'should remove grouped subjects' do
50
50
  should_broadcast action: :put, url: 'workflows/random/remove?subject_id=123&group_id=321'
51
51
  connection.remove_subject 123, workflow_id: 'random', group_id: 321
52
52
  end
53
-
53
+
54
54
  it 'should load users' do
55
55
  should_send action: :post, url: 'workflows/random/users/123/load', to: 1
56
56
  connection.load_user user_id: 123, host: '1', workflow_id: 'random'
57
57
  end
58
-
58
+
59
59
  it 'should add seen subjects' do
60
60
  should_send action: :put, url: 'workflows/random/users/123/add_seen?subject_id=456', to: 1
61
61
  connection.add_seen subject_id: 456, host: '1', user_id: 123, workflow_id: 'random'
62
62
  end
63
-
63
+
64
64
  it 'should get subjects' do
65
65
  should_send action: :get, url: 'workflows/random?user_id=1', to: 1
66
66
  connection.get_subjects host: '1', workflow_id: 'random', user_id: 1
67
67
  end
68
-
68
+
69
69
  it 'should get grouped subjects' do
70
70
  should_send action: :get, url: 'workflows/random?user_id=1&group_id=1&limit=10', to: 1
71
71
  connection.get_subjects host: '1', workflow_id: 'random', user_id: 1, limit: 10, group_id: 1
72
72
  end
73
-
73
+
74
74
  context 'getting subjects' do
75
75
  def get_subjects
76
76
  connection.get_subjects host: '1', workflow_id: 'random', user_id: 1, limit: 10, group_id: 1
77
77
  end
78
-
78
+
79
79
  it 'should return subjects as an array' do
80
80
  response = HTTP::Response.new 200, '1.1', nil, '[1, 2, 3, 4, 5]'
81
81
  allow(HTTP).to receive(:send).and_return response
82
82
  expect(get_subjects).to eq [1, 2, 3, 4, 5]
83
83
  end
84
-
84
+
85
85
  it 'should raise an error for unexpected responses' do
86
86
  response = HTTP::Response.new 404, '1.1', nil, ''
87
87
  allow(HTTP).to receive(:send).and_return response
@@ -4,7 +4,10 @@ module Cellect::Client
4
4
  describe NodeSet do
5
5
  it_behaves_like 'node set'
6
6
  let(:node_set){ Cellect::Client.node_set }
7
-
7
+
8
+ #@note: node_set.nodes has state from intial code loading
9
+ # the above def which is really a cached celluloid actor from boot
10
+ # see Cellect::Client / Cellect::Server
8
11
  it 'should update the node list when changing' do
9
12
  begin
10
13
  pass_until node_set, is: :ready
@@ -13,7 +16,6 @@ module Cellect::Client
13
16
  break if node_set.nodes['node0000000001']
14
17
  Thread.pass
15
18
  end
16
-
17
19
  expect(node_set.nodes['node0000000001']).to eq 'foo'
18
20
  ensure
19
21
  node_set.zk.delete '/nodes/node0000000001'
data/spec/spec_helper.rb CHANGED
@@ -12,7 +12,6 @@ Bundler.require :test, :development
12
12
 
13
13
  ENV['CELLECT_POOL_SIZE'] = '3'
14
14
  SPAWN_ZK = !ENV['ZK_URL']
15
-
16
15
  require 'pry'
17
16
  require 'oj'
18
17
  require './spec/support/zk_setup.rb'
@@ -32,14 +31,14 @@ RSpec.configure do |config|
32
31
  config.filter_run :focus
33
32
  config.order = 'random'
34
33
  config.include CellectHelper
35
-
34
+
36
35
  config.around(:each) do |example|
37
36
  Celluloid.boot
38
37
  example.run
39
38
  Celluloid.shutdown
40
39
  end
41
-
40
+
42
41
  config.after(:suite) do
43
- `zkServer stop #{ CELLECT_ZK_CONFIG } > /dev/null 2>&1` if SPAWN_ZK
42
+ ZK_Setup.stop_zk
44
43
  end
45
44
  end
@@ -1,10 +1,10 @@
1
1
  shared_context 'API' do
2
2
  include Rack::Test::Methods
3
-
3
+
4
4
  def app
5
5
  $app ||= Cellect::Server::API.new
6
6
  end
7
-
7
+
8
8
  def json
9
9
  Oj.strict_load last_response.body
10
10
  end
@@ -1,18 +1,18 @@
1
1
  shared_examples_for 'node set' do
2
2
  let(:node_set){ Cellect::NodeSet.new }
3
-
3
+
4
4
  it 'should connect to zoo keeper' do
5
5
  expect(node_set.zk).to be_nil
6
6
  pass_until 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
12
  pass_until 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
@@ -2,30 +2,30 @@ shared_examples_for 'a set' do
2
2
  it 'should convert to an Array' do
3
3
  expect(set.to_a).to eq (1..5).to_a
4
4
  end
5
-
5
+
6
6
  it 'should add elements' do
7
7
  set.add 100
8
8
  expect(set.to_a).to include 100
9
9
  end
10
-
10
+
11
11
  it 'should remove elements' do
12
12
  set.remove 1
13
13
  set.to_a.should_not include 1
14
14
  end
15
-
15
+
16
16
  it 'should sample elements' do
17
17
  expect(set.sample(2).length).to eq 2
18
18
  end
19
-
19
+
20
20
  it 'should not include removed elements in samples' do
21
21
  set.remove 5
22
22
  set.sample(5).should_not include 5
23
23
  end
24
-
24
+
25
25
  it 'should know how many elements it contains' do
26
26
  expect{ set.add 100 }.to change{ set.size }.from(5).to 6
27
27
  end
28
-
28
+
29
29
  it 'should know if it contains an element' do
30
30
  set.should_not include 100
31
31
  set.add 100
@@ -1,23 +1,23 @@
1
1
  shared_examples_for 'workflow' do |name|
2
2
  let(:obj){ send name }
3
-
3
+
4
4
  before(:each) do
5
5
  Cellect::Server.adapter.load_workflow obj.name
6
6
  end
7
-
7
+
8
8
  it 'should add singleton instances to the registry' do
9
9
  expect(obj.class[obj.name]).to be_a_kind_of Cellect::Server::Workflow
10
10
  expect(obj.class[obj.name].object_id).to eq obj.class[obj.name].object_id
11
11
  end
12
-
12
+
13
13
  it 'should initialize empty' do
14
14
  expect(obj.name).to be_a String
15
15
  expect(obj.users).to be_a Hash
16
-
16
+
17
17
  set_klass = obj.prioritized? ? DiffSet::PrioritySet : DiffSet::RandomSet
18
18
  expect(obj.subjects).to be_a set_klass
19
19
  end
20
-
20
+
21
21
  it 'should provide a user lookup' do
22
22
  expect(obj.user(1)).to be_a Cellect::Server::User
23
23
  expect(obj.user(1).object_id).to eq obj.user(1).object_id
@@ -8,11 +8,11 @@ class SpecAdapter < Cellect::Server::Adapters::Default
8
8
  fixtures.values_at(*names)
9
9
  end
10
10
  end
11
-
11
+
12
12
  def load_data_for(workflow_name)
13
13
  fixtures.fetch(workflow_name, { }).fetch 'entries', []
14
14
  end
15
-
15
+
16
16
  def fixtures
17
17
  @fixtures ||= { }.tap do |fixtures|
18
18
  Dir["#{ _fixture_path }/workflow_data/*.json"].collect do |f|
@@ -22,7 +22,7 @@ class SpecAdapter < Cellect::Server::Adapters::Default
22
22
  end
23
23
  end
24
24
  end
25
-
25
+
26
26
  def user_fixtures
27
27
  @user_fixtures ||= { }.tap do |user_fixtures|
28
28
  Dir["#{ _fixture_path }/user_data/*.json"].sort.collect.with_index do |f, i|
@@ -33,14 +33,14 @@ class SpecAdapter < Cellect::Server::Adapters::Default
33
33
  end
34
34
  end
35
35
  end
36
-
36
+
37
37
  def load_user(workflow_name, id)
38
38
  user = user_fixtures[id]
39
39
  user ? user[workflow_name] : user_fixtures['new_user'][workflow_name]
40
40
  end
41
-
41
+
42
42
  protected
43
-
43
+
44
44
  def _fixture_path
45
45
  File.expand_path File.join(__FILE__, '../../fixtures')
46
46
  end
@@ -1,28 +1,51 @@
1
- if SPAWN_ZK
2
- zk_dir = File.join CELLECT_ROOT, 'tmp/zookeeper'
3
- CELLECT_ZK_CONFIG = "#{ zk_dir }/zoo.cfg"
4
-
5
- `rm -rf #{ zk_dir }; mkdir -p #{ zk_dir }`
6
-
7
- File.open(CELLECT_ZK_CONFIG, 'w') do |out|
8
- out.puts <<-TEXT
9
- tickTime=2000
10
- initLimit=10
11
- syncLimit=5
12
- dataDir=#{ zk_dir }
13
- clientPort=21811
14
- forceSync=no
15
- snapCount=1000000
16
- TEXT
1
+ module ZK_Setup
2
+ def self.start_zk(port=21811)
3
+ @port = port
4
+ if SPAWN_ZK
5
+ kill_old_zk_servers
6
+ remove_zk_data
7
+ server = ZK::Server.new do |config|
8
+ config.client_port = port
9
+ config.client_port_address = 'localhost'
10
+ config.force_sync = false
11
+ config.tick_time = 2000
12
+ config.init_limit = 10
13
+ config.sync_limit = 5
14
+ config.snap_count = 1000000
15
+ config.base_dir = zk_dir
16
+ end
17
+ server.run
18
+ @zk_server = server
19
+ ENV['ZK_URL'] = "localhost:#{port}"
20
+ end
17
21
  end
18
-
19
- if `echo ruok | nc 127.0.0.1 21811`.chomp == 'imok'
20
- pid = `ps aux | grep -e 'Cellect[\/]tmp[\/]zookeeper'`.split[1]
21
- puts "Killing rogue zookeeper process: #{ pid }..."
22
- `kill -s TERM #{ pid }`
23
- sleep 1
22
+
23
+ def self.stop_zk
24
+ if SPAWN_ZK
25
+ @zk_server.shutdown
26
+ end
27
+ end
28
+
29
+ def self.zk_dir
30
+ File.join CELLECT_ROOT, 'tmp/zookeeper'
31
+ end
32
+
33
+ def self.zk_ok?
34
+ `echo ruok | nc 127.0.0.1 #{@port}`.chomp == 'imok'
35
+ end
36
+
37
+ def self.kill_old_zk_servers
38
+ if zk_ok?
39
+ pid = `ps aux | grep -e 'Cellect[\/]tmp[\/]zookeeper'`.split[1]
40
+ puts "Killing rogue zookeeper process: #{ pid }..."
41
+ `kill -s TERM #{ pid }`
42
+ sleep 1
43
+ end
44
+ end
45
+
46
+ def self.remove_zk_data
47
+ `rm -rf #{ zk_dir }; mkdir -p #{ zk_dir }`
24
48
  end
25
-
26
- `zkServer start #{ CELLECT_ZK_CONFIG } > /dev/null 2>&1`
27
- ENV['ZK_URL'] = 'localhost:21811'
28
49
  end
50
+
51
+ ZK_Setup.start_zk
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cellect-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 1.0.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-11-24 00:00:00.000000000 Z
11
+ date: 2015-12-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: zk-server
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: rack-test
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -232,7 +246,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
232
246
  version: '0'
233
247
  requirements: []
234
248
  rubyforge_project:
235
- rubygems_version: 2.5.0
249
+ rubygems_version: 2.4.2
236
250
  signing_key:
237
251
  specification_version: 4
238
252
  summary: ''