vagrant-mutate 0.1.5 → 0.2.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.
- 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
|