diplomat 0.5.1 → 0.6.0

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: 3f1c9c12e4e39b571bceb79ece16ea11b65e86a1
4
- data.tar.gz: 20aab29fd76ec1ccca03f7051a2055d90e2e7c47
3
+ metadata.gz: 13812b43787dfad96eb90581712105f0c628d79b
4
+ data.tar.gz: 6a1243327e6ac77df41c96d9d00b6a6aaeb8e5c2
5
5
  SHA512:
6
- metadata.gz: 90217e6d23c9fa287a1d53a0e6d9d4abb7e2700222f232b397e154004994880160a0ca97ae27019ba0811f2e054d190d61542a20292fa7c670ed9feeb847e7e8
7
- data.tar.gz: 9666756e0d00d492342a4f5898885d459724c8fdbfe5fc36754abcab80fa11faa1a9d4819191183b96a94fff4ae3fa5630fc05708ff58dca12bb0eea31336280
6
+ metadata.gz: cbccfdcb4107ff7c5fe8a515207f93ab162c5f3a469e932ee1fbd71596302e2fdc0aa7a67b056139abba39029b781702f3c854a23a50e39fa70a53b7fee7442e
7
+ data.tar.gz: 50e25171fab1b59b069f180d4ca50ea5084795852bc0c4a4a18fe522e325da26c5922968508d7c69c92b8db9e4c753bdb3b757da7ea2da57e1b5aee714916c14
@@ -20,7 +20,7 @@ module Diplomat
20
20
  self.root_path = File.expand_path "..", __FILE__
21
21
  self.lib_path = File.expand_path "../diplomat", __FILE__
22
22
 
23
- require_libs "configuration", "rest_client", "kv", "service", "members", "check", "health", "session", "lock"
23
+ require_libs "configuration", "rest_client", "kv", "service", "members", "check", "health", "session", "lock", "error"
24
24
  self.configuration ||= Diplomat::Configuration.new
25
25
 
26
26
  class << self
@@ -0,0 +1,5 @@
1
+ module Diplomat
2
+ class KeyNotFound < StandardError; end
3
+ class KeyAlreadyExists < StandardError; end
4
+ class UnknownStatus < StandardError; end
5
+ end
@@ -6,14 +6,69 @@ module Diplomat
6
6
 
7
7
  attr_reader :key, :value, :raw
8
8
 
9
- # Get a value by its key
9
+ # Get a value by its key, potentially blocking for the first or next value
10
10
  # @param key [String] the key
11
+ # @param options [Hash] the query params
12
+ # @option options [String] :consistency The read consistency type
13
+ # @param not_found [Symbol] behaviour if the key doesn't exist;
14
+ # :reject with exception, or :wait for it to appear
15
+ # @param found [Symbol] behaviour if the key does exist;
16
+ # :reject with exception, :wait for its next value, or :return its current value
11
17
  # @return [String] The base64-decoded value associated with the key
12
- def get key
18
+ # @note
19
+ # When trying to access a key, there are two possibilites:
20
+ # - The key doesn't (yet) exist
21
+ # - The key exists. This may be its first value, there is no way to tell
22
+ # The combination of not_found and found behaviour gives maximum possible
23
+ # flexibility. For X: reject, R: return, W: wait
24
+ # - X X - meaningless; never return a value
25
+ # - X R - "normal" non-blocking get operation. Default
26
+ # - X W - get the next value only (must have a current value)
27
+ # - W X - get the first value only (must not have a current value)
28
+ # - W R - get the first or current value; always return something, but
29
+ # block only when necessary
30
+ # - W W - get the first or next value; wait until there is an update
31
+ def get key, options=nil, not_found=:reject, found=:return
13
32
  @key = key
33
+ @options = options
34
+
14
35
  url = ["/v1/kv/#{@key}"]
15
36
  url += check_acl_token unless check_acl_token.nil?
16
- @raw = @conn.get concat_url url
37
+ url += use_consistency(@options) unless use_consistency(@options).nil?
38
+
39
+ # 404s OK using this connection
40
+ raw = @conn_no_err.get concat_url url
41
+ if raw.status == 404
42
+ case not_found
43
+ when :reject
44
+ raise Diplomat::KeyNotFound, key
45
+ when :wait
46
+ index = raw.headers["x-consul-index"]
47
+ end
48
+ elsif raw.status == 200
49
+ case found
50
+ when :reject
51
+ raise Diplomat::KeyAlreadyExists, key
52
+ when :return
53
+ @raw = raw
54
+ parse_body
55
+ return return_value
56
+ when :wait
57
+ index = raw.headers["x-consul-index"]
58
+ end
59
+ else
60
+ raise Diplomat::UnknownStatus, "status #{raw.status}"
61
+ end
62
+
63
+ # Wait for first/next value
64
+ url = ["/v1/kv/#{@key}"]
65
+ url += check_acl_token unless check_acl_token.nil?
66
+ url += use_consistency(@options) unless use_consistency(@options).nil?
67
+ url += ["index=#{index}"]
68
+ @raw = @conn.get do |req|
69
+ req.url concat_url url
70
+ req.options.timeout = 86400
71
+ end
17
72
  parse_body
18
73
  return_value
19
74
  end
@@ -69,7 +124,7 @@ module Diplomat
69
124
 
70
125
  # Parse the body, apply it to the raw attribute
71
126
  def parse_body
72
- @raw = JSON.parse(@raw.body).first
127
+ @raw = JSON.parse(@raw.body)
73
128
  end
74
129
 
75
130
  # Get the key from the raw output
@@ -79,8 +134,17 @@ module Diplomat
79
134
 
80
135
  # Get the value from the raw output
81
136
  def return_value
82
- @value = @raw["Value"]
83
- @value = Base64.decode64(@value) unless @value.nil?
137
+ if @raw.count == 1
138
+ @value = @raw.first["Value"]
139
+ @value = Base64.decode64(@value) unless @value.nil?
140
+ else
141
+ @value = @raw.map do |e|
142
+ {
143
+ key: e["Key"],
144
+ value: e["Value"].nil? ? e["Value"] : Base64.decode64(e["Value"])
145
+ }
146
+ end
147
+ end
84
148
  end
85
149
 
86
150
  def check_acl_token
@@ -90,5 +154,9 @@ module Diplomat
90
154
  def use_cas(options)
91
155
  ["cas=#{options[:cas]}"] if options && options[:cas]
92
156
  end
157
+
158
+ def use_consistency(options)
159
+ ["#{options[:consistency]}"] if options && options[:consistency]
160
+ end
93
161
  end
94
162
  end
@@ -21,13 +21,23 @@ module Diplomat
21
21
  # Build the API Client
22
22
  # @param api_connection [Faraday::Connection,nil] supply mock API Connection
23
23
  def start_connection api_connection=nil
24
- @conn = api_connection ||= Faraday.new(:url => Diplomat.configuration.url) do |faraday|
24
+ @conn = api_connection || Faraday.new(:url => Diplomat.configuration.url) do |faraday|
25
+ faraday.adapter Faraday.default_adapter
25
26
  faraday.request :url_encoded
27
+ faraday.response :raise_error
28
+
26
29
  Diplomat.configuration.middleware.each do |middleware|
27
30
  faraday.use middleware
28
31
  end
32
+ end
33
+
34
+ @conn_no_err = api_connection || Faraday.new(:url => Diplomat.configuration.url) do |faraday|
29
35
  faraday.adapter Faraday.default_adapter
30
- faraday.use Faraday::Response::RaiseError
36
+ faraday.request :url_encoded
37
+
38
+ Diplomat.configuration.middleware.each do |middleware|
39
+ faraday.use middleware
40
+ end
31
41
  end
32
42
  end
33
43
 
@@ -1,3 +1,3 @@
1
1
  module Diplomat
2
- VERSION = "0.5.1"
2
+ VERSION = "0.6.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: diplomat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Hamelink
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-16 00:00:00.000000000 Z
11
+ date: 2015-04-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -179,6 +179,7 @@ files:
179
179
  - lib/diplomat.rb
180
180
  - lib/diplomat/check.rb
181
181
  - lib/diplomat/configuration.rb
182
+ - lib/diplomat/error.rb
182
183
  - lib/diplomat/health.rb
183
184
  - lib/diplomat/kv.rb
184
185
  - lib/diplomat/lock.rb