vagrant-kvm 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +2 -0
- data/.rspec +1 -0
- data/.travis.yml +14 -0
- data/CHANGELOG.md +29 -0
- data/DEVELOPMENT.md +87 -0
- data/Gemfile +1 -0
- data/INSTALL.md +229 -0
- data/LICENSE +2 -1
- data/README.md +154 -63
- data/Rakefile +24 -1
- data/example_box/README.md +8 -8
- data/lib/vagrant-kvm/action.rb +47 -5
- data/lib/vagrant-kvm/action/boot.rb +0 -4
- data/lib/vagrant-kvm/action/clear_forwarded_ports.rb +53 -0
- data/lib/vagrant-kvm/action/forward_ports.rb +104 -0
- data/lib/vagrant-kvm/action/import.rb +97 -18
- data/lib/vagrant-kvm/action/init_storage_pool.rb +3 -1
- data/lib/vagrant-kvm/action/message_not_running.rb +16 -0
- data/lib/vagrant-kvm/action/network.rb +12 -13
- data/lib/vagrant-kvm/action/package_vagrantfile.rb +3 -1
- data/lib/vagrant-kvm/action/prepare_gui.rb +20 -0
- data/lib/vagrant-kvm/action/prepare_nfs_settings.rb +8 -16
- data/lib/vagrant-kvm/action/prepare_nfs_valid_ids.rb +17 -0
- data/lib/vagrant-kvm/action/reset_image_permission.rb +23 -0
- data/lib/vagrant-kvm/action/resume_network.rb +28 -0
- data/lib/vagrant-kvm/action/share_folders.rb +6 -5
- data/lib/vagrant-kvm/action/suspend.rb +8 -1
- data/lib/vagrant-kvm/config.rb +103 -2
- data/lib/vagrant-kvm/driver/driver.rb +321 -99
- data/lib/vagrant-kvm/errors.rb +18 -0
- data/lib/vagrant-kvm/provider.rb +4 -1
- data/lib/vagrant-kvm/util.rb +3 -0
- data/lib/vagrant-kvm/util/commands.rb +23 -0
- data/lib/vagrant-kvm/util/definition_attributes.rb +33 -0
- data/lib/vagrant-kvm/util/disk_info.rb +48 -0
- data/lib/vagrant-kvm/util/network_definition.rb +44 -84
- data/lib/vagrant-kvm/util/vm_definition.rb +91 -103
- data/lib/vagrant-kvm/version.rb +1 -1
- data/locales/en.yml +8 -0
- data/locales/ja.yml +14 -0
- data/spec/acceptance/vagrant-kvm_spec.rb +80 -0
- data/spec/fedora/10.virt.rules +10 -0
- data/spec/fedora/50-vagrant-libvirt-access.pkla +6 -0
- data/spec/spec_helper.rb +30 -0
- data/spec/support/libvirt_helper.rb +37 -0
- data/spec/support/vagrant_kvm_helper.rb +39 -0
- data/spec/test_files/box.xml +74 -0
- data/spec/vagrant-kvm/config_spec.rb +56 -0
- data/spec/vagrant-kvm/driver/driver_spec.rb +36 -0
- data/spec/vagrant-kvm/errors_spec.rb +25 -0
- data/spec/vagrant-kvm/util/network_definition_spec.rb +60 -0
- data/spec/vagrant-kvm/util/vm_definition_spec.rb +76 -0
- data/templates/libvirt_domain.erb +34 -12
- data/templates/libvirt_network.erb +13 -0
- data/templates/package_Vagrantfile.erb +11 -0
- data/vagrant-kvm.gemspec +1 -2
- metadata +41 -42
data/Rakefile
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'bundler/setup'
|
3
|
-
require 'rspec/core/rake_task'
|
4
3
|
|
5
4
|
# Immediately sync all stdout so that tools like buildbot can
|
6
5
|
# immediately load in the output.
|
@@ -13,3 +12,27 @@ Dir.chdir(File.expand_path("../", __FILE__))
|
|
13
12
|
# This installs the tasks that help with gem creation and
|
14
13
|
# publishing.
|
15
14
|
Bundler::GemHelper.install_tasks
|
15
|
+
|
16
|
+
require 'rspec/core/rake_task'
|
17
|
+
RSpec::Core::RakeTask.new
|
18
|
+
|
19
|
+
namespace :box do
|
20
|
+
desc 'Downloads and adds vagrant box for testing.'
|
21
|
+
task :add do
|
22
|
+
system 'bundle exec vagrant box add vagrant-kvm-specs http://cloud-images.ubuntu.com/vagrant/precise/current/precise-server-cloudimg-amd64-vagrant-disk1.box'
|
23
|
+
end
|
24
|
+
|
25
|
+
desc 'Prepares VirtualBox box for usage with KVM.'
|
26
|
+
task :prepare do
|
27
|
+
system 'bundle exec vagrant plugin install vagrant-mutate'
|
28
|
+
system 'bundle exec vagrant mutate vagrant-kvm-specs kvm'
|
29
|
+
system 'bundle exec vagrant box remove vagrant-kvm-specs virtualbox'
|
30
|
+
end
|
31
|
+
|
32
|
+
desc 'Removes testing vagrant box.'
|
33
|
+
task :remove do
|
34
|
+
system 'bundle exec vagrant box remove vagrant-kvm-specs kvm'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
task :default => :spec
|
data/example_box/README.md
CHANGED
@@ -3,16 +3,16 @@
|
|
3
3
|
Vagrant providers each require a custom provider-specific box format.
|
4
4
|
This folder shows the example contents of a box for the `kvm` provider.
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
You need a box.xml file (libvirt domain format), you can use the example
|
7
|
+
supplied as a base or use one from a VM you created with other tools. Don't
|
8
|
+
forget to change the volume path to just the name of the volume. You should
|
9
|
+
use a qcow2 volume in most cases, raw is also supported if you have a good
|
10
|
+
reason to use this format.
|
11
11
|
|
12
|
-
To turn this into a native box, you need to create
|
12
|
+
To turn this into a native box, you need to create an tar archive:
|
13
13
|
|
14
|
-
```
|
14
|
+
```bash
|
15
15
|
$ tar cvzf kvm.box ./metadata.json ./Vagrantfile ./box.xml ./box-disk1.img
|
16
16
|
```
|
17
17
|
|
18
|
-
You need a base MAC address
|
18
|
+
You need a base MAC address like in the example.
|
data/lib/vagrant-kvm/action.rb
CHANGED
@@ -15,12 +15,25 @@ module VagrantPlugins
|
|
15
15
|
Vagrant::Action::Builder.new.tap do |b|
|
16
16
|
b.use Network
|
17
17
|
b.use Provision
|
18
|
-
b.use
|
19
|
-
|
20
|
-
|
18
|
+
b.use Vagrant::Action::Builtin::HandleForwardedPortCollisions
|
19
|
+
if Vagrant::VERSION < "1.4.0"
|
20
|
+
b.use PruneNFSExports
|
21
|
+
b.use NFS
|
22
|
+
b.use PrepareNFSSettings
|
23
|
+
else
|
24
|
+
#FIXME
|
25
|
+
b.use PrepareNFSValidIds
|
26
|
+
b.use SyncedFolderCleanup
|
27
|
+
b.use SyncedFolders
|
28
|
+
b.use PrepareNFSSettings
|
29
|
+
end
|
21
30
|
b.use SetHostname
|
22
31
|
#b.use Customize
|
32
|
+
b.use ForwardPorts
|
23
33
|
b.use Boot
|
34
|
+
if Vagrant::VERSION >= "1.3.0"
|
35
|
+
b.use WaitForCommunicator, [:running]
|
36
|
+
end
|
24
37
|
b.use ShareFolders
|
25
38
|
end
|
26
39
|
end
|
@@ -41,7 +54,13 @@ module VagrantPlugins
|
|
41
54
|
b3.use ConfigValidate
|
42
55
|
b3.use EnvSet, :force_halt => true
|
43
56
|
b3.use action_halt
|
44
|
-
|
57
|
+
if Vagrant::VERSION < "1.4.0"
|
58
|
+
b3.use PruneNFSExports
|
59
|
+
else
|
60
|
+
b3.use PrepareNFSSettings
|
61
|
+
b3.use PrepareNFSValidIds
|
62
|
+
b3.use SyncedFolderCleanup
|
63
|
+
end
|
45
64
|
b3.use Destroy
|
46
65
|
else
|
47
66
|
b3.use MessageWillNotDestroy
|
@@ -63,10 +82,12 @@ module VagrantPlugins
|
|
63
82
|
b3.use Resume
|
64
83
|
end
|
65
84
|
|
85
|
+
b2.use ClearForwardedPorts
|
66
86
|
b2.use Call, GracefulHalt, :shutoff, :running do |env2, b3|
|
67
87
|
if !env2[:result]
|
68
88
|
b3.use ForcedHalt
|
69
89
|
end
|
90
|
+
b3.use ResetImagePermission
|
70
91
|
end
|
71
92
|
else
|
72
93
|
b2.use MessageNotCreated
|
@@ -87,7 +108,14 @@ module VagrantPlugins
|
|
87
108
|
|
88
109
|
b2.use SetupPackageFiles
|
89
110
|
b2.use action_halt
|
90
|
-
|
111
|
+
if Vagrant::VERSION < "1.4.0"
|
112
|
+
b2.use PruneNFSExports
|
113
|
+
else
|
114
|
+
b2.use PrepareNFSSettings
|
115
|
+
b2.use PrepareNFSValidIds
|
116
|
+
b2.use SyncedFolderCleanup
|
117
|
+
end
|
118
|
+
b2.use Export
|
91
119
|
b2.use PackageVagrantfile
|
92
120
|
b2.use Package
|
93
121
|
end
|
@@ -143,6 +171,7 @@ module VagrantPlugins
|
|
143
171
|
b.use CheckKvm
|
144
172
|
b.use Call, Created do |env, b2|
|
145
173
|
if env[:result]
|
174
|
+
b2.use ResumeNetwork
|
146
175
|
b2.use Resume
|
147
176
|
else
|
148
177
|
b2.use MessageNotCreated
|
@@ -190,12 +219,14 @@ module VagrantPlugins
|
|
190
219
|
|
191
220
|
b3.use Call, IsPaused do |env3, b4|
|
192
221
|
if env3[:result]
|
222
|
+
b4.use ResumeNetwork
|
193
223
|
b4.use Resume
|
194
224
|
next
|
195
225
|
end
|
196
226
|
|
197
227
|
# The VM is not saved, so we must have to boot it up
|
198
228
|
# like normal. Boot!
|
229
|
+
b4.use PrepareGui
|
199
230
|
b4.use action_boot
|
200
231
|
end
|
201
232
|
end
|
@@ -230,6 +261,7 @@ module VagrantPlugins
|
|
230
261
|
# If the VM is NOT created yet, then do the setup steps
|
231
262
|
if !env[:result]
|
232
263
|
b2.use CheckBox
|
264
|
+
b2.use SetName
|
233
265
|
b2.use Import
|
234
266
|
b2.use MatchMACAddress
|
235
267
|
end
|
@@ -245,10 +277,13 @@ module VagrantPlugins
|
|
245
277
|
autoload :CheckCreated, action_root.join("check_created")
|
246
278
|
autoload :CheckKvm, action_root.join("check_kvm")
|
247
279
|
autoload :CheckRunning, action_root.join("check_running")
|
280
|
+
autoload :ClearForwardedPorts, action_root.join("clear_forwarded_ports")
|
248
281
|
autoload :Created, action_root.join("created")
|
249
282
|
autoload :Destroy, action_root.join("destroy")
|
250
283
|
autoload :DestroyConfirm, action_root.join("destroy_confirm")
|
284
|
+
autoload :Export, action_root.join("export")
|
251
285
|
autoload :ForcedHalt, action_root.join("forced_halt")
|
286
|
+
autoload :ForwardPorts, action_root.join("forward_ports")
|
252
287
|
autoload :Import, action_root.join("import")
|
253
288
|
autoload :InitStoragePool, action_root.join("init_storage_pool")
|
254
289
|
autoload :IsPaused, action_root.join("is_paused")
|
@@ -256,11 +291,18 @@ module VagrantPlugins
|
|
256
291
|
autoload :IsSaved, action_root.join("is_saved")
|
257
292
|
autoload :MatchMACAddress, action_root.join("match_mac_address")
|
258
293
|
autoload :MessageNotCreated, action_root.join("message_not_created")
|
294
|
+
autoload :MessageNotRunning, action_root.join("message_not_running")
|
259
295
|
autoload :MessageWillNotDestroy, action_root.join("message_will_not_destroy")
|
260
296
|
autoload :Network, action_root.join("network")
|
297
|
+
autoload :PackageVagrantfile, action_root.join("package_vagrantfile")
|
298
|
+
autoload :Package, action_root.join("package")
|
299
|
+
autoload :PrepareGui, action_root.join("prepare_gui")
|
261
300
|
autoload :PrepareNFSSettings, action_root.join("prepare_nfs_settings")
|
301
|
+
autoload :PrepareNFSValidIds, action_root.join("prepare_nfs_valid_ids")
|
262
302
|
autoload :PruneNFSExports, action_root.join("prune_nfs_exports")
|
303
|
+
autoload :ResetImagePermission, action_root.join("reset_image_permission")
|
263
304
|
autoload :Resume, action_root.join("resume")
|
305
|
+
autoload :ResumeNetwork, action_root.join("resume_network")
|
264
306
|
autoload :SetName, action_root.join("set_name")
|
265
307
|
autoload :SetupPackageFiles, action_root.join("setup_package_files")
|
266
308
|
autoload :ShareFolders, action_root.join("share_folders")
|
@@ -9,10 +9,6 @@ module VagrantPlugins
|
|
9
9
|
def call(env)
|
10
10
|
@env = env
|
11
11
|
|
12
|
-
if @env[:machine].provider_config.gui
|
13
|
-
env[:machine].provider.driver.set_gui
|
14
|
-
end
|
15
|
-
|
16
12
|
# Start up the VM
|
17
13
|
env[:ui].info I18n.t("vagrant.actions.vm.boot.booting")
|
18
14
|
env[:machine].provider.driver.start
|
@@ -0,0 +1,53 @@
|
|
1
|
+
#
|
2
|
+
# borrowed from vagrant-lxc
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module ProviderKvm
|
6
|
+
module Action
|
7
|
+
class ClearForwardedPorts
|
8
|
+
include Util::Commands
|
9
|
+
|
10
|
+
def initialize(app, env)
|
11
|
+
@app = app
|
12
|
+
@logger = Log4r::Logger.new("vagrant::kvm::action::clear_forwarded_ports")
|
13
|
+
end
|
14
|
+
|
15
|
+
def call(env)
|
16
|
+
@env = env
|
17
|
+
|
18
|
+
if redir_pids.any?
|
19
|
+
env[:ui].info I18n.t("vagrant.actions.vm.clear_forward_ports.deleting")
|
20
|
+
redir_pids.each do |pid|
|
21
|
+
next unless is_redir_pid?(pid)
|
22
|
+
@logger.debug "Killing pid #{pid}"
|
23
|
+
run_command "pkill -TERM -P #{pid}"
|
24
|
+
end
|
25
|
+
|
26
|
+
remove_redir_pids
|
27
|
+
end
|
28
|
+
|
29
|
+
@app.call env
|
30
|
+
end
|
31
|
+
|
32
|
+
protected
|
33
|
+
|
34
|
+
def redir_pids
|
35
|
+
@redir_pids = Dir[@env[:machine].data_dir.join('pids').to_s + "/redir_*.pid"].map do |file|
|
36
|
+
File.read(file).strip.chomp
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def is_redir_pid?(pid)
|
41
|
+
`ps -o cmd= #{pid}`.strip.chomp =~ /redir/
|
42
|
+
end
|
43
|
+
|
44
|
+
def remove_redir_pids
|
45
|
+
Dir[@env[:machine].data_dir.join('pids').to_s + "/redir_*.pid"].each do |file|
|
46
|
+
File.delete file
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
@@ -0,0 +1,104 @@
|
|
1
|
+
#
|
2
|
+
# borrowed from vagrant-lxc
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module ProviderKvm
|
6
|
+
module Action
|
7
|
+
class ForwardPorts
|
8
|
+
include Util::Commands
|
9
|
+
|
10
|
+
def initialize(app, env)
|
11
|
+
@app = app
|
12
|
+
@logger = Log4r::Logger.new("vagrant::kvm::action::forward_ports")
|
13
|
+
end
|
14
|
+
|
15
|
+
def call(env)
|
16
|
+
@env = env
|
17
|
+
|
18
|
+
# Get the ports we're forwarding
|
19
|
+
env[:forwarded_ports] = compile_forwarded_ports(env[:machine].config)
|
20
|
+
|
21
|
+
if @env[:forwarded_ports].any? and not redir_installed?
|
22
|
+
raise Errors::RedirNotInstalled
|
23
|
+
end
|
24
|
+
|
25
|
+
# Warn if we're port forwarding to any privileged ports
|
26
|
+
env[:forwarded_ports].each do |fp|
|
27
|
+
if fp[:host] <= 1024
|
28
|
+
env[:ui].warn I18n.t("vagrant.actions.vm.forward_ports.privileged_ports")
|
29
|
+
break
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Continue, we need the VM to be booted in order to grab its IP
|
34
|
+
@app.call env
|
35
|
+
|
36
|
+
if @env[:forwarded_ports].any?
|
37
|
+
env[:ui].info I18n.t("vagrant.actions.vm.forward_ports.forwarding")
|
38
|
+
forward_ports
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def forward_ports
|
43
|
+
@env[:forwarded_ports].each do |fp|
|
44
|
+
message_attributes = {
|
45
|
+
# TODO: Add support for multiple adapters
|
46
|
+
:adapter => 'eth0',
|
47
|
+
:guest_port => fp[:guest],
|
48
|
+
:host_port => fp[:host]
|
49
|
+
}
|
50
|
+
|
51
|
+
# TODO: Remove adapter from logging
|
52
|
+
@env[:ui].info(I18n.t("vagrant.actions.vm.forward_ports.forwarding_entry",
|
53
|
+
message_attributes))
|
54
|
+
|
55
|
+
redir_pid = redirect_port(
|
56
|
+
fp[:host_ip],
|
57
|
+
fp[:host],
|
58
|
+
fp[:guest_ip] || @env[:machine].provider.ssh_info[:host],
|
59
|
+
fp[:guest]
|
60
|
+
)
|
61
|
+
store_redir_pid(fp[:host], redir_pid)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def compile_forwarded_ports(config)
|
68
|
+
mappings = {}
|
69
|
+
|
70
|
+
config.vm.networks.each do |type, options|
|
71
|
+
if type == :forwarded_port && options[:id] != 'ssh'
|
72
|
+
mappings[options[:host]] = options
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
mappings.values
|
77
|
+
end
|
78
|
+
|
79
|
+
def redirect_port(host_ip, host_port, guest_ip, guest_port)
|
80
|
+
params = %W( --lport=#{host_port} --caddr=#{guest_ip} --cport=#{guest_port} )
|
81
|
+
params.unshift "--laddr=#{host_ip}" if host_ip
|
82
|
+
params << '--syslog' if ENV['REDIR_LOG']
|
83
|
+
redir_cmd = "redir #{params.join(' ')} 2>/dev/null"
|
84
|
+
|
85
|
+
@logger.debug "Forwarding port with `#{redir_cmd}`"
|
86
|
+
spawn redir_cmd
|
87
|
+
end
|
88
|
+
|
89
|
+
def store_redir_pid(host_port, redir_pid)
|
90
|
+
data_dir = @env[:machine].data_dir.join('pids')
|
91
|
+
data_dir.mkdir unless data_dir.directory?
|
92
|
+
|
93
|
+
data_dir.join("redir_#{host_port}.pid").open('w') do |pid_file|
|
94
|
+
pid_file.write(redir_pid)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def redir_installed?
|
99
|
+
run_command "which redir > /dev/null"
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -1,44 +1,123 @@
|
|
1
|
+
require 'etc'
|
2
|
+
|
1
3
|
module VagrantPlugins
|
2
4
|
module ProviderKvm
|
3
5
|
module Action
|
4
6
|
class Import
|
7
|
+
include Util
|
8
|
+
include Util::Commands
|
9
|
+
|
5
10
|
def initialize(app, env)
|
6
11
|
@app = app
|
12
|
+
@logger = Log4r::Logger.new("vagrant::kvm::action::import")
|
7
13
|
end
|
8
14
|
|
9
15
|
def call(env)
|
10
|
-
env
|
16
|
+
@env = env
|
17
|
+
@env[:ui].info I18n.t("vagrant.actions.vm.import.importing",
|
11
18
|
:name => env[:machine].box.name)
|
12
19
|
|
20
|
+
provider_config = @env[:machine].provider_config
|
21
|
+
|
13
22
|
# Ignore unsupported image types
|
14
|
-
image_type
|
15
|
-
image_type = '
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
# otherwise we convert the OVF
|
20
|
-
storage_path = File.join(env[:tmp_path],"/storage-pool")
|
21
|
-
box_file = env[:machine].box.directory.join("box.xml").to_s
|
22
|
-
if File.file?(box_file)
|
23
|
-
env[:machine].id = env[:machine].provider.driver.import(
|
24
|
-
box_file, storage_path, image_type)
|
25
|
-
else
|
26
|
-
box_file = env[:machine].box.directory.join("box.ovf").to_s
|
27
|
-
env[:machine].id = env[:machine].provider.driver.import_ovf(
|
28
|
-
box_file, storage_path, image_type)
|
23
|
+
args={:image_type => provider_config.image_type}
|
24
|
+
args[:image_type] = 'qcow2' unless args[:image_type] == 'raw'
|
25
|
+
# Add memory attribute when specified
|
26
|
+
if provider_config.memory_size
|
27
|
+
args[:memory] = provider_config.memory_size
|
29
28
|
end
|
30
29
|
|
30
|
+
# import arguments
|
31
|
+
args = {
|
32
|
+
:image_backing => provider_config.image_backing,
|
33
|
+
:qemu_bin => provider_config.qemu_bin,
|
34
|
+
:cpus => provider_config.core_number,
|
35
|
+
:cpu_model => provider_config.cpu_model,
|
36
|
+
:machine_type => provider_config.machine_type,
|
37
|
+
:network_model => provider_config.network_model,
|
38
|
+
:video_model => provider_config.video_model
|
39
|
+
}.merge(args)
|
40
|
+
|
41
|
+
# Import the virtual machine
|
42
|
+
storage_path = File.join(@env[:tmp_path],"/storage-pool")
|
43
|
+
box_file = @env[:machine].box.directory.join("box.xml").to_s
|
44
|
+
raise Errors::KvmBadBoxFormat unless File.file?(box_file)
|
45
|
+
|
46
|
+
# import box volume
|
47
|
+
volume_name = import_volume(storage_path, box_file, args)
|
48
|
+
|
49
|
+
# import the box to a new vm
|
50
|
+
env[:machine].id = @env[:machine].provider.driver.import(box_file, volume_name, args)
|
51
|
+
|
31
52
|
# If we got interrupted, then the import could have been
|
32
53
|
# interrupted and its not a big deal. Just return out.
|
33
|
-
return if env[:interrupted]
|
54
|
+
return if @env[:interrupted]
|
34
55
|
|
35
56
|
# Flag as erroneous and return if import failed
|
36
|
-
raise Vagrant::Errors::VMImportFailure if
|
57
|
+
raise Vagrant::Errors::VMImportFailure if !@env[:machine].id
|
37
58
|
|
38
59
|
# Import completed successfully. Continue the chain
|
39
60
|
@app.call(env)
|
40
61
|
end
|
41
62
|
|
63
|
+
def import_volume(storage_path, box_file, args)
|
64
|
+
@logger.debug "Importing volume. Storage path: #{storage_path} " +
|
65
|
+
"Image Type: #{args[:image_type]}"
|
66
|
+
|
67
|
+
box_disk = @env[:machine].provider.driver.find_box_disk(box_file)
|
68
|
+
new_disk = File.basename(box_disk, File.extname(box_disk)) + "-" +
|
69
|
+
Time.now.to_i.to_s + ".img"
|
70
|
+
old_path = File.join(File.dirname(box_file), box_disk)
|
71
|
+
new_path = File.join(storage_path, new_disk)
|
72
|
+
|
73
|
+
# for backward compatibility, we handle both raw and qcow2 box format
|
74
|
+
box = Util::DiskInfo.new(old_path)
|
75
|
+
if box.type == 'raw' || args[:image_type] == 'raw'
|
76
|
+
args[:image_baking] = false
|
77
|
+
@logger.info "Disable disk image with box image as backing file"
|
78
|
+
end
|
79
|
+
|
80
|
+
if args[:image_type] == 'qcow2' || args[:image_type] == 'raw'
|
81
|
+
# create volume
|
82
|
+
box_name = @env[:machine].config.vm.box
|
83
|
+
driver = @env[:machine].provider.driver
|
84
|
+
userid = Process.uid.to_s
|
85
|
+
groupid = Process.gid.to_s
|
86
|
+
modes = {:dir => '0775', :file => '0664'}
|
87
|
+
label = 'virt_image_t'
|
88
|
+
if driver.host_redhat?
|
89
|
+
# on Redhat/Fedora, permission is controlled
|
90
|
+
# with only SELinux
|
91
|
+
modes = {:dir => '0777',:file => '0666'}
|
92
|
+
elsif driver.host_debian?
|
93
|
+
groupid = Etc.getgrnam('kvm').gid.to_s
|
94
|
+
else
|
95
|
+
# XXX: default
|
96
|
+
end
|
97
|
+
pool_name = 'vagrant_' + userid + '_' + box_name
|
98
|
+
driver.init_storage_directory(
|
99
|
+
:pool_path => File.dirname(old_path), :pool_name => pool_name,
|
100
|
+
:owner => userid, :group => groupid, :mode => modes[:dir])
|
101
|
+
driver.create_volume(
|
102
|
+
:disk_name => new_disk,
|
103
|
+
:capacity => box.capacity,
|
104
|
+
:path => new_path,
|
105
|
+
:image_type => args[:image_type],
|
106
|
+
:box_pool => pool_name,
|
107
|
+
:box_path => old_path,
|
108
|
+
:backing => args[:image_backing],
|
109
|
+
:owner => userid,
|
110
|
+
:group => groupid,
|
111
|
+
:mode => modes[:file],
|
112
|
+
:label => label)
|
113
|
+
driver.free_storage_pool(pool_name)
|
114
|
+
else
|
115
|
+
@logger.info "Image type #{args[:image_type]} is not supported"
|
116
|
+
end
|
117
|
+
# TODO cleanup if interrupted
|
118
|
+
new_disk
|
119
|
+
end
|
120
|
+
|
42
121
|
def recover(env)
|
43
122
|
if env[:machine].provider.state.id != :not_created
|
44
123
|
return if env["vagrant.error"].is_a?(Vagrant::Errors::VagrantError)
|