elasticsnap 0.1.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 +7 -0
- data/.gitignore +19 -0
- data/.rspec +2 -0
- data/.travis.yml +17 -0
- data/Gemfile +10 -0
- data/LICENSE.txt +192 -0
- data/README.md +29 -0
- data/Rakefile +1 -0
- data/bin/elasticsnap +7 -0
- data/elasticsnap.gemspec +31 -0
- data/lib/elasticsnap.rb +5 -0
- data/lib/elasticsnap/cli.rb +2 -0
- data/lib/elasticsnap/cli/application.rb +33 -0
- data/lib/elasticsnap/cli/base.rb +18 -0
- data/lib/elasticsnap/config.rb +24 -0
- data/lib/elasticsnap/ebs_snapshot.rb +30 -0
- data/lib/elasticsnap/freeze_elasticsearch.rb +72 -0
- data/lib/elasticsnap/freeze_fs.rb +55 -0
- data/lib/elasticsnap/security_group.rb +50 -0
- data/lib/elasticsnap/snapshot.rb +56 -0
- data/lib/elasticsnap/snapshot_volume_tags.rb +13 -0
- data/lib/elasticsnap/verify_es_cluster_status.rb +42 -0
- data/lib/elasticsnap/version.rb +3 -0
- data/spec/acceptance/snapshot_spec.rb +75 -0
- data/spec/elasticsnap/ebs_snapshot_spec.rb +63 -0
- data/spec/elasticsnap/freeze_elasticsearch_spec.rb +102 -0
- data/spec/elasticsnap/freeze_fs_spec.rb +54 -0
- data/spec/elasticsnap/security_group_spec.rb +81 -0
- data/spec/elasticsnap/snapshot_spec.rb +63 -0
- data/spec/elasticsnap/verify_es_cluster_status_spec.rb +32 -0
- data/spec/spec_helper.rb +30 -0
- data/spec/support/aruba.rb +26 -0
- metadata +225 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Elasticsnap::FreezeFs do
|
|
4
|
+
it 'requires mount' do
|
|
5
|
+
expect { described_class.new }.to raise_error ArgumentError
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
it 'requires security_group' do
|
|
9
|
+
expect { described_class.new(mount: 'asdf') }.to raise_error ArgumentError
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
let(:mount) { '/mnt/data' }
|
|
13
|
+
let(:security_group) { 'group' }
|
|
14
|
+
let(:freeze) { described_class.new(mount: mount, security_group: security_group) }
|
|
15
|
+
|
|
16
|
+
before do
|
|
17
|
+
allow(freeze).to receive(:run_command).with('sync')
|
|
18
|
+
allow(freeze).to receive(:run_command).with('fsfreeze', '-f', mount)
|
|
19
|
+
allow(freeze).to receive(:run_command).with('fsfreeze', '-u', mount)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it 'syncs the filesystem' do
|
|
23
|
+
freeze.freeze
|
|
24
|
+
expect(freeze).to have_received(:run_command).with('sync')
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it 'freezes the filesystem' do
|
|
28
|
+
freeze.freeze
|
|
29
|
+
expect(freeze).to have_received(:run_command).with('fsfreeze', '-f', mount)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it 'calls the passed block' do
|
|
33
|
+
block_called = false
|
|
34
|
+
freeze.freeze do
|
|
35
|
+
block_called = true
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
expect(block_called).to be_true
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it 'unfreezes the filesystem' do
|
|
42
|
+
freeze.freeze
|
|
43
|
+
expect(freeze).to have_received(:run_command).with('fsfreeze', '-u', mount)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
context 'when the block raises an exception' do
|
|
47
|
+
it 'unfreezes the filesystem' do
|
|
48
|
+
expect { freeze.freeze do
|
|
49
|
+
raise 'BOOM'
|
|
50
|
+
end }.to raise_error 'BOOM'
|
|
51
|
+
expect(freeze).to have_received(:run_command).with('fsfreeze', '-u', mount)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Elasticsnap::SecurityGroup do
|
|
4
|
+
it 'requires name' do
|
|
5
|
+
expect { described_class.new }.to raise_error ArgumentError
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
let(:group) { described_class.new(name: 'elasticsearch') }
|
|
9
|
+
let(:hosts) {[double(:host1, id: 'host1', dns_name: 'host1.ec2'), double(:host2, id: 'host2', dns_name: 'host2.ec2')]}
|
|
10
|
+
|
|
11
|
+
describe '#fog_group' do
|
|
12
|
+
it 'fetches the fog model' do
|
|
13
|
+
groups = double(:groups)
|
|
14
|
+
group.stub_chain(:connection, :security_groups, :all).and_return(groups)
|
|
15
|
+
expect(groups).to receive(:first)
|
|
16
|
+
group.fog_group
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
describe '#id' do
|
|
21
|
+
it 'aliases the fog group_id' do
|
|
22
|
+
fog_group = double(:fog_group)
|
|
23
|
+
expect(group).to receive(:fog_group).and_return(fog_group)
|
|
24
|
+
expect(fog_group).to receive(:group_id)
|
|
25
|
+
group.id
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
describe '#hosts' do
|
|
30
|
+
it 'fetches all servers with the group id' do
|
|
31
|
+
allow(group).to receive(:id).and_return('sg-deadbeef')
|
|
32
|
+
servers = double(:servers)
|
|
33
|
+
group.stub_chain(:connection, :servers).and_return(servers)
|
|
34
|
+
expect(servers).to receive(:all).with('group-id' => 'sg-deadbeef')
|
|
35
|
+
group.hosts
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
describe '#volumes' do
|
|
40
|
+
let(:volumes) { double(:volumes) }
|
|
41
|
+
before do
|
|
42
|
+
allow(group).to receive(:hosts).and_return(hosts)
|
|
43
|
+
group.stub_chain(:connection, :volumes).and_return(volumes)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
context 'with cluster name' do
|
|
47
|
+
it 'fetches all volumes with the instance ids and cluster name tag' do
|
|
48
|
+
expect(volumes).to receive(:all).with(
|
|
49
|
+
'attachment.instance-id' => ['host1', 'host2'],
|
|
50
|
+
'tag:ClusterName' => 'thundercats'
|
|
51
|
+
)
|
|
52
|
+
group.volumes(cluster_name: 'thundercats')
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
context 'without cluster name' do
|
|
57
|
+
it 'fetches all volumes with the instance ids' do
|
|
58
|
+
expect(volumes).to receive(:all).with(
|
|
59
|
+
'attachment.instance-id' => ['host1', 'host2']
|
|
60
|
+
)
|
|
61
|
+
group.volumes
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
describe '#ssh_hosts' do
|
|
67
|
+
before do
|
|
68
|
+
allow(group).to receive(:hosts).and_return(hosts)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it 'fetches the dns name for all hosts in the security group' do
|
|
72
|
+
expect(group.ssh_hosts).to eq ['host1.ec2', 'host2.ec2']
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
context 'with an ssh user' do
|
|
76
|
+
it 'adds the ssh user to each host' do
|
|
77
|
+
expect(group.ssh_hosts(ssh_user: 'foo')).to eq ['foo@host1.ec2', 'foo@host2.ec2']
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Elasticsnap::Snapshot do
|
|
4
|
+
let(:security_group) { 'elasticsearch' }
|
|
5
|
+
let(:url) { 'localhost:9200' }
|
|
6
|
+
let(:mount) { '/usr/local/var/data/elasticsearch/disk1' }
|
|
7
|
+
let(:quorum_nodes) { 2 }
|
|
8
|
+
let(:snapshot) { described_class.new(security_group: security_group, url: url, mount: mount, quorum_nodes: quorum_nodes) }
|
|
9
|
+
|
|
10
|
+
before do
|
|
11
|
+
allow(snapshot).to receive(:verify_es_cluster_status!)
|
|
12
|
+
allow(snapshot).to receive(:freeze_es) do |&block|
|
|
13
|
+
block.call
|
|
14
|
+
end
|
|
15
|
+
allow(snapshot).to receive(:freeze_fs) do |&block|
|
|
16
|
+
block.call
|
|
17
|
+
end
|
|
18
|
+
allow(snapshot).to receive(:ebs_snapshot!)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it 'requires security group' do
|
|
22
|
+
expect { described_class.new }.to raise_error ArgumentError
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it 'requires url' do
|
|
26
|
+
expect { described_class.new(security_group: 'foo') }.to raise_error ArgumentError
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it 'requires mount' do
|
|
30
|
+
expect { described_class.new(security_group: 'foo', url: 'foo') }.to raise_error ArgumentError
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it 'requires quorum_nodes' do
|
|
34
|
+
expect { described_class.new(security_group: 'foo', url: 'foo', mount: 'foo') }.to raise_error ArgumentError
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it 'checks the ES cluster status' do
|
|
38
|
+
snapshot.call
|
|
39
|
+
expect(snapshot).to have_received :verify_es_cluster_status!
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
context 'when the cluster status is bad' do
|
|
43
|
+
it 'raises an exception' do
|
|
44
|
+
allow(snapshot).to receive(:verify_es_cluster_status!).and_raise 'bad cluster!'
|
|
45
|
+
expect { snapshot.call }.to raise_error 'bad cluster!'
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it 'freezes elasticsearch' do
|
|
50
|
+
snapshot.call
|
|
51
|
+
expect(snapshot).to have_received :freeze_es
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it 'freezes the filesystem' do
|
|
55
|
+
snapshot.call
|
|
56
|
+
expect(snapshot).to have_received :freeze_fs
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it 'snapshots the EBS volume' do
|
|
60
|
+
snapshot.call
|
|
61
|
+
expect(snapshot).to have_received :ebs_snapshot!
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Elasticsnap::VerifyEsClusterStatus do
|
|
4
|
+
it 'requires a url' do
|
|
5
|
+
expect { described_class.new(quorum_nodes: 1) }.to raise_error ArgumentError
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
it 'requires quorum_nodes' do
|
|
9
|
+
expect { described_class.new(url: 'asdf') }.to raise_error ArgumentError
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
let(:verify) { described_class.new(url: 'localhost:9200', quorum_nodes: 2) }
|
|
13
|
+
|
|
14
|
+
it 'queries elasticsearch with flex' do
|
|
15
|
+
expect(Flex).to receive(:cluster_health).and_return({'status' => 'green', 'number_of_nodes' => 2 })
|
|
16
|
+
verify.verify!
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
context 'when the cluster remains red' do
|
|
20
|
+
it 'raises a StatusRed exception' do
|
|
21
|
+
allow(Flex).to receive(:cluster_health).and_return({'status' => 'red'})
|
|
22
|
+
expect { verify.verify! }.to raise_error Elasticsnap::VerifyEsClusterStatus::StatusRed
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
context "when the cluster hasn't reached quorum" do
|
|
27
|
+
it 'raises a NoQuorum exception' do
|
|
28
|
+
allow(Flex).to receive(:cluster_health).and_return({'status' => 'green', 'number_of_nodes' => 1 })
|
|
29
|
+
expect { verify.verify! }.to raise_error Elasticsnap::VerifyEsClusterStatus::NoQuorum
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# This file was generated by the `rspec --init` command. Conventionally, all
|
|
2
|
+
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
|
3
|
+
# Require this file using `require "spec_helper"` to ensure that it is only
|
|
4
|
+
# loaded once.
|
|
5
|
+
#
|
|
6
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
|
7
|
+
|
|
8
|
+
#require 'byebug'
|
|
9
|
+
require 'elasticsnap'
|
|
10
|
+
require 'aruba/api'
|
|
11
|
+
require 'aruba/in_process'
|
|
12
|
+
require 'webmock/rspec'
|
|
13
|
+
|
|
14
|
+
Dir['./spec/support/*.rb'].map {|f| require f}
|
|
15
|
+
|
|
16
|
+
RSpec.configure do |config|
|
|
17
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
|
18
|
+
config.run_all_when_everything_filtered = true
|
|
19
|
+
config.filter_run :focus
|
|
20
|
+
|
|
21
|
+
# Run specs in random order to surface order dependencies. If you find an
|
|
22
|
+
# order dependency and want to debug it, you can fix the order by providing
|
|
23
|
+
# the seed, which is printed after each run.
|
|
24
|
+
# --seed 1234
|
|
25
|
+
config.order = 'random'
|
|
26
|
+
|
|
27
|
+
config.include Aruba::Api, example_group: {
|
|
28
|
+
file_path: %r{spec/acceptance}
|
|
29
|
+
}
|
|
30
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'elasticsnap/cli/application'
|
|
2
|
+
|
|
3
|
+
class ThorMain
|
|
4
|
+
def initialize(argv, stdin, stdout, stderr, kernel)
|
|
5
|
+
@argv, @stdin, @stdout, @stderr, @kernel = argv, stdin, stdout, stderr, kernel
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def execute!
|
|
9
|
+
$stdin = @stdin
|
|
10
|
+
$stdout = @stdout
|
|
11
|
+
$stderr = @stderr
|
|
12
|
+
|
|
13
|
+
Elasticsnap::Cli::Application.start(@argv)
|
|
14
|
+
@kernel.exit(0)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
Aruba::InProcess.main_class = ThorMain
|
|
19
|
+
Aruba.process = Aruba::InProcess
|
|
20
|
+
|
|
21
|
+
def start(command, *args)
|
|
22
|
+
cmd = './../../bin/elasticsnap'
|
|
23
|
+
cmd << " #{command}" if command
|
|
24
|
+
cmd << " #{args.join(' ')}" if args
|
|
25
|
+
run_simple cmd
|
|
26
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: elasticsnap
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Ryan Schlesinger
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2013-09-10 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: fog
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ~>
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '1.15'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ~>
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '1.15'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: thor
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - ~>
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: 0.18.1
|
|
34
|
+
type: :runtime
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - ~>
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: 0.18.1
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: flex
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - ~>
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: 1.0.4
|
|
48
|
+
type: :runtime
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - ~>
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: 1.0.4
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: rest-client
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - ~>
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: 1.6.7
|
|
62
|
+
type: :runtime
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - ~>
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: 1.6.7
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: capistrano
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - ~>
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: 2.15.5
|
|
76
|
+
type: :runtime
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - ~>
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: 2.15.5
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: bundler
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - ~>
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: '1.3'
|
|
90
|
+
type: :development
|
|
91
|
+
prerelease: false
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - ~>
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: '1.3'
|
|
97
|
+
- !ruby/object:Gem::Dependency
|
|
98
|
+
name: rake
|
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
|
100
|
+
requirements:
|
|
101
|
+
- - '>='
|
|
102
|
+
- !ruby/object:Gem::Version
|
|
103
|
+
version: '0'
|
|
104
|
+
type: :development
|
|
105
|
+
prerelease: false
|
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
+
requirements:
|
|
108
|
+
- - '>='
|
|
109
|
+
- !ruby/object:Gem::Version
|
|
110
|
+
version: '0'
|
|
111
|
+
- !ruby/object:Gem::Dependency
|
|
112
|
+
name: rspec
|
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
|
114
|
+
requirements:
|
|
115
|
+
- - '>='
|
|
116
|
+
- !ruby/object:Gem::Version
|
|
117
|
+
version: '0'
|
|
118
|
+
type: :development
|
|
119
|
+
prerelease: false
|
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
121
|
+
requirements:
|
|
122
|
+
- - '>='
|
|
123
|
+
- !ruby/object:Gem::Version
|
|
124
|
+
version: '0'
|
|
125
|
+
- !ruby/object:Gem::Dependency
|
|
126
|
+
name: aruba
|
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
|
128
|
+
requirements:
|
|
129
|
+
- - '>='
|
|
130
|
+
- !ruby/object:Gem::Version
|
|
131
|
+
version: '0'
|
|
132
|
+
type: :development
|
|
133
|
+
prerelease: false
|
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
135
|
+
requirements:
|
|
136
|
+
- - '>='
|
|
137
|
+
- !ruby/object:Gem::Version
|
|
138
|
+
version: '0'
|
|
139
|
+
- !ruby/object:Gem::Dependency
|
|
140
|
+
name: webmock
|
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
|
142
|
+
requirements:
|
|
143
|
+
- - '>='
|
|
144
|
+
- !ruby/object:Gem::Version
|
|
145
|
+
version: '0'
|
|
146
|
+
type: :development
|
|
147
|
+
prerelease: false
|
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
149
|
+
requirements:
|
|
150
|
+
- - '>='
|
|
151
|
+
- !ruby/object:Gem::Version
|
|
152
|
+
version: '0'
|
|
153
|
+
description: Consistent snapshots for elasticsearch
|
|
154
|
+
email:
|
|
155
|
+
- ryan@aceofsales.com
|
|
156
|
+
executables:
|
|
157
|
+
- elasticsnap
|
|
158
|
+
extensions: []
|
|
159
|
+
extra_rdoc_files: []
|
|
160
|
+
files:
|
|
161
|
+
- .gitignore
|
|
162
|
+
- .rspec
|
|
163
|
+
- .travis.yml
|
|
164
|
+
- Gemfile
|
|
165
|
+
- LICENSE.txt
|
|
166
|
+
- README.md
|
|
167
|
+
- Rakefile
|
|
168
|
+
- bin/elasticsnap
|
|
169
|
+
- elasticsnap.gemspec
|
|
170
|
+
- lib/elasticsnap.rb
|
|
171
|
+
- lib/elasticsnap/cli.rb
|
|
172
|
+
- lib/elasticsnap/cli/application.rb
|
|
173
|
+
- lib/elasticsnap/cli/base.rb
|
|
174
|
+
- lib/elasticsnap/config.rb
|
|
175
|
+
- lib/elasticsnap/ebs_snapshot.rb
|
|
176
|
+
- lib/elasticsnap/freeze_elasticsearch.rb
|
|
177
|
+
- lib/elasticsnap/freeze_fs.rb
|
|
178
|
+
- lib/elasticsnap/security_group.rb
|
|
179
|
+
- lib/elasticsnap/snapshot.rb
|
|
180
|
+
- lib/elasticsnap/snapshot_volume_tags.rb
|
|
181
|
+
- lib/elasticsnap/verify_es_cluster_status.rb
|
|
182
|
+
- lib/elasticsnap/version.rb
|
|
183
|
+
- spec/acceptance/snapshot_spec.rb
|
|
184
|
+
- spec/elasticsnap/ebs_snapshot_spec.rb
|
|
185
|
+
- spec/elasticsnap/freeze_elasticsearch_spec.rb
|
|
186
|
+
- spec/elasticsnap/freeze_fs_spec.rb
|
|
187
|
+
- spec/elasticsnap/security_group_spec.rb
|
|
188
|
+
- spec/elasticsnap/snapshot_spec.rb
|
|
189
|
+
- spec/elasticsnap/verify_es_cluster_status_spec.rb
|
|
190
|
+
- spec/spec_helper.rb
|
|
191
|
+
- spec/support/aruba.rb
|
|
192
|
+
homepage: https://github.com/aceofsales/elasticsnap
|
|
193
|
+
licenses:
|
|
194
|
+
- Apache 2.0
|
|
195
|
+
metadata: {}
|
|
196
|
+
post_install_message:
|
|
197
|
+
rdoc_options: []
|
|
198
|
+
require_paths:
|
|
199
|
+
- lib
|
|
200
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
201
|
+
requirements:
|
|
202
|
+
- - '>='
|
|
203
|
+
- !ruby/object:Gem::Version
|
|
204
|
+
version: '0'
|
|
205
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
206
|
+
requirements:
|
|
207
|
+
- - '>='
|
|
208
|
+
- !ruby/object:Gem::Version
|
|
209
|
+
version: '0'
|
|
210
|
+
requirements: []
|
|
211
|
+
rubyforge_project:
|
|
212
|
+
rubygems_version: 2.0.7
|
|
213
|
+
signing_key:
|
|
214
|
+
specification_version: 4
|
|
215
|
+
summary: Consistent snapshots for elasticsearch with a focus on EBS snapshots
|
|
216
|
+
test_files:
|
|
217
|
+
- spec/acceptance/snapshot_spec.rb
|
|
218
|
+
- spec/elasticsnap/ebs_snapshot_spec.rb
|
|
219
|
+
- spec/elasticsnap/freeze_elasticsearch_spec.rb
|
|
220
|
+
- spec/elasticsnap/freeze_fs_spec.rb
|
|
221
|
+
- spec/elasticsnap/security_group_spec.rb
|
|
222
|
+
- spec/elasticsnap/snapshot_spec.rb
|
|
223
|
+
- spec/elasticsnap/verify_es_cluster_status_spec.rb
|
|
224
|
+
- spec/spec_helper.rb
|
|
225
|
+
- spec/support/aruba.rb
|