elastomer-client 6.2.1 → 6.2.2

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
  SHA256:
3
- metadata.gz: 49da91bf2c259b9b77ed76d66fa001aa4192432225090bb62ff9d74f8173f8dc
4
- data.tar.gz: 2d519500cced0a8783a9fd5b77853d935cc3b99f35e8be981e5e1e23b55d9632
3
+ metadata.gz: 96e8ae346cfe62276c448747cca8b9959c835aa4d52b1681c1f5b52474f45778
4
+ data.tar.gz: e4c470563171f93f51c74b5f5fa0c3d696c3b0386183d949ad104ac46f95ef3b
5
5
  SHA512:
6
- metadata.gz: 2f0f879414271cf6f861bfcf256ec6af824a60c2603dbb48dc2297ecffae55f969e7947e8c9cfc0469239c15fe4b9754721279886def527eb89658a549f085fb
7
- data.tar.gz: 42cd80d2c67d119767451b524543f73cc1af3ffda4088186cfac8daa99970849655c05ed5382e7ab689a71e1a5c8e4c6b620fbaf66a91693e4afad7e186900ff
6
+ metadata.gz: 779b6def22ad36824d81dfdd1a2ee659aacba776fb3ea4c4530f88ac6e39dd1379c7414406e56b5edd11fdb0d8a4b528c26437204cae19eeaa62437b6fcdff63
7
+ data.tar.gz: 07fd71595562ff808e4a28ba22025397566c85b6ac36f272f8f71d769f08e956e9174564a8494d4d45091db79662fcd658a0b4390a538a10ca00e669c47f11b6
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## 6.2.2 (2025-02-19)
2
+ - Add support for manually and automatically following indices for cross-cluster replication
3
+
1
4
  ## 6.2.1 (2024-12-10)
2
5
  - Add support for rethrottling reindex tasks
3
6
 
data/README.md CHANGED
@@ -142,6 +142,11 @@ To run ES 5 and ES 8:
142
142
  docker compose --project-directory docker --profile all up
143
143
  ```
144
144
 
145
+ To run in ES8 cross cluster replication mode:
146
+ ```
147
+ script/setup-ccr up "{non-production license}"
148
+ ```
149
+
145
150
  To run only ES 8:
146
151
  ```
147
152
  docker compose --project-directory docker --profile es8 up
@@ -159,6 +164,11 @@ ES 8
159
164
  ES_PORT=9208 rake test
160
165
  ```
161
166
 
167
+ CCR tests:
168
+ ```
169
+ ES_PORT=9208 ES_REPLICA_PORT=9209 rake test
170
+ ```
171
+
162
172
  ES 5
163
173
  ```
164
174
  ES_PORT=9205 rake test
data/docker/compose.yaml CHANGED
@@ -4,7 +4,7 @@ services:
4
4
  elasticsearch8.13:
5
5
  image: docker.elastic.co/elasticsearch/elasticsearch:8.13.2
6
6
  container_name: es8.13
7
- profiles: ["es8", "all"]
7
+ profiles: ["es8", "ccr", "all"]
8
8
  environment:
9
9
  - cluster.name=elastomer8.13
10
10
  - bootstrap.memory_lock=true
@@ -12,6 +12,7 @@ services:
12
12
  - xpack.security.enabled=false
13
13
  - xpack.watcher.enabled=false
14
14
  - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
15
+ - node.roles=[master,data,remote_cluster_client]
15
16
  ulimits:
16
17
  memlock:
17
18
  soft: -1
@@ -28,6 +29,33 @@ services:
28
29
  ports:
29
30
  - 127.0.0.1:${ES_8_PORT:-9208}:9200
30
31
 
32
+ elasticsearchFollower:
33
+ image: docker.elastic.co/elasticsearch/elasticsearch:8.13.2
34
+ container_name: es-follow
35
+ profiles: ["ccr"]
36
+ environment:
37
+ - cluster.name=es-follow
38
+ - bootstrap.memory_lock=true
39
+ - discovery.type=single-node
40
+ - xpack.security.enabled=false
41
+ - xpack.watcher.enabled=false
42
+ - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
43
+ - node.roles=[master,data,remote_cluster_client]
44
+ ulimits:
45
+ memlock:
46
+ soft: -1
47
+ hard: -1
48
+ nofile:
49
+ soft: 65536
50
+ hard: 65536
51
+ mem_limit: 2g
52
+ cap_add:
53
+ - IPC_LOCK
54
+ volumes:
55
+ - ./elasticsearch-follow.yml:/usr/share/elasticsearch/config/elasticsearch.yml
56
+ ports:
57
+ - 127.0.0.1:${ES_8_PORT:-9209}:9201
58
+
31
59
  elasticsearch5.6:
32
60
  image: docker.elastic.co/elasticsearch/elasticsearch:5.6.4
33
61
  container_name: es5.6
@@ -0,0 +1,14 @@
1
+ cluster.name: "es-follow"
2
+
3
+ network.host: 0.0.0.0
4
+
5
+ path:
6
+ data: /usr/share/elasticsearch/data
7
+ logs: /usr/share/elasticsearch/logs
8
+ repo: /usr/share/elasticsearch/repos
9
+
10
+ transport.port: 9301
11
+ http.port: 9201
12
+ remote_cluster.port: 9444
13
+ http.max_content_length: 50mb
14
+ ingest.geoip.downloader.enabled: false
@@ -9,5 +9,6 @@ path:
9
9
 
10
10
  transport.port: 9300
11
11
  http.port: 9200
12
+ remote_cluster.port: 9443
12
13
  http.max_content_length: 50mb
13
14
  ingest.geoip.downloader.enabled: false
@@ -0,0 +1,139 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ElastomerClient
4
+ class Client
5
+
6
+ # Returns a CCR instance
7
+ def ccr
8
+ Ccr.new(self)
9
+ end
10
+
11
+ class Ccr
12
+ # Create a new Ccr for initiating requests for cross cluster replication.
13
+ # More context: https://www.elastic.co/guide/en/elasticsearch/reference/current/ccr-apis.html
14
+ #
15
+ # client - ElastomerClient::Client used for HTTP requests to the server
16
+ def initialize(client)
17
+ @client = client
18
+ end
19
+
20
+ attr_reader :client
21
+
22
+ # Gets the parameters and status for each follower index.
23
+ #
24
+ # index_pattern - String name of the index pattern to get follower info for
25
+ # params - Hash of query parameters
26
+ #
27
+ # Examples
28
+ #
29
+ # ccr.get_follower_info("follower_index")
30
+ # ccr.get_follower_info("*")
31
+ #
32
+ # See https://www.elastic.co/guide/en/elasticsearch/reference/current/ccr-put-follow.html
33
+ def get_follower_info(index_pattern, params = {})
34
+ response = client.get "/#{index_pattern}/_ccr/info", params.merge(action: "get_follower_info", rest_api: "ccr")
35
+ response.body
36
+ end
37
+
38
+ # Creates a new follower index for the provided leader index on the remote cluster.
39
+ #
40
+ # follower_index - String name of the follower index to create
41
+ # body - Hash of the request body
42
+ # :remote_cluster - String name of the remote cluster. Required.
43
+ # :leader_index - String name of the leader index. Required.
44
+ # params - Hash of query parameters
45
+ #
46
+ # Examples
47
+ #
48
+ # ccr.follow("follower_index", { leader_index: "leader_index", remote_cluster: "leader" })
49
+ #
50
+ # See https://www.elastic.co/guide/en/elasticsearch/reference/current/ccr-put-follow.html
51
+ def follow(follower_index, body, params = {})
52
+ response = client.put "/#{follower_index}/_ccr/follow", params.merge(body:, action: "follow", rest_api: "ccr")
53
+ response.body
54
+ end
55
+
56
+ # Creates a new auto-follow pattern for the provided remote cluster.
57
+ #
58
+ # pattern_name - String name of the auto-follow pattern to create
59
+ # body - Hash of the request body
60
+ # :remote_cluster - String name of the remote cluster. Required.
61
+ # :leader_index_patterns - An array of simple index patterns to match against indices in the remote cluster
62
+ # :leader_index_exclusion_patterns - An array of simple index patterns that can be used to exclude indices from being auto-followed.
63
+ # :follow_index_pattern - The name of follower index. The template {{leader_index}} can be used to derive
64
+ # the name of the follower index from the name of the leader index.
65
+ # params - Hash of query parameters
66
+
67
+ # Examples
68
+
69
+ # ccr.auto_follow("follower_pattern", { remote_cluster: "leader", leader_index_patterns: ["leader_index*"],
70
+ # follow_index_pattern: "{{leader_index}}-follower" })
71
+
72
+ # See https://www.elastic.co/guide/en/elasticsearch/reference/current/ccr-put-auto-follow-pattern.html
73
+
74
+ def auto_follow(pattern_name, body, params = {})
75
+ response = client.put "/_ccr/auto_follow/#{pattern_name}", params.merge(body:, action: "create_auto_follow_pattern", rest_api: "ccr")
76
+ response.body
77
+ end
78
+
79
+ # Deletes the auto-follow pattern for the provided remote cluster.
80
+ #
81
+ # pattern_name - String name of the auto-follow pattern to delete
82
+ # params - Hash of query parameters
83
+ #
84
+ # Examples
85
+ #
86
+ # ccr.delete_auto_follow("follower_pattern")
87
+ #
88
+ # See https://www.elastic.co/guide/en/elasticsearch/reference/current/ccr-delete-auto-follow-pattern.html
89
+
90
+ def delete_auto_follow(pattern_name, params = {})
91
+ response = client.delete "/_ccr/auto_follow/#{pattern_name}", params.merge(action: "delete_auto_follow_pattern", rest_api: "ccr")
92
+ response.body
93
+ end
94
+
95
+ # Gets cross-cluster replication auto-follow patterns
96
+ #
97
+ # params - Hash of query parameters
98
+ # :pattern_name - (Optional) String name of the auto-follow pattern. Returns all patterns if not specified
99
+ # Examples
100
+ #
101
+ # ccr.get_auto_follow
102
+ #
103
+ # See https://www.elastic.co/guide/en/elasticsearch/reference/current/ccr-get-auto-follow-pattern.html
104
+
105
+ def get_auto_follow(params = {})
106
+ response = client.get "/_ccr/auto_follow{/pattern_name}", params.merge(action: "get_auto_follow_pattern", rest_api: "ccr")
107
+ response.body
108
+ end
109
+
110
+ # Pauses a follower index.
111
+ #
112
+ # follower_index - String name of the follower index to pause
113
+ # params - Hash of the request body
114
+ #
115
+ # Examples
116
+ # ccr.pause_follow("follower_index")
117
+ #
118
+ # See https://www.elastic.co/guide/en/elasticsearch/reference/current/ccr-post-pause-follow.html
119
+ def pause_follow(follower_index, params = {})
120
+ response = client.post "/#{follower_index}/_ccr/pause_follow", params.merge(action: "pause_follow", rest_api: "ccr")
121
+ response.body
122
+ end
123
+
124
+ # Unfollows a leader index given a follower index.
125
+ # The follower index must be paused and closed before unfollowing.
126
+ #
127
+ # follower_index - String name of the follower index to unfollow
128
+ # params - Hash of the request body
129
+ #
130
+ # Examples
131
+ # ccr.unfollow("follower_index")
132
+ # See https://www.elastic.co/guide/en/elasticsearch/reference/current/ccr-post-unfollow.html
133
+ def unfollow(follower_index, params = {})
134
+ response = client.post "/#{follower_index}/_ccr/unfollow", params.merge(action: "unfollow", rest_api: "ccr")
135
+ response.body
136
+ end
137
+ end
138
+ end
139
+ end
@@ -20,12 +20,12 @@ module ElastomerClient
20
20
  attr_reader :client
21
21
 
22
22
  def reindex(body, params = {})
23
- response = client.post "/_reindex", params.merge(params, body:, action: "reindex", rest_api: "reindex")
23
+ response = client.post "/_reindex", params.merge(body:, action: "reindex", rest_api: "reindex")
24
24
  response.body
25
25
  end
26
26
 
27
27
  def rethrottle(task_id, params = {})
28
- response = client.post "/_reindex/#{task_id}/_rethrottle", params.merge(params, action: "rethrottle", rest_api: "reindex")
28
+ response = client.post "/_reindex/#{task_id}/_rethrottle", params.merge(action: "rethrottle", rest_api: "reindex")
29
29
  response.body
30
30
  end
31
31
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ElastomerClient
4
- VERSION = "6.2.1"
4
+ VERSION = "6.2.2"
5
5
 
6
6
  def self.version
7
7
  VERSION
data/script/setup-ccr ADDED
@@ -0,0 +1,89 @@
1
+ #!/bin/bash
2
+
3
+ # Function to display help
4
+ show_help() {
5
+ echo "Usage: $0 [option] [license]"
6
+ echo "Options:"
7
+ echo " up - Start the clusters and apply the license"
8
+ echo " down - Shut down the clusters"
9
+ echo " help - Display this help message"
10
+ }
11
+
12
+ # Function to apply the license to a cluster
13
+ apply_license() {
14
+ local port=$1
15
+ local license="$2"
16
+ local response_file=$(mktemp)
17
+ local http_code
18
+ http_code=$(curl -s -o "$response_file" -w "%{http_code}" -X PUT "http://localhost:$port/_license?pretty" -H "Content-Type: application/json" -d "$license")
19
+
20
+ if [ "$http_code" -ne 200 ]; then
21
+ echo "Failed to apply license to cluster on port $port. HTTP status code: $http_code"
22
+ echo "Error response: $(cat "$response_file")"
23
+ rm "$response_file"
24
+ exit 1
25
+ fi
26
+ }
27
+
28
+ # Function to shut down the clusters
29
+ shutdown_clusters() {
30
+ docker compose --project-directory docker --profile ccr down
31
+ echo "Clusters shut down."
32
+ }
33
+
34
+ # Check for options
35
+ case "$1" in
36
+ up)
37
+
38
+ # Get the directory of the current script
39
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
40
+
41
+ # Start the clusters
42
+ docker compose --project-directory docker --profile ccr up -d
43
+
44
+ # Wait for both clusters to be online
45
+ export ES_PORT=9208
46
+ "$SCRIPT_DIR/poll-for-es"
47
+ export ES_PORT=9209
48
+ "$SCRIPT_DIR/poll-for-es"
49
+
50
+ # Apply the license to both clusters
51
+ LICENSE=$2
52
+ if [ -z "$LICENSE" ]; then
53
+ echo "License key is required as the second argument."
54
+ exit 1
55
+ fi
56
+
57
+ echo "Applying license to cluster on port 9208..."
58
+ apply_license 9208 "$LICENSE"
59
+ echo "Applying license to cluster on port 9209..."
60
+ apply_license 9209 "$LICENSE"
61
+ echo "License applied to both clusters."
62
+
63
+ # Set up the remote connection between the clusters
64
+ curl -X PUT "http://localhost:9209/_cluster/settings" -H "Content-Type: application/json" -d '{
65
+ "persistent": {
66
+ "cluster": {
67
+ "remote": {
68
+ "leader": {
69
+ "seeds": ["es8.13:9300"]
70
+ }
71
+ }
72
+ }
73
+ }
74
+ }'
75
+
76
+ echo "Clusters setup completed."
77
+ ;;
78
+ down)
79
+ shutdown_clusters
80
+ ;;
81
+ help)
82
+ show_help
83
+ ;;
84
+ *)
85
+ echo "Invalid option: $1"
86
+ show_help
87
+ exit 1
88
+ ;;
89
+ esac
@@ -0,0 +1,149 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../test_helper"
4
+
5
+ describe ElastomerClient::Client::Ccr do
6
+ before do
7
+ skip "Cannot test Ccr API without a replica cluster" unless $replica_client.available?
8
+
9
+ begin
10
+ ccr.delete_auto_follow("follower_pattern")
11
+ rescue StandardError
12
+ puts "No auto-follow pattern to delete"
13
+ end
14
+
15
+ @leader_index = $client.index("leader_index")
16
+ @follower_index = $replica_client.index("follower_index")
17
+ @auto_followed_index = $client.index("followed_index")
18
+ @auto_follower_index = $replica_client.index("followed_index-follower")
19
+
20
+ if @leader_index.exists?
21
+ @leader_index.delete
22
+ end
23
+ if @auto_followed_index.exists?
24
+ @auto_followed_index.delete
25
+ end
26
+ if @follower_index.exists?
27
+ @follower_index.delete
28
+ end
29
+ if @auto_follower_index.exists?
30
+ @auto_follower_index.delete
31
+ end
32
+
33
+ @leader_index.create(default_index_settings)
34
+ wait_for_index(@leader_index.name, "green")
35
+ end
36
+
37
+ after do
38
+ @leader_index.delete if @leader_index.exists?
39
+ @follower_index.delete if @follower_index.exists?
40
+ @auto_followed_index.delete if @auto_followed_index.exists?
41
+ @auto_follower_index.delete if @auto_follower_index.exists?
42
+
43
+ begin
44
+ ccr.delete_auto_follow("follower_pattern")
45
+ rescue StandardError
46
+ puts "No auto-follow pattern to delete"
47
+ end
48
+ end
49
+
50
+ def follow_index(follower_index_name, leader_index_name)
51
+ ccr = $replica_client.ccr
52
+ response = ccr.follow(follower_index_name, { leader_index: leader_index_name, remote_cluster: "leader" })
53
+ wait_for_index(follower_index_name, "green")
54
+ response
55
+ end
56
+
57
+ def pause_follow(follower_index_name)
58
+ ccr = $replica_client.ccr
59
+ response = ccr.pause_follow(follower_index_name)
60
+ wait_for_index(follower_index_name, "green")
61
+ response
62
+ end
63
+
64
+ def unfollow_index(follower_index_name)
65
+ ccr = $replica_client.ccr
66
+ response = ccr.unfollow(follower_index_name)
67
+ wait_for_index(follower_index_name, "green")
68
+ response
69
+ end
70
+
71
+ def create_document(index, type, document)
72
+ response = index.docs.index(document_wrapper(type, document))
73
+ index.refresh
74
+ response
75
+ end
76
+
77
+ it "successfully follows a leader index" do
78
+ create_document(@leader_index, "book", { _id: 1, title: "Book 1" })
79
+ follow_index(@follower_index.name, @leader_index.name)
80
+
81
+ doc = @follower_index.docs.get(id: 1, type: "book")
82
+
83
+ assert_equal "Book 1", doc["_source"]["title"]
84
+ end
85
+
86
+ it "successfully gets info for all follower indices" do
87
+ follow_index(@follower_index.name, @leader_index.name)
88
+
89
+ response = $replica_client.ccr.get_follower_info("*")
90
+
91
+ assert_equal response["follower_indices"][0]["follower_index"], @follower_index.name
92
+ assert_equal response["follower_indices"][0]["leader_index"], @leader_index.name
93
+ end
94
+
95
+ it "successfully pauses a follower index" do
96
+ follow_index(@follower_index.name, @leader_index.name)
97
+
98
+ response = pause_follow(@follower_index.name)
99
+
100
+ assert response["acknowledged"]
101
+
102
+ create_document(@leader_index, "book", { _id: 2, title: "Book 2" })
103
+
104
+ doc = @follower_index.docs.get(id: 2, type: "book")
105
+
106
+ refute doc["found"]
107
+ end
108
+
109
+ it "successfully unfollow a leader index" do
110
+ follow_index(@follower_index.name, @leader_index.name)
111
+
112
+ pause_follow(@follower_index.name)
113
+
114
+ @follower_index.close
115
+
116
+ response = unfollow_index(@follower_index.name)
117
+
118
+ assert response["acknowledged"]
119
+
120
+ @follower_index.open
121
+
122
+ wait_for_index(@follower_index.name, "green")
123
+
124
+ create_document(@leader_index, "book", { _id: 2, title: "Book 2" })
125
+
126
+ doc = @follower_index.docs.get(id: 2, type: "book")
127
+
128
+ refute doc["found"]
129
+ end
130
+
131
+ it "successfully implements an auto-follow policy" do
132
+ ccr = $replica_client.ccr
133
+
134
+ ccr.auto_follow("follower_pattern", { remote_cluster: "leader", leader_index_patterns: ["*"], follow_index_pattern: "{{leader_index}}-follower" })
135
+
136
+ @auto_followed_index.create(default_index_settings)
137
+ wait_for_index(@auto_followed_index.name, "green")
138
+
139
+ @auto_follower_index = $replica_client.index("followed_index-follower")
140
+ wait_for_index(@auto_follower_index.name, "green")
141
+
142
+ resp = ccr.get_auto_follow(pattern_name: "follower_pattern")
143
+
144
+ assert_equal "follower_pattern", resp["patterns"].first["name"]
145
+
146
+ assert_predicate @auto_follower_index, :exists?
147
+ end
148
+
149
+ end
@@ -57,15 +57,16 @@ describe ElastomerClient::Client::Reindex do
57
57
  }
58
58
  response = reindex.reindex(body, requests_per_second: 0.01, wait_for_completion: false)
59
59
  task_id = response["task"]
60
+ node_id = task_id.split(":").first
61
+ task_number = task_id.split(":").last.to_i
60
62
 
61
- reindex.rethrottle(task_id, requests_per_second: 1)
63
+ response = reindex.rethrottle(task_id, requests_per_second: 1)
62
64
 
63
- tasks = $client.tasks
64
- node_id = task_id.split(":").first
65
- task_id = task_id.split(":").last.to_i
65
+ assert_equal 1, response["nodes"][node_id]["tasks"][task_id]["status"]["requests_per_second"]
66
66
 
67
67
  # wait for the task to complete
68
- tasks.wait_by_id(node_id, task_id, "30s")
68
+ tasks = $client.tasks
69
+ tasks.wait_by_id(node_id, task_number, "30s")
69
70
 
70
71
  # Verify that the document has been reindexed
71
72
  doc = @dest_index.docs.get(id: 1, type: "book")
data/test/test_helper.rb CHANGED
@@ -46,6 +46,19 @@ raise "No server available at #{$client.url}" unless $client.available?
46
46
 
47
47
  puts "Elasticsearch version is #{$client.version}"
48
48
 
49
+ # Create client instance for replica cluster
50
+ $replica_client_params = {
51
+ port: ENV.fetch("ES_REPLICA_PORT", 9201),
52
+ read_timeout: 10,
53
+ open_timeout: 1,
54
+ opaque_id: false,
55
+ strict_params: true,
56
+ compress_body: true
57
+ }
58
+ $replica_client = ElastomerClient::Client.new(**$replica_client_params)
59
+
60
+ puts "Replica server is unavailable at #{$replica_client.url}" unless $replica_client.available?
61
+
49
62
  # remove any lingering test indices from the cluster
50
63
  Minitest.after_run do
51
64
  $client.cluster.indices.keys.each do |name|
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: elastomer-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.2.1
4
+ version: 6.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Pease
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2024-12-11 00:00:00.000000000 Z
12
+ date: 2025-02-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: addressable
@@ -105,6 +105,7 @@ files:
105
105
  - README.md
106
106
  - Rakefile
107
107
  - docker/compose.yaml
108
+ - docker/elasticsearch-follow.yml
108
109
  - docker/elasticsearch.yml
109
110
  - docker/elasticsearch8plus.yml
110
111
  - docs/README.md
@@ -121,6 +122,7 @@ files:
121
122
  - elastomer-client.gemspec
122
123
  - lib/elastomer_client/client.rb
123
124
  - lib/elastomer_client/client/bulk.rb
125
+ - lib/elastomer_client/client/ccr.rb
124
126
  - lib/elastomer_client/client/cluster.rb
125
127
  - lib/elastomer_client/client/delete_by_query.rb
126
128
  - lib/elastomer_client/client/docs.rb
@@ -157,8 +159,10 @@ files:
157
159
  - script/console
158
160
  - script/generate-rest-api-spec
159
161
  - script/poll-for-es
162
+ - script/setup-ccr
160
163
  - test/assertions.rb
161
164
  - test/client/bulk_test.rb
165
+ - test/client/ccr_test.rb
162
166
  - test/client/cluster_test.rb
163
167
  - test/client/docs_test.rb
164
168
  - test/client/errors_test.rb
@@ -213,6 +217,7 @@ summary: A library for interacting with Elasticsearch
213
217
  test_files:
214
218
  - test/assertions.rb
215
219
  - test/client/bulk_test.rb
220
+ - test/client/ccr_test.rb
216
221
  - test/client/cluster_test.rb
217
222
  - test/client/docs_test.rb
218
223
  - test/client/errors_test.rb