elasticsearch-extensions 0.0.23 → 0.0.24
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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7248c6fbddfe31ef013db4c097d59ba4427df2e3
|
4
|
+
data.tar.gz: 565df7537b10de2a83cbf0181a65b7580901ba83
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5d56926d940b28be59070ab4d98adaba0beedb9228ca8df892db425e9066342bb54b29ed6f4ef7b94b6f1d94214df876e451aae3313092ef1c277b20d8241266
|
7
|
+
data.tar.gz: 397ab511b86ae27c15c77037df6c8d598e618299bf1683d7927c0cb6bc72823e7a212285ae052c7d1d613bdabdd6518fcdcb74a3f7a3ed4c4b5436117f859158
|
@@ -68,7 +68,8 @@ module Elasticsearch
|
|
68
68
|
#
|
69
69
|
# reindex = Elasticsearch::Extensions::Reindex.new \
|
70
70
|
# source: { index: 'test1', client: client },
|
71
|
-
# target: { index: 'test2'
|
71
|
+
# target: { index: 'test2' },
|
72
|
+
# transform: lambda { |doc| doc['_source']['category'].upcase! }
|
72
73
|
#
|
73
74
|
#
|
74
75
|
# The reindexing process works by "scrolling" an index and sending
|
@@ -7,6 +7,7 @@ require 'json'
|
|
7
7
|
require 'ansi'
|
8
8
|
|
9
9
|
STDOUT.sync = true
|
10
|
+
STDERR.sync = true
|
10
11
|
|
11
12
|
class String
|
12
13
|
|
@@ -24,9 +25,20 @@ module Elasticsearch
|
|
24
25
|
# A convenience Ruby class for starting and stopping an Elasticsearch cluster,
|
25
26
|
# eg. for integration tests
|
26
27
|
#
|
27
|
-
# @example Start a cluster with default configuration
|
28
|
+
# @example Start a cluster with default configuration,
|
29
|
+
# assuming `elasticsearch` is on $PATH.
|
30
|
+
#
|
31
|
+
# require 'elasticsearch/extensions/test/cluster'
|
32
|
+
# Elasticsearch::Extensions::Test::Cluster.start
|
33
|
+
#
|
34
|
+
# @example Start a cluster with a specific Elasticsearch launch script,
|
35
|
+
# eg. from a downloaded `.tar.gz` distribution
|
36
|
+
#
|
37
|
+
# system 'wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.1.1.tar.gz'
|
38
|
+
# system 'tar -xvf elasticsearch-5.1.1.tar.gz'
|
39
|
+
#
|
28
40
|
# require 'elasticsearch/extensions/test/cluster'
|
29
|
-
# Elasticsearch::Extensions::Test::Cluster
|
41
|
+
# Elasticsearch::Extensions::Test::Cluster.start command: 'elasticsearch-5.1.1/bin/elasticsearch'
|
30
42
|
#
|
31
43
|
# @see Cluster#initialize
|
32
44
|
#
|
@@ -185,6 +197,7 @@ module Elasticsearch
|
|
185
197
|
# @option arguments [Integer] :timeout Timeout when starting the cluster (default: 30)
|
186
198
|
# @option arguments [String] :network_host The host that nodes will bind on and publish to
|
187
199
|
# @option arguments [Boolean] :clear_cluster Wipe out cluster content on startup (default: true)
|
200
|
+
# @option arguments [Boolean] :quiet Disable printing to STDERR (default: false)
|
188
201
|
#
|
189
202
|
# You can also use environment variables to set the constructor options (see source).
|
190
203
|
#
|
@@ -205,6 +218,7 @@ module Elasticsearch
|
|
205
218
|
@arguments[:timeout] ||= ENV.fetch('TEST_CLUSTER_TIMEOUT', 30).to_i
|
206
219
|
@arguments[:number_of_nodes] ||= ENV.fetch('TEST_CLUSTER_NODES', 2).to_i
|
207
220
|
@arguments[:network_host] ||= ENV.fetch('TEST_CLUSTER_NETWORK_HOST', __default_network_host)
|
221
|
+
@arguments[:quiet] ||= ! ENV.fetch('QUIET', '').empty?
|
208
222
|
|
209
223
|
@clear_cluster = !!@arguments[:clear_cluster] || (ENV.fetch('TEST_CLUSTER_CLEAR', 'true') != 'false')
|
210
224
|
|
@@ -239,22 +253,23 @@ module Elasticsearch
|
|
239
253
|
#
|
240
254
|
def start
|
241
255
|
if self.running?
|
242
|
-
|
256
|
+
__log "[!] Elasticsearch cluster already running".ansi(:red)
|
243
257
|
return false
|
244
258
|
end
|
245
259
|
|
246
260
|
__remove_cluster_data if @clear_cluster
|
247
261
|
|
248
|
-
|
249
|
-
|
262
|
+
__log "Starting ".ansi(:faint) + arguments[:number_of_nodes].to_s.ansi(:bold, :faint) +
|
263
|
+
" Elasticsearch #{arguments[:number_of_nodes] < 2 ? 'node' : 'nodes'}..".ansi(:faint), :print
|
264
|
+
|
250
265
|
pids = []
|
251
266
|
|
252
|
-
|
267
|
+
__log "\nUsing Elasticsearch version [#{version}]" if ENV['DEBUG']
|
253
268
|
|
254
269
|
arguments[:number_of_nodes].times do |n|
|
255
270
|
n += 1
|
256
271
|
command = __command(version, arguments, n)
|
257
|
-
|
272
|
+
__log command.gsub(/ {1,}/, ' ').ansi(:bold) if ENV['DEBUG']
|
258
273
|
|
259
274
|
pid = Process.spawn(command)
|
260
275
|
Process.detach pid
|
@@ -264,7 +279,7 @@ module Elasticsearch
|
|
264
279
|
|
265
280
|
__check_for_running_processes(pids)
|
266
281
|
wait_for_green
|
267
|
-
|
282
|
+
__log __cluster_info
|
268
283
|
|
269
284
|
return true
|
270
285
|
end
|
@@ -286,7 +301,7 @@ module Elasticsearch
|
|
286
301
|
begin
|
287
302
|
nodes = __get_nodes
|
288
303
|
rescue Exception => e
|
289
|
-
|
304
|
+
__log "[!] Exception raised when stopping the cluster: #{e.inspect}".ansi(:red)
|
290
305
|
nil
|
291
306
|
end
|
292
307
|
|
@@ -295,13 +310,14 @@ module Elasticsearch
|
|
295
310
|
pids = nodes['nodes'].map { |id, info| info['process']['id'] }
|
296
311
|
|
297
312
|
unless pids.empty?
|
298
|
-
|
313
|
+
__log "Stopping Elasticsearch nodes... ".ansi(:faint), :print
|
314
|
+
|
299
315
|
pids.each_with_index do |pid, i|
|
300
316
|
['INT','KILL'].each do |signal|
|
301
317
|
begin
|
302
318
|
Process.kill signal, pid
|
303
319
|
rescue Exception => e
|
304
|
-
|
320
|
+
__log "[#{e.class}] PID #{pid} not found. ".ansi(:red), :print
|
305
321
|
end
|
306
322
|
|
307
323
|
# Give the system some breathing space to finish...
|
@@ -313,14 +329,15 @@ module Elasticsearch
|
|
313
329
|
# `getpgid` will raise error if pid is dead, so if we get here, try next signal
|
314
330
|
next
|
315
331
|
rescue Errno::ESRCH
|
316
|
-
|
332
|
+
__log "Stopped PID #{pid}".ansi(:green) +
|
317
333
|
(ENV['DEBUG'] ? " with #{signal} signal".ansi(:green) : '') +
|
318
|
-
". ".ansi(:green)
|
334
|
+
". ".ansi(:green), :print
|
319
335
|
break # pid is dead
|
320
336
|
end
|
321
337
|
end
|
322
338
|
end
|
323
|
-
|
339
|
+
|
340
|
+
__log "\n"
|
324
341
|
else
|
325
342
|
return false
|
326
343
|
end
|
@@ -416,23 +433,35 @@ module Elasticsearch
|
|
416
433
|
jar = Dir.entries(path_to_lib).select { |f| f.start_with? 'elasticsearch' }.first if File.exist? path_to_lib
|
417
434
|
|
418
435
|
version = if jar
|
419
|
-
|
436
|
+
__log "Determining version from [#{jar}]" if ENV['DEBUG']
|
437
|
+
if m = jar.match(/elasticsearch\-(\d+\.\d+\.\d+).*/)
|
420
438
|
m[1]
|
421
439
|
else
|
422
440
|
raise RuntimeError, "Cannot determine Elasticsearch version from jar [#{jar}]"
|
423
441
|
end
|
424
442
|
else
|
425
|
-
|
443
|
+
__log "[!] Cannot find Elasticsearch .jar from path to command [#{arguments[:command]}], using `#{arguments[:command]} --version`" if ENV['DEBUG']
|
426
444
|
|
427
445
|
unless File.exist? arguments[:command]
|
428
|
-
|
446
|
+
__log "File [#{arguments[:command]}] does not exists, checking full path by `which`: ", :print if ENV['DEBUG']
|
447
|
+
|
448
|
+
begin
|
449
|
+
full_path = `which #{arguments[:command]}`.strip
|
450
|
+
__log "#{full_path.inspect}\n", :print if ENV['DEBUG']
|
451
|
+
rescue Exception => e
|
452
|
+
raise RuntimeError, "Cannot determine full path to [#{arguments[:command]}] with 'which'"
|
453
|
+
end
|
454
|
+
|
455
|
+
if full_path.empty?
|
456
|
+
raise Errno::ENOENT, "Cannot find Elasticsearch launch script from [#{arguments[:command]}] -- did you pass a correct path?"
|
457
|
+
end
|
429
458
|
end
|
430
459
|
|
431
460
|
output = ''
|
432
461
|
|
433
462
|
begin
|
434
463
|
# First, try the new `--version` syntax...
|
435
|
-
|
464
|
+
__log "Running [#{arguments[:command]} --version] to determine version" if ENV['DEBUG']
|
436
465
|
rout, wout = IO.pipe
|
437
466
|
pid = Process.spawn("#{arguments[:command]} --version", out: wout)
|
438
467
|
|
@@ -444,10 +473,12 @@ module Elasticsearch
|
|
444
473
|
end
|
445
474
|
rescue Timeout::Error
|
446
475
|
# ...else, the old `-v` syntax
|
447
|
-
|
476
|
+
__log "Running [#{arguments[:command]} -v] to determine version" if ENV['DEBUG']
|
448
477
|
output = `#{arguments[:command]} -v`
|
449
478
|
ensure
|
450
|
-
|
479
|
+
if pid
|
480
|
+
Process.kill('INT', pid) rescue Errno::ESRCH # Most likely the process has terminated already
|
481
|
+
end
|
451
482
|
wout.close unless wout.closed?
|
452
483
|
rout.close unless rout.closed?
|
453
484
|
end
|
@@ -511,33 +542,33 @@ module Elasticsearch
|
|
511
542
|
Timeout::timeout(timeout) do
|
512
543
|
loop do
|
513
544
|
response = __get_cluster_health(status)
|
514
|
-
|
545
|
+
__log response if ENV['DEBUG']
|
515
546
|
|
516
547
|
if response && response['status'] == status && ( arguments[:number_of_nodes].nil? || arguments[:number_of_nodes].to_i == response['number_of_nodes'].to_i )
|
517
548
|
break
|
518
549
|
end
|
519
550
|
|
520
|
-
|
551
|
+
__log '.'.ansi(:faint), :print
|
521
552
|
sleep 1
|
522
553
|
end
|
523
554
|
end
|
524
555
|
rescue Timeout::Error => e
|
525
556
|
message = "\nTimeout while waiting for cluster status [#{status}]"
|
526
557
|
message += " and [#{arguments[:number_of_nodes]}] nodes" if arguments[:number_of_nodes]
|
527
|
-
|
558
|
+
__log message.ansi(:red, :bold)
|
528
559
|
raise e
|
529
560
|
end
|
530
561
|
|
531
562
|
return true
|
532
563
|
end
|
533
564
|
|
534
|
-
#
|
565
|
+
# Return information about the cluster
|
535
566
|
#
|
536
567
|
# @api private
|
537
568
|
#
|
538
|
-
# @return
|
569
|
+
# @return String
|
539
570
|
#
|
540
|
-
def
|
571
|
+
def __cluster_info
|
541
572
|
health = JSON.parse(Net::HTTP.get(URI("#{__cluster_url}/_cluster/health")))
|
542
573
|
nodes = if version == '0.90'
|
543
574
|
JSON.parse(Net::HTTP.get(URI("#{__cluster_url}/_nodes/?process&http")))
|
@@ -546,21 +577,23 @@ module Elasticsearch
|
|
546
577
|
end
|
547
578
|
master = JSON.parse(Net::HTTP.get(URI("#{__cluster_url}/_cluster/state")))['master_node']
|
548
579
|
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
580
|
+
result = ["\n",
|
581
|
+
('-'*80).ansi(:faint),
|
582
|
+
'Cluster: '.ljust(20).ansi(:faint) + health['cluster_name'].to_s.ansi(:faint),
|
583
|
+
'Status: '.ljust(20).ansi(:faint) + health['status'].to_s.ansi(:faint),
|
584
|
+
'Nodes: '.ljust(20).ansi(:faint) + health['number_of_nodes'].to_s.ansi(:faint)].join("\n")
|
554
585
|
|
555
586
|
nodes['nodes'].each do |id, info|
|
556
587
|
m = id == master ? '*' : '+'
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
588
|
+
result << ''.ljust(20) +
|
589
|
+
"#{m} ".ansi(:faint) +
|
590
|
+
"#{info['name'].ansi(:bold)} ".ansi(:faint) +
|
591
|
+
"| version: #{info['version'] rescue 'N/A'}, ".ansi(:faint) +
|
592
|
+
"pid: #{info['process']['id'] rescue 'N/A'}, ".ansi(:faint) +
|
593
|
+
"address: #{info['http']['bound_address'] rescue 'N/A'}".ansi(:faint)
|
563
594
|
end
|
595
|
+
|
596
|
+
result
|
564
597
|
end
|
565
598
|
|
566
599
|
# Tries to load cluster health information
|
@@ -598,7 +631,7 @@ module Elasticsearch
|
|
598
631
|
#
|
599
632
|
def __check_for_running_processes(pids)
|
600
633
|
if `ps -p #{pids.join(' ')}`.split("\n").size < arguments[:number_of_nodes]+1
|
601
|
-
|
634
|
+
__log "\n[!!!] Process failed to start (see output above)".ansi(:red)
|
602
635
|
exit(1)
|
603
636
|
end
|
604
637
|
end
|
@@ -610,6 +643,12 @@ module Elasticsearch
|
|
610
643
|
def __get_nodes
|
611
644
|
JSON.parse(Net::HTTP.get(URI("#{__cluster_url}/_nodes/process")))
|
612
645
|
end
|
646
|
+
|
647
|
+
# Print to STDERR
|
648
|
+
#
|
649
|
+
def __log(message, mode=:puts)
|
650
|
+
STDERR.__send__ mode, message unless @arguments[:quiet]
|
651
|
+
end
|
613
652
|
end
|
614
653
|
end
|
615
654
|
end
|
@@ -102,6 +102,13 @@ class Elasticsearch::Extensions::TestClusterTest < Test::Unit::TestCase
|
|
102
102
|
@subject.__remove_cluster_data
|
103
103
|
end
|
104
104
|
|
105
|
+
should "not log when :quiet" do
|
106
|
+
c = Cluster::Cluster.new quiet: true
|
107
|
+
|
108
|
+
STDERR.expects(:puts).never
|
109
|
+
c.__log 'QUIET'
|
110
|
+
end
|
111
|
+
|
105
112
|
context "when starting a cluster, " do
|
106
113
|
should "return false when it's already running" do
|
107
114
|
Process.expects(:spawn).never
|
@@ -127,7 +134,7 @@ class Elasticsearch::Extensions::TestClusterTest < Test::Unit::TestCase
|
|
127
134
|
c.expects(:wait_for_green).returns(true)
|
128
135
|
c.expects(:__check_for_running_processes).returns(true)
|
129
136
|
c.expects(:__determine_version).returns('5.0')
|
130
|
-
c.expects(:
|
137
|
+
c.expects(:__cluster_info).returns('CLUSTER INFO')
|
131
138
|
|
132
139
|
assert_equal true, c.start
|
133
140
|
end
|
@@ -198,8 +205,6 @@ class Elasticsearch::Extensions::TestClusterTest < Test::Unit::TestCase
|
|
198
205
|
end
|
199
206
|
|
200
207
|
should "return true" do
|
201
|
-
@subject.stubs(:__print_cluster_info)
|
202
|
-
|
203
208
|
@subject
|
204
209
|
.expects(:__get_cluster_health)
|
205
210
|
.with('yellow')
|
@@ -254,6 +259,7 @@ class Elasticsearch::Extensions::TestClusterTest < Test::Unit::TestCase
|
|
254
259
|
|
255
260
|
should "return version from `elasticsearch --version`" do
|
256
261
|
File.expects(:exist?).with('/foo/bar/bin/../lib/').returns(false)
|
262
|
+
File.expects(:exist?).with('/foo/bar/bin/elasticsearch').returns(true)
|
257
263
|
|
258
264
|
Process.stubs(:wait)
|
259
265
|
Process.expects(:spawn)
|
@@ -270,7 +276,7 @@ class Elasticsearch::Extensions::TestClusterTest < Test::Unit::TestCase
|
|
270
276
|
end
|
271
277
|
|
272
278
|
should "raise an exception when the version cannot be parsed from .jar" do
|
273
|
-
# Incorrect jar version
|
279
|
+
# Incorrect jar version (no dots)
|
274
280
|
File.expects(:exist?).with('/foo/bar/bin/../lib/').returns(true)
|
275
281
|
Dir.expects(:entries).with('/foo/bar/bin/../lib/').returns(['elasticsearch-100.jar'])
|
276
282
|
|
@@ -279,6 +285,7 @@ class Elasticsearch::Extensions::TestClusterTest < Test::Unit::TestCase
|
|
279
285
|
|
280
286
|
should "raise an exception when the version cannot be parsed from command output" do
|
281
287
|
File.expects(:exist?).with('/foo/bar/bin/../lib/').returns(false)
|
288
|
+
File.expects(:exist?).with('/foo/bar/bin/elasticsearch').returns(true)
|
282
289
|
|
283
290
|
Process.stubs(:wait)
|
284
291
|
Process.expects(:spawn)
|
@@ -300,6 +307,16 @@ class Elasticsearch::Extensions::TestClusterTest < Test::Unit::TestCase
|
|
300
307
|
|
301
308
|
assert_raise(RuntimeError) { @subject.__determine_version }
|
302
309
|
end
|
310
|
+
|
311
|
+
should "raise an exception when the command cannot be found" do
|
312
|
+
@subject = Elasticsearch::Extensions::Test::Cluster::Cluster.new
|
313
|
+
|
314
|
+
File.expects(:exist?).with('./../lib/').returns(false)
|
315
|
+
File.expects(:exist?).with('elasticsearch').returns(false)
|
316
|
+
@subject.expects(:`).returns('')
|
317
|
+
|
318
|
+
assert_raise(Errno::ENOENT) { @subject.__determine_version }
|
319
|
+
end
|
303
320
|
end
|
304
321
|
end
|
305
322
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elasticsearch-extensions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.24
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Karel Minarik
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ansi
|