vagrant-mutate 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +4 -0
- data/lib/vagrant-mutate/box/box.rb +1 -1
- data/lib/vagrant-mutate/box/virtualbox.rb +5 -1
- data/lib/vagrant-mutate/box_loader.rb +55 -55
- data/lib/vagrant-mutate/converter/converter.rb +0 -33
- data/lib/vagrant-mutate/mutate.rb +4 -0
- data/lib/vagrant-mutate/qemu.rb +37 -0
- data/lib/vagrant-mutate/version.rb +1 -1
- metadata +3 -2
data/CHANGELOG.md
CHANGED
@@ -12,7 +12,7 @@ module VagrantMutate
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def virtual_size
|
15
|
-
input_file = File.join( @dir,
|
15
|
+
input_file = File.join( @dir, image_name )
|
16
16
|
info = `qemu-img info #{input_file}`
|
17
17
|
@logger.debug "qemu-img info output\n#{info}"
|
18
18
|
if info =~ /(\d+) bytes/
|
@@ -11,7 +11,11 @@ module VagrantMutate
|
|
11
11
|
@supported_input = true
|
12
12
|
@supported_output = false
|
13
13
|
@image_format = 'vmdk'
|
14
|
-
|
14
|
+
end
|
15
|
+
|
16
|
+
# this is usually box-disk1.vmdk but some tools like packer customize it
|
17
|
+
def image_name
|
18
|
+
ovf.elements['//References/File'].attributes['ovf:href']
|
15
19
|
end
|
16
20
|
|
17
21
|
# the architecture is not defined in the ovf file,
|
@@ -13,23 +13,6 @@ module VagrantMutate
|
|
13
13
|
@tmp_files = []
|
14
14
|
end
|
15
15
|
|
16
|
-
def create_box(provider_name, name, dir)
|
17
|
-
@logger.info "Creating box #{name} with provider #{provider_name} in #{dir}"
|
18
|
-
case provider_name
|
19
|
-
when 'kvm'
|
20
|
-
require_relative 'box/kvm'
|
21
|
-
Box::Kvm.new(@env, name, dir)
|
22
|
-
when 'libvirt'
|
23
|
-
require_relative 'box/libvirt'
|
24
|
-
Box::Libvirt.new(@env, name, dir)
|
25
|
-
when 'virtualbox'
|
26
|
-
require_relative 'box/virtualbox'
|
27
|
-
Box::Virtualbox.new(@env, name, dir)
|
28
|
-
else
|
29
|
-
raise Errors::ProviderNotSupported, :provider => provider_name, :direction => 'input or output'
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
16
|
def prepare_for_output(name, provider_name)
|
34
17
|
@logger.info "Preparing #{name} for output as #{provider_name}"
|
35
18
|
dir = create_output_dir(name, provider_name)
|
@@ -128,6 +111,51 @@ module VagrantMutate
|
|
128
111
|
|
129
112
|
private
|
130
113
|
|
114
|
+
def create_box(provider_name, name, dir)
|
115
|
+
@logger.info "Creating box #{name} with provider #{provider_name} in #{dir}"
|
116
|
+
case provider_name
|
117
|
+
when 'kvm'
|
118
|
+
require_relative 'box/kvm'
|
119
|
+
Box::Kvm.new(@env, name, dir)
|
120
|
+
when 'libvirt'
|
121
|
+
require_relative 'box/libvirt'
|
122
|
+
Box::Libvirt.new(@env, name, dir)
|
123
|
+
when 'virtualbox'
|
124
|
+
require_relative 'box/virtualbox'
|
125
|
+
Box::Virtualbox.new(@env, name, dir)
|
126
|
+
else
|
127
|
+
raise Errors::ProviderNotSupported, :provider => provider_name, :direction => 'input or output'
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def create_output_dir(name, provider_name)
|
132
|
+
# e.g. $HOME/.vagrant.d/boxes/fedora-19/libvirt
|
133
|
+
out_dir = File.join( @env.boxes_path, name, provider_name )
|
134
|
+
begin
|
135
|
+
FileUtils.mkdir_p(out_dir)
|
136
|
+
rescue => e
|
137
|
+
raise Errors::CreateBoxDirFailed, :error_message => e.message
|
138
|
+
end
|
139
|
+
@logger.info "Created output directory #{out_dir}"
|
140
|
+
return out_dir
|
141
|
+
end
|
142
|
+
|
143
|
+
def unpack(file)
|
144
|
+
@env.ui.info "Extracting box file to a temporary directory."
|
145
|
+
unless File.exists? file
|
146
|
+
raise Errors::BoxNotFound, :box => file
|
147
|
+
end
|
148
|
+
tmp_dir = Dir.mktmpdir(nil, @env.tmp_path)
|
149
|
+
@tmp_files << tmp_dir
|
150
|
+
result = Vagrant::Util::Subprocess.execute(
|
151
|
+
"bsdtar", "-v", "-x", "-m", "-C", tmp_dir.to_s, "-f", file)
|
152
|
+
if result.exit_code != 0
|
153
|
+
raise Errors::ExtractBoxFailed, :error_message => result.stderr.to_s
|
154
|
+
end
|
155
|
+
@logger.info "Unpacked box to #{tmp_dir}"
|
156
|
+
return tmp_dir
|
157
|
+
end
|
158
|
+
|
131
159
|
def determine_provider(dir)
|
132
160
|
metadata_file = File.join(dir, 'metadata.json')
|
133
161
|
if File.exists? metadata_file
|
@@ -154,6 +182,16 @@ module VagrantMutate
|
|
154
182
|
end
|
155
183
|
end
|
156
184
|
|
185
|
+
def verify_input_dir(provider_name, name)
|
186
|
+
input_dir = File.join( @env.boxes_path, name, provider_name)
|
187
|
+
if File.directory?(input_dir)
|
188
|
+
@logger.info "Found input directory #{input_dir}"
|
189
|
+
return input_dir
|
190
|
+
else
|
191
|
+
raise Errors::BoxNotFound, :box => input_dir
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
157
195
|
def find_input_dir(name)
|
158
196
|
box_parent_dir = File.join( @env.boxes_path, name)
|
159
197
|
|
@@ -177,43 +215,5 @@ module VagrantMutate
|
|
177
215
|
end
|
178
216
|
end
|
179
217
|
|
180
|
-
def verify_input_dir(provider_name, name)
|
181
|
-
input_dir = File.join( @env.boxes_path, name, provider_name)
|
182
|
-
if File.directory?(input_dir)
|
183
|
-
@logger.info "Found input directory #{input_dir}"
|
184
|
-
return input_dir
|
185
|
-
else
|
186
|
-
raise Errors::BoxNotFound, :box => input_dir
|
187
|
-
end
|
188
|
-
end
|
189
|
-
|
190
|
-
def create_output_dir(name, provider_name)
|
191
|
-
# e.g. $HOME/.vagrant.d/boxes/fedora-19/libvirt
|
192
|
-
out_dir = File.join( @env.boxes_path, name, provider_name )
|
193
|
-
begin
|
194
|
-
FileUtils.mkdir_p(out_dir)
|
195
|
-
rescue => e
|
196
|
-
raise Errors::CreateBoxDirFailed, :error_message => e.message
|
197
|
-
end
|
198
|
-
@logger.info "Created output directory #{out_dir}"
|
199
|
-
return out_dir
|
200
|
-
end
|
201
|
-
|
202
|
-
def unpack(file)
|
203
|
-
@env.ui.info "Extracting box file to a temporary directory."
|
204
|
-
unless File.exists? file
|
205
|
-
raise Errors::BoxNotFound, :box => file
|
206
|
-
end
|
207
|
-
tmp_dir = Dir.mktmpdir(nil, @env.tmp_path)
|
208
|
-
@tmp_files << tmp_dir
|
209
|
-
result = Vagrant::Util::Subprocess.execute(
|
210
|
-
"bsdtar", "-v", "-x", "-m", "-C", tmp_dir.to_s, "-f", file)
|
211
|
-
if result.exit_code != 0
|
212
|
-
raise Errors::ExtractBoxFailed, :error_message => result.stderr.to_s
|
213
|
-
end
|
214
|
-
@logger.info "Unpacked box to #{tmp_dir}"
|
215
|
-
return tmp_dir
|
216
|
-
end
|
217
|
-
|
218
218
|
end
|
219
219
|
end
|
@@ -22,8 +22,6 @@ module VagrantMutate
|
|
22
22
|
@input_box = input_box
|
23
23
|
@output_box = output_box
|
24
24
|
@logger = Log4r::Logger.new('vagrant::mutate')
|
25
|
-
verify_qemu_installed
|
26
|
-
verify_qemu_version
|
27
25
|
end
|
28
26
|
|
29
27
|
def convert()
|
@@ -42,37 +40,6 @@ module VagrantMutate
|
|
42
40
|
|
43
41
|
private
|
44
42
|
|
45
|
-
# http://stackoverflow.com/questions/2108727/which-in-ruby-checking-if-program-exists-in-path-from-ruby
|
46
|
-
def verify_qemu_installed
|
47
|
-
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
48
|
-
ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
|
49
|
-
exts.each do |ext|
|
50
|
-
exe = File.join(path, "qemu-img#{ext}")
|
51
|
-
if File.executable? exe
|
52
|
-
@logger.info "Found qemu"
|
53
|
-
return
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
# if we make it here qemu-img command was not found
|
58
|
-
raise Errors::QemuNotFound
|
59
|
-
end
|
60
|
-
|
61
|
-
def verify_qemu_version
|
62
|
-
usage = `qemu-img`
|
63
|
-
if usage =~ /(\d+\.\d+\.\d+)/
|
64
|
-
recommended_version = Gem::Version.new('1.2.0')
|
65
|
-
installed_version = Gem::Version.new($1)
|
66
|
-
if installed_version < recommended_version
|
67
|
-
@env.ui.warn "You have qemu #{installed_version} installed. "\
|
68
|
-
"This version is too old to read some virtualbox boxes. "\
|
69
|
-
"If conversion fails, try upgrading to qemu 1.2.0 or newer."
|
70
|
-
end
|
71
|
-
else
|
72
|
-
raise Errors::ParseQemuVersionFailed
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
43
|
|
77
44
|
def write_metadata
|
78
45
|
metadata = generate_metadata
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'vagrant-mutate/box_loader'
|
2
|
+
require 'vagrant-mutate/qemu'
|
2
3
|
require 'vagrant-mutate/converter/converter'
|
3
4
|
|
4
5
|
module VagrantMutate
|
@@ -20,6 +21,9 @@ module VagrantMutate
|
|
20
21
|
box_arg = argv[0]
|
21
22
|
output_provider_arg = argv[1]
|
22
23
|
|
24
|
+
Qemu.verify_qemu_installed
|
25
|
+
Qemu.verify_qemu_version(@env)
|
26
|
+
|
23
27
|
input_loader = BoxLoader.new(@env)
|
24
28
|
input_box = input_loader.load(box_arg)
|
25
29
|
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module VagrantMutate
|
2
|
+
class Qemu
|
3
|
+
|
4
|
+
# http://stackoverflow.com/questions/2108727/which-in-ruby-checking-if-program-exists-in-path-from-ruby
|
5
|
+
def self.verify_qemu_installed
|
6
|
+
logger = Log4r::Logger.new('vagrant::mutate')
|
7
|
+
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
8
|
+
ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
|
9
|
+
exts.each do |ext|
|
10
|
+
exe = File.join(path, "qemu-img#{ext}")
|
11
|
+
if File.executable? exe
|
12
|
+
logger.info "Found qemu"
|
13
|
+
return
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
# if we make it here qemu-img command was not found
|
18
|
+
raise Errors::QemuNotFound
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.verify_qemu_version(env)
|
22
|
+
usage = `qemu-img`
|
23
|
+
if usage =~ /(\d+\.\d+\.\d+)/
|
24
|
+
recommended_version = Gem::Version.new('1.2.0')
|
25
|
+
installed_version = Gem::Version.new($1)
|
26
|
+
if installed_version < recommended_version
|
27
|
+
env.ui.warn "You have qemu #{installed_version} installed. "\
|
28
|
+
"This version is too old to read some virtualbox boxes. "\
|
29
|
+
"If conversion fails, try upgrading to qemu 1.2.0 or newer."
|
30
|
+
end
|
31
|
+
else
|
32
|
+
raise Errors::ParseQemuVersionFailed
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-mutate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-01-
|
12
|
+
date: 2014-01-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -67,6 +67,7 @@ files:
|
|
67
67
|
- lib/vagrant-mutate/converter/libvirt.rb
|
68
68
|
- lib/vagrant-mutate/errors.rb
|
69
69
|
- lib/vagrant-mutate/mutate.rb
|
70
|
+
- lib/vagrant-mutate/qemu.rb
|
70
71
|
- lib/vagrant-mutate/version.rb
|
71
72
|
- locales/en.yml
|
72
73
|
- templates/kvm/box.xml.erb
|