vagrant-mutate 0.1.5 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +19 -3
- data/lib/vagrant-mutate/box/kvm.rb +3 -3
- data/lib/vagrant-mutate/box/libvirt.rb +28 -3
- data/lib/vagrant-mutate/box/virtualbox.rb +3 -3
- data/lib/vagrant-mutate/box_loader.rb +49 -13
- data/lib/vagrant-mutate/converter/converter.rb +4 -0
- data/lib/vagrant-mutate/errors.rb +8 -0
- data/lib/vagrant-mutate/mutate.rb +0 -1
- data/lib/vagrant-mutate/version.rb +1 -1
- data/locales/en.yml +5 -1
- data/test/expected_output/libvirt/kvm/Vagrantfile +11 -0
- data/test/expected_output/libvirt/kvm/box-disk1.img +0 -0
- data/test/expected_output/libvirt/kvm/box.xml +62 -0
- data/test/expected_output/libvirt/kvm/metadata.json +1 -0
- data/test/test.rb +18 -1
- data/vagrant-mutate.gemspec +0 -2
- metadata +10 -18
data/README.md
CHANGED
@@ -4,8 +4,17 @@ Vagrant-mutate is a [vagrant](http://www.vagrantup.com/) plugin to convert vagra
|
|
4
4
|
|
5
5
|
## Supported Conversions
|
6
6
|
|
7
|
-
* Virtualbox to
|
8
|
-
* Virtualbox to
|
7
|
+
* Virtualbox to kvm
|
8
|
+
* Virtualbox to libvirt
|
9
|
+
* Libvirt to kvm
|
10
|
+
|
11
|
+
## Compatibility
|
12
|
+
|
13
|
+
Vagrant-mutate has been tested against the following versions. It may work with other versions too.
|
14
|
+
|
15
|
+
* vagrant 1.3.5
|
16
|
+
* [vagrant-kvm](https://github.com/adrahon/vagrant-kvm) 0.1.4
|
17
|
+
* [vagrant-libvirt](https://github.com/pradels/vagrant-libvirt) 0.0.11
|
9
18
|
|
10
19
|
## Installation
|
11
20
|
|
@@ -51,10 +60,17 @@ Or if you had already downloaded it
|
|
51
60
|
|
52
61
|
vagrant mutate precise32.box libvirt
|
53
62
|
|
54
|
-
Or if you had already added the
|
63
|
+
Or if you had already added the box to vagrant and now want to use it with libvirt
|
55
64
|
|
56
65
|
vagrant mutate precise32 libvirt
|
57
66
|
|
67
|
+
If you have a box for multiple providers, you must specify the provider to use for input by prepending it to the name with a slash, e.g.
|
68
|
+
|
69
|
+
$ vagrant box list
|
70
|
+
precise32 (kvm)
|
71
|
+
precise32 (virtualbox)
|
72
|
+
$ vagrant mutate virtualbox/precise32 libvirt
|
73
|
+
|
58
74
|
To export a box you created with vagrant mutate, just repackage it, e.g.
|
59
75
|
|
60
76
|
vagrant box repackage precise32 libvirt
|
@@ -7,9 +7,9 @@ module VagrantMutate
|
|
7
7
|
def initialize(env, name, dir)
|
8
8
|
super
|
9
9
|
@provider_name = 'kvm'
|
10
|
-
@supported_input = false
|
11
|
-
@supported_output = true
|
12
|
-
@image_format = 'qcow2'
|
10
|
+
@supported_input = false
|
11
|
+
@supported_output = true
|
12
|
+
@image_format = 'qcow2'
|
13
13
|
@image_name = 'box-disk1.img'
|
14
14
|
end
|
15
15
|
|
@@ -7,12 +7,37 @@ module VagrantMutate
|
|
7
7
|
def initialize(env, name, dir)
|
8
8
|
super
|
9
9
|
@provider_name = 'libvirt'
|
10
|
-
@supported_input =
|
11
|
-
@supported_output = true
|
12
|
-
@image_format = 'qcow2'
|
10
|
+
@supported_input = true
|
11
|
+
@supported_output = true
|
12
|
+
@image_format = 'qcow2'
|
13
13
|
@image_name = 'box.img'
|
14
14
|
end
|
15
15
|
|
16
|
+
# since none of below can be determined from the box
|
17
|
+
# we just generate sane values
|
18
|
+
|
19
|
+
def architecture
|
20
|
+
return 'x86_64'
|
21
|
+
end
|
22
|
+
|
23
|
+
# kvm prefix is 52:54:00
|
24
|
+
def mac_address
|
25
|
+
octets = 3.times.map { rand(255).to_s(16) }
|
26
|
+
return "52:54:00:#{octets[0]}:#{octets[1]}:#{octets[2]}"
|
27
|
+
end
|
28
|
+
|
29
|
+
def cpus
|
30
|
+
return 1
|
31
|
+
end
|
32
|
+
|
33
|
+
def memory
|
34
|
+
return 536870912
|
35
|
+
end
|
36
|
+
|
37
|
+
def disk_interface
|
38
|
+
return 'virtio'
|
39
|
+
end
|
40
|
+
|
16
41
|
end
|
17
42
|
end
|
18
43
|
end
|
@@ -8,9 +8,9 @@ module VagrantMutate
|
|
8
8
|
def initialize(env, name, dir)
|
9
9
|
super
|
10
10
|
@provider_name = 'virtualbox'
|
11
|
-
@supported_input = true
|
12
|
-
@supported_output = false
|
13
|
-
@image_format = 'vmdk'
|
11
|
+
@supported_input = true
|
12
|
+
@supported_output = false
|
13
|
+
@image_format = 'vmdk'
|
14
14
|
@image_name = 'box-disk1.vmdk'
|
15
15
|
end
|
16
16
|
|
@@ -48,13 +48,13 @@ module VagrantMutate
|
|
48
48
|
elsif box_arg =~ /\.box$/
|
49
49
|
box = load_from_file(box_arg)
|
50
50
|
else
|
51
|
-
box =
|
51
|
+
box = load_from_boxes_path(box_arg)
|
52
52
|
end
|
53
53
|
|
54
54
|
if box.supported_input
|
55
55
|
return box
|
56
56
|
else
|
57
|
-
raise Errors::ProviderNotSupported, :provider => provider_name, :direction => 'input'
|
57
|
+
raise Errors::ProviderNotSupported, :provider => box.provider_name, :direction => 'input'
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
@@ -105,11 +105,15 @@ module VagrantMutate
|
|
105
105
|
box = create_box(provider_name, name, dir)
|
106
106
|
end
|
107
107
|
|
108
|
-
def
|
109
|
-
@logger.info "Loading box from
|
110
|
-
|
111
|
-
|
112
|
-
|
108
|
+
def load_from_boxes_path(identifier)
|
109
|
+
@logger.info "Loading box #{identifier} from vagrants box path"
|
110
|
+
provider_name, name = parse_identifier(identifier)
|
111
|
+
if provider_name
|
112
|
+
dir = verify_input_dir(provider_name, name)
|
113
|
+
else
|
114
|
+
provider_name, dir = find_input_dir(name)
|
115
|
+
end
|
116
|
+
box = create_box(provider_name, name, dir)
|
113
117
|
end
|
114
118
|
|
115
119
|
def cleanup
|
@@ -140,14 +144,46 @@ module VagrantMutate
|
|
140
144
|
end
|
141
145
|
end
|
142
146
|
|
147
|
+
def parse_identifier(identifier)
|
148
|
+
if identifier =~ /^([\w-]+)#{File::SEPARATOR}([\w-]+)$/
|
149
|
+
@logger.info "Parsed provider name as #{$1} and box name as #{$2}"
|
150
|
+
return $1, $2
|
151
|
+
else
|
152
|
+
@logger.info "Parsed provider name as not given and box name as #{identifier}"
|
153
|
+
return nil, identifier
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
143
157
|
def find_input_dir(name)
|
144
|
-
|
145
|
-
|
146
|
-
if
|
147
|
-
|
148
|
-
|
158
|
+
box_parent_dir = File.join( @env.boxes_path, name)
|
159
|
+
|
160
|
+
if Dir.exist?(box_parent_dir)
|
161
|
+
providers = Dir.entries(box_parent_dir).reject { |entry| entry =~ /^\./ }
|
162
|
+
@logger.info "Found potential providers #{providers}"
|
163
|
+
else
|
164
|
+
providers = []
|
165
|
+
end
|
166
|
+
|
167
|
+
case
|
168
|
+
when providers.length < 1
|
169
|
+
raise Errors::BoxNotFound, :box => name
|
170
|
+
when providers.length > 1
|
171
|
+
raise Errors::TooManyBoxesFound, :box => name
|
172
|
+
else
|
173
|
+
provider_name = providers.first
|
174
|
+
input_dir = File.join( box_parent_dir, provider_name)
|
175
|
+
@logger.info "Found source for box #{name} from provider #{provider_name} at #{input_dir}"
|
176
|
+
return provider_name, input_dir
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
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
|
149
185
|
else
|
150
|
-
raise Errors::BoxNotFound, :box =>
|
186
|
+
raise Errors::BoxNotFound, :box => input_dir
|
151
187
|
end
|
152
188
|
end
|
153
189
|
|
@@ -27,6 +27,10 @@ module VagrantMutate
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def convert()
|
30
|
+
if @input_box.provider_name == @output_box.provider_name
|
31
|
+
raise Errors::ProvidersMatch
|
32
|
+
end
|
33
|
+
|
30
34
|
@env.ui.info "Converting #{@input_box.name} from #{@input_box.provider_name} "\
|
31
35
|
"to #{@output_box.provider_name}."
|
32
36
|
|
@@ -6,6 +6,10 @@ module VagrantMutate
|
|
6
6
|
error_namespace('vagrant_mutate.errors')
|
7
7
|
end
|
8
8
|
|
9
|
+
class ProvidersMatch < VagrantMutateError
|
10
|
+
error_key(:providers_match)
|
11
|
+
end
|
12
|
+
|
9
13
|
class ProviderNotSupported < VagrantMutateError
|
10
14
|
error_key(:provider_not_supported)
|
11
15
|
end
|
@@ -18,6 +22,10 @@ module VagrantMutate
|
|
18
22
|
error_key(:box_not_found)
|
19
23
|
end
|
20
24
|
|
25
|
+
class TooManyBoxesFound < VagrantMutateError
|
26
|
+
error_key(:too_many_boxes_found)
|
27
|
+
end
|
28
|
+
|
21
29
|
class ExtractBoxFailed < VagrantMutateError
|
22
30
|
error_key(:extract_box_failed)
|
23
31
|
end
|
data/locales/en.yml
CHANGED
@@ -1,12 +1,16 @@
|
|
1
1
|
en:
|
2
2
|
vagrant_mutate:
|
3
3
|
errors:
|
4
|
+
providers_match: |-
|
5
|
+
Input and output provider are the same. Aborting.
|
4
6
|
provider_not_supported: |-
|
5
7
|
Vagrant-mutate does not support %{provider} for %{direction}
|
6
8
|
qemu_not_found: |-
|
7
9
|
Qemu-img was not found in your path
|
8
10
|
box_not_found: |-
|
9
|
-
The box
|
11
|
+
The box %{box} was not found
|
12
|
+
too_many_boxes_found: |-
|
13
|
+
More than one box named %{box} was found. Please specify the input provider as well.
|
10
14
|
extract_box_failed: |-
|
11
15
|
Extracting box failed with error:
|
12
16
|
%{error_message}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Vagrant::Config.run do |config|
|
2
|
+
# This Vagrantfile is auto-generated by `vagrant package` to contain
|
3
|
+
# the MAC address of the box. Custom configuration should be placed in
|
4
|
+
# the actual `Vagrantfile` in this box.
|
5
|
+
config.vm.base_mac = "08002755B88D"
|
6
|
+
end
|
7
|
+
|
8
|
+
# Load include vagrant file if it exists after the auto-generated
|
9
|
+
# so it can override any of the settings
|
10
|
+
include_vagrantfile = File.expand_path("../include/_Vagrantfile", __FILE__)
|
11
|
+
load include_vagrantfile if File.exist?(include_vagrantfile)
|
Binary file
|
@@ -0,0 +1,62 @@
|
|
1
|
+
<domain type='kvm'>
|
2
|
+
<name>mutate-test</name>
|
3
|
+
|
4
|
+
<memory unit='KiB'>524288</memory>
|
5
|
+
<currentMemory unit='KiB'>524288</currentMemory>
|
6
|
+
<vcpu placement='static'>1</vcpu>
|
7
|
+
<os>
|
8
|
+
<type arch='x86_64' machine='pc-1.2'>hvm</type>
|
9
|
+
<boot dev='hd'/>
|
10
|
+
</os>
|
11
|
+
<features>
|
12
|
+
<acpi/>
|
13
|
+
<apic/>
|
14
|
+
<pae/>
|
15
|
+
</features>
|
16
|
+
<clock offset='utc'/>
|
17
|
+
<on_poweroff>destroy</on_poweroff>
|
18
|
+
<on_reboot>restart</on_reboot>
|
19
|
+
<on_crash>restart</on_crash>
|
20
|
+
<devices>
|
21
|
+
<emulator>/usr/bin/qemu-system-x86_64</emulator>
|
22
|
+
<disk type='file' device='disk'>
|
23
|
+
<driver name='qemu' type='qcow2'/>
|
24
|
+
<source file='box-disk1.img'/>
|
25
|
+
<target dev='vda' bus='virtio'/>
|
26
|
+
|
27
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
|
28
|
+
</disk>
|
29
|
+
|
30
|
+
<controller type='usb' index='0'>
|
31
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
|
32
|
+
</controller>
|
33
|
+
<controller type='virtio-serial' index='0'>
|
34
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
|
35
|
+
</controller>
|
36
|
+
<interface type='network'>
|
37
|
+
<mac address='52:54:00:cb:b2:80'/>
|
38
|
+
<source network='vagrant'/>
|
39
|
+
<model type='virtio'/>
|
40
|
+
</interface>
|
41
|
+
<serial type='pty'>
|
42
|
+
<target port='0'/>
|
43
|
+
</serial>
|
44
|
+
<console type='pty'>
|
45
|
+
<target type='serial' port='0'/>
|
46
|
+
</console>
|
47
|
+
<input type='mouse' bus='ps2'/>
|
48
|
+
<sound model='ich6'>
|
49
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
|
50
|
+
</sound>
|
51
|
+
|
52
|
+
<graphics type='vnc' port='-1' autoport='yes'/>
|
53
|
+
|
54
|
+
<video>
|
55
|
+
<model type='cirrus' vram='9216' heads='1'/>
|
56
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
|
57
|
+
</video>
|
58
|
+
<memballoon model='virtio'>
|
59
|
+
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
|
60
|
+
</memballoon>
|
61
|
+
</devices>
|
62
|
+
</domain>
|
@@ -0,0 +1 @@
|
|
1
|
+
{"provider":"kvm"}
|
data/test/test.rb
CHANGED
@@ -29,6 +29,21 @@ def install_plugin
|
|
29
29
|
Dir.chdir working_dir
|
30
30
|
end
|
31
31
|
|
32
|
+
# convering libvirt to kvm has some random output which we must replace
|
33
|
+
# with the static "random" value in the sampe output we are comapring against
|
34
|
+
def derandomize_output(input, output_dir)
|
35
|
+
if input == 'libvirt'
|
36
|
+
if File.split(output_dir).last == 'kvm'
|
37
|
+
path = File.join(output_dir, 'box.xml')
|
38
|
+
contents = File.read(path)
|
39
|
+
contents.gsub!(/52:54:00:[0-9a-f:]+/, '52:54:00:cb:b2:80')
|
40
|
+
File.open(path, 'w') do |f|
|
41
|
+
f.write(contents)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
32
47
|
def test(input, outputs)
|
33
48
|
failures = []
|
34
49
|
test_dir = File.expand_path( File.dirname(__FILE__) )
|
@@ -45,13 +60,14 @@ def test(input, outputs)
|
|
45
60
|
system("vagrant mutate #{input_box} #{output}")
|
46
61
|
output_dir = File.join(vagrant_dir, 'boxes', 'mutate-test', output)
|
47
62
|
expected_output_dir = File.join(test_dir, 'expected_output', input, output)
|
63
|
+
derandomize_output(input, output_dir)
|
48
64
|
Dir.foreach(expected_output_dir) do |f|
|
49
65
|
next if f == '.' or f == '..'
|
50
66
|
output = File.join(output_dir, f)
|
51
67
|
expected_output = File.join(expected_output_dir, f)
|
52
68
|
test_passed = FileUtils.compare_file(output, expected_output)
|
53
69
|
unless test_passed
|
54
|
-
failures.push "
|
70
|
+
failures.push "These two files do not match #{output} #{expected_output}"
|
55
71
|
end
|
56
72
|
end
|
57
73
|
end
|
@@ -62,6 +78,7 @@ end
|
|
62
78
|
cleanup
|
63
79
|
build_plugin
|
64
80
|
failures = test( 'virtualbox', ['kvm', 'libvirt'] )
|
81
|
+
failures += test( 'libvirt', ['kvm'] )
|
65
82
|
|
66
83
|
unless failures.empty?
|
67
84
|
puts "\nTESTS FAILED"
|
data/vagrant-mutate.gemspec
CHANGED
@@ -18,8 +18,6 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_runtime_dependency "archive-tar-minitar", "~> 0.5.0"
|
22
|
-
|
23
21
|
spec.add_development_dependency "bundler", "~> 1.3"
|
24
22
|
spec.add_development_dependency "rake"
|
25
23
|
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.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,24 +9,8 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2014-01-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
-
- !ruby/object:Gem::Dependency
|
15
|
-
name: archive-tar-minitar
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
|
-
requirements:
|
19
|
-
- - ~>
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: 0.5.0
|
22
|
-
type: :runtime
|
23
|
-
prerelease: false
|
24
|
-
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ~>
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: 0.5.0
|
30
14
|
- !ruby/object:Gem::Dependency
|
31
15
|
name: bundler
|
32
16
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,6 +70,10 @@ files:
|
|
86
70
|
- lib/vagrant-mutate/version.rb
|
87
71
|
- locales/en.yml
|
88
72
|
- templates/kvm/box.xml.erb
|
73
|
+
- test/expected_output/libvirt/kvm/Vagrantfile
|
74
|
+
- test/expected_output/libvirt/kvm/box-disk1.img
|
75
|
+
- test/expected_output/libvirt/kvm/box.xml
|
76
|
+
- test/expected_output/libvirt/kvm/metadata.json
|
89
77
|
- test/expected_output/virtualbox/kvm/Vagrantfile
|
90
78
|
- test/expected_output/virtualbox/kvm/box-disk1.img
|
91
79
|
- test/expected_output/virtualbox/kvm/box.xml
|
@@ -124,6 +112,10 @@ signing_key:
|
|
124
112
|
specification_version: 3
|
125
113
|
summary: Convert vagrant boxes to work with different providers
|
126
114
|
test_files:
|
115
|
+
- test/expected_output/libvirt/kvm/Vagrantfile
|
116
|
+
- test/expected_output/libvirt/kvm/box-disk1.img
|
117
|
+
- test/expected_output/libvirt/kvm/box.xml
|
118
|
+
- test/expected_output/libvirt/kvm/metadata.json
|
127
119
|
- test/expected_output/virtualbox/kvm/Vagrantfile
|
128
120
|
- test/expected_output/virtualbox/kvm/box-disk1.img
|
129
121
|
- test/expected_output/virtualbox/kvm/box.xml
|