scalastic 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: db0c2019184cf395101e628c12380028c616cecb
4
- data.tar.gz: fb827f64ffcc8cb8b9beeef11839fae4eb0537bc
3
+ metadata.gz: 7a323230b42e70b738a01c5ad1dcdba2ce284155
4
+ data.tar.gz: 2fe66cdd753c110c60daa3bbd17355d72a5eecd4
5
5
  SHA512:
6
- metadata.gz: 916ca019138061d26daf42ac486ee8f346dc16b01c5b869525ad09ec064e88728910e1207b55ebf691ff3d5ef7544c6af4a1bde6f45d681d16a8546e90e93296
7
- data.tar.gz: 5511b43df76519259a6625a5ca1b8f18562766f83cc0ac9d52c936fdd4e1c54c7495f6a8df87ef468205692689819d90b5ab289c38b7833916e36d5b0cf24832
6
+ metadata.gz: d9bbd87a04f3ab5ebd0012bd6e47bb28f1572e706fa12ea1abbca9f6289773bc47bfd2932907dae3ebd26215173fbca93b231b8239a7a9b9b22db0af8fb2e5b0
7
+ data.tar.gz: f042ba5eb5743a51684643c032fa6421a2b2c088cf438c2772e08c515147265f49b1f2c42cdf2ddca20d109641b21da2aea3656c01cadfd29ea0b3a523e0be03
@@ -24,7 +24,7 @@ module Scalastic
24
24
 
25
25
  def get_partition_id(alias_name)
26
26
  m = partition_regex.match(alias_name)
27
- m && m[1].to_i
27
+ m && m[1]
28
28
  end
29
29
 
30
30
  def partition_prefix=(value)
@@ -39,7 +39,7 @@ module Scalastic
39
39
 
40
40
  def partition_selector_type=(value)
41
41
  value = value.to_s
42
- raise(ArgumentError, "Unsupported selector type: #{value}. Supported types are: (string, long)") unless %w(string long).include?(value)
42
+ raise(ArgumentError, "Unsupported selector type: #{value}. Supported types are: (string, long)") unless %w(string long integer).include?(value)
43
43
  @partition_selector_type = value
44
44
  end
45
45
 
@@ -3,6 +3,9 @@ require 'scalastic/partition_selector'
3
3
 
4
4
  module Scalastic
5
5
  class Partition
6
+ Endpoint = Struct.new(:index, :routing)
7
+ Endpoints = Struct.new(:index, :search)
8
+
6
9
  attr_reader(:es_client)
7
10
  attr_reader(:config)
8
11
  attr_reader(:id)
@@ -82,6 +85,32 @@ module Scalastic
82
85
  "ES partition #{id}"
83
86
  end
84
87
 
88
+ def get_endpoints
89
+ sa = config.search_endpoint(id)
90
+ ia = config.index_endpoint(id)
91
+ aliases = es_client.indices.get_aliases name: [sa, ia].join(',')
92
+ sas = aliases.map{|i, d| [i, d['aliases'][sa]]}.reject{|_i, sa| sa.nil?}
93
+ ias = aliases.map{|i, d| [i, d['aliases'][ia]]}.reject{|_i, ia| ia.nil?}
94
+ Endpoints.new(
95
+ ias.map{|i, ia| Endpoint.new(i, ia['index_routing']).freeze}.first,
96
+ sas.map{|i, sa| Endpoint.new(i, sa['search_routing']).freeze}.freeze
97
+ ).freeze
98
+ end
99
+
100
+ def index_to(args)
101
+ ie = config.index_endpoint(id)
102
+ eps = get_endpoints
103
+ actions = []
104
+ actions << {remove: {index: eps.index.index, alias: ie}} if eps.index
105
+ actions << {add: EsActionsGenerator.new_index_alias(config, args.merge(id: id))} unless args.nil?
106
+ #TODO: log a warning if there're no updates
107
+ es_client.indices.update_aliases(body: {actions: actions}) if actions.any?
108
+ end
109
+
110
+ def readonly?
111
+ get_endpoints.index.nil?
112
+ end
113
+
85
114
  private
86
115
 
87
116
  def operation_name(entry)
@@ -25,7 +25,8 @@ module Scalastic
25
25
  end
26
26
 
27
27
  def delete(args = {})
28
- id = args[:id] || raise(ArgumentError, 'Missing required argument :id')
28
+ id = args[:id].to_s
29
+ raise(ArgumentError, 'Missing required argument :id') if id.nil? || id.empty?
29
30
  pairs = es_client.indices.get_aliases.map{|i, d| d['aliases'].keys.select{|a| config.get_partition_id(a) == id}.map{|a| [i, a]}}.flatten(1)
30
31
  unless pairs.any?
31
32
  #TODO: log a warning
@@ -1,3 +1,3 @@
1
1
  module Scalastic
2
- VERSION = "0.5.1"
2
+ VERSION = "0.6.0"
3
3
  end
@@ -0,0 +1,52 @@
1
+ module RegressionTests
2
+ module Endpoints
3
+ extend self
4
+
5
+ def cleanup
6
+ client = Elasticsearch::Client.new
7
+ %w(endpoints_1 endpoints_2).each do |i|
8
+ client.indices.delete index: i if client.indices.exists? index: i
9
+ end
10
+ end
11
+
12
+ def run
13
+ client = Elasticsearch::Client.new
14
+ partitions = client.partitions
15
+
16
+ client.indices.create index: 'endpoints_1'
17
+ client.indices.create index: 'endpoints_2'
18
+ partitions.prepare_index index: 'endpoints_1'
19
+ partitions.prepare_index index: 'endpoints_2'
20
+
21
+ p = partitions[1]
22
+ raise 'Partition should not exist!' if p.exists?
23
+ raise 'Partition should be read only!' unless p.readonly?
24
+
25
+ eps = p.get_endpoints
26
+ raise 'Index endpoint is not nil!' unless eps.index.nil?
27
+ raise 'Search endpoints must be empty!' if eps.search.any?
28
+
29
+ p.index_to index: 'endpoints_1'
30
+ eps = p.get_endpoints
31
+ raise 'Partition shoudl exist!' unless p.exists?
32
+ raise 'Unexpected index endpoint' unless eps.index == Scalastic::Partition::Endpoint.new('endpoints_1', nil)
33
+ raise 'Partition should not be read only!' if p.readonly?
34
+
35
+ p.index_to index: 'endpoints_2', routing: 123
36
+ eps = p.get_endpoints
37
+ raise 'Unexpected index endpoint' unless eps.index == Scalastic::Partition::Endpoint.new('endpoints_2', '123')
38
+
39
+ p.index_to nil
40
+ raise 'Partition should not exist' if p.exists?
41
+ raise 'Partition is not read only' unless p.readonly?
42
+
43
+ p.extend_to index: 'endpoints_1'
44
+ eps = p.get_endpoints
45
+ raise 'Unexpected search endpoints' unless eps.search == [Scalastic::Partition::Endpoint.new('endpoints_1', nil)]
46
+ p.extend_to index: 'endpoints_2', routing: '22'
47
+ eps = p.get_endpoints
48
+ expected = [Scalastic::Partition::Endpoint.new('endpoints_1', nil), Scalastic::Partition::Endpoint.new('endpoints_2', '22')]
49
+ raise 'Unexpected search endpoints' unless eps.search.size == expected.size && expected.all?{|ep| eps.search.include?(ep)}
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,40 @@
1
+ module RegressionTests
2
+ module IndexDestinations
3
+ extend self
4
+
5
+ def cleanup
6
+ client = Elasticsearch::Client.new
7
+ client.indices.delete index: 'destinations_1' if client.indices.exists? index: 'destinations_1'
8
+ client.indices.delete index: 'destinations_2' if client.indices.exists? index: 'destinations_2'
9
+ end
10
+
11
+ def run
12
+ client = Elasticsearch::Client.new
13
+ partitions = client.partitions
14
+
15
+ client.indices.create index: 'destinations_1'
16
+ client.indices.create index: 'destinations_2'
17
+
18
+ partitions.prepare_index index: 'destinations_1'
19
+ partitions.prepare_index index: 'destinations_2'
20
+
21
+ p = partitions.create id: 1, index: 'destinations_1'
22
+ p.extend_to(index: 'destinations_2')
23
+
24
+ expected = {"destinations_1"=>{"aliases"=>{"scalastic_1_search"=>{"filter"=>{"term"=>{"scalastic_partition_id"=>1}}}}}, "destinations_2"=>{"aliases"=>{"scalastic_1_index"=>{}, "scalastic_1_search"=>{"filter"=>{"term"=>{"scalastic_partition_id"=>1}}}}}}
25
+ actual = client.indices.get_aliases index: 'destinations_1,destinations_2', name: 'scalastic_1_*'
26
+ raise "Expected #{expected}, got: #{actual}" unless expected == actual
27
+
28
+ p = partitions[2]
29
+ raise 'Partition should not exist!' if p.exists?
30
+ p = partitions.create id: 2, index: 'destinations_1'
31
+ raise 'Partition should exist!' unless p.exists?
32
+
33
+ p.index_to nil
34
+
35
+ expected = {"destinations_1"=>{"aliases"=>{"scalastic_2_search"=>{"filter"=>{"term"=>{"scalastic_partition_id"=>2}}}}}, "destinations_2"=>{"aliases"=>{}}}
36
+ actual = client.indices.get_aliases index: 'destinations_1,destinations_2', name: "scalastic_2_*"
37
+ raise "Expected: #{expected}, got: #{actual}" unless expected == actual
38
+ end
39
+ end
40
+ end
@@ -28,8 +28,9 @@ module RegressionTests
28
28
  sleep 1.5
29
29
 
30
30
  # List all partitions
31
- ids = partitions.to_a.map{|p| p.id}
32
- raise "Unexpected partitions: #{ids}" unless ids.sort == [1,2,3]
31
+ ids = partitions.to_a.map{|p| p.id}.sort
32
+ expected_ids = %w(1 2 3)
33
+ raise "Expected partitions #{expected_ids}, got #{ids}" unless ids == expected_ids
33
34
  end
34
35
  end
35
36
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scalastic
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
  - Aliaksei Baturytski
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-06-03 00:00:00.000000000 Z
11
+ date: 2016-06-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -111,7 +111,9 @@ files:
111
111
  - regression/regression_tests/delete_by_query.rb
112
112
  - regression/regression_tests/delete_partition.rb
113
113
  - regression/regression_tests/document_get.rb
114
+ - regression/regression_tests/endpoints.rb
114
115
  - regression/regression_tests/extend_partition.rb
116
+ - regression/regression_tests/index_destinations.rb
115
117
  - regression/regression_tests/list_partitions.rb
116
118
  - regression/regression_tests/nested_selector.rb
117
119
  - regression/regression_tests/nested_selector_bulk.rb