vagrant-mutate 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -12,6 +12,7 @@ lib/bundler/man
12
12
  pkg
13
13
  rdoc
14
14
  spec/reports
15
+ test/actual_output
15
16
  test/tmp
16
17
  test/version_tmp
17
18
  tmp
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ # 0.1.3 (2013-12-03)
2
+
3
+ * Add support for vagrant-kvm (#12)
4
+ * Add acceptance tests
5
+
1
6
  # 0.1.2 (2013-11-20)
2
7
 
3
8
  * Rework provider and converter implementation (#7)
data/README.md CHANGED
@@ -1,6 +1,11 @@
1
1
  # Vagrant-Mutate
2
2
 
3
- Vagrant-mutate is a [vagrant](http://www.vagrantup.com/) plugin to convert vagrant boxes to work with different providers. Currently the only supported conversion is from virtualbox to [libvirt](https://github.com/pradels/vagrant-libvirt).
3
+ Vagrant-mutate is a [vagrant](http://www.vagrantup.com/) plugin to convert vagrant boxes to work with different providers.
4
+
5
+ ## Supported Conversions
6
+
7
+ * Virtualbox to [kvm](https://github.com/adrahon/vagrant-kvm) (tested against 0.1.4)
8
+ * Virtualbox to [libvirt](https://github.com/pradels/vagrant-libvirt) (tested against 0.0.11)
4
9
 
5
10
  ## Installation
6
11
 
@@ -26,12 +31,11 @@ Download and install it from [Stefan Weil](http://qemu.weilnetz.de/) or compile
26
31
 
27
32
  ### vagrant-mutate
28
33
 
29
- Then you can install vagrant-mutate. Once it has proven stable I will publish it to RubyGems, but for now you must build it from source.
34
+ Now you're ready to install vagrant-mutate. To install the latest released version simply run
35
+
36
+ vagrant plugin install vagrant-mutate
30
37
 
31
- git clone https://github.com/sciurus/vagrant-mutate.git
32
- cd vagrant-mutate
33
- rake build
34
- vagrant plugin install pkg/*
38
+ To install from source, clone the repository and run `rake build`. That will produce a gem file in the _pkg_ directory which you can then install with `vagrant plugin install`.
35
39
 
36
40
  ## Usage
37
41
 
@@ -61,14 +65,15 @@ If you experience any problems, please open an issue on [github](https://github.
61
65
 
62
66
  ## Contributing
63
67
 
64
- Contributions are welcome! I'd especially like to see support for converting between more providers added. Be forewarned that I've made some assumptions in the code that may have to be reworked in order to support more than just virtualbox to libvirt.
68
+ Contributions are welcome! I'd especially like to see support for converting between more providers added.
65
69
 
66
70
  To contribute, follow the standard flow of
67
71
 
68
72
  1. Fork it
69
- 2. Create your feature branch (`git checkout -b my-new-feature`)
70
- 3. Commit your changes (`git commit -am 'Add some feature'`)
71
- 4. Push to the branch (`git push origin my-new-feature`)
72
- 5. Create new Pull Request
73
+ 1. Create your feature branch (`git checkout -b my-new-feature`)
74
+ 1. Commit your changes (`git commit -am 'Add some feature'`)
75
+ 1. Make sure the acceptance tests pass (`ruby test/test.rb`)
76
+ 1. Push to the branch (`git push origin my-new-feature`)
77
+ 1. Create new Pull Request
73
78
 
74
79
  Even if you can't contribute code, if you have an idea for an improvement please open an [issue](https://github.com/sciurus/vagrant-mutate/issues).
@@ -18,7 +18,7 @@ module VagrantMutate
18
18
  def prepare_for_output( box_name, provider_name )
19
19
  @logger.info "Preparing #{box_name} for output as #{provider_name}"
20
20
  @name = box_name
21
- @provider = Provider::Provider.create( provider_name )
21
+ @provider = Provider::Provider.create( provider_name, self )
22
22
  @dir = create_output_dir()
23
23
  @dir_is_tmp = false
24
24
 
@@ -43,7 +43,7 @@ module VagrantMutate
43
43
  @logger.info "Loading box from name #{name}"
44
44
  @name = name
45
45
  # cheat for now since only supported input is virtualbox
46
- @provider = Provider::Provider.create('virtualbox')
46
+ @provider = Provider::Provider.create('virtualbox', self)
47
47
  @dir = find_input_dir()
48
48
  @dir_is_tmp = false
49
49
  end
@@ -56,6 +56,19 @@ module VagrantMutate
56
56
  end
57
57
  end
58
58
 
59
+ def virtual_size
60
+ input_file = File.join( @dir, @provider.image_name )
61
+ info = `qemu-img info #{input_file}`
62
+ @logger.debug "qemu-img info output\n#{info}"
63
+ if info =~ /(\d+) bytes/
64
+ return $1
65
+ else
66
+ raise Errors::DetermineImageSizeFailed
67
+ end
68
+ end
69
+
70
+ private
71
+
59
72
  def determine_provider
60
73
  metadata_file = File.join(@dir, 'metadata.json')
61
74
  if File.exists? metadata_file
@@ -65,10 +78,10 @@ module VagrantMutate
65
78
  raise Errors::DetermineProviderFailed, :error_message => e.message
66
79
  end
67
80
  @logger.info "Determined input provider is #{metadata['provider']}"
68
- return Provider::Provider.create( metadata['provider'] )
81
+ return Provider::Provider.create( metadata['provider'], self )
69
82
  else
70
83
  @logger.info "No metadata found, so assuming input provider is virtualbox"
71
- return Provider::Provider.create('virtualbox')
84
+ return Provider::Provider.create('virtualbox', self)
72
85
  end
73
86
  end
74
87
 
@@ -115,16 +128,5 @@ module VagrantMutate
115
128
  return tmp_dir
116
129
  end
117
130
 
118
- def determine_virtual_size
119
- input_file = File.join( @dir, @provider.image_name )
120
- info = `qemu-img info #{input_file}`
121
- @logger.debug "qemu-img info output\n#{info}"
122
- if info =~ /(\d+) bytes/
123
- return $1
124
- else
125
- raise Errors::DetermineImageSizeFailed
126
- end
127
- end
128
-
129
131
  end
130
132
  end
@@ -10,6 +10,22 @@ module VagrantMutate
10
10
  verify_qemu_version
11
11
  end
12
12
 
13
+ def convert(input_box, output_box)
14
+ @input_box = input_box
15
+ @output_box = output_box
16
+
17
+ @env.ui.info "Converting #{input_box.name} from #{input_box.provider.name} "\
18
+ "to #{output_box.provider.name}."
19
+
20
+ write_metadata
21
+ # will have to rethink this if any providers need to alter the vagrantfile
22
+ copy_vagrantfile
23
+ output_box.provider.write_specific_files(input_box)
24
+ write_disk
25
+ end
26
+
27
+ private
28
+
13
29
  # http://stackoverflow.com/questions/2108727/which-in-ruby-checking-if-program-exists-in-path-from-ruby
14
30
  def verify_qemu_installed
15
31
  exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
@@ -41,10 +57,11 @@ module VagrantMutate
41
57
  end
42
58
  end
43
59
 
44
- def write_metadata(input_box, output_box)
45
- metadata = output_box.provider.generate_metadata(input_box, output_box)
60
+
61
+ def write_metadata
62
+ metadata = @output_box.provider.generate_metadata(@input_box)
46
63
  begin
47
- File.open( File.join( output_box.dir, 'metadata.json'), 'w') do |f|
64
+ File.open( File.join( @output_box.dir, 'metadata.json'), 'w') do |f|
48
65
  f.write( JSON.generate(metadata) )
49
66
  end
50
67
  rescue => e
@@ -53,10 +70,10 @@ module VagrantMutate
53
70
  @logger.info "Wrote metadata"
54
71
  end
55
72
 
56
- def copy_vagrantfile(input_box, output_box)
57
- input = File.join( input_box.dir, 'Vagrantfile' )
73
+ def copy_vagrantfile
74
+ input = File.join( @input_box.dir, 'Vagrantfile' )
58
75
  if File.exists? input
59
- output = File.join( output_box.dir, 'Vagrantfile' )
76
+ output = File.join( @output_box.dir, 'Vagrantfile' )
60
77
  @logger.info "Copying #{input} to #{output}"
61
78
  begin
62
79
  FileUtils.copy_file(input, output)
@@ -66,17 +83,17 @@ module VagrantMutate
66
83
  end
67
84
  end
68
85
 
69
- def write_disk(input_box, output_box)
70
- if input_box.provider.image_format == output_box.provider.image_format
71
- copy_disk(input_box, output_box)
86
+ def write_disk
87
+ if @input_box.provider.image_format == @output_box.provider.image_format
88
+ copy_disk
72
89
  else
73
- convert_disk(input_box, output_box)
90
+ convert_disk
74
91
  end
75
92
  end
76
93
 
77
- def copy_disk(input_box, output_box)
78
- input = File.join( input_box.dir, input_box.provider.image_name )
79
- output = File.join( output_box.dir, output_box.provider.image_name )
94
+ def copy_disk
95
+ input = File.join( @input_box.dir, @input_box.provider.image_name )
96
+ output = File.join( @output_box.dir, @output_box.provider.image_name )
80
97
  @logger.info "Copying #{input} to #{output}"
81
98
  begin
82
99
  FileUtils.copy_file(input, output)
@@ -85,11 +102,11 @@ module VagrantMutate
85
102
  end
86
103
  end
87
104
 
88
- def convert_disk(input_box, output_box)
89
- input_file = File.join( input_box.dir, input_box.provider.image_name )
90
- output_file = File.join( output_box.dir, output_box.provider.image_name )
91
- input_format = input_box.provider.image_format
92
- output_format = output_box.provider.image_format
105
+ def convert_disk
106
+ input_file = File.join( @input_box.dir, @input_box.provider.image_name )
107
+ output_file = File.join( @output_box.dir, @output_box.provider.image_name )
108
+ input_format = @input_box.provider.image_format
109
+ output_format = @output_box.provider.image_format
93
110
 
94
111
  command = "qemu-img convert -p -f #{input_format} -O #{output_format} #{input_file} #{output_file}"
95
112
  @logger.info "Running #{command}"
@@ -98,14 +115,5 @@ module VagrantMutate
98
115
  end
99
116
  end
100
117
 
101
- def convert(input_box, output_box)
102
- @env.ui.info "Converting #{input_box.name} from #{input_box.provider.name} "\
103
- "to #{output_box.provider.name}."
104
- write_metadata(input_box, output_box)
105
- # will have to rethink this if any providers need to alter the vagrantfile
106
- copy_vagrantfile(input_box, output_box)
107
- write_disk(input_box, output_box)
108
- end
109
-
110
118
  end
111
119
  end
@@ -21,8 +21,8 @@ module VagrantMutate
21
21
  box_arg = argv[0]
22
22
  output_provider_arg = argv[1]
23
23
 
24
- c = Converter.new(@env)
25
- input_box = Box.new(@env)
24
+ converter = Converter.new(@env)
25
+ input_box = Box.new(@env)
26
26
  output_box = Box.new(@env)
27
27
 
28
28
  if box_arg =~ /\.box$/
@@ -33,7 +33,7 @@ module VagrantMutate
33
33
 
34
34
  output_box.prepare_for_output( input_box.name, output_provider_arg)
35
35
 
36
- c.convert(input_box, output_box)
36
+ converter.convert(input_box, output_box)
37
37
 
38
38
  input_box.cleanup
39
39
 
@@ -0,0 +1,57 @@
1
+ require 'erb'
2
+
3
+ module VagrantMutate
4
+ module Provider
5
+ class Kvm < Provider
6
+ def initialize(box)
7
+ @box = box
8
+ @name = 'kvm'
9
+ @supported_input = false,
10
+ @supported_output = true,
11
+ @image_format = 'raw',
12
+ @image_name = 'box-disk1.img'
13
+ end
14
+
15
+ def generate_metadata(input_box)
16
+ metadata = {
17
+ 'provider' => @box.provider.name,
18
+ }
19
+ end
20
+
21
+ def write_specific_files(input_box)
22
+ template_path = VagrantMutate.source_root.join('templates', 'kvm', 'box.xml.erb')
23
+ template = File.read(template_path)
24
+
25
+ uuid = nil
26
+ gui = true
27
+ disk_bus = 'virtio'
28
+ name = input_box.name
29
+ image_type = @image_format
30
+ disk = @image_name
31
+ qemu_bin = find_kvm
32
+ memory = input_box.provider.memory / 1024 # convert bytes to kib
33
+ cpus = input_box.provider.cpus
34
+ mac = input_box.provider.mac_address
35
+ arch = input_box.provider.architecture
36
+
37
+ File.open( File.join( @box.dir, 'box.xml'), 'w') do |f|
38
+ f.write( ERB.new(template).result(binding) )
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ def find_kvm
45
+ qemu_bin_list = [ '/usr/bin/qemu-kvm', '/usr/bin/kvm',
46
+ '/usr/bin/qemu-system-x86_64',
47
+ '/usr/bin/qemu-system-i386' ]
48
+ qemu_bin = qemu_bin_list.detect { |binary| File.exists? binary }
49
+ unless qemu_bin
50
+ raise Errors::QemuNotFound
51
+ end
52
+ return qemu_bin
53
+ end
54
+
55
+ end
56
+ end
57
+ end
@@ -1,22 +1,27 @@
1
1
  module VagrantMutate
2
2
  module Provider
3
3
  class Libvirt < Provider
4
- def initialize
4
+ def initialize(box)
5
+ @box = box
5
6
  @name = 'libvirt'
6
- @supported_input = true,
7
+ @supported_input = false,
7
8
  @supported_output = true,
8
9
  @image_format = 'qcow2',
9
10
  @image_name = 'box.img'
10
11
  end
11
12
 
12
- def generate_metadata(input_box, output_box)
13
+ def generate_metadata(input_box)
13
14
  metadata = {
14
- 'provider' => output_box.provider.name,
15
+ 'provider' => @box.provider.name,
15
16
  'format' => 'qcow2',
16
- 'virtual_size' => ( input_box.determine_virtual_size.to_f / (1024 * 1024 * 1024) ).ceil
17
+ 'virtual_size' => ( input_box.virtual_size.to_f / (1024 * 1024 * 1024) ).ceil
17
18
  }
18
19
  end
19
20
 
21
+ def write_specific_files(input_box)
22
+ # nothing to do here
23
+ end
24
+
20
25
  end
21
26
  end
22
27
  end
@@ -3,14 +3,17 @@ module VagrantMutate
3
3
  class Provider
4
4
  attr_reader :name, :supported_input, :supported_output, :image_format, :image_name
5
5
 
6
- def self.create(name)
6
+ def self.create(name, box)
7
7
  case name
8
+ when 'kvm'
9
+ require_relative 'kvm'
10
+ Kvm.new(box)
8
11
  when 'libvirt'
9
12
  require_relative 'libvirt'
10
- Libvirt.new
13
+ Libvirt.new(box)
11
14
  when 'virtualbox'
12
15
  require_relative 'virtualbox'
13
- Virtualbox.new
16
+ Virtualbox.new(box)
14
17
  else
15
18
  raise Errors::ProviderNotSupported, :provider => name, :direction => 'input or output'
16
19
  end
@@ -1,14 +1,100 @@
1
+ require "rexml/document"
2
+
1
3
  module VagrantMutate
2
4
  module Provider
3
5
 
4
6
  class Virtualbox < Provider
5
- def initialize
7
+ def initialize(box)
8
+ @box = box
6
9
  @name = 'virtualbox'
7
10
  @supported_input = true,
8
11
  @supported_output = false,
9
12
  @image_format = 'vmdk',
10
13
  @image_name = 'box-disk1.vmdk'
14
+
15
+ definition = File.read( File.join( box.dir, 'box.ovf') )
16
+ @ovf = REXML::Document.new(definition)
17
+ end
18
+
19
+ # the architecture is not defined in the ovf file,
20
+ # we could try to guess from OSType
21
+ # (https://www.virtualbox.org/browser/vbox/trunk/src/VBox/Main/include/ovfreader.h)
22
+ # but if that is not set correctly we risk a 64-bit box not booting
23
+ # because we try to run in 32-bit vm.
24
+ # in contrast, running 32-bit box in a 64-bit vm should work.
25
+ def architecture
26
+ return 'x86_64'
27
+ end
28
+
29
+ # use mac from the first enabled nic
30
+ def mac_address
31
+ @ovf.elements.each("//vbox:Machine/Hardware//Adapter") do |ele|
32
+ if ele.attributes['enabled'] == 'true'
33
+ mac = ele.attributes['MACAddress']
34
+ # convert to more standarad format with colons
35
+ return mac[0..1] + ":" + mac[2..3] + ":" +
36
+ mac[4..5] + ":" + mac[6..7] + ":" +
37
+ mac[8..9] + ":" + mac[10..11]
38
+ end
39
+ end
40
+ end
41
+
42
+ def cpus
43
+ @ovf.elements.each("//VirtualHardwareSection/Item") do |device|
44
+ if device.elements["rasd:ResourceType"].text == '3'
45
+ return device.elements["rasd:VirtualQuantity"].text
46
+ end
47
+ end
48
+ end
49
+
50
+ def memory
51
+ @ovf.elements.each("//VirtualHardwareSection/Item") do |device|
52
+ if device.elements["rasd:ResourceType"].text == '4'
53
+ return size_in_bytes(device.elements["rasd:VirtualQuantity"].text,
54
+ device.elements["rasd:AllocationUnits"].text)
55
+ end
56
+ end
11
57
  end
58
+
59
+ private
60
+
61
+ # Takes a quantity and a unit
62
+ # returns quantity in bytes
63
+ # mib = true to use mebibytes, etc
64
+ # defaults to false because ovf MB != megabytes
65
+ def size_in_bytes(qty, unit, mib=false)
66
+ qty = qty.to_i
67
+ unit = unit.downcase
68
+ if !mib
69
+ case unit
70
+ when "kb", "kilobytes"
71
+ unit = "kib"
72
+ when "mb", "megabytes"
73
+ unit = "mib"
74
+ when "gb", "gigabytes"
75
+ unit = "gib"
76
+ end
77
+ end
78
+ case unit
79
+ when "b", "bytes"
80
+ qty
81
+ when "kb", "kilobytes"
82
+ (qty * 1000)
83
+ when "kib", "kibibytes"
84
+ (qty * 1024)
85
+ when "mb", "megabytes"
86
+ (qty * 1000000)
87
+ when "m", "mib", "mebibytes"
88
+ (qty * 1048576)
89
+ when "gb", "gigabytes"
90
+ (qty * 1000000000)
91
+ when "g", "gib", "gibibytes"
92
+ (qty * 1073741824)
93
+ else
94
+ raise ArgumentError, "Unknown unit #{unit}"
95
+ end
96
+ end
97
+
12
98
  end
13
99
 
14
100
  end
@@ -1,3 +1,3 @@
1
1
  module VagrantMutate
2
- VERSION = '0.1.2'
2
+ VERSION = '0.1.3'
3
3
  end
@@ -3,6 +3,10 @@ require 'vagrant-mutate/errors'
3
3
 
4
4
  module VagrantMutate
5
5
 
6
+ def self.source_root
7
+ @source_root ||= Pathname.new(File.expand_path('../../', __FILE__))
8
+ end
9
+
6
10
  class Plugin < Vagrant.plugin('2')
7
11
  name 'vagrant-mutate'
8
12
 
@@ -13,10 +17,9 @@ module VagrantMutate
13
17
  end
14
18
 
15
19
  def self.setup_i18n
16
- I18n.load_path << File.expand_path('../../locales/en.yml', __FILE__)
20
+ I18n.load_path << File.expand_path('locales/en.yml', VagrantMutate.source_root)
17
21
  I18n.reload!
18
22
  end
19
-
20
23
  end
21
24
 
22
25
  end
@@ -0,0 +1,66 @@
1
+ <domain type='kvm'>
2
+ <name><%= name %></name>
3
+ <% if uuid %>
4
+ <uuid><%= uuid %></uuid>
5
+ <% end %>
6
+ <memory unit='KiB'><%= memory %></memory>
7
+ <currentMemory unit='KiB'><%= memory%></currentMemory>
8
+ <vcpu placement='static'><%= cpus %></vcpu>
9
+ <os>
10
+ <type arch='<%= arch %>' machine='pc-1.2'>hvm</type>
11
+ <boot dev='hd'/>
12
+ </os>
13
+ <features>
14
+ <acpi/>
15
+ <apic/>
16
+ <pae/>
17
+ </features>
18
+ <clock offset='utc'/>
19
+ <on_poweroff>destroy</on_poweroff>
20
+ <on_reboot>restart</on_reboot>
21
+ <on_crash>restart</on_crash>
22
+ <devices>
23
+ <emulator><%= qemu_bin %></emulator>
24
+ <disk type='file' device='disk'>
25
+ <driver name='qemu' type='<%= image_type %>'/>
26
+ <source file='<%= disk %>'/>
27
+ <target dev='vda' bus='<%= disk_bus %>'/>
28
+ <% if disk_bus == 'virtio' %>
29
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
30
+ <% else %>
31
+ <address type='drive' controller='0' bus='0' target='0' unit='0'/>
32
+ <% end %>
33
+ </disk>
34
+ <controller type='usb' index='0'>
35
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
36
+ </controller>
37
+ <controller type='virtio-serial' index='0'>
38
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
39
+ </controller>
40
+ <interface type='network'>
41
+ <mac address='<%= mac %>'/>
42
+ <source network='vagrant'/>
43
+ <model type='virtio'/>
44
+ </interface>
45
+ <serial type='pty'>
46
+ <target port='0'/>
47
+ </serial>
48
+ <console type='pty'>
49
+ <target type='serial' port='0'/>
50
+ </console>
51
+ <input type='mouse' bus='ps2'/>
52
+ <sound model='ich6'>
53
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
54
+ </sound>
55
+ <% if gui %>
56
+ <%= "<graphics type='vnc' port='-1' autoport='yes'/>" %>
57
+ <% end %>
58
+ <video>
59
+ <model type='cirrus' vram='9216' heads='1'/>
60
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
61
+ </video>
62
+ <memballoon model='virtio'>
63
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
64
+ </memballoon>
65
+ </devices>
66
+ </domain>
@@ -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)
@@ -0,0 +1,62 @@
1
+ <domain type='kvm'>
2
+ <name>mutate-test</name>
3
+
4
+ <memory unit='KiB'>262144</memory>
5
+ <currentMemory unit='KiB'>262144</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/kvm</emulator>
22
+ <disk type='file' device='disk'>
23
+ <driver name='qemu' type='raw'/>
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
+
29
+ </disk>
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='08:00:27:55:B8:8D'/>
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"}
@@ -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)
@@ -0,0 +1 @@
1
+ {"provider":"libvirt","format":"qcow2","virtual_size":1}
Binary file
Binary file
data/test/test.rb ADDED
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'fileutils'
4
+
5
+ def cleanup
6
+ puts "\nCLEANING UP"
7
+ base_output_dir = File.expand_path('../actual_output', __FILE__)
8
+ if File.directory? base_output_dir
9
+ FileUtils.rm_rf base_output_dir
10
+ end
11
+ end
12
+
13
+ def build_plugin
14
+ puts "\nBUILDING PLUGIN"
15
+ pkg_dir = File.expand_path('../../pkg', __FILE__)
16
+ working_dir = Dir.pwd
17
+ Dir.chdir pkg_dir
18
+ FileUtils.rm( Dir.glob('*.gem') )
19
+ system('rake build')
20
+ Dir.chdir working_dir
21
+ end
22
+
23
+ def install_plugin
24
+ puts "\nINSTALLING PLUGIN"
25
+ pkg_dir = File.expand_path('../../pkg', __FILE__)
26
+ working_dir = Dir.pwd
27
+ Dir.chdir pkg_dir
28
+ system('vagrant plugin install *.gem')
29
+ Dir.chdir working_dir
30
+ end
31
+
32
+ def test(input, outputs)
33
+ failures = []
34
+ test_dir = File.expand_path( File.dirname(__FILE__) )
35
+
36
+ input_box = File.join(test_dir, 'input', input, 'mutate-test.box')
37
+
38
+ vagrant_dir = File.join(test_dir, 'actual_output', input)
39
+ FileUtils.mkdir_p vagrant_dir
40
+ ENV['VAGRANT_HOME'] = vagrant_dir
41
+ install_plugin
42
+
43
+ outputs.each do |output|
44
+ puts "\nTESTING #{input} to #{output}"
45
+ system("vagrant mutate #{input_box} #{output}")
46
+ output_dir = File.join(vagrant_dir, 'boxes', 'mutate-test', output)
47
+ expected_output_dir = File.join(test_dir, 'expected_output', input, output)
48
+ Dir.foreach(expected_output_dir) do |f|
49
+ next if f == '.' or f == '..'
50
+ output = File.join(output_dir, f)
51
+ expected_output = File.join(expected_output_dir, f)
52
+ test_passed = FileUtils.compare_file(output, expected_output)
53
+ unless test_passed
54
+ failures.push "#{output} does not match #{expected_output}"
55
+ end
56
+ end
57
+ end
58
+
59
+ return failures
60
+ end
61
+
62
+ cleanup
63
+ build_plugin
64
+ failures = test( 'virtualbox', ['kvm', 'libvirt'] )
65
+
66
+ unless failures.empty?
67
+ puts "\nTESTS FAILED"
68
+ failures.each {|f| puts f}
69
+ else
70
+ puts "\nALL TESTS PASSED"
71
+ 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.1.2
4
+ version: 0.1.3
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: 2013-11-21 00:00:00.000000000 Z
12
+ date: 2013-12-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: archive-tar-minitar
@@ -77,12 +77,24 @@ files:
77
77
  - lib/vagrant-mutate/converter.rb
78
78
  - lib/vagrant-mutate/errors.rb
79
79
  - lib/vagrant-mutate/mutate.rb
80
+ - lib/vagrant-mutate/provider/kvm.rb
80
81
  - lib/vagrant-mutate/provider/libvirt.rb
81
82
  - lib/vagrant-mutate/provider/provider.rb
82
83
  - lib/vagrant-mutate/provider/virtualbox.rb
83
84
  - lib/vagrant-mutate/version.rb
84
85
  - locales/en.yml
85
- - test/mutate-test.box
86
+ - templates/kvm/box.xml.erb
87
+ - test/expected_output/virtualbox/kvm/Vagrantfile
88
+ - test/expected_output/virtualbox/kvm/box-disk1.img
89
+ - test/expected_output/virtualbox/kvm/box.xml
90
+ - test/expected_output/virtualbox/kvm/metadata.json
91
+ - test/expected_output/virtualbox/libvirt/Vagrantfile
92
+ - test/expected_output/virtualbox/libvirt/box.img
93
+ - test/expected_output/virtualbox/libvirt/metadata.json
94
+ - test/input/kvm/mutate-test.box
95
+ - test/input/libvirt/mutate-test.box
96
+ - test/input/virtualbox/mutate-test.box
97
+ - test/test.rb
86
98
  - vagrant-mutate.gemspec
87
99
  homepage: ''
88
100
  licenses:
@@ -110,4 +122,14 @@ signing_key:
110
122
  specification_version: 3
111
123
  summary: Convert vagrant boxes to work with different providers
112
124
  test_files:
113
- - test/mutate-test.box
125
+ - test/expected_output/virtualbox/kvm/Vagrantfile
126
+ - test/expected_output/virtualbox/kvm/box-disk1.img
127
+ - test/expected_output/virtualbox/kvm/box.xml
128
+ - test/expected_output/virtualbox/kvm/metadata.json
129
+ - test/expected_output/virtualbox/libvirt/Vagrantfile
130
+ - test/expected_output/virtualbox/libvirt/box.img
131
+ - test/expected_output/virtualbox/libvirt/metadata.json
132
+ - test/input/kvm/mutate-test.box
133
+ - test/input/libvirt/mutate-test.box
134
+ - test/input/virtualbox/mutate-test.box
135
+ - test/test.rb
data/test/mutate-test.box DELETED
Binary file