elastomer-client 0.3.3 → 0.4.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: 2d0dde42bf5e2cd7b2a2da696528ec66b8b44c75
4
- data.tar.gz: 82b5315520a01408b40c97149649a197196d0d4e
3
+ metadata.gz: a3bb86cf79cf4c35faa602b5b887790916354830
4
+ data.tar.gz: 0d20d421a0c1c396efaaa01edfc0c7eb621deb37
5
5
  SHA512:
6
- metadata.gz: e73b854104d40f4d2310e78f3bb480b1c1ca6b91be50bcd93f263fc7a6373364cacdea81c00a955818788e915d20b23fd9c713cd78b410ea25bdd7d6a4eeab2c
7
- data.tar.gz: d2091b590bb120763fbe74c6e4b4ce2fcdef423bb61dd249e39ef17c781cd78f990ebeb5382a32ffbb36808f8103eb1119381207541bfb3ceaabdb3ab9d6e4f0
6
+ metadata.gz: 0043c22c958488f7952e814a05390df0dfb1b3746414b66d33b22ea5951f489155bd2ac820d47c541f9b3146f73a1a7a9c93af0b88769318ff1229bf112a160e
7
+ data.tar.gz: ca7cf1438d19f70fa2f73bf4b2ff7a22e8ef74453f8914dfa646b83163b4df0a4216fbd6cc5666b153dc2bcebd3af602f7240f28b449b22f07d61808fd27a608
data/CHANGELOG.md CHANGED
@@ -1,7 +1,18 @@
1
+ ## 0.4.0 (2014-10-08)
2
+ - BREAKING: docs.add alias for docs.index removed
3
+ - BREAKING: Faraday exceptions are now raised as Elastomer exceptions
4
+ - Repository and snapshot support
5
+ - Support cluster state filtering on 1.x
6
+ - Support node stats filtering on 1.x
7
+ - New apis: cluster stats, cluster pending\_tasks
8
+ - Support single-index alias get, add, delete
9
+
1
10
  ## 0.3.3 (2014-08-18)
2
11
  - Allow symbols as parameter values #67
12
+
3
13
  ## 0.3.2 (2014-07-02)
4
14
  - Make underscore optional in bulk params #66
15
+
5
16
  ## 0.3.1 (2014-06-24)
6
17
  - First rubygems release
7
18
  - Make `update_aliases` more flexible
@@ -20,16 +20,16 @@ The event namespace is `request.client.elastomer`.
20
20
 
21
21
  ## Valid actions
22
22
  - bulk
23
- - cluster.get_settings
24
- - cluster.health
25
- - cluster.reroute
26
- - cluster.state
27
- - cluster.update_settings
28
23
  - cluster.available
29
24
  - cluster.get_aliases
25
+ - cluster.get_settings
26
+ - cluster.health
30
27
  - cluster.info
28
+ - cluster.reroute
31
29
  - cluster.shutdown
30
+ - cluster.state
32
31
  - cluster.update_aliases
32
+ - cluster.update_settings
33
33
  - docs.delete
34
34
  - docs.delete_by_query
35
35
  - docs.explain
@@ -65,7 +65,19 @@ The event namespace is `request.client.elastomer`.
65
65
  - nodes.info
66
66
  - nodes.shutdown
67
67
  - nodes.stats
68
+ - repository.create
69
+ - repository.delete
70
+ - repository.exists
71
+ - repository.get
72
+ - repository.status
73
+ - repository.update
68
74
  - search.scan
69
75
  - search.scroll
76
+ - snapshot.create
77
+ - snapshot.delete
78
+ - snapshot.exists
79
+ - snapshot.get
80
+ - snapshot.restore
81
+ - snapshot.status
70
82
  - template.create
71
83
  - template.get
@@ -188,7 +188,22 @@ module Elastomer
188
188
  handle_errors response
189
189
 
190
190
  rescue Faraday::Error::TimeoutError => boom
191
- raise ::Elastomer::Client::TimeoutError.new(boom, path)
191
+ raise TimeoutError.new(boom, method.upcase, path)
192
+
193
+ rescue Faraday::Error::ConnectionFailed => boom
194
+ raise ConnectionFailed.new(boom, method.upcase, path)
195
+
196
+ rescue Faraday::Error::ResourceNotFound => boom
197
+ raise ResourceNotFound.new(boom, method.upcase, path)
198
+
199
+ rescue Faraday::Error::ParsingError => boom
200
+ raise ParsingError.new(boom, method.upcase, path)
201
+
202
+ rescue Faraday::Error::SSLError => boom
203
+ raise SSLError.new(boom, method.upcase, path)
204
+
205
+ rescue Faraday::Error::ClientError => boom
206
+ raise Error.new(boom, method.upcase, path)
192
207
 
193
208
  # ensure
194
209
  # # FIXME: this is here until we get a real logger in place
@@ -259,8 +274,8 @@ module Elastomer
259
274
  # Raises an Elastomer::Client::Error on 500 responses or responses
260
275
  # containing and 'error' field.
261
276
  def handle_errors( response )
262
- raise Error, response if response.status >= 500
263
- raise Error, response if Hash === response.body && response.body['error']
277
+ raise ServerError, response if response.status >= 500
278
+ raise RequestError, response if Hash === response.body && response.body['error']
264
279
 
265
280
  response
266
281
  end
@@ -135,7 +135,6 @@ module Elastomer
135
135
  params = prepare_params(document, params)
136
136
  add_to_actions({:index => params}, document)
137
137
  end
138
- alias :add :index
139
138
 
140
139
  # Add a create action to the list of bulk actions to be performed when
141
140
  # the bulk API call is made. Parameters can be provided in the
@@ -19,10 +19,18 @@ module Elastomer
19
19
 
20
20
  attr_reader :client
21
21
 
22
- # Simple status on the health of the cluster.
23
- # See http://www.elasticsearch.org/guide/reference/api/admin-cluster-health/
22
+ # Simple status on the health of the cluster. The API can also be executed
23
+ # against one or more indices to get just the specified indices health.
24
24
  #
25
25
  # params - Parameters Hash
26
+ # :index - a single index name or an Array of index names
27
+ # :level - one of "cluster", "indices", or "shards"
28
+ # :wait_for_status - one of "green", "yellow", or "red"
29
+ # :wait_for_relocating_shards - a number controlling to how many relocating shards to wait for
30
+ # :wait_for_nodes - the request waits until the specified number N of nodes is available
31
+ # :timeout - how long to wait [default is "30s"]
32
+ #
33
+ # See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/cluster-health.html
26
34
  #
27
35
  # Returns the response as a Hash
28
36
  def health( params = {} )
@@ -30,22 +38,58 @@ module Elastomer
30
38
  response.body
31
39
  end
32
40
 
33
- # Comprehensive state information of the whole cluster.
34
- # See http://www.elasticsearch.org/guide/reference/api/admin-cluster-state/
41
+ # Comprehensive state information of the whole cluster. For 1.x metric
42
+ # and index filtering, use the :metrics and :indices parameter keys.
43
+ #
44
+ # The list of available metrics are:
45
+ # version, master_node, nodes, routing_table, metadata, blocks
35
46
  #
36
47
  # params - Parameters Hash
48
+ # :metrics - list of metrics to select as an Array
49
+ # :indices - a single index name or an Array of index names
50
+ #
51
+ # See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/cluster-state.html
37
52
  #
38
53
  # Returns the response as a Hash
39
54
  def state( params = {} )
40
- response = client.get '/_cluster/state', params.merge(:action => 'cluster.state')
55
+ response = client.get '/_cluster/state{/metrics}{/indices}', params.merge(:action => 'cluster.state')
56
+ response.body
57
+ end
58
+
59
+ # Retrieve statistics from a cluster wide perspective. The API returns
60
+ # basic index metrics (shard numbers, store size, memory usage) and
61
+ # information about the current nodes that form the cluster (number,
62
+ # roles, os, jvm versions, memory usage, cpu and installed plugins).
63
+ #
64
+ # params - Parameters Hash
65
+ #
66
+ # See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/cluster-stats.html
67
+ #
68
+ # Returns the response as a Hash
69
+ def stats( params = {} )
70
+ response = client.get '/_cluster/stats', params.merge(:action => 'cluster.stats')
71
+ response.body
72
+ end
73
+
74
+ # Returns a list of any cluster-level changes (e.g. create index, update
75
+ # mapping, allocate or fail shard) which have not yet been executed.
76
+ #
77
+ # params - Parameters Hash
78
+ #
79
+ # See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/cluster-pending.html
80
+ #
81
+ # Returns the response as a Hash
82
+ def pending_tasks( params = {} )
83
+ response = client.get '/_cluster/pending_tasks', params.merge(:action => 'cluster.pending_tasks')
41
84
  response.body
42
85
  end
43
86
 
44
87
  # Cluster wide settings that have been modified via the update API.
45
- # See http://www.elasticsearch.org/guide/reference/api/admin-cluster-update-settings/
46
88
  #
47
89
  # params - Parameters Hash
48
90
  #
91
+ # See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/cluster-update-settings.html
92
+ #
49
93
  # Returns the response as a Hash
50
94
  def get_settings( params = {} )
51
95
  response = client.get '/_cluster/settings', params.merge(:action => 'cluster.get_settings')
@@ -57,11 +101,11 @@ module Elastomer
57
101
  # persistent (applied cross restarts) or transient (will not survive a
58
102
  # full cluster restart).
59
103
  #
60
- # See http://www.elasticsearch.org/guide/reference/api/admin-cluster-update-settings/
61
- #
62
104
  # body - The new settings as a Hash or a JSON encoded String
63
105
  # params - Parameters Hash
64
106
  #
107
+ # See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/cluster-update-settings.html
108
+ #
65
109
  # Returns the response as a Hash
66
110
  def update_settings( body, params = {} )
67
111
  response = client.put '/_cluster/settings', params.merge(:body => body, :action => 'cluster.update_settings')
@@ -73,8 +117,6 @@ module Elastomer
73
117
  # allocation can be canceled, or an unassigned shard can be explicitly
74
118
  # allocated on a specific node.
75
119
  #
76
- # See http://www.elasticsearch.org/guide/reference/api/admin-cluster-reroute/
77
- #
78
120
  # commands - A command Hash or an Array of command Hashes
79
121
  # params - Parameters Hash
80
122
  #
@@ -87,20 +129,23 @@ module Elastomer
87
129
  # { :allocate => { :index => 'test', :shard => 1, :node => 'node3' }}
88
130
  # ])
89
131
  #
132
+ # See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/cluster-reroute.html
133
+ #
90
134
  # Returns the response as a Hash
91
135
  def reroute( commands, params = {} )
92
- commands = [commands] unless Array === commands
93
- body = {:commands => commands}
136
+ body = {:commands => Array(commands)}
94
137
 
95
138
  response = client.post '/_cluster/reroute', params.merge(:body => body, :action => 'cluster.reroute')
96
139
  response.body
97
140
  end
98
141
 
99
- # Shutdown the entire cluster.
100
- # See http://www.elasticsearch.org/guide/reference/api/admin-cluster-nodes-shutdown/
142
+ # Shutdown the entire cluster. There is also a Nodes#shutdown method for
143
+ # shutting down individual nodes.
101
144
  #
102
145
  # params - Parameters Hash
103
146
  #
147
+ # See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/cluster-nodes-shutdown.html
148
+ #
104
149
  # Returns the response as a Hash
105
150
  def shutdown( params = {} )
106
151
  response = client.post '/_shutdown', params.merge(:action => 'cluster.shutdown')
@@ -112,15 +157,16 @@ module Elastomer
112
157
  # can also use the alias name here since it is acting the part of an
113
158
  # index.
114
159
  #
115
- # See http://www.elasticsearch.org/guide/reference/api/admin-indices-aliases/
116
- #
117
160
  # params - Parameters Hash
161
+ # :index - an index name or Array of index names
118
162
  #
119
163
  # Examples
120
164
  #
121
165
  # get_aliases
122
166
  # get_aliases( :index => 'users' )
123
167
  #
168
+ # See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-aliases.html
169
+ #
124
170
  # Returns the response body as a Hash
125
171
  def get_aliases( params = {} )
126
172
  response = client.get '{/index}/_aliases', params.merge(:action => 'cluster.get_aliases')
@@ -133,8 +179,6 @@ module Elastomer
133
179
  # actions. This API method will wrap the request in the appropriate
134
180
  # {:actions => [...]} body construct.
135
181
  #
136
- # See http://www.elasticsearch.org/guide/reference/api/admin-indices-aliases/
137
- #
138
182
  # actions - An action Hash or an Array of action Hashes
139
183
  # params - Parameters Hash
140
184
  #
@@ -147,6 +191,8 @@ module Elastomer
147
191
  # { :add => { :index => 'users-2', :alias => 'users' }}
148
192
  # ])
149
193
  #
194
+ # See http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-aliases.html
195
+ #
150
196
  # Returns the response body as a Hash
151
197
  def update_aliases( actions, params = {} )
152
198
  if actions.is_a?(Hash) && actions.key?(:actions)
@@ -168,11 +214,17 @@ module Elastomer
168
214
  #
169
215
  # Returns the template definitions as a Hash
170
216
  def templates
171
- h = state(
172
- :filter_blocks => true,
173
- :filter_nodes => true,
174
- :filter_routing_table => true
175
- )
217
+ # ES 1.x supports state filtering via a path segment called metrics.
218
+ # ES 0.90 uses query parameters instead.
219
+ if client.semantic_version >= '1.0.0'
220
+ h = state(:metrics => 'metadata')
221
+ else
222
+ h = state(
223
+ :filter_blocks => true,
224
+ :filter_nodes => true,
225
+ :filter_routing_table => true,
226
+ )
227
+ end
176
228
  h['metadata']['templates']
177
229
  end
178
230
 
@@ -181,11 +233,17 @@ module Elastomer
181
233
  #
182
234
  # Returns the indices definitions as a Hash
183
235
  def indices
184
- h = state(
185
- :filter_blocks => true,
186
- :filter_nodes => true,
187
- :filter_routing_table => true
188
- )
236
+ # ES 1.x supports state filtering via a path segment called metrics.
237
+ # ES 0.90 uses query parameters instead.
238
+ if client.semantic_version >= '1.0.0'
239
+ h = state(:metrics => 'metadata')
240
+ else
241
+ h = state(
242
+ :filter_blocks => true,
243
+ :filter_nodes => true,
244
+ :filter_routing_table => true,
245
+ )
246
+ end
189
247
  h['metadata']['indices']
190
248
  end
191
249
 
@@ -195,11 +253,17 @@ module Elastomer
195
253
  #
196
254
  # Returns the nodes definitions as a Hash
197
255
  def nodes
198
- h = state(
199
- :filter_blocks => true,
200
- :filter_metadata => true,
201
- :filter_routing_table => true
202
- )
256
+ # ES 1.x supports state filtering via a path segment called metrics.
257
+ # ES 0.90 uses query parameters instead.
258
+ if client.semantic_version >= '1.0.0'
259
+ h = state(:metrics => 'nodes')
260
+ else
261
+ h = state(
262
+ :filter_blocks => true,
263
+ :filter_metadata => true,
264
+ :filter_routing_table => true,
265
+ )
266
+ end
203
267
  h['nodes']
204
268
  end
205
269
 
@@ -52,7 +52,6 @@ module Elastomer
52
52
 
53
53
  response.body
54
54
  end
55
- alias :add :index
56
55
 
57
56
  # Delete a document from the index based on the document ID. The :id is
58
57
  # provided as part of the params hash.
@@ -14,38 +14,68 @@ module Elastomer
14
14
  # extracted from the response body.
15
15
  #
16
16
  # response - Faraday::Response object or a simple error message String
17
- def initialize( response )
18
- if response.respond_to? :body
17
+ #
18
+ def initialize( *args )
19
+ @status = nil
20
+
21
+ case args.first
22
+ when Exception
23
+ exception = args.shift
24
+ super("#{exception.message} :: #{args.join(' ')}")
25
+ set_backtrace exception.backtrace
26
+
27
+ when Faraday::Response
28
+ response = args.shift
19
29
  message = Hash === response.body && response.body['error'] || response.body.to_s
30
+ @status = response.status
31
+ super message
32
+
20
33
  else
21
- message, response = response.to_s, nil
34
+ super args.join(' ')
22
35
  end
23
-
24
- @status = response.nil? ? nil : response.status
25
-
26
- super message
27
36
  end
28
37
 
29
38
  # Returns the status code from the `response` or nil if the Error was not
30
39
  # created with a response.
31
40
  attr_reader :status
32
41
 
33
- end # Error
42
+ # Indicates that the error is fatal. The request should not be tried
43
+ # again.
44
+ def fatal?
45
+ self.class.fatal?
46
+ end
34
47
 
35
- # Timeout specific error class.
36
- class TimeoutError < ::Elastomer::Error
48
+ # The inverse of the `fatal?` method. A request can be retried if this
49
+ # method returns `true`.
50
+ def retry?
51
+ !fatal?
52
+ end
37
53
 
38
- # Wrap a Farday TimeoutError with our own class and include the HTTP
39
- # path where the error originated.
40
- #
41
- # exception - The originating Faraday::Error::TimeoutError
42
- # path - The path portion of the HTTP request
43
- #
44
- def initialize( exception, path )
45
- super "#{exception.message}: #{path}"
46
- set_backtrace exception.backtrace
54
+ class << self
55
+ # By default all client errors are fatal and indicate that a request
56
+ # should not be retried. Only a few errors are retryable.
57
+ def fatal
58
+ return @fatal if defined? @fatal
59
+ @fatal = true
60
+ end
61
+ attr_writer :fatal
62
+ alias :fatal? :fatal
47
63
  end
48
- end # TimeoutError
64
+
65
+ end # Error
66
+
67
+ # Wrapper classes for specific Faraday errors.
68
+ TimeoutError = Class.new Error
69
+ ConnectionFailed = Class.new Error
70
+ ResourceNotFound = Class.new Error
71
+ ParsingError = Class.new Error
72
+ SSLError = Class.new Error
73
+ ServerError = Class.new Error
74
+ RequestError = Class.new Error
75
+
76
+ ServerError.fatal = false
77
+ TimeoutError.fatal = false
78
+ ConnectionFailed.fatal = false
49
79
 
50
80
  end # Client
51
81
  end # Elastomer