chef_backup 0.0.1 → 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 +5 -5
- data/lib/chef_backup.rb +8 -8
- data/lib/chef_backup/config.rb +17 -17
- data/lib/chef_backup/data_map.rb +18 -12
- data/lib/chef_backup/deep_merge.rb +145 -0
- data/lib/chef_backup/helpers.rb +46 -10
- data/lib/chef_backup/logger.rb +2 -2
- data/lib/chef_backup/mash.rb +226 -0
- data/lib/chef_backup/runner.rb +11 -13
- data/lib/chef_backup/strategy.rb +10 -10
- data/lib/chef_backup/strategy/backup/custom.rb +1 -2
- data/lib/chef_backup/strategy/backup/ebs.rb +3 -6
- data/lib/chef_backup/strategy/backup/lvm.rb +2 -4
- data/lib/chef_backup/strategy/backup/object.rb +2 -4
- data/lib/chef_backup/strategy/backup/tar.rb +23 -7
- data/lib/chef_backup/strategy/restore/tar.rb +69 -43
- data/lib/chef_backup/version.rb +1 -1
- metadata +20 -168
- data/.gitignore +0 -23
- data/.kitchen.yml +0 -30
- data/.rubocop.yml +0 -21
- data/.travis.yml +0 -6
- data/Gemfile +0 -4
- data/Guardfile +0 -22
- data/README.md +0 -21
- data/Rakefile +0 -44
- data/chef_backup.gemspec +0 -33
- data/spec/fixtures/chef-server-running.json +0 -589
- data/spec/spec_helper.rb +0 -98
- data/spec/unit/data_map_spec.rb +0 -59
- data/spec/unit/helpers_spec.rb +0 -88
- data/spec/unit/runner_spec.rb +0 -185
- data/spec/unit/shared_examples/helpers.rb +0 -20
- data/spec/unit/strategy/backup/lvm_spec.rb +0 -0
- data/spec/unit/strategy/backup/shared_examples/backup.rb +0 -92
- data/spec/unit/strategy/backup/tar_spec.rb +0 -327
- data/spec/unit/strategy/restore/lvm_spec.rb +0 -0
- data/spec/unit/strategy/restore/shared_examples/restore.rb +0 -84
- data/spec/unit/strategy/restore/tar_spec.rb +0 -255
- data/spec/unit/strategy_spec.rb +0 -36
@@ -1,255 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require_relative 'shared_examples/restore'
|
3
|
-
|
4
|
-
describe ChefBackup::Strategy::TarRestore do
|
5
|
-
let(:manifest) do
|
6
|
-
{ 'strategy' => 'tar',
|
7
|
-
'backup_time' => '2014-12-02-22-46-58',
|
8
|
-
'services' => {
|
9
|
-
'rabbitmq' => { 'data_dir' => '/var/opt/opscode/rabbitmq/db' },
|
10
|
-
'opscode-solr4' => {
|
11
|
-
'data_dir' => '/var/opt/opscode/opscode-solr4/data'
|
12
|
-
},
|
13
|
-
'redis_lb' => { 'data_dir' => '/var/opt/opscode/redis_lb/data' },
|
14
|
-
'postgresql' => {
|
15
|
-
'data_dir' => '/var/opt/opscode/postgresql/9.2/data',
|
16
|
-
'pg_dump_success' => pg_dump_success,
|
17
|
-
'username' => 'opscode-pgsql'
|
18
|
-
},
|
19
|
-
'bookshelf' => { 'data_dir' => '/var/opt/opscode/bookshelf/data' }
|
20
|
-
},
|
21
|
-
'configs' => {
|
22
|
-
'opscode' => { 'data_dir' => '/etc/opscode' },
|
23
|
-
'opscode-manage' => { 'data_dir' => '/etc/opscode-manage' },
|
24
|
-
'opscode-reporting' => { 'data_dir' => '/etc/opscode-reporting' },
|
25
|
-
'opscode-analytics' => { 'data_dir' => '/etc/opscode-analytics' }
|
26
|
-
}
|
27
|
-
}
|
28
|
-
end
|
29
|
-
|
30
|
-
let(:pg_dump_success) { true }
|
31
|
-
let(:tarball_path) { '/var/backups/chef-backup-2014-12-02-22-46-58.tgz' }
|
32
|
-
let(:configs) { manifest['configs'].keys }
|
33
|
-
let(:services) { manifest['services'].keys }
|
34
|
-
let(:restore_dir) { ChefBackup::Config['restore_dir'] }
|
35
|
-
|
36
|
-
subject { described_class.new(tarball_path) }
|
37
|
-
|
38
|
-
before(:each) { use_default_cli_args }
|
39
|
-
|
40
|
-
describe '.restore' do
|
41
|
-
before do
|
42
|
-
%i(shell_out shell_out! unpack_tarball stop_chef_server ensure_file!
|
43
|
-
start_chef_server reconfigure_server cleanse_chef_server
|
44
|
-
update_config import_db touch_sentinel restart_add_ons
|
45
|
-
).each do |method|
|
46
|
-
allow(subject).to receive(method).and_return(true)
|
47
|
-
end
|
48
|
-
configs.each do |config|
|
49
|
-
allow(subject)
|
50
|
-
.to receive(:restore_data)
|
51
|
-
.with(:configs, config)
|
52
|
-
.and_return(true)
|
53
|
-
end
|
54
|
-
services.each do |service|
|
55
|
-
allow(subject)
|
56
|
-
.to receive(:restore_data)
|
57
|
-
.with(:services, service)
|
58
|
-
.and_return(true)
|
59
|
-
end
|
60
|
-
|
61
|
-
allow(subject).to receive(:tarball_path).and_return(tarball_path)
|
62
|
-
allow(subject).to receive(:manifest).and_return(manifest)
|
63
|
-
allow(subject).to receive(:marketplace?).and_return(false)
|
64
|
-
end
|
65
|
-
|
66
|
-
it_behaves_like 'a tar based restore'
|
67
|
-
|
68
|
-
context 'on a frontend' do
|
69
|
-
before do
|
70
|
-
allow(subject).to receive(:frontend?).and_return(true)
|
71
|
-
end
|
72
|
-
|
73
|
-
it_behaves_like 'a tar based frontend restore'
|
74
|
-
end
|
75
|
-
|
76
|
-
context 'on a backend' do
|
77
|
-
before do
|
78
|
-
allow(subject).to receive(:frontend?).and_return(false)
|
79
|
-
end
|
80
|
-
|
81
|
-
it_behaves_like 'a tar based backend restore'
|
82
|
-
|
83
|
-
context 'when a db dump is present' do
|
84
|
-
before do
|
85
|
-
allow(subject).to receive(:restore_db_dump?).and_return(true)
|
86
|
-
allow(subject)
|
87
|
-
.to receive(:start_service).with(:postgresql).and_return(true)
|
88
|
-
allow(subject).to receive(:import_db).and_return(true)
|
89
|
-
end
|
90
|
-
|
91
|
-
it_behaves_like 'a tar based backend restore with db dump'
|
92
|
-
end
|
93
|
-
|
94
|
-
context 'when a db dump is not present' do
|
95
|
-
before do
|
96
|
-
allow(subject).to receive(:restore_db_dump?).and_return(false)
|
97
|
-
end
|
98
|
-
|
99
|
-
it_behaves_like 'a tar based backend restore without db dump'
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
context 'on a standalone' do
|
104
|
-
before do
|
105
|
-
allow(subject).to receive(:frontend?).and_return(false)
|
106
|
-
end
|
107
|
-
|
108
|
-
it_behaves_like 'a tar based backend restore'
|
109
|
-
|
110
|
-
context 'when a db dump is present' do
|
111
|
-
before do
|
112
|
-
allow(subject).to receive(:restore_db_dump?).and_return(true)
|
113
|
-
end
|
114
|
-
|
115
|
-
it_behaves_like 'a tar based backend restore with db dump'
|
116
|
-
end
|
117
|
-
|
118
|
-
context 'when a db dump is not present' do
|
119
|
-
before do
|
120
|
-
allow(subject).to receive(:restore_db_dump?).and_return(false)
|
121
|
-
end
|
122
|
-
|
123
|
-
it_behaves_like 'a tar based backend restore without db dump'
|
124
|
-
end
|
125
|
-
|
126
|
-
context 'on a marketplace all-in-one' do
|
127
|
-
before do
|
128
|
-
allow(subject).to receive(:marketplace?).and_return(true)
|
129
|
-
allow(subject).to receive(:reconfigure_marketplace?).and_return(true)
|
130
|
-
end
|
131
|
-
|
132
|
-
it 'sets up chef-marketplace' do
|
133
|
-
expect(subject).to receive(:reconfigure_marketplace).once
|
134
|
-
subject.restore
|
135
|
-
end
|
136
|
-
|
137
|
-
it_behaves_like 'a tar based backend restore'
|
138
|
-
end
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
describe '.manifest' do
|
143
|
-
let(:json) { '{"some":"json"}' }
|
144
|
-
let(:manifest_json) { File.join(restore_dir, 'manifest.json') }
|
145
|
-
|
146
|
-
it 'parses the manifest from the restore dir' do
|
147
|
-
allow(subject).to receive(:ensure_file!).and_return(true)
|
148
|
-
allow(File).to receive(:read).with(manifest_json).and_return(json)
|
149
|
-
expect(subject.manifest).to eq('some' => 'json')
|
150
|
-
end
|
151
|
-
|
152
|
-
it 'raises an error if the manifest is invalid' do
|
153
|
-
expect { subject.manifest }
|
154
|
-
.to raise_error(
|
155
|
-
ChefBackup::Strategy::TarRestore::InvalidManifest,
|
156
|
-
"#{File.join(restore_dir, 'manifest.json')} not found"
|
157
|
-
)
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
describe '.restore_data' do
|
162
|
-
before do
|
163
|
-
ChefBackup::Config['restore_dir'] = restore_dir
|
164
|
-
allow(subject).to receive(:manifest).and_return(manifest)
|
165
|
-
allow(subject).to receive(:shell_out!).and_return(true)
|
166
|
-
allow(File).to receive(:directory?).and_return(true)
|
167
|
-
end
|
168
|
-
|
169
|
-
context 'with config data' do
|
170
|
-
it 'rsyncs the config from the restore dir to the data_dir' do
|
171
|
-
source = File.expand_path(
|
172
|
-
File.join(restore_dir, manifest['configs']['opscode']['data_dir']))
|
173
|
-
destination = manifest['configs']['opscode']['data_dir']
|
174
|
-
cmd = "rsync -chaz --delete #{source}/ #{destination}"
|
175
|
-
|
176
|
-
expect(subject).to receive(:shell_out!).with(cmd)
|
177
|
-
subject.restore_data(:configs, 'opscode')
|
178
|
-
end
|
179
|
-
end
|
180
|
-
|
181
|
-
context 'with service data' do
|
182
|
-
it 'rsyncs the service from the restore dir to the data_dir' do
|
183
|
-
source = File.expand_path(
|
184
|
-
File.join(restore_dir, manifest['services']['rabbitmq']['data_dir']))
|
185
|
-
destination = manifest['services']['rabbitmq']['data_dir']
|
186
|
-
cmd = "rsync -chaz --delete #{source}/ #{destination}"
|
187
|
-
|
188
|
-
expect(subject).to receive(:shell_out!).with(cmd)
|
189
|
-
subject.restore_data(:services, 'rabbitmq')
|
190
|
-
end
|
191
|
-
end
|
192
|
-
end
|
193
|
-
|
194
|
-
describe '.import_db' do
|
195
|
-
let(:pg_options) { ["PGOPTIONS=#{ChefBackup::Helpers::DEFAULT_PG_OPTIONS}"] }
|
196
|
-
|
197
|
-
before do
|
198
|
-
allow(subject).to receive(:manifest).and_return(manifest)
|
199
|
-
allow(subject).to receive(:shell_out!).and_return(true)
|
200
|
-
allow(subject).to receive(:running_config).and_return(running_config)
|
201
|
-
allow(subject)
|
202
|
-
.to receive(:start_service).with('postgresql').and_return(true)
|
203
|
-
end
|
204
|
-
|
205
|
-
context 'without a db dump' do
|
206
|
-
it 'raises an exception' do
|
207
|
-
expect { subject.import_db }
|
208
|
-
.to raise_error(ChefBackup::Exceptions::InvalidDatabaseDump)
|
209
|
-
end
|
210
|
-
end
|
211
|
-
|
212
|
-
context 'with a db dump' do
|
213
|
-
let(:db_sql) do
|
214
|
-
File.join(restore_dir, "chef_backup-#{manifest['backup_time']}.sql")
|
215
|
-
end
|
216
|
-
|
217
|
-
let(:import_cmd) do
|
218
|
-
['/opt/opscode/embedded/bin/chpst -u opscode-pgsql',
|
219
|
-
'/opt/opscode/embedded/bin/psql -U opscode-pgsql',
|
220
|
-
"-d opscode_chef < #{db_sql}"
|
221
|
-
].join(' ')
|
222
|
-
end
|
223
|
-
|
224
|
-
before do
|
225
|
-
allow(subject)
|
226
|
-
.to receive(:ensure_file!)
|
227
|
-
.with(db_sql,
|
228
|
-
ChefBackup::Exceptions::InvalidDatabaseDump,
|
229
|
-
"#{db_sql} not found")
|
230
|
-
.and_return(true)
|
231
|
-
end
|
232
|
-
|
233
|
-
it 'imports the database' do
|
234
|
-
expect(subject).to receive(:shell_out!).with(import_cmd, env: pg_options)
|
235
|
-
subject.import_db
|
236
|
-
end
|
237
|
-
end
|
238
|
-
end
|
239
|
-
|
240
|
-
describe '.touch_sentinel' do
|
241
|
-
let(:file) { double('File', write: true) }
|
242
|
-
let(:file_dir) { '/var/opt/opscode' }
|
243
|
-
let(:file_path) { File.join(file_dir, 'bootstrapped') }
|
244
|
-
|
245
|
-
before do
|
246
|
-
allow(FileUtils).to receive(:mkdir_p).with(file_dir).and_return(true)
|
247
|
-
allow(File).to receive(:open).with(file_path, 'w').and_yield(file)
|
248
|
-
end
|
249
|
-
|
250
|
-
it 'touches the bootstrap sentinel file' do
|
251
|
-
expect(file).to receive(:write).with('bootstrapped!')
|
252
|
-
subject.touch_sentinel
|
253
|
-
end
|
254
|
-
end
|
255
|
-
end
|
data/spec/unit/strategy_spec.rb
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe ChefBackup::Strategy do
|
4
|
-
before do
|
5
|
-
# Backup Tester
|
6
|
-
class ChefBackup::Strategy::TestBackup
|
7
|
-
def initialize(_p = {})
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
# Restore Tester
|
12
|
-
class ChefBackup::Strategy::TestRestore
|
13
|
-
def initialize(_p = {})
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
after do
|
19
|
-
described_class.send(:remove_const, :TestBackup)
|
20
|
-
described_class.send(:remove_const, :TestRestore)
|
21
|
-
end
|
22
|
-
|
23
|
-
describe '.backup' do
|
24
|
-
it 'it returns a backup strategy' do
|
25
|
-
expect(described_class.backup('test'))
|
26
|
-
.to be_an(ChefBackup::Strategy::TestBackup)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
describe '.restore' do
|
31
|
-
it 'it returns a restore strategy' do
|
32
|
-
expect(described_class.restore('test', '/some/backup.tgz'))
|
33
|
-
.to be_an(ChefBackup::Strategy::TestRestore)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|