lib/vagrant-mutate/provider/virtualbox.rb in vagrant-mutate-0.1.2 vs lib/vagrant-mutate/provider/virtualbox.rb in vagrant-mutate-0.1.3
- old
+ new
@@ -1,15 +1,101 @@
+require "rexml/document"
+
module VagrantMutate
module Provider
class Virtualbox < Provider
- def initialize
+ def initialize(box)
+ @box = box
@name = 'virtualbox'
@supported_input = true,
@supported_output = false,
@image_format = 'vmdk',
@image_name = 'box-disk1.vmdk'
+
+ definition = File.read( File.join( box.dir, 'box.ovf') )
+ @ovf = REXML::Document.new(definition)
end
+
+ # the architecture is not defined in the ovf file,
+ # we could try to guess from OSType
+ # (https://www.virtualbox.org/browser/vbox/trunk/src/VBox/Main/include/ovfreader.h)
+ # but if that is not set correctly we risk a 64-bit box not booting
+ # because we try to run in 32-bit vm.
+ # in contrast, running 32-bit box in a 64-bit vm should work.
+ def architecture
+ return 'x86_64'
+ end
+
+ # use mac from the first enabled nic
+ def mac_address
+ @ovf.elements.each("//vbox:Machine/Hardware//Adapter") do |ele|
+ if ele.attributes['enabled'] == 'true'
+ mac = ele.attributes['MACAddress']
+ # convert to more standarad format with colons
+ return mac[0..1] + ":" + mac[2..3] + ":" +
+ mac[4..5] + ":" + mac[6..7] + ":" +
+ mac[8..9] + ":" + mac[10..11]
+ end
+ end
+ end
+
+ def cpus
+ @ovf.elements.each("//VirtualHardwareSection/Item") do |device|
+ if device.elements["rasd:ResourceType"].text == '3'
+ return device.elements["rasd:VirtualQuantity"].text
+ end
+ end
+ end
+
+ def memory
+ @ovf.elements.each("//VirtualHardwareSection/Item") do |device|
+ if device.elements["rasd:ResourceType"].text == '4'
+ return size_in_bytes(device.elements["rasd:VirtualQuantity"].text,
+ device.elements["rasd:AllocationUnits"].text)
+ end
+ end
+ end
+
+ private
+
+ # Takes a quantity and a unit
+ # returns quantity in bytes
+ # mib = true to use mebibytes, etc
+ # defaults to false because ovf MB != megabytes
+ def size_in_bytes(qty, unit, mib=false)
+ qty = qty.to_i
+ unit = unit.downcase
+ if !mib
+ case unit
+ when "kb", "kilobytes"
+ unit = "kib"
+ when "mb", "megabytes"
+ unit = "mib"
+ when "gb", "gigabytes"
+ unit = "gib"
+ end
+ end
+ case unit
+ when "b", "bytes"
+ qty
+ when "kb", "kilobytes"
+ (qty * 1000)
+ when "kib", "kibibytes"
+ (qty * 1024)
+ when "mb", "megabytes"
+ (qty * 1000000)
+ when "m", "mib", "mebibytes"
+ (qty * 1048576)
+ when "gb", "gigabytes"
+ (qty * 1000000000)
+ when "g", "gib", "gibibytes"
+ (qty * 1073741824)
+ else
+ raise ArgumentError, "Unknown unit #{unit}"
+ end
+ end
+
end
end
end