es_dump_restore 0.0.13 → 1.0.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: 86d387c4543740231133cf902eb7ef3ccc4b8032
4
- data.tar.gz: f713de78847fab41c950625668dbfbfb3bc64241
3
+ metadata.gz: 8c543de6aac0bbd4e8380b4fdf8b9f995c2ff33c
4
+ data.tar.gz: eb25e1154138dba1bb53c71080190c9a3d57a7c2
5
5
  SHA512:
6
- metadata.gz: 0b4c08c8beac9653c832bd34b4fa544934f932eb1f7a06c124d6a824a9287e85f3efbe07b386e1880c2cff1ce47da57eecacf6f7595bf5789bacdf7ab9cc7fb5
7
- data.tar.gz: 92889a08a395f142596394637b886fac7cd1baa7b23f09873ee69f70007f69fcaee5ba5743888a7d96d3bc2b9da5648fd45c538927ba88091de7a5069e309e0a
6
+ metadata.gz: 5af4422476d43ff85ea997463162703f4c4d214cd617517ea4ca9950c9ef24c06367b7fa8eeeadc0acc683f0ee1ab352d250c969ae8eef3263a5b9ce9e94533c
7
+ data.tar.gz: 6707141cbeae98732da6dd62d786f6c2ba2c09879f29a5b9c027559f73dca4ac588d50b7c68af71060f541a4ae7e62683633f92ddfa61a29fcf625cd340f458d
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ # Version 1.0.0 - April 11, 2015
2
+
3
+ * Add a `restore_alias` command, which performs a restore and switches an alias to point at the result (thanks Richard Boulton!)
4
+ * Fixes a bug preventing index restoration on newer ES releases (thanks again Richard Boulton!)
5
+ * Richard Boulton tells us he's used `es_dump_restore` to perform a migration on the www.gov.uk indexes, so we think it's high time we started calling this tool ready for prime time. Announcing 1.0.0!
6
+
1
7
  # Version 0.0.13 - April 10, 2015
2
8
 
3
9
  * Fix a regression introduced for ES version 0.90.x by the previous release (thanks again Richard Boulton!)
@@ -75,5 +75,23 @@ module EsDumpRestore
75
75
  end
76
76
  end
77
77
 
78
+ desc "restore_alias URL ALIAS_NAME INDEX_NAME FILENAME", "Restores a dumpfile into the given ElasticSearch index, and then sets the alias to point at that index, removing any existing indexes pointed at by the alias"
79
+ def restore_alias(url, alias_name, index_name, filename)
80
+ client = EsClient.new(url, index_name, nil)
81
+ client.check_alias alias_name
82
+
83
+ Dumpfile.read(filename) do |dumpfile|
84
+ client.create_index(dumpfile.index)
85
+
86
+ bar = ProgressBar.new(dumpfile.num_objects) unless options[:noprogressbar]
87
+ dumpfile.scan_objects(1000) do |batch, size|
88
+ client.bulk_index batch
89
+ bar.increment!(size) unless options[:noprogressbar]
90
+ end
91
+ end
92
+
93
+ client.replace_alias_and_close_old_index alias_name
94
+ end
95
+
78
96
  end
79
97
  end
@@ -74,11 +74,50 @@ module EsDumpRestore
74
74
  end
75
75
 
76
76
  def create_index(metadata)
77
- request(:post, "", :body => MultiJson.dump(metadata))
77
+ request(:post, "#{@path_prefix}", :body => MultiJson.dump(metadata))
78
+ end
79
+
80
+ def check_alias(alias_name)
81
+ # Checks that it's possible to do an atomic restore using the given alias
82
+ # name. This requires that:
83
+ # - `alias_name` doesn't point to an existing index
84
+ # - `index_name` doesn't point to an existing index
85
+ existing = request(:get, "_aliases")
86
+ if existing.include? index_name
87
+ raise "There is already an index called #{index_name}"
88
+ end
89
+ if existing.include? alias_name
90
+ raise "There is already an index called #{alias_name}"
91
+ end
92
+ end
93
+
94
+ def replace_alias_and_close_old_index(alias_name)
95
+ existing = request(:get, "_aliases")
96
+
97
+ # Response of the form:
98
+ # { "index_name" => { "aliases" => { "a1" => {}, "a2" => {} } } }
99
+ old_aliased_indices = existing.select { |name, details|
100
+ details.fetch("aliases", {}).keys.include? alias_name
101
+ }
102
+ old_aliased_indices = old_aliased_indices.keys
103
+
104
+ # For any existing indices with this alias, remove the alias
105
+ # We would normally expect 0 or 1 such index, but several is
106
+ # valid too
107
+ actions = old_aliased_indices.map { |old_index_name|
108
+ { "remove" => { "index" => old_index_name, "alias" => alias_name } }
109
+ }
110
+
111
+ actions << { "add" => { "index" => index_name, "alias" => alias_name } }
112
+
113
+ request(:post, "_aliases", :body => MultiJson.dump({ "actions" => actions }))
114
+ old_aliased_indices.each do |old_index_name|
115
+ request(:post, "#{old_index_name}/_close")
116
+ end
78
117
  end
79
118
 
80
119
  def bulk_index(data)
81
- request(:post, "_bulk", :body => data)
120
+ request(:post, "#{@path_prefix}/_bulk", :body => data)
82
121
  end
83
122
 
84
123
  private
@@ -88,12 +127,11 @@ module EsDumpRestore
88
127
  begin
89
128
  response = @httpclient.request(method, request_uri, options)
90
129
  unless response.ok? or extra_allowed_exitcodes.include? response.status
91
- raise "Request failed with status #{response.status}: #{response.reason}"
130
+ raise "Request failed with status #{response.status}: #{response.reason} #{response.content}"
92
131
  end
93
132
  MultiJson.load(response.content)
94
133
  rescue Exception => e
95
134
  puts "Exception caught issuing HTTP request to #{request_uri}"
96
- puts "options: #{options}"
97
135
  raise e
98
136
  end
99
137
  end
@@ -1,3 +1,3 @@
1
1
  module EsDumpRestore
2
- VERSION = "0.0.13"
2
+ VERSION = "1.0.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: es_dump_restore
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.13
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nat Budin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-10 00:00:00.000000000 Z
11
+ date: 2015-04-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: multi_json