prune_cloudfiles_db_backups 0.0.1

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.
@@ -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