elasticsearch-extensions 0.0.27 → 0.0.32

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.
@@ -1,3 +1,20 @@
1
+ # Licensed to Elasticsearch B.V. under one or more contributor
2
+ # license agreements. See the NOTICE file distributed with
3
+ # this work for additional information regarding copyright
4
+ # ownership. Elasticsearch B.V. licenses this file to you under
5
+ # the Apache License, Version 2.0 (the "License"); you may
6
+ # not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
17
+
1
18
  # encoding: utf-8
2
19
 
3
20
  require 'elasticsearch'
@@ -1,3 +1,20 @@
1
+ # Licensed to Elasticsearch B.V. under one or more contributor
2
+ # license agreements. See the NOTICE file distributed with
3
+ # this work for additional information regarding copyright
4
+ # ownership. Elasticsearch B.V. licenses this file to you under
5
+ # the Apache License, Version 2.0 (the "License"); you may
6
+ # not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
17
+
1
18
  # encoding: utf-8
2
19
 
3
20
  require 'elasticsearch/extensions'
@@ -1,3 +1,20 @@
1
+ # Licensed to Elasticsearch B.V. under one or more contributor
2
+ # license agreements. See the NOTICE file distributed with
3
+ # this work for additional information regarding copyright
4
+ # ownership. Elasticsearch B.V. licenses this file to you under
5
+ # the Apache License, Version 2.0 (the "License"); you may
6
+ # not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
17
+
1
18
  # encoding: utf-8
2
19
 
3
20
  module Elasticsearch
@@ -100,7 +117,7 @@ module Elasticsearch
100
117
  output << ""
101
118
  end
102
119
  output << Helpers.___
103
- output << "#{hits.size.to_s.ansi(:bold)} of #{json['hits']['total'].to_s.ansi(:bold)} results".ansi(:faint)
120
+ output << "#{hits.size.to_s.ansi(:bold)} of #{json['hits']['total']['value'].to_s.ansi(:bold)} results".ansi(:faint)
104
121
 
105
122
  output.join("\n")
106
123
  end
@@ -1,3 +1,20 @@
1
+ # Licensed to Elasticsearch B.V. under one or more contributor
2
+ # license agreements. See the NOTICE file distributed with
3
+ # this work for additional information regarding copyright
4
+ # ownership. Elasticsearch B.V. licenses this file to you under
5
+ # the Apache License, Version 2.0 (the "License"); you may
6
+ # not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
17
+
1
18
  # encoding: utf-8
2
19
 
3
20
  module Elasticsearch
@@ -1,3 +1,20 @@
1
+ # Licensed to Elasticsearch B.V. under one or more contributor
2
+ # license agreements. See the NOTICE file distributed with
3
+ # this work for additional information regarding copyright
4
+ # ownership. Elasticsearch B.V. licenses this file to you under
5
+ # the Apache License, Version 2.0 (the "License"); you may
6
+ # not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
17
+
1
18
  module Elasticsearch
2
19
  module Extensions
3
20
  module ANSI
@@ -1,13 +1,41 @@
1
+ # Licensed to Elasticsearch B.V. under one or more contributor
2
+ # license agreements. See the NOTICE file distributed with
3
+ # this work for additional information regarding copyright
4
+ # ownership. Elasticsearch B.V. licenses this file to you under
5
+ # the Apache License, Version 2.0 (the "License"); you may
6
+ # not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
17
+
1
18
  # encoding: utf-8
2
19
 
3
20
  require 'pathname'
4
21
  require 'fileutils'
5
22
 
6
23
  require 'multi_json'
7
- require 'oj'
24
+
25
+ begin
26
+ require 'oj'
27
+ rescue LoadError
28
+ warn('The "oj" gem could not be loaded. JSON parsing and serialization performance may not be optimal.')
29
+ end
30
+
31
+ begin
32
+ require 'patron'
33
+ rescue LoadError
34
+ warn('The "patron" gem could not be loaded. HTTP requests may not be performed optimally.')
35
+ end
36
+
8
37
 
9
38
  require 'elasticsearch'
10
- require 'patron'
11
39
 
12
40
  module Backup
13
41
  module Database
@@ -154,12 +182,19 @@ module Backup
154
182
  while r = client.scroll(scroll_id: r['_scroll_id'], scroll: scroll) and not r['hits']['hits'].empty? do
155
183
  r['hits']['hits'].each do |hit|
156
184
  FileUtils.mkdir_p "#{path.join hit['_index'], hit['_type']}"
157
- File.open("#{path.join hit['_index'], hit['_type'], hit['_id']}.json", 'w') do |file|
185
+ File.open("#{path.join hit['_index'], hit['_type'], __sanitize_filename(hit['_id'])}.json", 'w') do |file|
158
186
  file.write MultiJson.dump(hit)
159
187
  end
160
188
  end
161
189
  end
162
190
  end
191
+
192
+ def __sanitize_filename name
193
+ name
194
+ .encode(Encoding::UTF_8, invalid: :replace, undef: :replace, replace: "�")
195
+ .strip
196
+ .tr("\u{202E}%$|:;/\t\r\n\\", "-")
197
+ end
163
198
  end
164
199
  end
165
200
  end
@@ -1,3 +1,20 @@
1
+ # Licensed to Elasticsearch B.V. under one or more contributor
2
+ # license agreements. See the NOTICE file distributed with
3
+ # this work for additional information regarding copyright
4
+ # ownership. Elasticsearch B.V. licenses this file to you under
5
+ # the Apache License, Version 2.0 (the "License"); you may
6
+ # not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
17
+
1
18
  # encoding: utf-8
2
19
 
3
20
  module Elasticsearch
@@ -23,10 +40,10 @@ module Elasticsearch
23
40
  end; extend self
24
41
 
25
42
  module API
26
- # Copy documents from one index into another and refresh the target index
43
+ # Copy documents from one index into another and refresh the destination index
27
44
  #
28
45
  # @example
29
- # client.reindex source: { index: 'test1' }, target: { index: 'test2' }, refresh: true
46
+ # client.reindex source: { index: 'test1' }, dest: { index: 'test2' }, refresh: true
30
47
  #
31
48
  # The method allows all the options as {Reindex::Reindex.new}.
32
49
  #
@@ -50,40 +67,40 @@ module Elasticsearch
50
67
  # client = Elasticsearch::Client.new
51
68
  # reindex = Elasticsearch::Extensions::Reindex.new \
52
69
  # source: { index: 'test1', client: client },
53
- # target: { index: 'test2' }
70
+ # dest: { index: 'test2' }
54
71
  #
55
72
  # reindex.perform
56
73
  #
57
74
  # @example Copy documents to a different cluster
58
75
  #
59
76
  # source_client = Elasticsearch::Client.new url: 'http://localhost:9200'
60
- # target_client = Elasticsearch::Client.new url: 'http://localhost:9250'
77
+ # destination_client = Elasticsearch::Client.new url: 'http://localhost:9250'
61
78
  #
62
79
  # reindex = Elasticsearch::Extensions::Reindex.new \
63
80
  # source: { index: 'test', client: source_client },
64
- # target: { index: 'test', client: target_client }
81
+ # dest: { index: 'test', client: destination_client }
65
82
  # reindex.perform
66
83
  #
67
84
  # @example Transform the documents during re-indexing
68
85
  #
69
86
  # reindex = Elasticsearch::Extensions::Reindex.new \
70
87
  # source: { index: 'test1', client: client },
71
- # target: { index: 'test2' },
88
+ # dest: { index: 'test2' },
72
89
  # transform: lambda { |doc| doc['_source']['category'].upcase! }
73
90
  #
74
91
  #
75
92
  # The reindexing process works by "scrolling" an index and sending
76
- # batches via the "Bulk" API to the target index/cluster
93
+ # batches via the "Bulk" API to the destination index/cluster
77
94
  #
78
95
  # @option arguments [String] :source The source index/cluster definition (*Required*)
79
- # @option arguments [String] :target The target index/cluster definition (*Required*)
96
+ # @option arguments [String] :dest The destination index/cluster definition (*Required*)
80
97
  # @option arguments [Proc] :transform A block which will be executed for each document
81
98
  # @option arguments [Integer] :batch_size The size of the batch for scroll operation (Default: 1000)
82
99
  # @option arguments [String] :scroll The timeout for the scroll operation (Default: 5min)
83
- # @option arguments [Boolean] :refresh Whether to refresh the target index after
100
+ # @option arguments [Boolean] :refresh Whether to refresh the destination index after
84
101
  # the operation is completed (Default: false)
85
102
  #
86
- # Be aware, that if you want to change the target index settings and/or mappings,
103
+ # Be aware, that if you want to change the destination index settings and/or mappings,
87
104
  # you have to do so in advance by using the "Indices Create" API.
88
105
  #
89
106
  # Note, that there is a native "Reindex" API in Elasticsearch 2.3.x and higer versions,
@@ -98,7 +115,7 @@ module Elasticsearch
98
115
  [
99
116
  [:source, :index],
100
117
  [:source, :client],
101
- [:target, :index]
118
+ [:dest, :index]
102
119
  ].each do |required_option|
103
120
  value = required_option.reduce(arguments) { |sum, o| sum = sum[o] ? sum[o] : {} }
104
121
 
@@ -113,7 +130,7 @@ module Elasticsearch
113
130
  refresh: false
114
131
  }.merge(arguments)
115
132
 
116
- arguments[:target][:client] ||= arguments[:source][:client]
133
+ arguments[:dest][:client] ||= arguments[:source][:client]
117
134
  end
118
135
 
119
136
  # Performs the operation
@@ -144,14 +161,14 @@ module Elasticsearch
144
161
  output[:errors] += bulk_response['items'].select { |k, v| k.values.first['error'] }.size
145
162
  end
146
163
 
147
- arguments[:target][:client].indices.refresh index: arguments[:target][:index] if arguments[:refresh]
164
+ arguments[:dest][:client].indices.refresh index: arguments[:dest][:index] if arguments[:refresh]
148
165
 
149
166
  output
150
167
  end
151
168
 
152
169
  def __store_batch(documents)
153
170
  body = documents.map do |doc|
154
- doc['_index'] = arguments[:target][:index]
171
+ doc['_index'] = arguments[:dest][:index]
155
172
 
156
173
  arguments[:transform].call(doc) if arguments[:transform]
157
174
 
@@ -162,7 +179,7 @@ module Elasticsearch
162
179
  { index: doc }
163
180
  end
164
181
 
165
- arguments[:target][:client].bulk body: body
182
+ arguments[:dest][:client].bulk body: body
166
183
  end
167
184
  end
168
185
  end
@@ -1,3 +1,20 @@
1
+ # Licensed to Elasticsearch B.V. under one or more contributor
2
+ # license agreements. See the NOTICE file distributed with
3
+ # this work for additional information regarding copyright
4
+ # ownership. Elasticsearch B.V. licenses this file to you under
5
+ # the Apache License, Version 2.0 (the "License"); you may
6
+ # not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
17
+
1
18
  require 'timeout'
2
19
  require 'net/http'
3
20
  require 'fileutils'
@@ -21,7 +38,6 @@ end
21
38
  module Elasticsearch
22
39
  module Extensions
23
40
  module Test
24
-
25
41
  # A convenience Ruby class for starting and stopping an Elasticsearch cluster,
26
42
  # eg. for integration tests
27
43
  #
@@ -43,12 +59,11 @@ module Elasticsearch
43
59
  # @see Cluster#initialize
44
60
  #
45
61
  module Cluster
46
-
47
62
  # Starts a cluster
48
63
  #
49
64
  # @see Cluster#start
50
65
  #
51
- def start(arguments={})
66
+ def start(arguments = {})
52
67
  Cluster.new(arguments).start
53
68
  end
54
69
 
@@ -56,7 +71,7 @@ module Elasticsearch
56
71
  #
57
72
  # @see Cluster#stop
58
73
  #
59
- def stop(arguments={})
74
+ def stop(arguments = {})
60
75
  Cluster.new(arguments).stop
61
76
  end
62
77
 
@@ -64,7 +79,7 @@ module Elasticsearch
64
79
  #
65
80
  # @see Cluster#running?
66
81
  #
67
- def running?(arguments={})
82
+ def running?(arguments = {})
68
83
  Cluster.new(arguments).running?
69
84
  end
70
85
 
@@ -72,7 +87,7 @@ module Elasticsearch
72
87
  #
73
88
  # @see Cluster#wait_for_green
74
89
  #
75
- def wait_for_green(arguments={})
90
+ def wait_for_green(arguments = {})
76
91
  Cluster.new(arguments).wait_for_green
77
92
  end
78
93
 
@@ -190,12 +205,15 @@ module Elasticsearch
190
205
  -E path.repo=/tmp \
191
206
  -E repositories.url.allowed_urls=http://snapshot.test* \
192
207
  -E discovery.zen.minimum_master_nodes=#{arguments[:number_of_nodes]-1} \
208
+ -E xpack.security.enabled=false \
193
209
  -E node.max_local_storage_nodes=#{arguments[:number_of_nodes]} \
194
210
  -E logger.level=#{ENV['DEBUG'] ? 'DEBUG' : 'INFO'} \
195
211
  #{arguments[:es_params]}
196
212
  COMMAND
197
213
  }
198
214
  }
215
+ COMMANDS['7.0'] = COMMANDS['6.0'].clone
216
+ COMMANDS['8.0'] = COMMANDS['7.0'].clone
199
217
  COMMANDS.freeze
200
218
 
201
219
  # Create a new instance of the Cluster class
@@ -237,7 +255,11 @@ module Elasticsearch
237
255
  @arguments[:network_host] ||= ENV.fetch('TEST_CLUSTER_NETWORK_HOST', __default_network_host)
238
256
  @arguments[:quiet] ||= ! ENV.fetch('QUIET', '').empty?
239
257
 
240
- @clear_cluster = !!@arguments[:clear_cluster] || (ENV.fetch('TEST_CLUSTER_CLEAR', 'true') != 'false')
258
+ @clear_cluster = if @arguments[:clear_cluster].nil?
259
+ (ENV.fetch('TEST_CLUSTER_CLEAR', 'true') != 'false')
260
+ else
261
+ !!@arguments[:clear_cluster]
262
+ end
241
263
 
242
264
  # Make sure `cluster_name` is not dangerous
243
265
  raise ArgumentError, "The `cluster_name` argument cannot be empty string or a slash" \
@@ -407,7 +429,7 @@ module Elasticsearch
407
429
  '0.0.0.0'
408
430
  when /^2/
409
431
  '_local_'
410
- when /^5|^6/
432
+ when /^5|^6|^7|^8/
411
433
  '_local_'
412
434
  else
413
435
  raise RuntimeError, "Cannot determine default network host from version [#{version}]"
@@ -450,9 +472,10 @@ module Elasticsearch
450
472
  #
451
473
  def __determine_version
452
474
  path_to_lib = File.dirname(arguments[:command]) + '/../lib/'
475
+
453
476
  version = if arguments[:version]
454
477
  arguments[:version]
455
- elsif File.exist?(path_to_lib) && !(jar = Dir.entries(path_to_lib).select { |f| f.start_with? 'elasticsearch' }.first).nil?
478
+ elsif File.exist?(path_to_lib) && !(jar = Dir.entries(path_to_lib).select { |f| f =~ /^elasticsearch\-\d/ }.first).nil?
456
479
  __log "Determining version from [#{jar}]" if ENV['DEBUG']
457
480
  if m = jar.match(/elasticsearch\-(\d+\.\d+\.\d+).*/)
458
481
  m[1]
@@ -482,15 +505,14 @@ module Elasticsearch
482
505
  begin
483
506
  # First, try the new `--version` syntax...
484
507
  __log "Running [#{arguments[:command]} --version] to determine version" if ENV['DEBUG']
485
- rout, wout = IO.pipe
486
- pid = Process.spawn("#{arguments[:command]} --version", out: wout)
508
+ io = IO.popen("#{arguments[:command]} --version")
509
+ pid = io.pid
487
510
 
488
511
  Timeout::timeout(arguments[:timeout_version]) do
489
512
  Process.wait(pid)
490
- wout.close unless wout.closed?
491
- output = rout.read unless rout.closed?
492
- rout.close unless rout.closed?
513
+ output = io.read
493
514
  end
515
+
494
516
  rescue Timeout::Error
495
517
  # ...else, the old `-v` syntax
496
518
  __log "Running [#{arguments[:command]} -v] to determine version" if ENV['DEBUG']
@@ -499,8 +521,7 @@ module Elasticsearch
499
521
  if pid
500
522
  Process.kill('INT', pid) rescue Errno::ESRCH # Most likely the process has terminated already
501
523
  end
502
- wout.close unless wout.closed?
503
- rout.close unless rout.closed?
524
+ io.close unless io.closed?
504
525
  end
505
526
 
506
527
  STDERR.puts "> #{output}" if ENV['DEBUG']
@@ -509,7 +530,7 @@ module Elasticsearch
509
530
  raise RuntimeError, "Cannot determine Elasticsearch version from [#{arguments[:command]} --version] or [#{arguments[:command]} -v]"
510
531
  end
511
532
 
512
- if m = output.match(/Version: (\d\.\d.\d).*,/)
533
+ if(m = output.match(/Version: (\d+\.\d+.\d+).*,/))
513
534
  m[1]
514
535
  else
515
536
  raise RuntimeError, "Cannot determine Elasticsearch version from elasticsearch --version output [#{output}]"
@@ -527,6 +548,10 @@ module Elasticsearch
527
548
  '5.0'
528
549
  when /^6\..*/
529
550
  '6.0'
551
+ when /^7\..*/
552
+ '7.0'
553
+ when /^8\..*/
554
+ '8.0'
530
555
  else
531
556
  raise RuntimeError, "Cannot determine major version from [#{version}]"
532
557
  end