etzetera 0.0.3 → 0.0.4

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: 8b4e2c26fd128ba900ac46cd4164bf0ff33cc860
4
- data.tar.gz: 941f5e9dc5e869aa0ee375c9f855ddc258afbe8e
3
+ metadata.gz: 47fa8b1efad7c677d6530ef9cf8c0aab5e11141a
4
+ data.tar.gz: c52221bb46aeae8a74de23793b20f4f8b25dcb01
5
5
  SHA512:
6
- metadata.gz: 9279230c0f3162832c37bd85e08c9a8867094cb63f10624d015e5a98c01d81e3f67e1f4fe0683325eab64a2d27c79046292afee851107e74d264eb9962f18185
7
- data.tar.gz: 8493e5af5b0bb162ef7c640e75ce5e727f85b41323be08b66524cb9eb1ee1d3adee46f6485eb8dd521dbff9bc8235562304ffc37355b818935c1f1a9ebbed013
6
+ metadata.gz: bf5cea647017f105ccc35f7d00452fbb628d0358c79cbe3dbe6b864651c56c922eba3cf7a9e47b1b5787999bfa897d7e202c77a14294dc16b17033328bd6a3ab
7
+ data.tar.gz: d535bc3b57d27b98685e6df01927c4a3d6ee5820bc7ff38da27133192852a207e37abbbbcc41d30c66e87816ff44caac3c5b060c86b853aaf09e87f1fb0e6993
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -1,143 +1,140 @@
1
1
  require 'celluloid/io'
2
+ require 'time'
2
3
  require 'multi_json'
3
4
 
4
5
  module Etzetera
5
6
  class Client
6
7
  include Celluloid::IO
7
- API_ENDPOINT = 'v2'.freeze
8
+ API_VERSION = 'v2'.freeze
9
+ KEYS_PREFIX = "/#{API_VERSION}/keys".freeze
10
+ LOCK_PREFIX = "/mod/#{API_VERSION}/lock/".freeze
11
+ LEADER_PREFIX = "/mod/#{API_VERSION}/leader/".freeze
12
+ STATS_PREFIX = "/#{API_VERSION}/stats/".freeze
13
+
14
+ execute_block_on_receiver :wait
8
15
 
9
16
  attr_accessor :servers
10
17
 
11
18
  def initialize(servers = ['http://127.0.0.1:4001'], default_options = {})
12
19
 
13
- self.servers = servers
20
+ self.servers = servers.dup
21
+
22
+ def_opts = default_options.dup
14
23
 
15
24
  opts = {}
16
- opts[:follow] = true
17
25
  opts[:headers] = {:accept => 'application/json'}
18
26
  opts[:response] = :object
19
- opts[:election_timeout] = 200
20
- opts[:heartbeat_interval] = 50
21
27
  opts[:socket_class] = Celluloid::IO::TCPSocket
22
28
  opts[:ssl_socket_class] = Celluloid::IO::SSLSocket
23
29
 
24
- @default_options = ::HTTP::Options.new(opts.merge(default_options))
30
+ @etcd_opts = {}
31
+ @etcd_opts[:election_timeout] = def_opts.delete(:election_timeout) {|key| 200}
32
+ @etcd_opts[:heartbeat_interval] = def_opts.delete(:heartbeat_interval) {|key| 50}
33
+
34
+
35
+ @default_options = ::HTTP::Options.new(opts.merge(def_opts))
25
36
  end
26
37
 
27
38
  def get(key, params = {})
28
- request(:get, keys_path(key), :params => params)
39
+ request(:get, KEYS_PREFIX, key, :params => params)
29
40
  end
30
41
 
31
42
  def set(key, form, params = {})
32
- request(:put, keys_path(key), form: form, :params => params)
43
+ request(:put, KEYS_PREFIX, key, form: form, :params => params)
33
44
  end
34
45
 
35
46
  def delete(key, params = {})
36
- request(:delete, keys_path(key), :params => params)
47
+ request(:delete, KEYS_PREFIX, key, :params => params)
37
48
  end
38
49
 
39
- def wait(key, params = {}, &callback)
40
- response = request(:get, keys_path(key), :params => params.merge({:wait => true}))
50
+ def wait(key, callback = nil, params = {})
51
+ response = request(:get, KEYS_PREFIX, key, :params => params.merge({:wait => true}))
41
52
 
42
53
  if block_given?
43
54
  yield response
44
55
  elsif callback
45
- after(@default_options[:heartbeat_interval] / 1000.0) do
46
- callback.call(response)
47
- end
56
+ #sleep (@etcd_opts[:heartbeat_interval] / 1000.0)
57
+ callback.call(response)
48
58
  else
49
59
  parse_response(response)
50
60
  end
51
61
  end
52
62
 
53
63
  def create(key, form, params = {})
54
- request(:put, keys_path(key), form: form, :params => params.merge({:prevExist => false}))
64
+ request(:put, KEYS_PREFIX, key, form: form, :params => params.merge({:prevExist => false}))
55
65
  end
56
66
 
57
67
  def update(key, form, params = {})
58
- request(:put, keys_path(key), form: form, :params => params.merge({:prevExist => true}))
68
+ request(:put, KEYS_PREFIX, key, form: form, :params => params.merge({:prevExist => true}))
69
+ end
70
+
71
+ def mkdir(dir)
72
+ request(:put, KEYS_PREFIX, dir, :params => {dir: true})
59
73
  end
60
74
 
61
75
  def dir(dir, params = {})
62
- request(:get, keys_path(dir), :params => params.merge({:recursive => true}))
76
+ request(:get, KEYS_PREFIX, dir, :params => params.merge({:recursive => true}))
63
77
  end
64
78
 
65
79
  def rmdir(dir, params = {})
66
- request(:delete, keys_path(dir), :params => {:recursive => true}.merge(params))
80
+ request(:delete, KEYS_PREFIX, dir, :params => {:recursive => true}.merge(params))
67
81
  end
68
82
 
69
- def compareAndSwap(key, prevValue)
70
- request(:put, keys_path(key), :params => {:prevValue => prevValue})
83
+ def compareAndSwap(key, prevValue, form)
84
+ request(:put, KEYS_PREFIX, key, :form => form, :params => {:prevValue => prevValue})
71
85
  end
72
86
 
73
87
  def compareAndDelete(key, prevValue)
74
- request(:delete, keys_path(key), :params => {:prevValue => prevValue})
88
+ request(:delete, KEYS_PREFIX, key, :params => {:prevValue => prevValue})
75
89
  end
76
90
 
77
91
  def acquire_lock(name, ttl)
78
- request(:post, lock_path(name), :form => {:ttl => ttl})
92
+ request(:post, LOCK_PREFIX, name, :form => {:ttl => ttl})
79
93
  end
80
94
 
81
95
  def renew_lock(name, form)
82
- request(:put, lock_path(name), :form => form)
96
+ request(:put, LOCK_PREFIX, name, :form => form)
83
97
  end
84
98
 
85
99
  def release_lock(name, form)
86
- request(:delete, lock_path(name), :form => form)
100
+ request(:delete, LOCK_PREFIX, name, :form => form)
87
101
  end
88
102
 
89
103
  def retrieve_lock(name, params)
90
- request(:get, lock_path(name), :params => params)
104
+ request(:get, LOCK_PREFIX, name, :params => params)
91
105
  end
92
106
 
93
107
  def set_leader(clustername, name, ttl)
94
- request(:put, leader_path(clustername), :form => {:name => name, :ttl => ttl})
108
+ request(:put, LEADER_PREFIX, clustername, :form => {:name => name, :ttl => ttl})
95
109
  end
96
110
 
97
111
  def get_leader(clustername, params = {})
98
- request(:get, leader_path(clustername), :params => params)
112
+ request(:get, LEADER_PREFIX, clustername, :params => params)
99
113
  end
100
114
 
101
115
  def delete_leader(clustername, name)
102
- request(:delete, leader_path(clustername), :form => {:name => name})
116
+ request(:delete, LEADER_PREFIX, clustername, :form => {:name => name})
103
117
  end
104
118
 
105
119
  def stats(type)
106
- request(:get, stats_path(type))
120
+ request(:get, STATS_PREFIX, type)
107
121
  end
108
122
 
109
123
  private
110
- def keys_path(key)
111
- "/#{API_ENDPOINT}/keys/#{key}"
112
- end
113
-
114
- def lock_path(name)
115
- "/mod/#{API_ENDPOINT}/lock/#{name}"
116
- end
117
-
118
- def leader_path(clustername)
119
- "/mod/#{API_ENDPOINT}/leader/#{clustername}"
120
- end
121
-
122
- def stats_path(type)
123
- "/#{API_ENDPOINT}/stats/#{type}"
124
- end
125
-
126
- def request(verb, path, options = {})
124
+ def request(verb, prefix, path, options = {})
127
125
  opts = @default_options.merge(options)
128
126
 
127
+ if opts[:form] && !opts[:form].is_a?(Hash)
128
+ opts = opts.with_form({:value => opts[:form]})
129
+ end
130
+
129
131
  client = ::HTTP::Client.new(opts)
130
132
  server = servers.first
131
133
  retries = servers.count - 1
132
134
  request = nil
133
-
134
135
  begin
135
- request = client.request(verb, "#{server}#{path}")
136
- response = MultiJson.load(request.body)
137
- if response['errorCode']
138
- abort Error::CODES[response['errorCode']].new(response['message'])
139
- end
140
- parse_response(response)
136
+ request = client.request(verb, "#{server}#{prefix}#{path}")
137
+ MultiJson.load(request.body)
141
138
  rescue IOError => e
142
139
  abort e if retries < 1
143
140
 
@@ -152,11 +149,16 @@ module Etzetera
152
149
 
153
150
  retries -= 1
154
151
 
155
- after(@default_options[:election_timeout] / 1000.0) do
156
- retry
157
- end
152
+ #sleep (@etcd_opts[:election_timeout] / 1000.0)
153
+ retry
158
154
  rescue MultiJson::LoadError => e
159
- if request.code.between?(400, 499)
155
+ if request.code.between?(200, 299)
156
+ request.body.to_s
157
+ elsif request.code.between?(300, 399)
158
+ if request.headers['Location']
159
+ request(verb, request.headers['Location'], opts)
160
+ end
161
+ elsif request.code.between?(400, 499)
160
162
  abort Error::HttpClientError.new("#{request.reason}\n#{request.body.to_s}")
161
163
  elsif request.code.between?(500, 599)
162
164
  abort Error::HttpServerError.new("#{request.reason}\n#{request.body.to_s}")
@@ -165,9 +167,5 @@ module Etzetera
165
167
  end
166
168
  end
167
169
  end
168
-
169
- def parse_response(response)
170
- response
171
- end
172
170
  end
173
171
  end
@@ -21,6 +21,7 @@ module Etzetera
21
21
  class NotDir < CommandError; end
22
22
  class NodeExist < CommandError; end
23
23
  class KeyIsPreserved < CommandError; end
24
+ class RootROnly < CommandError; end
24
25
 
25
26
  class ValueRequired < PostFormError; end
26
27
  class PrevValueRequired < PostFormError; end
@@ -41,6 +42,7 @@ module Etzetera
41
42
  104 => NotDir,
42
43
  105 => NodeExist,
43
44
  106 => KeyIsPreserved,
45
+ 107 => RootROnly,
44
46
  200 => ValueRequired,
45
47
  201 => PrevValueRequired,
46
48
  202 => TTLNaN,
@@ -1,3 +1,3 @@
1
1
  module Etzetera
2
- VERSION = '0.0.3'
2
+ VERSION = '0.0.4'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: etzetera
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hendrik
@@ -31,62 +31,62 @@ cert_chain:
31
31
  fESaRa24pr3CGd0AyltcRbKGfNpZfj1zfqWXrDUJj0Y1sOASd8+UZPmBFS2feJqy
32
32
  het/fGFD7akMwHXIlNxNsg==
33
33
  -----END CERTIFICATE-----
34
- date: 2014-03-04 00:00:00.000000000 Z
34
+ date: 2014-03-05 00:00:00.000000000 Z
35
35
  dependencies:
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: celluloid-io
38
38
  requirement: !ruby/object:Gem::Requirement
39
39
  requirements:
40
- - - "~>"
40
+ - - ">="
41
41
  - !ruby/object:Gem::Version
42
42
  version: '0.15'
43
43
  type: :runtime
44
44
  prerelease: false
45
45
  version_requirements: !ruby/object:Gem::Requirement
46
46
  requirements:
47
- - - "~>"
47
+ - - ">="
48
48
  - !ruby/object:Gem::Version
49
49
  version: '0.15'
50
50
  - !ruby/object:Gem::Dependency
51
51
  name: http
52
52
  requirement: !ruby/object:Gem::Requirement
53
53
  requirements:
54
- - - "~>"
54
+ - - ">="
55
55
  - !ruby/object:Gem::Version
56
56
  version: '0.5'
57
57
  type: :runtime
58
58
  prerelease: false
59
59
  version_requirements: !ruby/object:Gem::Requirement
60
60
  requirements:
61
- - - "~>"
61
+ - - ">="
62
62
  - !ruby/object:Gem::Version
63
63
  version: '0.5'
64
64
  - !ruby/object:Gem::Dependency
65
65
  name: multi_json
66
66
  requirement: !ruby/object:Gem::Requirement
67
67
  requirements:
68
- - - "~>"
68
+ - - ">="
69
69
  - !ruby/object:Gem::Version
70
- version: '1.8'
70
+ version: 1.8.4
71
71
  type: :runtime
72
72
  prerelease: false
73
73
  version_requirements: !ruby/object:Gem::Requirement
74
74
  requirements:
75
- - - "~>"
75
+ - - ">="
76
76
  - !ruby/object:Gem::Version
77
- version: '1.8'
77
+ version: 1.8.4
78
78
  - !ruby/object:Gem::Dependency
79
79
  name: bundler
80
80
  requirement: !ruby/object:Gem::Requirement
81
81
  requirements:
82
- - - "~>"
82
+ - - ">="
83
83
  - !ruby/object:Gem::Version
84
84
  version: '1.5'
85
85
  type: :development
86
86
  prerelease: false
87
87
  version_requirements: !ruby/object:Gem::Requirement
88
88
  requirements:
89
- - - "~>"
89
+ - - ">="
90
90
  - !ruby/object:Gem::Version
91
91
  version: '1.5'
92
92
  description: A etcd Client written in Ruby
metadata.gz.sig CHANGED
Binary file