s3_rotate 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,56 @@
1
+ # standard
2
+ require 'date'
3
+
4
+ # 3rd part
5
+ require 'fog-aws'
6
+
7
+ # s3_rotate
8
+ require File.expand_path("../../../../lib/s3_rotate/core/backup_manager", __FILE__)
9
+
10
+ describe S3Rotate::BackupManager do
11
+
12
+ before :each do
13
+ @manager = S3Rotate::BackupManager.new('key', 'secret', 'bucket', 'region')
14
+ end
15
+
16
+ describe '#initialize' do
17
+
18
+ it 'sets the client' do
19
+ expect(@manager.s3_client).not_to eq nil
20
+ end
21
+
22
+ it 'sets the uploader' do
23
+ expect(@manager.uploader).not_to eq nil
24
+ end
25
+
26
+ it 'sets the rotator' do
27
+ expect(@manager.rotator).not_to eq nil
28
+ end
29
+
30
+ end
31
+
32
+ describe '#upload' do
33
+
34
+ it 'calls uploader.upload' do
35
+ # mock
36
+ allow(@manager.uploader).to receive(:upload).with('backup_name', '/path/to/dir', /\d{4}-\d{2}-\d{2}/).and_return('upload_result')
37
+
38
+ # perform test
39
+ expect(@manager.upload('backup_name', '/path/to/dir', /\d{4}-\d{2}-\d{2}/)).to eq 'upload_result'
40
+ end
41
+
42
+ end
43
+
44
+ describe '#rotate' do
45
+
46
+ it 'calls rotator.rotate' do
47
+ # mock
48
+ allow(@manager.rotator).to receive(:rotate).with('backup_name', '/path/to/dir', 1, 2, 3, 4).and_return('rotate_result')
49
+
50
+ # perform test
51
+ expect(@manager.rotate('backup_name', '/path/to/dir', 1, 2, 3, 4)).to eq 'rotate_result'
52
+ end
53
+
54
+ end
55
+
56
+ end
@@ -0,0 +1,681 @@
1
+ # standard
2
+ require 'date'
3
+ require 'fileutils'
4
+
5
+ # 3rd part
6
+ require 'fog-aws'
7
+
8
+ # s3_rotate
9
+ require File.expand_path("../../../../lib/s3_rotate/core/backup_rotator", __FILE__)
10
+ require File.expand_path("../../../../lib/s3_rotate/utils/file_utils", __FILE__)
11
+
12
+ describe S3Rotate::BackupRotator do
13
+
14
+ before :each do
15
+ @client = S3Rotate::S3Client.new('key', 'secret', 'bucket', 'region')
16
+ @rotator = S3Rotate::BackupRotator.new(@client)
17
+ end
18
+
19
+ describe '#initialize' do
20
+
21
+ it 'sets the client' do
22
+ expect(@rotator.s3_client).not_to eq nil
23
+ end
24
+
25
+ end
26
+
27
+ describe '#rotate' do
28
+
29
+ it 'calls the different rotate function in the correct order' do
30
+ # mock
31
+ allow(@rotator).to receive(:rotate_local).and_return nil
32
+ allow(@rotator).to receive(:rotate_daily).and_return nil
33
+ allow(@rotator).to receive(:rotate_weekly).and_return nil
34
+ allow(@rotator).to receive(:rotate_monthly).and_return nil
35
+
36
+ # perform test
37
+ @rotator.rotate('backup_name', '/path/to/dir', max_local=10, max_daily=11, max_weekly=12, max_monthly=13)
38
+
39
+ # verify result
40
+ expect(@rotator).to have_received(:rotate_local).with('/path/to/dir', 10)
41
+ expect(@rotator).to have_received(:rotate_daily).with('backup_name', 11)
42
+ expect(@rotator).to have_received(:rotate_weekly).with('backup_name', 12)
43
+ expect(@rotator).to have_received(:rotate_monthly).with('backup_name', 13)
44
+ end
45
+
46
+ end
47
+
48
+ describe '#rotate_daily' do
49
+
50
+ it 'rotates and cleanup when relevant' do
51
+ # mock
52
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-12.tgz', body: 'some data')
53
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-13.tgz', body: 'some data')
54
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-14.tgz', body: 'some data')
55
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-15.tgz', body: 'some data')
56
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-16.tgz', body: 'some data')
57
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-17.tgz', body: 'some data')
58
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-01-06.tgz', body: 'some data')
59
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/monthly/2020-01-06.tgz', body: 'some data')
60
+ @client.connection.directories.get('bucket').files.create(key: '/other_backup_name/daily/2020-01-07.tgz', body: 'some data')
61
+
62
+ # perform test
63
+ @rotator.rotate_daily('backup_name', 3)
64
+
65
+ # verify result
66
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files.length).to eq 3
67
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[0].key).to eq '/backup_name/daily/2020-01-15.tgz'
68
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[0].body).to eq 'some data'
69
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[1].key).to eq '/backup_name/daily/2020-01-16.tgz'
70
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[1].body).to eq 'some data'
71
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[2].key).to eq '/backup_name/daily/2020-01-17.tgz'
72
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[2].body).to eq 'some data'
73
+
74
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files.length).to eq 2
75
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].key).to eq '/backup_name/weekly/2020-01-06.tgz'
76
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].body).to eq 'some data'
77
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[1].key).to eq '/backup_name/weekly/2020-01-13.tgz'
78
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[1].body).to eq 'some data'
79
+
80
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files.length).to eq 1
81
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[0].key).to eq '/backup_name/monthly/2020-01-06.tgz'
82
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[0].body).to eq 'some data'
83
+ end
84
+
85
+ it 'only cleanup when relevant' do
86
+ # mock
87
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-12.tgz', body: 'some data')
88
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-13.tgz', body: 'some data')
89
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-14.tgz', body: 'some data')
90
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-15.tgz', body: 'some data')
91
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-16.tgz', body: 'some data')
92
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-17.tgz', body: 'some data')
93
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-01-11.tgz', body: 'some data')
94
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/monthly/2020-01-06.tgz', body: 'some data')
95
+ @client.connection.directories.get('bucket').files.create(key: '/other_backup_name/daily/2020-01-07.tgz', body: 'some data')
96
+
97
+ # perform test
98
+ @rotator.rotate_daily('backup_name', 3)
99
+
100
+ # verify result
101
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files.length).to eq 3
102
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[0].key).to eq '/backup_name/daily/2020-01-15.tgz'
103
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[0].body).to eq 'some data'
104
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[1].key).to eq '/backup_name/daily/2020-01-16.tgz'
105
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[1].body).to eq 'some data'
106
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[2].key).to eq '/backup_name/daily/2020-01-17.tgz'
107
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[2].body).to eq 'some data'
108
+
109
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files.length).to eq 1
110
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].key).to eq '/backup_name/weekly/2020-01-11.tgz'
111
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].body).to eq 'some data'
112
+
113
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files.length).to eq 1
114
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[0].key).to eq '/backup_name/monthly/2020-01-06.tgz'
115
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[0].body).to eq 'some data'
116
+ end
117
+
118
+ it 'only rotates when relevant' do
119
+ # mock
120
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-12.tgz', body: 'some data')
121
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-13.tgz', body: 'some data')
122
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-14.tgz', body: 'some data')
123
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-01-06.tgz', body: 'some data')
124
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/monthly/2020-01-06.tgz', body: 'some data')
125
+ @client.connection.directories.get('bucket').files.create(key: '/other_backup_name/daily/2020-01-07.tgz', body: 'some data')
126
+
127
+ # perform test
128
+ @rotator.rotate_daily('backup_name', 3)
129
+
130
+ # verify result
131
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files.length).to eq 3
132
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[0].key).to eq '/backup_name/daily/2020-01-12.tgz'
133
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[0].body).to eq 'some data'
134
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[1].key).to eq '/backup_name/daily/2020-01-13.tgz'
135
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[1].body).to eq 'some data'
136
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[2].key).to eq '/backup_name/daily/2020-01-14.tgz'
137
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[2].body).to eq 'some data'
138
+
139
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files.length).to eq 2
140
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].key).to eq '/backup_name/weekly/2020-01-06.tgz'
141
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].body).to eq 'some data'
142
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[1].key).to eq '/backup_name/weekly/2020-01-13.tgz'
143
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[1].body).to eq 'some data'
144
+
145
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files.length).to eq 1
146
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[0].key).to eq '/backup_name/monthly/2020-01-06.tgz'
147
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[0].body).to eq 'some data'
148
+ end
149
+
150
+ it 'always promote when there is no weekly backup' do
151
+ # mock
152
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-12.tgz', body: 'some data')
153
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-13.tgz', body: 'some data')
154
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-14.tgz', body: 'some data')
155
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-15.tgz', body: 'some data')
156
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-16.tgz', body: 'some data')
157
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-17.tgz', body: 'some data')
158
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/monthly/2020-01-06.tgz', body: 'some data')
159
+ @client.connection.directories.get('bucket').files.create(key: '/other_backup_name/daily/2020-01-07.tgz', body: 'some data')
160
+
161
+ # perform test
162
+ @rotator.rotate_daily('backup_name', 3)
163
+
164
+ # verify result
165
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files.length).to eq 3
166
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[0].key).to eq '/backup_name/daily/2020-01-15.tgz'
167
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[0].body).to eq 'some data'
168
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[1].key).to eq '/backup_name/daily/2020-01-16.tgz'
169
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[1].body).to eq 'some data'
170
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[2].key).to eq '/backup_name/daily/2020-01-17.tgz'
171
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[2].body).to eq 'some data'
172
+
173
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files.length).to eq 1
174
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].key).to eq '/backup_name/weekly/2020-01-12.tgz'
175
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].body).to eq 'some data'
176
+
177
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files.length).to eq 1
178
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[0].key).to eq '/backup_name/monthly/2020-01-06.tgz'
179
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[0].body).to eq 'some data'
180
+ end
181
+
182
+ it 'does nothing where there is no daily backup' do
183
+ # mock
184
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-01-06.tgz', body: 'some data')
185
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/monthly/2020-01-06.tgz', body: 'some data')
186
+ @client.connection.directories.get('bucket').files.create(key: '/other_backup_name/daily/2020-01-07.tgz', body: 'some data')
187
+
188
+ # perform test
189
+ @rotator.rotate_daily('backup_name', 3)
190
+
191
+ # verify result
192
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files.length).to eq 0
193
+
194
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files.length).to eq 1
195
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].key).to eq '/backup_name/weekly/2020-01-06.tgz'
196
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].body).to eq 'some data'
197
+
198
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files.length).to eq 1
199
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[0].key).to eq '/backup_name/monthly/2020-01-06.tgz'
200
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[0].body).to eq 'some data'
201
+ end
202
+
203
+ end
204
+
205
+ describe '#rotate_weekly' do
206
+
207
+ it 'rotates and cleanup when relevant' do
208
+ # mock
209
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-12.tgz', body: 'some data')
210
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-13.tgz', body: 'some data')
211
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-14.tgz', body: 'some data')
212
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-15.tgz', body: 'some data')
213
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-16.tgz', body: 'some data')
214
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-17.tgz', body: 'some data')
215
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-02-07.tgz', body: 'some data')
216
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-02-14.tgz', body: 'some data')
217
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-02-21.tgz', body: 'some data')
218
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-02-28.tgz', body: 'some data')
219
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/monthly/2020-01-12.tgz', body: 'some data')
220
+ @client.connection.directories.get('bucket').files.create(key: '/other_backup_name/daily/2020-01-07.tgz', body: 'some data')
221
+
222
+ # perform test
223
+ @rotator.rotate_weekly('backup_name', 2)
224
+
225
+ # verify result
226
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files.length).to eq 6
227
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[0].key).to eq '/backup_name/daily/2020-01-12.tgz'
228
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[0].body).to eq 'some data'
229
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[1].key).to eq '/backup_name/daily/2020-01-13.tgz'
230
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[1].body).to eq 'some data'
231
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[2].key).to eq '/backup_name/daily/2020-01-14.tgz'
232
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[2].body).to eq 'some data'
233
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[3].key).to eq '/backup_name/daily/2020-01-15.tgz'
234
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[3].body).to eq 'some data'
235
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[4].key).to eq '/backup_name/daily/2020-01-16.tgz'
236
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[4].body).to eq 'some data'
237
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[5].key).to eq '/backup_name/daily/2020-01-17.tgz'
238
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[5].body).to eq 'some data'
239
+
240
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files.length).to eq 2
241
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].key).to eq '/backup_name/weekly/2020-02-21.tgz'
242
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].body).to eq 'some data'
243
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[1].key).to eq '/backup_name/weekly/2020-02-28.tgz'
244
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[1].body).to eq 'some data'
245
+
246
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files.length).to eq 2
247
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[0].key).to eq '/backup_name/monthly/2020-01-12.tgz'
248
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[0].body).to eq 'some data'
249
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[1].key).to eq '/backup_name/monthly/2020-02-14.tgz'
250
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[1].body).to eq 'some data'
251
+ end
252
+
253
+ it 'only cleanup when relevant' do
254
+ # mock
255
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-12.tgz', body: 'some data')
256
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-13.tgz', body: 'some data')
257
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-14.tgz', body: 'some data')
258
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-15.tgz', body: 'some data')
259
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-16.tgz', body: 'some data')
260
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-17.tgz', body: 'some data')
261
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-02-07.tgz', body: 'some data')
262
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-02-14.tgz', body: 'some data')
263
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-02-21.tgz', body: 'some data')
264
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-02-28.tgz', body: 'some data')
265
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/monthly/2020-01-29.tgz', body: 'some data')
266
+ @client.connection.directories.get('bucket').files.create(key: '/other_backup_name/daily/2020-01-07.tgz', body: 'some data')
267
+
268
+ # perform test
269
+ @rotator.rotate_weekly('backup_name', 2)
270
+
271
+ # verify result
272
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files.length).to eq 6
273
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[0].key).to eq '/backup_name/daily/2020-01-12.tgz'
274
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[0].body).to eq 'some data'
275
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[1].key).to eq '/backup_name/daily/2020-01-13.tgz'
276
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[1].body).to eq 'some data'
277
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[2].key).to eq '/backup_name/daily/2020-01-14.tgz'
278
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[2].body).to eq 'some data'
279
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[3].key).to eq '/backup_name/daily/2020-01-15.tgz'
280
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[3].body).to eq 'some data'
281
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[4].key).to eq '/backup_name/daily/2020-01-16.tgz'
282
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[4].body).to eq 'some data'
283
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[5].key).to eq '/backup_name/daily/2020-01-17.tgz'
284
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[5].body).to eq 'some data'
285
+
286
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files.length).to eq 2
287
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].key).to eq '/backup_name/weekly/2020-02-21.tgz'
288
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].body).to eq 'some data'
289
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[1].key).to eq '/backup_name/weekly/2020-02-28.tgz'
290
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[1].body).to eq 'some data'
291
+
292
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files.length).to eq 1
293
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[0].key).to eq '/backup_name/monthly/2020-01-29.tgz'
294
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[0].body).to eq 'some data'
295
+ end
296
+
297
+ it 'only rotates when relevant' do
298
+ # mock
299
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-12.tgz', body: 'some data')
300
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-13.tgz', body: 'some data')
301
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-14.tgz', body: 'some data')
302
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-15.tgz', body: 'some data')
303
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-16.tgz', body: 'some data')
304
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-17.tgz', body: 'some data')
305
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-02-07.tgz', body: 'some data')
306
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-02-14.tgz', body: 'some data')
307
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/monthly/2020-01-12.tgz', body: 'some data')
308
+ @client.connection.directories.get('bucket').files.create(key: '/other_backup_name/daily/2020-01-07.tgz', body: 'some data')
309
+
310
+ # perform test
311
+ @rotator.rotate_weekly('backup_name', 2)
312
+
313
+ # verify result
314
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files.length).to eq 6
315
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[0].key).to eq '/backup_name/daily/2020-01-12.tgz'
316
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[0].body).to eq 'some data'
317
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[1].key).to eq '/backup_name/daily/2020-01-13.tgz'
318
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[1].body).to eq 'some data'
319
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[2].key).to eq '/backup_name/daily/2020-01-14.tgz'
320
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[2].body).to eq 'some data'
321
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[3].key).to eq '/backup_name/daily/2020-01-15.tgz'
322
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[3].body).to eq 'some data'
323
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[4].key).to eq '/backup_name/daily/2020-01-16.tgz'
324
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[4].body).to eq 'some data'
325
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[5].key).to eq '/backup_name/daily/2020-01-17.tgz'
326
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[5].body).to eq 'some data'
327
+
328
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files.length).to eq 2
329
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].key).to eq '/backup_name/weekly/2020-02-07.tgz'
330
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].body).to eq 'some data'
331
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[1].key).to eq '/backup_name/weekly/2020-02-14.tgz'
332
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[1].body).to eq 'some data'
333
+
334
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files.length).to eq 2
335
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[0].key).to eq '/backup_name/monthly/2020-01-12.tgz'
336
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[0].body).to eq 'some data'
337
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[1].key).to eq '/backup_name/monthly/2020-02-14.tgz'
338
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[1].body).to eq 'some data'
339
+ end
340
+
341
+ it 'always promote when there is no monthly backup' do
342
+ # mock
343
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-12.tgz', body: 'some data')
344
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-13.tgz', body: 'some data')
345
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-14.tgz', body: 'some data')
346
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-15.tgz', body: 'some data')
347
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-16.tgz', body: 'some data')
348
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-17.tgz', body: 'some data')
349
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-02-07.tgz', body: 'some data')
350
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-02-14.tgz', body: 'some data')
351
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-02-21.tgz', body: 'some data')
352
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-02-28.tgz', body: 'some data')
353
+ @client.connection.directories.get('bucket').files.create(key: '/other_backup_name/daily/2020-01-07.tgz', body: 'some data')
354
+
355
+ # perform test
356
+ @rotator.rotate_weekly('backup_name', 2)
357
+
358
+ # verify result
359
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files.length).to eq 6
360
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[0].key).to eq '/backup_name/daily/2020-01-12.tgz'
361
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[0].body).to eq 'some data'
362
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[1].key).to eq '/backup_name/daily/2020-01-13.tgz'
363
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[1].body).to eq 'some data'
364
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[2].key).to eq '/backup_name/daily/2020-01-14.tgz'
365
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[2].body).to eq 'some data'
366
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[3].key).to eq '/backup_name/daily/2020-01-15.tgz'
367
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[3].body).to eq 'some data'
368
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[4].key).to eq '/backup_name/daily/2020-01-16.tgz'
369
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[4].body).to eq 'some data'
370
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[5].key).to eq '/backup_name/daily/2020-01-17.tgz'
371
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[5].body).to eq 'some data'
372
+
373
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files.length).to eq 2
374
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].key).to eq '/backup_name/weekly/2020-02-21.tgz'
375
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].body).to eq 'some data'
376
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[1].key).to eq '/backup_name/weekly/2020-02-28.tgz'
377
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[1].body).to eq 'some data'
378
+
379
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files.length).to eq 1
380
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[0].key).to eq '/backup_name/monthly/2020-02-07.tgz'
381
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[0].body).to eq 'some data'
382
+ end
383
+
384
+ it 'does nothing where there is no weekly backup' do
385
+ # mock
386
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-12.tgz', body: 'some data')
387
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-13.tgz', body: 'some data')
388
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-14.tgz', body: 'some data')
389
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-15.tgz', body: 'some data')
390
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-16.tgz', body: 'some data')
391
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-17.tgz', body: 'some data')
392
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/monthly/2020-01-12.tgz', body: 'some data')
393
+ @client.connection.directories.get('bucket').files.create(key: '/other_backup_name/daily/2020-01-07.tgz', body: 'some data')
394
+
395
+ # perform test
396
+ @rotator.rotate_weekly('backup_name', 2)
397
+
398
+ # verify result
399
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files.length).to eq 6
400
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[0].key).to eq '/backup_name/daily/2020-01-12.tgz'
401
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[0].body).to eq 'some data'
402
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[1].key).to eq '/backup_name/daily/2020-01-13.tgz'
403
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[1].body).to eq 'some data'
404
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[2].key).to eq '/backup_name/daily/2020-01-14.tgz'
405
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[2].body).to eq 'some data'
406
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[3].key).to eq '/backup_name/daily/2020-01-15.tgz'
407
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[3].body).to eq 'some data'
408
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[4].key).to eq '/backup_name/daily/2020-01-16.tgz'
409
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[4].body).to eq 'some data'
410
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[5].key).to eq '/backup_name/daily/2020-01-17.tgz'
411
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[5].body).to eq 'some data'
412
+
413
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files.length).to eq 0
414
+
415
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files.length).to eq 1
416
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[0].key).to eq '/backup_name/monthly/2020-01-12.tgz'
417
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[0].body).to eq 'some data'
418
+ end
419
+
420
+ end
421
+
422
+ describe '#rotate_monthly' do
423
+
424
+ it 'cleanup when relevant' do
425
+ # mock
426
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-12.tgz', body: 'some data')
427
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-13.tgz', body: 'some data')
428
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-14.tgz', body: 'some data')
429
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-15.tgz', body: 'some data')
430
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-16.tgz', body: 'some data')
431
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-17.tgz', body: 'some data')
432
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-02-07.tgz', body: 'some data')
433
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-02-14.tgz', body: 'some data')
434
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-02-21.tgz', body: 'some data')
435
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-02-28.tgz', body: 'some data')
436
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/monthly/2020-01-12.tgz', body: 'some data')
437
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/monthly/2020-02-12.tgz', body: 'some data')
438
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/monthly/2020-03-12.tgz', body: 'some data')
439
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/monthly/2020-04-12.tgz', body: 'some data')
440
+ @client.connection.directories.get('bucket').files.create(key: '/other_backup_name/daily/2020-01-07.tgz', body: 'some data')
441
+
442
+ # perform test
443
+ @rotator.rotate_monthly('backup_name', 2)
444
+
445
+ # verify result
446
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files.length).to eq 6
447
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[0].key).to eq '/backup_name/daily/2020-01-12.tgz'
448
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[0].body).to eq 'some data'
449
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[1].key).to eq '/backup_name/daily/2020-01-13.tgz'
450
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[1].body).to eq 'some data'
451
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[2].key).to eq '/backup_name/daily/2020-01-14.tgz'
452
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[2].body).to eq 'some data'
453
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[3].key).to eq '/backup_name/daily/2020-01-15.tgz'
454
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[3].body).to eq 'some data'
455
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[4].key).to eq '/backup_name/daily/2020-01-16.tgz'
456
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[4].body).to eq 'some data'
457
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[5].key).to eq '/backup_name/daily/2020-01-17.tgz'
458
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[5].body).to eq 'some data'
459
+
460
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files.length).to eq 4
461
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].key).to eq '/backup_name/weekly/2020-02-07.tgz'
462
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].body).to eq 'some data'
463
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[1].key).to eq '/backup_name/weekly/2020-02-14.tgz'
464
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[1].body).to eq 'some data'
465
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[2].key).to eq '/backup_name/weekly/2020-02-21.tgz'
466
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[2].body).to eq 'some data'
467
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[3].key).to eq '/backup_name/weekly/2020-02-28.tgz'
468
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[3].body).to eq 'some data'
469
+
470
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files.length).to eq 2
471
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[0].key).to eq '/backup_name/monthly/2020-03-12.tgz'
472
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[0].body).to eq 'some data'
473
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[1].key).to eq '/backup_name/monthly/2020-04-12.tgz'
474
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[1].body).to eq 'some data'
475
+ end
476
+
477
+ it 'does not cleanup if not relevant' do
478
+ # mock
479
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-12.tgz', body: 'some data')
480
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-13.tgz', body: 'some data')
481
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-14.tgz', body: 'some data')
482
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-15.tgz', body: 'some data')
483
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-16.tgz', body: 'some data')
484
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-17.tgz', body: 'some data')
485
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-02-07.tgz', body: 'some data')
486
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-02-14.tgz', body: 'some data')
487
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-02-21.tgz', body: 'some data')
488
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-02-28.tgz', body: 'some data')
489
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/monthly/2020-01-12.tgz', body: 'some data')
490
+ @client.connection.directories.get('bucket').files.create(key: '/other_backup_name/daily/2020-01-07.tgz', body: 'some data')
491
+
492
+ # perform test
493
+ @rotator.rotate_monthly('backup_name', 2)
494
+
495
+ # verify result
496
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files.length).to eq 6
497
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[0].key).to eq '/backup_name/daily/2020-01-12.tgz'
498
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[0].body).to eq 'some data'
499
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[1].key).to eq '/backup_name/daily/2020-01-13.tgz'
500
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[1].body).to eq 'some data'
501
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[2].key).to eq '/backup_name/daily/2020-01-14.tgz'
502
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[2].body).to eq 'some data'
503
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[3].key).to eq '/backup_name/daily/2020-01-15.tgz'
504
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[3].body).to eq 'some data'
505
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[4].key).to eq '/backup_name/daily/2020-01-16.tgz'
506
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[4].body).to eq 'some data'
507
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[5].key).to eq '/backup_name/daily/2020-01-17.tgz'
508
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[5].body).to eq 'some data'
509
+
510
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files.length).to eq 4
511
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].key).to eq '/backup_name/weekly/2020-02-07.tgz'
512
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].body).to eq 'some data'
513
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[1].key).to eq '/backup_name/weekly/2020-02-14.tgz'
514
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[1].body).to eq 'some data'
515
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[2].key).to eq '/backup_name/weekly/2020-02-21.tgz'
516
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[2].body).to eq 'some data'
517
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[3].key).to eq '/backup_name/weekly/2020-02-28.tgz'
518
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[3].body).to eq 'some data'
519
+
520
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files.length).to eq 1
521
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[0].key).to eq '/backup_name/monthly/2020-01-12.tgz'
522
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files[0].body).to eq 'some data'
523
+ end
524
+
525
+ it 'does nothing if there is no monthly backup' do
526
+ # mock
527
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-12.tgz', body: 'some data')
528
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-13.tgz', body: 'some data')
529
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-14.tgz', body: 'some data')
530
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-15.tgz', body: 'some data')
531
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-16.tgz', body: 'some data')
532
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/daily/2020-01-17.tgz', body: 'some data')
533
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-02-07.tgz', body: 'some data')
534
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-02-14.tgz', body: 'some data')
535
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-02-21.tgz', body: 'some data')
536
+ @client.connection.directories.get('bucket').files.create(key: '/backup_name/weekly/2020-02-28.tgz', body: 'some data')
537
+ @client.connection.directories.get('bucket').files.create(key: '/other_backup_name/daily/2020-01-07.tgz', body: 'some data')
538
+
539
+ # perform test
540
+ @rotator.rotate_monthly('backup_name', 2)
541
+
542
+ # verify result
543
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files.length).to eq 6
544
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[0].key).to eq '/backup_name/daily/2020-01-12.tgz'
545
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[0].body).to eq 'some data'
546
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[1].key).to eq '/backup_name/daily/2020-01-13.tgz'
547
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[1].body).to eq 'some data'
548
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[2].key).to eq '/backup_name/daily/2020-01-14.tgz'
549
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[2].body).to eq 'some data'
550
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[3].key).to eq '/backup_name/daily/2020-01-15.tgz'
551
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[3].body).to eq 'some data'
552
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[4].key).to eq '/backup_name/daily/2020-01-16.tgz'
553
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[4].body).to eq 'some data'
554
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[5].key).to eq '/backup_name/daily/2020-01-17.tgz'
555
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/daily').files[5].body).to eq 'some data'
556
+
557
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files.length).to eq 4
558
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].key).to eq '/backup_name/weekly/2020-02-07.tgz'
559
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].body).to eq 'some data'
560
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[1].key).to eq '/backup_name/weekly/2020-02-14.tgz'
561
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[1].body).to eq 'some data'
562
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[2].key).to eq '/backup_name/weekly/2020-02-21.tgz'
563
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[2].body).to eq 'some data'
564
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[3].key).to eq '/backup_name/weekly/2020-02-28.tgz'
565
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[3].body).to eq 'some data'
566
+
567
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/monthly').files.length).to eq 0
568
+ end
569
+
570
+ end
571
+
572
+ describe '#rotate_local' do
573
+
574
+ before :each do
575
+ Dir.mkdir('./tmp')
576
+ FileUtils.touch('./tmp/2020-01-01-backup.tar')
577
+ FileUtils.touch('./tmp/2020-01-02-backup.tar')
578
+ FileUtils.touch('./tmp/2020-01-03-backup.tar')
579
+ FileUtils.touch('./tmp/2020-01-04-backup.tar')
580
+ FileUtils.touch('./tmp/2020-01-05-backup.tar')
581
+ end
582
+
583
+ after :each do
584
+ FileUtils.rm_rf('./tmp')
585
+ end
586
+
587
+ it 'cleanup if relevant' do
588
+ # perform test
589
+ @rotator.rotate_local('./tmp', 3)
590
+
591
+ # verify result
592
+ expect(Dir.entries('./tmp').select { |f| !File.directory? f }.sort).to eq ["2020-01-03-backup.tar", "2020-01-04-backup.tar", "2020-01-05-backup.tar"]
593
+ end
594
+
595
+ it 'does not cleanup if not relevant' do
596
+ # perform test
597
+ @rotator.rotate_local('./tmp', 7)
598
+
599
+ # verify result
600
+ expect(Dir.entries('./tmp').select { |f| !File.directory? f }.sort).to eq ["2020-01-01-backup.tar", "2020-01-02-backup.tar", "2020-01-03-backup.tar", "2020-01-04-backup.tar", "2020-01-05-backup.tar"]
601
+ end
602
+
603
+ it 'does nothing if there is no local backup' do
604
+ # mock
605
+ FileUtils.rm_rf('./tmp')
606
+ Dir.mkdir('./tmp')
607
+
608
+ # perform test
609
+ @rotator.rotate_local('./tmp', 7)
610
+
611
+ # verify result
612
+ expect(Dir.entries('./tmp').select { |f| !File.directory? f }.sort).to eq []
613
+ end
614
+
615
+ end
616
+
617
+ describe '#should_promote_daily_to_weekly?' do
618
+
619
+ it 'promotes after 7 days' do
620
+ expect(@rotator.should_promote_daily_to_weekly?('/gitlab/daily/2020-01-14.tar', '/gitlab/weekly/2020-01-07.tar')).to eq true
621
+ end
622
+
623
+ it 'does not promote before 7 days' do
624
+ expect(@rotator.should_promote_daily_to_weekly?('/gitlab/daily/2020-01-13.tar', '/gitlab/weekly/2020-01-07.tar')).to eq false
625
+ end
626
+
627
+ it 'does not promote if no daily file' do
628
+ expect(@rotator.should_promote_daily_to_weekly?(nil, '/gitlab/weekly/2020-01-07.tar')).to eq false
629
+ end
630
+
631
+ it 'promotes if no weekly file' do
632
+ expect(@rotator.should_promote_daily_to_weekly?('/gitlab/daily/2020-01-13.tar', nil)).to eq true
633
+ end
634
+
635
+ end
636
+
637
+ describe '#should_promote_weekly_to_monthly?' do
638
+
639
+ it 'promotes after one month' do
640
+ expect(@rotator.should_promote_weekly_to_monthly?('/gitlab/weekly/2020-02-14.tar', '/gitlab/monthly/2020-01-14.tar')).to eq true
641
+ end
642
+
643
+ it 'does not promote before one month' do
644
+ expect(@rotator.should_promote_weekly_to_monthly?('/gitlab/weekly/2020-02-13.tar', '/gitlab/monthly/2020-01-14.tar')).to eq false
645
+ end
646
+
647
+ it 'does not promote if no weekly file' do
648
+ expect(@rotator.should_promote_weekly_to_monthly?(nil, '/gitlab/monthly/2020-01-07.tar')).to eq false
649
+ end
650
+
651
+ it 'promotes if no monthly file' do
652
+ expect(@rotator.should_promote_weekly_to_monthly?('/gitlab/weekly/2020-01-13.tar', nil)).to eq true
653
+ end
654
+
655
+ end
656
+
657
+ describe '#promote' do
658
+
659
+ it 'promotes backup with extension' do
660
+ # perform test
661
+ @rotator.promote('backup_name', '/gitlab/daily/2020-01-02.tgz', 'some data', 'weekly')
662
+
663
+ # verify result
664
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files.length).to eq 1
665
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].key).to eq '/backup_name/weekly/2020-01-02.tgz'
666
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].body).to eq 'some data'
667
+ end
668
+
669
+ it 'promotes backup without extension' do
670
+ # perform test
671
+ @rotator.promote('backup_name', '/gitlab/daily/2020-01-02', 'some data', 'weekly')
672
+
673
+ # verify result
674
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files.length).to eq 1
675
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].key).to eq '/backup_name/weekly/2020-01-02'
676
+ expect(@client.connection.directories.get('bucket', prefix: '/backup_name/weekly').files[0].body).to eq 'some data'
677
+ end
678
+
679
+ end
680
+
681
+ end