desi 0.2.0 → 0.2.1
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.
- data/.travis.yml +4 -0
- data/README.md +25 -5
- data/Rakefile +3 -0
- data/lib/desi/index_manager.rb +6 -6
- data/lib/desi/process_manager.rb +90 -14
- data/lib/desi/version.rb +1 -1
- data/spec/desi/index_manager_spec.rb +3 -3
- data/tasks/spec.rake +8 -0
- metadata +6 -4
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
Desi
|
2
|
+
====
|
3
|
+
[](http://travis-ci.org/AF83/desi)
|
2
4
|
|
3
5
|
Desi (Developper ElasticSearch Installer) is very simple tool to quickly set up
|
4
6
|
an [Elastic Search](http://www.elasticsearch.org/) local install for
|
@@ -51,6 +53,24 @@ will be spun up by (`desi start`)
|
|
51
53
|
Desi::LocalInstall.new.releases.detect(&:current?).version #=> "0.19.9"
|
52
54
|
```
|
53
55
|
|
56
|
+
### Start a node instance and get the cluster's status
|
57
|
+
|
58
|
+
* command-line
|
59
|
+
|
60
|
+
```shell
|
61
|
+
$ desi start
|
62
|
+
* Elastic Search 0.19.9 started
|
63
|
+
$ desi status
|
64
|
+
OK. Elastic Search cluster 'elasticsearch' (v0.19.9) is running on 1 node(s) with status yellow
|
65
|
+
```
|
66
|
+
|
67
|
+
|
68
|
+
* library
|
69
|
+
|
70
|
+
```ruby
|
71
|
+
Desi::ProcessManager.new.start.status #=> "OK. Elastic Search cluster 'elasticsearch' (v0.19.9) is running on 1 node(s) with status green"
|
72
|
+
```
|
73
|
+
|
54
74
|
|
55
75
|
### List and delete some indices
|
56
76
|
|
@@ -65,7 +85,7 @@ will be spun up by (`desi start`)
|
|
65
85
|
bar
|
66
86
|
baz
|
67
87
|
|
68
|
-
$ # List all indices on remote cluster 129.168.1.42,
|
88
|
+
$ # List all indices with "foo" in their name on remote cluster 129.168.1.42, port 9800
|
69
89
|
$ desi indices --host 129.168.1.42:9800 foo
|
70
90
|
Indices from host http://192.168.1.42:9800 matching the pattern /foo/
|
71
91
|
|
@@ -86,16 +106,16 @@ will be spun up by (`desi start`)
|
|
86
106
|
# All local indices
|
87
107
|
Desi::IndexManager.new.list #=> ["foo", "bar", "baz"]
|
88
108
|
|
89
|
-
# All local indices whose name starts with
|
109
|
+
# All local indices whose name starts with "b"
|
90
110
|
Desi::IndexManager.new.list("^b") #=> ["bar", "baz"]
|
91
111
|
|
92
112
|
# All indices from distant cluster
|
93
113
|
Desi::IndexManager.new(host: "192.168.1.42:9800").list #=> ["remotefoo1", "remotefoo2"]
|
94
114
|
|
95
|
-
# Delete all local indices whose name starts with
|
115
|
+
# Delete all local indices whose name starts with "ba"
|
96
116
|
Desi::IndexManager.new.delete!("^ba") #=> nil
|
97
117
|
|
98
|
-
# The indices actually disappeared
|
118
|
+
# The indices actually disappeared! \o/
|
99
119
|
Desi::IndexManager.new.list #=> ["foo"]
|
100
120
|
```
|
101
121
|
|
data/Rakefile
CHANGED
data/lib/desi/index_manager.rb
CHANGED
@@ -20,7 +20,7 @@ module Desi
|
|
20
20
|
#
|
21
21
|
# @note The +:http_client_factory+ should return an instance that responds
|
22
22
|
# to #get and #delete
|
23
|
-
# @return [
|
23
|
+
# @return [void]
|
24
24
|
#
|
25
25
|
# @api public
|
26
26
|
def initialize(opts = {})
|
@@ -60,7 +60,7 @@ module Desi
|
|
60
60
|
# Delete all indices matching the specified pattern
|
61
61
|
#
|
62
62
|
# @param [#to_s] pattern Regexp pattern used to restrict the selection
|
63
|
-
# @return [
|
63
|
+
# @return [void]
|
64
64
|
#
|
65
65
|
# @note No confirmation is needed, so beware!
|
66
66
|
#
|
@@ -77,7 +77,7 @@ module Desi
|
|
77
77
|
@outputter.puts "The following indices from host #{@host} are now deleted" if @verbose
|
78
78
|
|
79
79
|
indices(Regexp.new(pattern)).each do |index|
|
80
|
-
@client.delete(index)
|
80
|
+
@client.delete("/#{index}")
|
81
81
|
@outputter.puts " * #{index}" if @verbose
|
82
82
|
end
|
83
83
|
end
|
@@ -85,7 +85,7 @@ module Desi
|
|
85
85
|
# Empty (remove all records) from indices matching the specified pattern
|
86
86
|
#
|
87
87
|
# @param [#to_s] pattern Regexp pattern used to restrict the selection
|
88
|
-
# @return [
|
88
|
+
# @return [void]
|
89
89
|
#
|
90
90
|
# @note No confirmation is needed, so beware!
|
91
91
|
#
|
@@ -102,7 +102,7 @@ module Desi
|
|
102
102
|
@outputter.puts "The following indices from host #{@host} are now emptied" if @verbose
|
103
103
|
|
104
104
|
indices(Regexp.new(pattern)).each do |index|
|
105
|
-
@client.delete("
|
105
|
+
@client.delete("/#{index}/_query?q=*")
|
106
106
|
@outputter.puts " * #{index}" if @verbose
|
107
107
|
end
|
108
108
|
end
|
@@ -110,7 +110,7 @@ module Desi
|
|
110
110
|
private
|
111
111
|
|
112
112
|
def indices(pattern)
|
113
|
-
JSON.parse(@client.get('_status').body)["indices"].keys.select {|i|
|
113
|
+
JSON.parse(@client.get('/_status').body)["indices"].keys.select {|i|
|
114
114
|
i =~ pattern
|
115
115
|
}
|
116
116
|
end
|
data/lib/desi/process_manager.rb
CHANGED
@@ -7,6 +7,19 @@ require "desi/http_client"
|
|
7
7
|
require "desi/local_install"
|
8
8
|
|
9
9
|
module Desi
|
10
|
+
|
11
|
+
# The ProcessManager will start, stop and restart a local Elastic Search node
|
12
|
+
# instance, in addition to reporting its status
|
13
|
+
#
|
14
|
+
# @example Start up the instance and check its status
|
15
|
+
# Desi::ProcessManager.new.start.status #=> "OK. Elastic Search cluster 'elasticsearch' (v0.19.9) is running on 1 node(s) with status green"
|
16
|
+
#
|
17
|
+
# @example Retrieve the currently running cluster's version
|
18
|
+
# Desi::ProcessManager.new.running_version #=> "0.19.9"
|
19
|
+
#
|
20
|
+
# @example Retrieve a distant cluster's version
|
21
|
+
# Desi::ProcessManager.new(host: "http://somewhere.com:9200").running_version #=> "0.18.5"
|
22
|
+
#
|
10
23
|
class ProcessManager
|
11
24
|
|
12
25
|
def initialize(opts = {})
|
@@ -16,6 +29,16 @@ module Desi
|
|
16
29
|
@client = opts.fetch(:http_client_factory, Desi::HttpClient).new(@host)
|
17
30
|
end
|
18
31
|
|
32
|
+
# Start the cluster
|
33
|
+
#
|
34
|
+
# This will be a no-op if the cluster is already started.
|
35
|
+
#
|
36
|
+
# @note This method will also output its result on STDOUT if +@verbose+ is
|
37
|
+
# true
|
38
|
+
#
|
39
|
+
# @return [self]
|
40
|
+
#
|
41
|
+
# @api public
|
19
42
|
def start
|
20
43
|
if cluster_ready?
|
21
44
|
puts "ES cluster is already running" if @verbose
|
@@ -23,15 +46,39 @@ module Desi
|
|
23
46
|
start_cluster
|
24
47
|
puts " * Elastic Search #{running_version} started" if @verbose
|
25
48
|
end
|
26
|
-
|
27
|
-
|
49
|
+
self
|
50
|
+
end
|
51
|
+
|
52
|
+
# Restart the cluster
|
53
|
+
#
|
54
|
+
# Stop the cluster (if its up) and start it again.
|
55
|
+
#
|
56
|
+
# @note We use the pidfile to determine if the cluster is up. If a node was
|
57
|
+
# started with another tool, you may end up with more than 1 node
|
58
|
+
# running.
|
59
|
+
#
|
60
|
+
# @note This method will also output its result on STDOUT if +@verbose+ is
|
61
|
+
# true
|
62
|
+
#
|
63
|
+
# @return [self]
|
64
|
+
#
|
65
|
+
# @api public
|
28
66
|
def restart
|
29
67
|
puts " * (Re)starting cluster" if @verbose
|
30
68
|
stop if has_pid?
|
31
69
|
start_cluster
|
32
70
|
puts " * Elastic Search #{running_version} started" if @verbose
|
71
|
+
self
|
33
72
|
end
|
34
73
|
|
74
|
+
# Stop the cluster
|
75
|
+
#
|
76
|
+
# @note This method will also output its result on STDOUT if +@verbose+ is
|
77
|
+
# true
|
78
|
+
#
|
79
|
+
# @return [self]
|
80
|
+
#
|
81
|
+
# @api public
|
35
82
|
def stop
|
36
83
|
if pid
|
37
84
|
puts " * Will stop instance with pid #{pid}" if @verbose
|
@@ -39,13 +86,19 @@ module Desi
|
|
39
86
|
else
|
40
87
|
puts " * No pidfile detected!. Won't stop" if @verbose
|
41
88
|
end
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
89
|
+
self
|
90
|
+
end
|
91
|
+
|
92
|
+
# Get information about the cluster's status
|
93
|
+
#
|
94
|
+
# Desi::ProcessManager.new.status #=> "OK. Elastic Search cluster 'elasticsearch' (v0.19.9) is running on 1 node(s) with status green"
|
95
|
+
#
|
96
|
+
# @note This method will also output its result on STDOUT if +@verbose+ is
|
97
|
+
# true
|
98
|
+
#
|
99
|
+
# @return [String]
|
100
|
+
#
|
101
|
+
# @api public
|
49
102
|
def status
|
50
103
|
if version = running_version
|
51
104
|
msg = "OK. Elastic Search cluster '#{cluster_health.cluster_name}' (v#{version}) is running on #{cluster_health.number_of_nodes} node(s) with status #{cluster_health.status}"
|
@@ -56,14 +109,27 @@ module Desi
|
|
56
109
|
msg
|
57
110
|
end
|
58
111
|
|
112
|
+
# Whether the pidfile actually holds a PID
|
113
|
+
#
|
114
|
+
# @return [Boolean]
|
59
115
|
def has_pid?
|
60
116
|
pid && !pid.empty?
|
61
117
|
end
|
62
118
|
|
119
|
+
# PID as retrieved from the pidfile
|
120
|
+
#
|
121
|
+
# @return [String]
|
63
122
|
def pid
|
64
123
|
@pid ||= File.read(pidfile) if pidfile.exist?
|
65
124
|
end
|
66
125
|
|
126
|
+
# Release number of the currently running cluster
|
127
|
+
#
|
128
|
+
# @example
|
129
|
+
# Desi::ProcessManager.new.running_version #=> "0.19.9"
|
130
|
+
#
|
131
|
+
#
|
132
|
+
# @return [String,nil]
|
67
133
|
def running_version
|
68
134
|
begin
|
69
135
|
JSON.parse(@client.get('/').body)["version"]["number"]
|
@@ -72,6 +138,21 @@ module Desi
|
|
72
138
|
end
|
73
139
|
end
|
74
140
|
|
141
|
+
protected
|
142
|
+
|
143
|
+
# Return cluster health data straight from the cluster
|
144
|
+
#
|
145
|
+
# see
|
146
|
+
# http://www.elasticsearch.org/guide/reference/api/admin-cluster-health.html
|
147
|
+
# for further information on the response's structure
|
148
|
+
#
|
149
|
+
# @return [Hash]
|
150
|
+
def cluster_health
|
151
|
+
@cluster_health ||= OpenStruct.new(JSON.parse(@client.get('/_cluster/health').body))
|
152
|
+
end
|
153
|
+
|
154
|
+
private
|
155
|
+
|
75
156
|
def wait_until_cluster_becomes_ready(max_wait = 10, step = 0.5)
|
76
157
|
wait_for(max_wait, step) { cluster_ready? }
|
77
158
|
end
|
@@ -80,8 +161,6 @@ module Desi
|
|
80
161
|
wait_for(max_wait, step) { !cluster_ready? }
|
81
162
|
end
|
82
163
|
|
83
|
-
private
|
84
|
-
|
85
164
|
def start_cluster
|
86
165
|
line = Cocaine::CommandLine.new(@local_install.launcher.to_s, "-p :pidfile", pidfile: pidfile.to_s)
|
87
166
|
line.run
|
@@ -124,9 +203,6 @@ module Desi
|
|
124
203
|
delay < max_wait
|
125
204
|
end
|
126
205
|
|
127
|
-
def cluster_health
|
128
|
-
@cluster_health ||= OpenStruct.new(JSON.parse(@client.get('/_cluster/health').body))
|
129
|
-
end
|
130
206
|
|
131
207
|
end
|
132
208
|
end
|
data/lib/desi/version.rb
CHANGED
@@ -18,7 +18,7 @@ describe Desi::IndexManager do
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def stub_indices(*names)
|
21
|
-
stub_request(:get, '_status', {"indices" => Hash[Array(names).zip]})
|
21
|
+
stub_request(:get, '/_status', {"indices" => Hash[Array(names).zip]})
|
22
22
|
end
|
23
23
|
|
24
24
|
before do
|
@@ -63,7 +63,7 @@ describe Desi::IndexManager do
|
|
63
63
|
end
|
64
64
|
|
65
65
|
it "deletes all matching indices" do
|
66
|
-
http_client.should_receive(:delete).with("foo")
|
66
|
+
http_client.should_receive(:delete).with("/foo")
|
67
67
|
http_client.should_not_receive(:delete).with("bar")
|
68
68
|
|
69
69
|
subject.delete!('f.*')
|
@@ -96,7 +96,7 @@ describe Desi::IndexManager do
|
|
96
96
|
end
|
97
97
|
|
98
98
|
it "deletes all matching indices" do
|
99
|
-
http_client.should_receive(:delete).with("foo/_query?q=*")
|
99
|
+
http_client.should_receive(:delete).with("/foo/_query?q=*")
|
100
100
|
http_client.should_not_receive(:delete).with("bar")
|
101
101
|
|
102
102
|
subject.empty!('f.*')
|
data/tasks/spec.rake
ADDED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: desi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-09-
|
12
|
+
date: 2012-09-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: boson
|
@@ -168,6 +168,7 @@ extra_rdoc_files: []
|
|
168
168
|
files:
|
169
169
|
- .gitignore
|
170
170
|
- .rspec
|
171
|
+
- .travis.yml
|
171
172
|
- .yardopts
|
172
173
|
- Gemfile
|
173
174
|
- Guardfile
|
@@ -189,6 +190,7 @@ files:
|
|
189
190
|
- lib/desi/version.rb
|
190
191
|
- spec/desi/index_manager_spec.rb
|
191
192
|
- spec/spec_helper.rb
|
193
|
+
- tasks/spec.rake
|
192
194
|
- tasks/yard.rake
|
193
195
|
homepage: https://github.com/AF83/desi/
|
194
196
|
licenses: []
|
@@ -204,7 +206,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
204
206
|
version: '0'
|
205
207
|
segments:
|
206
208
|
- 0
|
207
|
-
hash:
|
209
|
+
hash: 3454323007955509059
|
208
210
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
209
211
|
none: false
|
210
212
|
requirements:
|
@@ -213,7 +215,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
213
215
|
version: '0'
|
214
216
|
segments:
|
215
217
|
- 0
|
216
|
-
hash:
|
218
|
+
hash: 3454323007955509059
|
217
219
|
requirements: []
|
218
220
|
rubyforge_project:
|
219
221
|
rubygems_version: 1.8.24
|