prune_cloudfiles_db_backups 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+ require 'prune_cloudfiles_db_backups/pruner'
3
+
4
+ require 'openstack'
5
+
6
+ module PruneCloudfilesDbBackups
7
+
8
+ describe Pruner do
9
+ before(:each) do
10
+ @time_now = DateTime.parse('March 24, 2013')
11
+ DateTime.stub!(:now).and_return(@time_now)
12
+
13
+ @object_pile = IO.read("#{File.dirname(__FILE__)}/lists/backup_pile.txt").split("\n")
14
+ container = double('an openstack container')
15
+ container.stub(:objects) {
16
+ @object_pile
17
+ }
18
+ container.stub(:delete_object) { |arg|
19
+ @object_pile.delete(arg)
20
+ }
21
+ OpenStack::Connection.stub_chain(:create, :container).and_return(container)
22
+
23
+ end
24
+
25
+ it 'can be tested with the cloudfile mocked to object_pile' do
26
+ cf = OpenStack::Connection.create(username: 'a_real_username',
27
+ api_key: 'a_real_key',
28
+ auth_url: 'https://identity.api.rackspacecloud.com/v1.0',
29
+ service_type:'object-store')
30
+ container = cf.container('database_backups')
31
+ container.objects.size.should be > 1000
32
+ size = container.objects.size
33
+ marked_for_death_object = container.objects[0]
34
+ container.delete_object(marked_for_death_object)
35
+ container.objects.size.should be == (size - 1)
36
+ end
37
+
38
+ context 'running' do
39
+ before(:each) do
40
+ @pruner = Pruner.new({})
41
+ end
42
+
43
+ it 'returns TBD and Keep values' do
44
+ @pruner.list_to_delete.should_not be_nil
45
+ @pruner.list_to_keep.should_not be_nil
46
+ end
47
+
48
+ it 'returns a sorted list of stuff to keep with the older stuff at top' do
49
+ @pruner.date_sorted_keep_list.first.datetime.year.should be == 2012
50
+ end
51
+
52
+ it 'will actually delete things if #delete! is called' do
53
+ size = @object_pile.size
54
+ @pruner.delete!
55
+ @object_pile.size.should be < size
56
+ end
57
+
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,70 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+ require 'prune_cloudfiles_db_backups/retention_calculator'
5
+ require 'prune_cloudfiles_db_backups/backup'
6
+
7
+ module PruneCloudfilesDbBackups
8
+
9
+ describe RetentionCalculator do
10
+ context 'March 24, 2013' do
11
+ before(:each) do
12
+ @time_now = DateTime.parse('March 24, 2013')
13
+ DateTime.stub!(:now).and_return(@time_now)
14
+ end
15
+
16
+ let (:objects) {
17
+ IO.read("#{File.dirname(__FILE__)}/lists/backup_pile.txt").split("\n")
18
+ }
19
+
20
+ it 'is able to be created on this date with a stubbed Time#now' do
21
+ DateTime.now.should eq(DateTime.parse('March 24, 2013'))
22
+ RetentionCalculator.new(objects)
23
+ end
24
+
25
+ it 'accepts keyword initialization arguments' do
26
+ RetentionCalculator.new(objects)
27
+ end
28
+
29
+ context 'calculations' do
30
+ before(:each) do
31
+ @calc = RetentionCalculator.new(objects)
32
+ end
33
+
34
+ describe '#list_to_keep' do
35
+ it 'contains trans_production-20130322000006.pgdump' do
36
+ backup = Backup.new(
37
+ objects:
38
+ Set.new(
39
+ %w(
40
+ trans_production-20130322000006.pgdump
41
+ trans_production-20130322000006.pgdump.000
42
+ trans_production-20130322000006.pgdump.001
43
+ trans_production-20130322000006.pgdump.003
44
+ trans_production-20130322000006.pgdump.004
45
+ )
46
+ )
47
+ )
48
+ @calc.list_to_keep.include?(backup).should be_true
49
+ end
50
+ end
51
+
52
+ describe '#list_to_delete' do
53
+ it 'contains reports_production-20120524000003.pgdump' do
54
+ backup = Backup.new(
55
+ objects:
56
+ Set.new(
57
+ %w(
58
+ reports_production-20120524000003.pgdump
59
+ reports_production-20120524000003.pgdump.000
60
+ )
61
+ )
62
+ )
63
+ @calc.list_to_delete.include?(backup).should be_true
64
+ end
65
+ end
66
+ end
67
+ end
68
+
69
+ end
70
+ end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+ require 'prune_cloudfiles_db_backups/version'
3
+
4
+ module PruneCloudfilesDbBackups
5
+ describe 'VERSION' do
6
+ it 'returns a string with a valid version' do
7
+ VERSION.should be_a(String)
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,17 @@
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
+ RSpec.configure do |config|
8
+ config.treat_symbols_as_metadata_keys_with_true_values = true
9
+ config.run_all_when_everything_filtered = true
10
+ config.filter_run :focus
11
+
12
+ # Run specs in random order to surface order dependencies. If you find an
13
+ # order dependency and want to debug it, you can fix the order by providing
14
+ # the seed, which is printed after each run.
15
+ # --seed 1234
16
+ config.order = 'random'
17
+ end
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env ruby
2
+ require 'openstack'
3
+ require 'slop'
4
+ require 'ruby-progressbar'
5
+ require 'parallel'
6
+
7
+ opts = Slop.parse(strict: true, help: true) do
8
+ banner 'Usage: populate_dummy_container [options]'
9
+ on :u, :user=, 'Rackspace user to use', required: true
10
+ on :k, :key=, 'Rackspace API Key', required: true
11
+ on :s, :src=, 'Rackspace source container', default: 'database_backups'
12
+ on :d, :dest=, 'Rackspace destination container', default: 'dummy_container'
13
+ end
14
+
15
+ def create_connection(opts)
16
+ OpenStack::Connection.create(
17
+ username: opts[:user],
18
+ api_key: opts[:key],
19
+ auth_url: 'https://identity.api.rackspacecloud.com/v1.0',
20
+ service_type: 'object-store'
21
+ )
22
+ end
23
+
24
+ connection = create_connection(opts)
25
+ dest_container = connection.container(opts[:dest])
26
+ src_container = connection.container(opts[:src])
27
+
28
+ objects = src_container.objects - dest_container.objects
29
+
30
+ progress = ProgressBar.create(title: 'Object names copied',
31
+ total: objects.size,
32
+ format: '%e %a |%b>%i| %p%% %t'
33
+ )
34
+ Parallel.each(objects,
35
+ {
36
+ in_processes: 32,
37
+ finish: lambda { |_, _| progress.increment }
38
+ }
39
+ ) do |object|
40
+ connection = create_connection(opts)
41
+ dest_container = connection.container(opts[:dest])
42
+ dest_container.create_object(object)
43
+ end
44
+
45
+ progress.finish
metadata ADDED
@@ -0,0 +1,194 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: prune_cloudfiles_db_backups
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Nelson Chen
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-04-04 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.3'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.3'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rspec
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: openstack
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 1.0.9
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 1.0.9
78
+ - !ruby/object:Gem::Dependency
79
+ name: slop
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: 3.4.4
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 3.4.4
94
+ - !ruby/object:Gem::Dependency
95
+ name: activesupport
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ version: 3.2.13
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: 3.2.13
110
+ - !ruby/object:Gem::Dependency
111
+ name: ruby-progressbar
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: 1.0.2
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: 1.0.2
126
+ description: Prunes SmartReceipts DB Backups from Cloudfiles
127
+ email:
128
+ - nelson.chen@receipt.com
129
+ executables:
130
+ - prune_cloudfiles_db_backups
131
+ extensions: []
132
+ extra_rdoc_files: []
133
+ files:
134
+ - .gitignore
135
+ - .rspec
136
+ - .travis.yml
137
+ - Gemfile
138
+ - LICENSE.txt
139
+ - README.md
140
+ - Rakefile
141
+ - bin/prune_cloudfiles_db_backups
142
+ - lib/prune_cloudfiles_db_backups/backup.rb
143
+ - lib/prune_cloudfiles_db_backups/cli.rb
144
+ - lib/prune_cloudfiles_db_backups/pruner.rb
145
+ - lib/prune_cloudfiles_db_backups/retention_calculator.rb
146
+ - lib/prune_cloudfiles_db_backups/version.rb
147
+ - prune_cloudfiles_db_backups.gemspec
148
+ - spec/prune_cloudfiles_db_backups/backup_spec.rb
149
+ - spec/prune_cloudfiles_db_backups/cli_spec.rb
150
+ - spec/prune_cloudfiles_db_backups/lists/backup_pile.txt
151
+ - spec/prune_cloudfiles_db_backups/pruner_spec.rb
152
+ - spec/prune_cloudfiles_db_backups/retention_calculator_spec.rb
153
+ - spec/prune_cloudfiles_db_backups/version_spec.rb
154
+ - spec/spec_helper.rb
155
+ - test-util/populate_dummy_container
156
+ homepage: https://github.com/SmartReceipt/prune_cloudfiles_db_backups
157
+ licenses:
158
+ - MIT
159
+ post_install_message:
160
+ rdoc_options: []
161
+ require_paths:
162
+ - lib
163
+ required_ruby_version: !ruby/object:Gem::Requirement
164
+ none: false
165
+ requirements:
166
+ - - ! '>='
167
+ - !ruby/object:Gem::Version
168
+ version: '0'
169
+ segments:
170
+ - 0
171
+ hash: 2982127033611316181
172
+ required_rubygems_version: !ruby/object:Gem::Requirement
173
+ none: false
174
+ requirements:
175
+ - - ! '>='
176
+ - !ruby/object:Gem::Version
177
+ version: '0'
178
+ segments:
179
+ - 0
180
+ hash: 2982127033611316181
181
+ requirements: []
182
+ rubyforge_project:
183
+ rubygems_version: 1.8.23
184
+ signing_key:
185
+ specification_version: 3
186
+ summary: Prunes SmartReceipts DB Backups from Cloudfiles
187
+ test_files:
188
+ - spec/prune_cloudfiles_db_backups/backup_spec.rb
189
+ - spec/prune_cloudfiles_db_backups/cli_spec.rb
190
+ - spec/prune_cloudfiles_db_backups/lists/backup_pile.txt
191
+ - spec/prune_cloudfiles_db_backups/pruner_spec.rb
192
+ - spec/prune_cloudfiles_db_backups/retention_calculator_spec.rb
193
+ - spec/prune_cloudfiles_db_backups/version_spec.rb
194
+ - spec/spec_helper.rb