ebs_snapper 0.0.8 → 0.0.9
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.
- data/config/sample.config.yaml +2 -1
- data/lib/ebs_snapper/cli.rb +9 -2
- data/lib/ebs_snapper/ebs.rb +34 -10
- data/lib/ebs_snapper/version.rb +1 -1
- data/spec/lib/ebs_spec.rb +31 -0
- metadata +4 -4
data/config/sample.config.yaml
CHANGED
data/lib/ebs_snapper/cli.rb
CHANGED
@@ -21,7 +21,10 @@ class EbsSnapper::CLI
|
|
21
21
|
|
22
22
|
def self.run
|
23
23
|
opts = parse(ARGV)
|
24
|
-
|
24
|
+
if opts[:dry_run]
|
25
|
+
@logger.info "Dry run mode enabled"
|
26
|
+
end
|
27
|
+
ebs = EbsSnapper::Ebs.new(opts[:aws], opts[:dry_run])
|
25
28
|
ebs.snapshot_and_purge
|
26
29
|
rescue => e
|
27
30
|
@logger.error "Exception: #{e}\n" + e.backtrace().join("\n")
|
@@ -49,12 +52,12 @@ class EbsSnapper::CLI
|
|
49
52
|
def self.parse(args)
|
50
53
|
options = {}
|
51
54
|
options[:aws] = {}
|
55
|
+
options[:dry_run] = false
|
52
56
|
options[:ultradns] = {}
|
53
57
|
options[:log_to] = nil
|
54
58
|
options[:verbose] = false
|
55
59
|
options[:out] = ''
|
56
60
|
options[:config] = nil
|
57
|
-
options[:pause_time] = 1
|
58
61
|
|
59
62
|
opts = OptionParser.new do |opts|
|
60
63
|
opts.banner = "Usage: ebs_snapper [options]"
|
@@ -73,6 +76,10 @@ class EbsSnapper::CLI
|
|
73
76
|
options[:verbose] = v
|
74
77
|
end
|
75
78
|
|
79
|
+
opts.on("-d", "--dry-run", "Dry run, will not create or delete snapshots") do
|
80
|
+
options[:dry_run] = true
|
81
|
+
end
|
82
|
+
|
76
83
|
opts.on_tail("-h", "--help", "Show this message") do
|
77
84
|
puts opts
|
78
85
|
exit
|
data/lib/ebs_snapper/ebs.rb
CHANGED
@@ -19,16 +19,26 @@ class EbsSnapper::Ebs
|
|
19
19
|
DEFAULT_TAG_NAME = 'Snapper'
|
20
20
|
DEFAULT_PAUSE_TIME = 0
|
21
21
|
|
22
|
-
def initialize(opts = {})
|
22
|
+
def initialize(opts = {}, dry_run = false)
|
23
|
+
@dry_run = dry_run
|
24
|
+
@logger = opts[:logger] || Logger.new(STDOUT)
|
25
|
+
max_retries = opts[:max_retries] || AWS.config.max_retries
|
23
26
|
if !opts[:secret_access_key].nil? && !opts[:access_key_id].nil?
|
24
27
|
AWS.config(:access_key_id => opts[:access_key_id],
|
25
|
-
:secret_access_key => opts[:secret_access_key]
|
28
|
+
:secret_access_key => opts[:secret_access_key],
|
29
|
+
:logger => @logger,
|
30
|
+
:max_retries => max_retries)
|
31
|
+
else
|
32
|
+
AWS.config(:logger => @logger,
|
33
|
+
:max_retries => max_retries)
|
26
34
|
end
|
27
35
|
|
28
|
-
@logger = opts[:logger] || Logger.new(STDOUT)
|
29
36
|
@retain = opts[:retain]
|
30
37
|
@tag_name = opts[:volume_tag] || DEFAULT_TAG_NAME # default
|
31
38
|
PausingEnumerable.pause_time = opts[:pause_time] || DEFAULT_PAUSE_TIME
|
39
|
+
@logger.info "Initializing"
|
40
|
+
@logger.info {"Dry run mode: #{@dry_run}"}
|
41
|
+
@logger.info {"AWS SDK max retries: #{AWS.config.max_retries}"}
|
32
42
|
end
|
33
43
|
|
34
44
|
def snapshot_and_purge
|
@@ -62,13 +72,18 @@ class EbsSnapper::Ebs
|
|
62
72
|
end
|
63
73
|
|
64
74
|
def snapshot_volume(region, vol_id)
|
65
|
-
timestamp = Time.now.utc
|
66
|
-
@logger.info {"Snapshotting #{vol_id} at: #{timestamp}"}
|
67
75
|
vol = region.volumes[vol_id]
|
68
76
|
if vol != nil
|
69
|
-
|
70
|
-
|
71
|
-
|
77
|
+
if dry_run?
|
78
|
+
@logger.info {"Dry run - would have called vol.create_snapshot for volume #{vol_id}"}
|
79
|
+
@logger.info {"Dry run - would have called snapshot.tag for new snapshot of volume #{vol_id}"}
|
80
|
+
else
|
81
|
+
timestamp = Time.now.utc
|
82
|
+
@logger.info {"Snapshotting #{vol_id} at: #{timestamp}"}
|
83
|
+
snapshot = vol.create_snapshot("Snapper Backup #{timestamp}")
|
84
|
+
# tag the snapshot with the timestamp so we can look it up later for cleanup
|
85
|
+
snapshot.tag(@tag_name, :value => "#{timestamp.to_i}")
|
86
|
+
end
|
72
87
|
else
|
73
88
|
@logger.error "Error: Volume #{vol_id} in Region: #{region} not found"
|
74
89
|
end
|
@@ -80,9 +95,13 @@ class EbsSnapper::Ebs
|
|
80
95
|
unless snapshot.status == :pending
|
81
96
|
ts = snapshot.tags[@tag_name]
|
82
97
|
if ttl.purge?(ts)
|
83
|
-
@logger.info {"Purging #{vol_id} snapshot: #{snapshot.id}"}
|
84
98
|
begin
|
85
|
-
|
99
|
+
if dry_run?
|
100
|
+
@logger.info {"Dry run - would have called snapshot.delete for snapshot #{snapshot.id} of volume #{vol_id}"}
|
101
|
+
else
|
102
|
+
@logger.info {"Purging #{vol_id} snapshot: #{snapshot.id}"}
|
103
|
+
snapshot.delete
|
104
|
+
end
|
86
105
|
rescue => e
|
87
106
|
@logger.error "Exception: #{e}\n" + e.backtrace().join("\n")
|
88
107
|
end
|
@@ -90,6 +109,10 @@ class EbsSnapper::Ebs
|
|
90
109
|
end
|
91
110
|
end
|
92
111
|
end
|
112
|
+
|
113
|
+
def dry_run?
|
114
|
+
@dry_run == true
|
115
|
+
end
|
93
116
|
|
94
117
|
module PausingEnumerable
|
95
118
|
|
@@ -120,6 +143,7 @@ class EbsSnapper::Ebs
|
|
120
143
|
enumerable
|
121
144
|
end
|
122
145
|
end
|
146
|
+
|
123
147
|
|
124
148
|
def each_region
|
125
149
|
ec2.regions.each do |region|
|
data/lib/ebs_snapper/version.rb
CHANGED
data/spec/lib/ebs_spec.rb
CHANGED
@@ -19,6 +19,37 @@ require 'ostruct'
|
|
19
19
|
describe EbsSnapper::Ebs do
|
20
20
|
DEFAULT_TAG_NAME = EbsSnapper::Ebs::DEFAULT_TAG_NAME
|
21
21
|
|
22
|
+
|
23
|
+
it "should run purge_old_snapshots in dry mode" do
|
24
|
+
ebs = EbsSnapper::Ebs.new({}, true)
|
25
|
+
ttl = EbsSnapper::Ebs::TTL.new("1.day") # 1 day
|
26
|
+
region = OpenStruct.new
|
27
|
+
|
28
|
+
snapshot_old = OpenStruct.new
|
29
|
+
snapshot_old.status = :complete
|
30
|
+
snapshot_old.tags = {DEFAULT_TAG_NAME => Time.now.utc.to_i - (86400 * 2)}
|
31
|
+
snapshot_old.should_not_receive(:delete)
|
32
|
+
|
33
|
+
region.snapshots = [snapshot_old]
|
34
|
+
region.snapshots.stub(:filter).and_return(region.snapshots)
|
35
|
+
|
36
|
+
ebs.purge_old_snapshots(ttl, region, 2)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should run snapshot_volume in dry mode" do
|
40
|
+
ebs = EbsSnapper::Ebs.new({}, true)
|
41
|
+
|
42
|
+
region = OpenStruct.new
|
43
|
+
region.tags = []
|
44
|
+
region.id = '999'
|
45
|
+
|
46
|
+
volume = OpenStruct.new
|
47
|
+
volume.should_not_receive(:create_snapshot)
|
48
|
+
region.volumes = {3 => volume}
|
49
|
+
|
50
|
+
ebs.snapshot_volume(region, 3).should == true
|
51
|
+
end
|
52
|
+
|
22
53
|
it "should find tagged volumes in a region" do
|
23
54
|
ebs = EbsSnapper::Ebs.new
|
24
55
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ebs_snapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-01-
|
12
|
+
date: 2014-01-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: aws-sdk
|
@@ -111,7 +111,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
111
111
|
version: '0'
|
112
112
|
segments:
|
113
113
|
- 0
|
114
|
-
hash:
|
114
|
+
hash: 1635891677389619037
|
115
115
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
116
|
none: false
|
117
117
|
requirements:
|
@@ -120,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
120
120
|
version: '0'
|
121
121
|
segments:
|
122
122
|
- 0
|
123
|
-
hash:
|
123
|
+
hash: 1635891677389619037
|
124
124
|
requirements: []
|
125
125
|
rubyforge_project:
|
126
126
|
rubygems_version: 1.8.24
|