chef_backup 0.0.1.dev.2 → 0.1.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.
- checksums.yaml +5 -5
- data/lib/chef_backup.rb +8 -8
- data/lib/chef_backup/config.rb +22 -12
- data/lib/chef_backup/data_map.rb +23 -9
- data/lib/chef_backup/deep_merge.rb +145 -0
- data/lib/chef_backup/helpers.rb +169 -27
- data/lib/chef_backup/logger.rb +2 -2
- data/lib/chef_backup/mash.rb +226 -0
- data/lib/chef_backup/runner.rb +19 -14
- 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 +116 -35
- data/lib/chef_backup/strategy/restore/tar.rb +103 -38
- data/lib/chef_backup/version.rb +1 -1
- metadata +22 -170
- data/.gitignore +0 -23
- data/.kitchen.yml +0 -30
- data/.rubocop.yml +0 -17
- 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 -584
- data/spec/spec_helper.rb +0 -103
- 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 -74
- data/spec/unit/strategy/backup/tar_spec.rb +0 -294
- 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 -238
- data/spec/unit/strategy_spec.rb +0 -36
@@ -1,7 +1,7 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
1
|
+
require "fileutils"
|
2
|
+
require "pathname"
|
3
|
+
require "forwardable"
|
4
|
+
require "chef_backup/deep_merge"
|
5
5
|
|
6
6
|
# rubocop:disable IndentationWidth
|
7
7
|
module ChefBackup
|
@@ -11,87 +11,98 @@ class TarRestore
|
|
11
11
|
# rubocop:enable IndentationWidth
|
12
12
|
include ChefBackup::Helpers
|
13
13
|
include ChefBackup::Exceptions
|
14
|
-
include
|
14
|
+
include ChefBackup::Mixin::DeepMerge
|
15
15
|
extend Forwardable
|
16
16
|
|
17
17
|
attr_accessor :tarball_path
|
18
|
+
attr_writer :manifest
|
18
19
|
|
19
20
|
def_delegators :@log, :log
|
20
21
|
|
21
22
|
def initialize(path)
|
22
23
|
@tarball_path = path
|
23
|
-
@log = ChefBackup::Logger.logger(
|
24
|
+
@log = ChefBackup::Logger.logger(service_config["backup"]["logfile"] || nil)
|
24
25
|
end
|
25
26
|
|
26
27
|
def restore
|
27
|
-
log
|
28
|
-
|
28
|
+
log "Restoring Chef Server from backup"
|
29
|
+
return unless check_manifest_version
|
30
|
+
|
31
|
+
cleanse_chef_server(config["agree_to_cleanse"])
|
32
|
+
if ha?
|
33
|
+
log "Performing HA restore - please ensure that keepalived is not running on the standby host"
|
34
|
+
fix_ha_plugins
|
35
|
+
check_ha_volume
|
36
|
+
touch_drbd_ready
|
37
|
+
end
|
29
38
|
restore_configs
|
30
39
|
restore_services unless frontend?
|
31
40
|
touch_sentinel
|
41
|
+
reconfigure_marketplace if marketplace?
|
32
42
|
reconfigure_server
|
33
43
|
update_config
|
34
44
|
import_db if restore_db_dump?
|
35
45
|
start_chef_server
|
46
|
+
reconfigure_add_ons
|
47
|
+
restart_add_ons
|
36
48
|
cleanup
|
37
|
-
log
|
49
|
+
log "Restoration Completed!"
|
38
50
|
end
|
39
51
|
|
40
52
|
def manifest
|
41
53
|
@manifest ||= begin
|
42
|
-
manifest = File.expand_path(File.join(ChefBackup::Config[
|
43
|
-
|
54
|
+
manifest = File.expand_path(File.join(ChefBackup::Config["restore_dir"],
|
55
|
+
"manifest.json"))
|
44
56
|
ensure_file!(manifest, InvalidManifest, "#{manifest} not found")
|
45
57
|
JSON.parse(File.read(manifest))
|
46
58
|
end
|
47
59
|
end
|
48
60
|
|
49
61
|
def restore_db_dump?
|
50
|
-
manifest[
|
62
|
+
manifest["services"]["postgresql"]["pg_dump_success"] && !frontend?
|
51
63
|
rescue NoMethodError
|
52
64
|
false
|
53
65
|
end
|
54
66
|
|
55
67
|
def import_db
|
56
|
-
start_service(
|
57
|
-
sql_file = File.join(ChefBackup::Config[
|
58
|
-
|
68
|
+
start_service("postgresql")
|
69
|
+
sql_file = File.join(ChefBackup::Config["restore_dir"],
|
70
|
+
"chef_backup-#{manifest["backup_time"]}.sql")
|
59
71
|
ensure_file!(sql_file, InvalidDatabaseDump, "#{sql_file} not found")
|
60
72
|
|
61
|
-
cmd = [
|
62
|
-
"-u #{manifest[
|
63
|
-
|
64
|
-
"-U #{manifest[
|
65
|
-
|
66
|
-
"< #{sql_file}"
|
67
|
-
|
68
|
-
|
69
|
-
shell_out!(cmd)
|
73
|
+
cmd = [chpst,
|
74
|
+
"-u #{manifest["services"]["postgresql"]["username"]}",
|
75
|
+
pgsql,
|
76
|
+
"-U #{manifest["services"]["postgresql"]["username"]}",
|
77
|
+
"-d #{database_name}",
|
78
|
+
"< #{sql_file}"].join(" ")
|
79
|
+
log "Importing Database dump"
|
80
|
+
shell_out!(cmd, env: ["PGOPTIONS=#{pg_options}"])
|
70
81
|
end
|
71
82
|
|
72
83
|
def restore_services
|
73
|
-
manifest.key?(
|
84
|
+
manifest.key?("services") && manifest["services"].keys.each do |service|
|
74
85
|
restore_data(:services, service)
|
75
86
|
end
|
76
87
|
end
|
77
88
|
|
78
89
|
def restore_configs
|
79
|
-
manifest.key?(
|
90
|
+
manifest.key?("configs") && manifest["configs"].keys.each do |config|
|
80
91
|
restore_data(:configs, config)
|
81
92
|
end
|
82
93
|
end
|
83
94
|
|
84
95
|
def touch_sentinel
|
85
|
-
dir =
|
86
|
-
sentinel = File.join(dir,
|
96
|
+
dir = "/var/opt/opscode"
|
97
|
+
sentinel = File.join(dir, "bootstrapped")
|
87
98
|
FileUtils.mkdir_p(dir) unless File.directory?(dir)
|
88
|
-
File.open(sentinel,
|
99
|
+
File.open(sentinel, "w") { |file| file.write "bootstrapped!" }
|
89
100
|
end
|
90
101
|
|
91
102
|
def restore_data(type, name)
|
92
|
-
source = File.expand_path(File.join(config[
|
93
|
-
|
94
|
-
destination = manifest[type.to_s][name][
|
103
|
+
source = File.expand_path(File.join(config["restore_dir"],
|
104
|
+
manifest[type.to_s][name]["data_dir"]))
|
105
|
+
destination = manifest[type.to_s][name]["data_dir"]
|
95
106
|
FileUtils.mkdir_p(destination) unless File.directory?(destination)
|
96
107
|
cmd = "rsync -chaz --delete #{source}/ #{destination}"
|
97
108
|
log "Restoring the #{name} data"
|
@@ -99,22 +110,76 @@ class TarRestore
|
|
99
110
|
end
|
100
111
|
|
101
112
|
def backup_name
|
102
|
-
@backup_name ||= Pathname.new(tarball_path).basename.sub_ext(
|
113
|
+
@backup_name ||= Pathname.new(tarball_path).basename.sub_ext("").to_s
|
114
|
+
end
|
115
|
+
|
116
|
+
def check_manifest_version
|
117
|
+
unless manifest["versions"]
|
118
|
+
log "no version information in manifest"
|
119
|
+
return true
|
120
|
+
end
|
121
|
+
|
122
|
+
manifest["versions"].each_pair do |name, data|
|
123
|
+
installed = version_from_manifest_file(data["path"])
|
124
|
+
|
125
|
+
if installed == :no_version
|
126
|
+
log "Warning: #{name} @ #{data["version"]} not installed"
|
127
|
+
elsif installed["version"] != data["version"]
|
128
|
+
log "package #{name} #{installed["version"]} installed, but backup was"\
|
129
|
+
" from #{data["version"]}. Please install correct version, restore, then upgrade."
|
130
|
+
return false
|
131
|
+
end
|
132
|
+
end
|
133
|
+
true
|
134
|
+
end
|
135
|
+
|
136
|
+
def fix_ha_plugins
|
137
|
+
log "Fixing HA plugins directory (https://github.com/chef/chef-server/issues/115)"
|
138
|
+
plugins_dir = "/var/opt/opscode/plugins"
|
139
|
+
drbd_plugin = File.join(plugins_dir, "chef-ha-drbd.rb")
|
140
|
+
|
141
|
+
FileUtils.mkdir_p(plugins_dir) unless Dir.exist?(plugins_dir)
|
142
|
+
FileUtils.ln_sf("/opt/opscode/chef-server-plugin.rb", drbd_plugin) unless
|
143
|
+
File.exist?(drbd_plugin)
|
144
|
+
end
|
145
|
+
|
146
|
+
def check_ha_volume
|
147
|
+
log "Checking that the HA storage volume is mounted"
|
148
|
+
ha_data_dir = manifest["ha"]["path"]
|
149
|
+
|
150
|
+
unless ha_data_dir_mounted?(ha_data_dir)
|
151
|
+
raise "Please mount the data directory #{ha_data_dir} and perform any DRBD configuration before continuing"
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
def ha_data_dir_mounted?(ha_data_dir)
|
156
|
+
File.read("/proc/mounts").split("\n").grep(/#{ha_data_dir}/).count > 0
|
157
|
+
end
|
158
|
+
|
159
|
+
def touch_drbd_ready
|
160
|
+
log "Touching drbd_ready file"
|
161
|
+
FileUtils.touch("/var/opt/opscode/drbd/drbd_ready") unless
|
162
|
+
File.exist?("/var/opt/opscode/drbd/drbd_ready")
|
103
163
|
end
|
104
164
|
|
105
165
|
def reconfigure_server
|
106
|
-
log
|
107
|
-
shell_out(
|
166
|
+
log "Reconfiguring the Chef Server"
|
167
|
+
shell_out("#{ctl_command} reconfigure")
|
108
168
|
end
|
109
169
|
|
110
170
|
def cleanse_chef_server(agree)
|
111
|
-
log
|
112
|
-
|
171
|
+
log "Cleaning up any old files"
|
172
|
+
# The chef-server-ctl cleanse command deliberately waits 60 seconds to give
|
173
|
+
# you an option to cancel it. Therefore, don't count it in the timeout that
|
174
|
+
# the user provided. If the user has eagerly dismissed that wait period,
|
175
|
+
# then don't elongate the timeout. The user can do this with the -c flag.
|
176
|
+
timeout = shell_timeout + (agree ? 0 : 60) if shell_timeout
|
177
|
+
shell_out!("#{ctl_command} cleanse #{agree || ""}", "timeout" => timeout)
|
113
178
|
end
|
114
179
|
|
115
180
|
def running_config
|
116
181
|
@running_config ||=
|
117
|
-
JSON.parse(File.read(
|
182
|
+
JSON.parse(File.read(running_filepath)) || {}
|
118
183
|
end
|
119
184
|
|
120
185
|
def update_config
|
data/lib/chef_backup/version.rb
CHANGED
metadata
CHANGED
@@ -1,192 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chef_backup
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Chef Software, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-09-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: di-ruby-lvm
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: mixlib-shellout
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
30
16
|
requirements:
|
31
17
|
- - ">="
|
32
18
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
19
|
+
version: '2.0'
|
20
|
+
- - "<"
|
39
21
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: highline
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
22
|
+
version: '4.0'
|
48
23
|
type: :runtime
|
49
24
|
prerelease: false
|
50
25
|
version_requirements: !ruby/object:Gem::Requirement
|
51
26
|
requirements:
|
52
27
|
- - ">="
|
53
28
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
-
|
56
|
-
name: chef
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :runtime
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
29
|
+
version: '2.0'
|
30
|
+
- - "<"
|
67
31
|
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
32
|
+
version: '4.0'
|
69
33
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
34
|
+
name: highline
|
71
35
|
requirement: !ruby/object:Gem::Requirement
|
72
36
|
requirements:
|
73
37
|
- - "~>"
|
74
38
|
- !ruby/object:Gem::Version
|
75
39
|
version: '1.6'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '1.6'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: rake
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
40
|
- - ">="
|
95
41
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
97
|
-
|
98
|
-
name: rspec
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - "~>"
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '3.0'
|
104
|
-
type: :development
|
42
|
+
version: 1.6.9
|
43
|
+
type: :runtime
|
105
44
|
prerelease: false
|
106
45
|
version_requirements: !ruby/object:Gem::Requirement
|
107
46
|
requirements:
|
108
47
|
- - "~>"
|
109
48
|
- !ruby/object:Gem::Version
|
110
|
-
version: '
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: guard-rspec
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - ">="
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '0'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - ">="
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '0'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: pry-rescue
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - ">="
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: '0'
|
132
|
-
type: :development
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - ">="
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: '0'
|
139
|
-
- !ruby/object:Gem::Dependency
|
140
|
-
name: rubocop
|
141
|
-
requirement: !ruby/object:Gem::Requirement
|
142
|
-
requirements:
|
143
|
-
- - '='
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
version: '0.28'
|
146
|
-
type: :development
|
147
|
-
prerelease: false
|
148
|
-
version_requirements: !ruby/object:Gem::Requirement
|
149
|
-
requirements:
|
150
|
-
- - '='
|
151
|
-
- !ruby/object:Gem::Version
|
152
|
-
version: '0.28'
|
153
|
-
- !ruby/object:Gem::Dependency
|
154
|
-
name: simplecov
|
155
|
-
requirement: !ruby/object:Gem::Requirement
|
156
|
-
requirements:
|
157
|
-
- - ">="
|
158
|
-
- !ruby/object:Gem::Version
|
159
|
-
version: '0'
|
160
|
-
type: :development
|
161
|
-
prerelease: false
|
162
|
-
version_requirements: !ruby/object:Gem::Requirement
|
163
|
-
requirements:
|
49
|
+
version: '1.6'
|
164
50
|
- - ">="
|
165
51
|
- !ruby/object:Gem::Version
|
166
|
-
version:
|
52
|
+
version: 1.6.9
|
167
53
|
description: A library to backup a Chef Server
|
168
54
|
email:
|
169
|
-
-
|
55
|
+
- oss@chef.io
|
170
56
|
executables: []
|
171
57
|
extensions: []
|
172
58
|
extra_rdoc_files: []
|
173
59
|
files:
|
174
|
-
- ".gitignore"
|
175
|
-
- ".kitchen.yml"
|
176
|
-
- ".rubocop.yml"
|
177
|
-
- ".travis.yml"
|
178
|
-
- Gemfile
|
179
|
-
- Guardfile
|
180
60
|
- LICENSE
|
181
|
-
- README.md
|
182
|
-
- Rakefile
|
183
|
-
- chef_backup.gemspec
|
184
61
|
- lib/chef_backup.rb
|
185
62
|
- lib/chef_backup/config.rb
|
186
63
|
- lib/chef_backup/data_map.rb
|
64
|
+
- lib/chef_backup/deep_merge.rb
|
187
65
|
- lib/chef_backup/exceptions.rb
|
188
66
|
- lib/chef_backup/helpers.rb
|
189
67
|
- lib/chef_backup/logger.rb
|
68
|
+
- lib/chef_backup/mash.rb
|
190
69
|
- lib/chef_backup/runner.rb
|
191
70
|
- lib/chef_backup/strategy.rb
|
192
71
|
- lib/chef_backup/strategy/backup/custom.rb
|
@@ -200,22 +79,9 @@ files:
|
|
200
79
|
- lib/chef_backup/strategy/restore/object.rb
|
201
80
|
- lib/chef_backup/strategy/restore/tar.rb
|
202
81
|
- lib/chef_backup/version.rb
|
203
|
-
- spec/fixtures/chef-server-running.json
|
204
|
-
- spec/spec_helper.rb
|
205
|
-
- spec/unit/data_map_spec.rb
|
206
|
-
- spec/unit/helpers_spec.rb
|
207
|
-
- spec/unit/runner_spec.rb
|
208
|
-
- spec/unit/shared_examples/helpers.rb
|
209
|
-
- spec/unit/strategy/backup/lvm_spec.rb
|
210
|
-
- spec/unit/strategy/backup/shared_examples/backup.rb
|
211
|
-
- spec/unit/strategy/backup/tar_spec.rb
|
212
|
-
- spec/unit/strategy/restore/lvm_spec.rb
|
213
|
-
- spec/unit/strategy/restore/shared_examples/restore.rb
|
214
|
-
- spec/unit/strategy/restore/tar_spec.rb
|
215
|
-
- spec/unit/strategy_spec.rb
|
216
82
|
homepage: https://github.com/chef/chef_backup
|
217
83
|
licenses:
|
218
|
-
-
|
84
|
+
- Apache-2.0
|
219
85
|
metadata: {}
|
220
86
|
post_install_message:
|
221
87
|
rdoc_options: []
|
@@ -228,26 +94,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
228
94
|
version: '0'
|
229
95
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
230
96
|
requirements:
|
231
|
-
- - "
|
97
|
+
- - ">="
|
232
98
|
- !ruby/object:Gem::Version
|
233
|
-
version:
|
99
|
+
version: '0'
|
234
100
|
requirements: []
|
235
|
-
|
236
|
-
rubygems_version: 2.2.2
|
101
|
+
rubygems_version: 3.0.3
|
237
102
|
signing_key:
|
238
103
|
specification_version: 4
|
239
104
|
summary: A library to backup a Chef Server
|
240
|
-
test_files:
|
241
|
-
- spec/fixtures/chef-server-running.json
|
242
|
-
- spec/spec_helper.rb
|
243
|
-
- spec/unit/data_map_spec.rb
|
244
|
-
- spec/unit/helpers_spec.rb
|
245
|
-
- spec/unit/runner_spec.rb
|
246
|
-
- spec/unit/shared_examples/helpers.rb
|
247
|
-
- spec/unit/strategy/backup/lvm_spec.rb
|
248
|
-
- spec/unit/strategy/backup/shared_examples/backup.rb
|
249
|
-
- spec/unit/strategy/backup/tar_spec.rb
|
250
|
-
- spec/unit/strategy/restore/lvm_spec.rb
|
251
|
-
- spec/unit/strategy/restore/shared_examples/restore.rb
|
252
|
-
- spec/unit/strategy/restore/tar_spec.rb
|
253
|
-
- spec/unit/strategy_spec.rb
|
105
|
+
test_files: []
|