vagrant-kvm 0.1.4 → 0.1.5
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.
- checksums.yaml +7 -0
- data/.gitignore +2 -0
- data/.rspec +1 -0
- data/.travis.yml +14 -0
- data/CHANGELOG.md +29 -0
- data/DEVELOPMENT.md +87 -0
- data/Gemfile +1 -0
- data/INSTALL.md +229 -0
- data/LICENSE +2 -1
- data/README.md +154 -63
- data/Rakefile +24 -1
- data/example_box/README.md +8 -8
- data/lib/vagrant-kvm/action.rb +47 -5
- data/lib/vagrant-kvm/action/boot.rb +0 -4
- data/lib/vagrant-kvm/action/clear_forwarded_ports.rb +53 -0
- data/lib/vagrant-kvm/action/forward_ports.rb +104 -0
- data/lib/vagrant-kvm/action/import.rb +97 -18
- data/lib/vagrant-kvm/action/init_storage_pool.rb +3 -1
- data/lib/vagrant-kvm/action/message_not_running.rb +16 -0
- data/lib/vagrant-kvm/action/network.rb +12 -13
- data/lib/vagrant-kvm/action/package_vagrantfile.rb +3 -1
- data/lib/vagrant-kvm/action/prepare_gui.rb +20 -0
- data/lib/vagrant-kvm/action/prepare_nfs_settings.rb +8 -16
- data/lib/vagrant-kvm/action/prepare_nfs_valid_ids.rb +17 -0
- data/lib/vagrant-kvm/action/reset_image_permission.rb +23 -0
- data/lib/vagrant-kvm/action/resume_network.rb +28 -0
- data/lib/vagrant-kvm/action/share_folders.rb +6 -5
- data/lib/vagrant-kvm/action/suspend.rb +8 -1
- data/lib/vagrant-kvm/config.rb +103 -2
- data/lib/vagrant-kvm/driver/driver.rb +321 -99
- data/lib/vagrant-kvm/errors.rb +18 -0
- data/lib/vagrant-kvm/provider.rb +4 -1
- data/lib/vagrant-kvm/util.rb +3 -0
- data/lib/vagrant-kvm/util/commands.rb +23 -0
- data/lib/vagrant-kvm/util/definition_attributes.rb +33 -0
- data/lib/vagrant-kvm/util/disk_info.rb +48 -0
- data/lib/vagrant-kvm/util/network_definition.rb +44 -84
- data/lib/vagrant-kvm/util/vm_definition.rb +91 -103
- data/lib/vagrant-kvm/version.rb +1 -1
- data/locales/en.yml +8 -0
- data/locales/ja.yml +14 -0
- data/spec/acceptance/vagrant-kvm_spec.rb +80 -0
- data/spec/fedora/10.virt.rules +10 -0
- data/spec/fedora/50-vagrant-libvirt-access.pkla +6 -0
- data/spec/spec_helper.rb +30 -0
- data/spec/support/libvirt_helper.rb +37 -0
- data/spec/support/vagrant_kvm_helper.rb +39 -0
- data/spec/test_files/box.xml +74 -0
- data/spec/vagrant-kvm/config_spec.rb +56 -0
- data/spec/vagrant-kvm/driver/driver_spec.rb +36 -0
- data/spec/vagrant-kvm/errors_spec.rb +25 -0
- data/spec/vagrant-kvm/util/network_definition_spec.rb +60 -0
- data/spec/vagrant-kvm/util/vm_definition_spec.rb +76 -0
- data/templates/libvirt_domain.erb +34 -12
- data/templates/libvirt_network.erb +13 -0
- data/templates/package_Vagrantfile.erb +11 -0
- data/vagrant-kvm.gemspec +1 -2
- metadata +41 -42
data/lib/vagrant-kvm/errors.rb
CHANGED
@@ -6,12 +6,30 @@ module VagrantPlugins
|
|
6
6
|
class VagrantKVMError < Vagrant::Errors::VagrantError
|
7
7
|
error_namespace("vagrant_kvm.errors")
|
8
8
|
end
|
9
|
+
|
9
10
|
class KvmNoConnection < VagrantKVMError
|
10
11
|
error_key(:kvm_no_connection)
|
11
12
|
end
|
13
|
+
|
12
14
|
class KvmInvalidVersion < VagrantKVMError
|
13
15
|
error_key(:kvm_invalid_version)
|
14
16
|
end
|
17
|
+
|
18
|
+
class KvmNoQEMUBinary < VagrantKVMError
|
19
|
+
error_key(:kvm_no_qemu_binary)
|
20
|
+
end
|
21
|
+
|
22
|
+
class KvmFailImageConversion < VagrantKVMError
|
23
|
+
error_key(:kvm_fail_image_conversion)
|
24
|
+
end
|
25
|
+
|
26
|
+
class KvmBadBoxFormat < VagrantKVMError
|
27
|
+
error_key(:kvm_bad_box_format)
|
28
|
+
end
|
29
|
+
|
30
|
+
class KvmFailedCommand < VagrantKVMError
|
31
|
+
error_key(:kvm_failed_command)
|
32
|
+
end
|
15
33
|
end
|
16
34
|
end
|
17
35
|
end
|
data/lib/vagrant-kvm/provider.rb
CHANGED
@@ -66,7 +66,9 @@ module VagrantPlugins
|
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
69
|
-
|
69
|
+
# XXX duplicated with network.rb default
|
70
|
+
# If no private network configuration, return default ip
|
71
|
+
"192.168.123.10"
|
70
72
|
end
|
71
73
|
|
72
74
|
# Return the state of the VM
|
@@ -81,6 +83,7 @@ module VagrantPlugins
|
|
81
83
|
state_id = :not_created if !@driver.uuid
|
82
84
|
state_id = @driver.read_state if !state_id
|
83
85
|
state_id = :unknown if !state_id
|
86
|
+
@logger.info("state is now:", state_id)
|
84
87
|
|
85
88
|
# TODO Translate into short/long descriptions
|
86
89
|
short = state_id
|
data/lib/vagrant-kvm/util.rb
CHANGED
@@ -4,9 +4,12 @@ module VagrantPlugins
|
|
4
4
|
module ProviderKvm
|
5
5
|
module Util
|
6
6
|
util_root = Pathname.new(File.expand_path("../util", __FILE__))
|
7
|
+
autoload :DefinitionAttributes, util_root.join("definition_attributes")
|
7
8
|
autoload :VmDefinition, util_root.join("vm_definition")
|
8
9
|
autoload :NetworkDefinition, util_root.join("network_definition")
|
9
10
|
autoload :KvmTemplateRenderer, util_root.join("kvm_template_renderer")
|
11
|
+
autoload :Commands, util_root.join("commands")
|
12
|
+
autoload :DiskInfo, util_root.join("disk_info")
|
10
13
|
end
|
11
14
|
end
|
12
15
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module ProviderKvm
|
3
|
+
module Util
|
4
|
+
module Commands
|
5
|
+
def run_root_command(cmd)
|
6
|
+
# FIXME detect whether 'sudo' or 'su -c'
|
7
|
+
# for safety, we run cmd as single argument of sudo
|
8
|
+
unless res = system('sudo ' + cmd)
|
9
|
+
raise Errors::KvmFailedCommand, cmd: cmd, res: res
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def run_command(cmd)
|
14
|
+
unless res = system(cmd)
|
15
|
+
raise Errors::KvmFailedCommand, cmd: cmd, res: res
|
16
|
+
end
|
17
|
+
res
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module ProviderKvm
|
3
|
+
module Util
|
4
|
+
module DefinitionAttributes
|
5
|
+
module InstanceMethods
|
6
|
+
def attributes
|
7
|
+
@attributes ||= {}
|
8
|
+
end
|
9
|
+
|
10
|
+
def attributes=(attrs)
|
11
|
+
@attributes = attrs
|
12
|
+
end
|
13
|
+
|
14
|
+
def get(key)
|
15
|
+
attributes[key]
|
16
|
+
end
|
17
|
+
|
18
|
+
def set(key, val)
|
19
|
+
attributes[key] = val
|
20
|
+
end
|
21
|
+
|
22
|
+
def update(args={})
|
23
|
+
attributes.merge!(args)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.included(receiver)
|
28
|
+
receiver.send :include, InstanceMethods
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module ProviderKvm
|
3
|
+
module Util
|
4
|
+
class DiskInfo
|
5
|
+
include Errors
|
6
|
+
|
7
|
+
attr_reader :backing, :capacity, :cluster, :size, :type
|
8
|
+
|
9
|
+
def initialize(vol_path)
|
10
|
+
logger = Log4r::Logger.new("vagrant::kvm::util::disk_info")
|
11
|
+
# default values
|
12
|
+
@capacity = {:size => 10, :unit => 'G'}
|
13
|
+
@backing = nil
|
14
|
+
@cluster = nil
|
15
|
+
begin
|
16
|
+
diskinfo = %x[qemu-img info #{vol_path}]
|
17
|
+
diskinfo.each_line do |line|
|
18
|
+
case line
|
19
|
+
when /^file format:/
|
20
|
+
result = line.match(%r{file format:\s+(?<format>(\w+))})
|
21
|
+
@type = result[:format]
|
22
|
+
when /virtual size:/
|
23
|
+
result = line.match(%r{virtual size:\s+(?<size>\d+(\.\d+)?)(?<unit>.)\s+\((?<bytesize>\d+)\sbytes\)})
|
24
|
+
# always take the size in bytes to avoid conversion
|
25
|
+
@capacity = {:size => result[:bytesize], :unit => "B"}
|
26
|
+
when /^disk size:/
|
27
|
+
result = line.match(%r{disk size:\s+(?<size>\d+(\.\d+)?)(?<unit>.)})
|
28
|
+
@size = {:size => result[:size], :unit => result[:unit]}
|
29
|
+
when /^backing file:/
|
30
|
+
result = line.match(%r{backing file:\s+(?<file>(\S+))})
|
31
|
+
@backing = result[:file]
|
32
|
+
when /^cluster[_ ]size:/
|
33
|
+
result = line.match(%r{cluster[_ ]size:\s+(?<size>(\d+))})
|
34
|
+
@cluster = result[:size]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
rescue Errors::KvmFailedCommand => e
|
38
|
+
logger.error 'Failed to find volume size. Using defaults.'
|
39
|
+
logger.error e
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# TBD backing chain 'qemu-img info --backing-chain'
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -1,105 +1,65 @@
|
|
1
1
|
# Utility class to manage libvirt network definition
|
2
|
-
require "
|
2
|
+
require "rexml/document"
|
3
3
|
|
4
4
|
module VagrantPlugins
|
5
5
|
module ProviderKvm
|
6
6
|
module Util
|
7
7
|
class NetworkDefinition
|
8
|
-
|
9
|
-
attr_reader :name
|
10
|
-
attr_reader :domain_name
|
11
|
-
attr_reader :base_ip
|
8
|
+
include DefinitionAttributes
|
12
9
|
|
13
10
|
def initialize(name, definition=nil)
|
14
|
-
|
11
|
+
# create with defaults
|
12
|
+
# XXX defaults should move to config
|
13
|
+
self.attributes = {
|
14
|
+
:forward => "nat",
|
15
|
+
:domain_name => "vagrant.local",
|
16
|
+
:base_ip => "192.168.192.1",
|
17
|
+
:netmask => "255.255.255.0",
|
18
|
+
:range => {
|
19
|
+
:start => "192.168.192.100",
|
20
|
+
:end => "192.168.192.200",
|
21
|
+
},
|
22
|
+
:hosts => [],
|
23
|
+
name: name,
|
24
|
+
}
|
25
|
+
|
15
26
|
if definition
|
16
|
-
doc =
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
:
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
27
|
+
doc = REXML::Document.new definition
|
28
|
+
if doc.elements["/network/forward"]
|
29
|
+
set(:forward, doc.elements["/network/forward"].attributes["mode"])
|
30
|
+
end
|
31
|
+
|
32
|
+
if doc.elements["/network/domain"]
|
33
|
+
set(:domain_name, doc.elements["/network/domain"].attributes["name"])
|
34
|
+
end
|
35
|
+
set(:base_ip, doc.elements["/network/ip"].attributes["address"])
|
36
|
+
set(:netmask, doc.elements["/network/ip"].attributes["netmask"])
|
37
|
+
set(:range, {
|
38
|
+
:start => doc.elements["/network/ip/dhcp/range"].attributes["start"],
|
39
|
+
:end => doc.elements["/network/ip/dhcp/range"].attributes["end"]
|
40
|
+
})
|
41
|
+
hosts = []
|
42
|
+
doc.elements.each("/network/ip/dhcp/host") do |host|
|
43
|
+
hosts << {
|
44
|
+
:mac => host.attributes["mac"],
|
45
|
+
:name => host.attributes["name"],
|
46
|
+
:ip => host.attributes["ip"]
|
31
47
|
}
|
32
48
|
end
|
33
|
-
|
34
|
-
# create with defaults
|
35
|
-
# XXX defaults should move to config
|
36
|
-
@forward = "nat"
|
37
|
-
@domain_name = "vagrant.local"
|
38
|
-
@base_ip = "192.168.192.1"
|
39
|
-
@netmask = "255.255.255.0"
|
40
|
-
@range = {
|
41
|
-
:start => "192.168.192.100",
|
42
|
-
:end => "192.168.192.200"}
|
43
|
-
@hosts = []
|
49
|
+
set(:hosts, hosts)
|
44
50
|
end
|
45
51
|
end
|
46
52
|
|
47
|
-
def
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
:base_ip => @base_ip,
|
52
|
-
:netmask => @netmask,
|
53
|
-
:range => @range,
|
54
|
-
:hosts => @hosts}.merge(config)
|
55
|
-
|
56
|
-
@forward = config[:forward]
|
57
|
-
@domain_name = config[:domain_name]
|
58
|
-
@base_ip = config[:base_ip]
|
59
|
-
@netmask = config[:netmask]
|
60
|
-
@range = config[:range]
|
61
|
-
@hosts = config[:hosts]
|
62
|
-
end
|
63
|
-
|
64
|
-
def as_xml
|
65
|
-
xml = <<-EOXML
|
66
|
-
<network>
|
67
|
-
<name>#{@name}</name>
|
68
|
-
<forward mode='#{@forward}'/>
|
69
|
-
<domain name='#{@domain_name}'/>
|
70
|
-
<ip address='#{@base_ip}' netmask='#{@netmask}'>
|
71
|
-
<dhcp>
|
72
|
-
<range start='#{@range[:start]}' end='#{@range[:end]}' />
|
73
|
-
</dhcp>
|
74
|
-
</ip>
|
75
|
-
</network>
|
76
|
-
EOXML
|
77
|
-
xml = inject_hosts(xml) if @hosts.length > 0
|
78
|
-
xml
|
79
|
-
end
|
80
|
-
|
81
|
-
def add_host(host)
|
82
|
-
cur_host = @hosts.detect {|h| h[:mac] == host[:mac]}
|
83
|
-
if cur_host
|
84
|
-
cur_host[:ip] = host[:ip]
|
85
|
-
cur_host[:name] = host[:name]
|
86
|
-
else
|
87
|
-
@hosts << {
|
88
|
-
:mac => host[:mac],
|
89
|
-
:name => host[:name],
|
90
|
-
:ip => host[:ip]}
|
53
|
+
def ==(other)
|
54
|
+
# Don't compare the hosts
|
55
|
+
[:forward, :domain_name, :base_ip, :netmask, :range,].all? do |key|
|
56
|
+
get(key) == other.get(key)
|
91
57
|
end
|
92
58
|
end
|
93
59
|
|
94
|
-
def
|
95
|
-
|
96
|
-
entry_point = doc.at_css("network ip dhcp range")
|
97
|
-
@hosts.each do |host|
|
98
|
-
entry_point.add_next_sibling "<host mac='#{host[:mac]}' name='#{host[:name]}' ip='#{host[:ip]}' />"
|
99
|
-
end
|
100
|
-
doc.to_xml
|
60
|
+
def as_xml
|
61
|
+
KvmTemplateRenderer.render("libvirt_network", attributes.dup)
|
101
62
|
end
|
102
|
-
|
103
63
|
end
|
104
64
|
end
|
105
65
|
end
|
@@ -1,135 +1,119 @@
|
|
1
1
|
# Utility class to translate ovf definition to libvirt XML
|
2
2
|
# and manage XML formatting for libvirt interaction
|
3
3
|
# Not a full OVF converter, only the minimal needed definition
|
4
|
-
require "
|
4
|
+
require "rexml/document"
|
5
5
|
|
6
6
|
module VagrantPlugins
|
7
7
|
module ProviderKvm
|
8
8
|
module Util
|
9
9
|
class VmDefinition
|
10
|
-
|
11
|
-
|
12
|
-
attr_reader :cpus
|
13
|
-
attr_accessor :disk
|
14
|
-
attr_reader :mac
|
15
|
-
attr_reader :arch
|
16
|
-
attr_reader :network
|
17
|
-
attr_accessor :image_type
|
10
|
+
include Errors
|
11
|
+
include DefinitionAttributes
|
18
12
|
|
19
13
|
def self.list_interfaces(definition)
|
20
|
-
nics =
|
21
|
-
|
22
|
-
doc = Nokogiri::XML(definition)
|
14
|
+
nics = []
|
15
|
+
doc = REXML::Document.new definition
|
23
16
|
# look for user mode interfaces
|
24
|
-
doc.
|
25
|
-
|
26
|
-
adapter = ifcount
|
27
|
-
nics[adapter] ||= {}
|
28
|
-
nics[adapter][:type] = :user
|
17
|
+
doc.elements.each("//devices/interface[@type='user']") do |item|
|
18
|
+
nics << {:type => :user, :network => nil }
|
29
19
|
end
|
30
20
|
# look for interfaces on virtual network
|
31
|
-
doc.
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
nics[adapter][:type] = :network
|
21
|
+
doc.elements.each("//devices/interface[@type='network']") do |item|
|
22
|
+
nics << {
|
23
|
+
:type => :network,
|
24
|
+
:network => item.elements["source"].attributes["network"].to_s
|
25
|
+
}
|
37
26
|
end
|
38
27
|
nics
|
39
28
|
end
|
40
29
|
|
41
|
-
def initialize(definition
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
30
|
+
def initialize(definition)
|
31
|
+
self.attributes = {
|
32
|
+
:uuid => nil,
|
33
|
+
:gui => nil,
|
34
|
+
:vnc_autoport => false,
|
35
|
+
:vnc_password => nil,
|
36
|
+
:network => 'default',
|
37
|
+
:network_model => 'virtio',
|
38
|
+
:video_model => 'cirrus'
|
39
|
+
}
|
40
|
+
doc = REXML::Document.new definition
|
41
|
+
memory_unit = doc.elements["/domain/memory"].attributes["unit"]
|
42
|
+
update({
|
43
|
+
:name => doc.elements["/domain/name"].text,
|
44
|
+
:cpus => doc.elements["/domain/vcpu"].text,
|
45
|
+
:memory => size_in_bytes(doc.elements["/domain/memory"].text,
|
46
|
+
memory_unit), # always :memory is in bytes
|
47
|
+
:arch => doc.elements["/domain/os/type"].attributes["arch"],
|
48
|
+
:machine_type => doc.elements["/domain/os/type"].attributes["machine"],
|
49
|
+
:disk => doc.elements["//devices/disk/source"].attributes["file"],
|
50
|
+
:network => doc.elements["//devices/interface/source"].attributes["network"],
|
51
|
+
:network_model => :default,
|
52
|
+
:mac => format_mac(doc.elements["//devices/interface/mac"].attributes["address"]),
|
53
|
+
:image_type => doc.elements["//devices/disk/driver"].attributes["type"],
|
54
|
+
:qemu_bin => doc.elements["/domain/devices/emulator"].text,
|
55
|
+
:video_model => doc.elements["/domain/devices/video/model"].attributes["type"],
|
56
|
+
:disk_bus => doc.elements["//devices/disk/target"].attributes["bus"]
|
57
|
+
})
|
58
|
+
model_node = doc.elements["//devices/interface/model"]
|
59
|
+
if model_node
|
60
|
+
update({
|
61
|
+
:model_node => model_node,
|
62
|
+
:network_model => model_node.attributes["type"]
|
63
|
+
})
|
49
64
|
end
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
doc
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
when "3"
|
62
|
-
@cpus = device.at_css("VirtualQuantity").content
|
63
|
-
# Memory
|
64
|
-
when "4"
|
65
|
-
@memory = size_in_bytes(device.at_css("VirtualQuantity").content,
|
66
|
-
device.at_css("AllocationUnits").content)
|
67
|
-
end
|
65
|
+
if doc.elements["/domain/uuid"]
|
66
|
+
update({:uuid => doc.elements["/domain/uuid"].text})
|
67
|
+
end
|
68
|
+
if doc.elements["//devices/graphics"]
|
69
|
+
attrs = doc.elements["//devices/graphics"].attributes
|
70
|
+
update({
|
71
|
+
:gui => attrs["type"] == 'vnc',
|
72
|
+
:vnc_port => attrs['port'].to_i,
|
73
|
+
:vnc_autoport => attrs['autoport'] == 'yes',
|
74
|
+
:vnc_password => attrs['passwd']
|
75
|
+
})
|
68
76
|
end
|
69
|
-
|
70
|
-
# disk volume
|
71
|
-
diskref = doc.at_css("DiskSection Disk")["fileRef"]
|
72
|
-
@disk = doc.at_css("References File[id='#{diskref}']")["href"]
|
73
|
-
@image_type = 'raw'
|
74
|
-
# mac address
|
75
|
-
# XXX we use only the first nic
|
76
|
-
@mac = format_mac(doc.at_css("Machine Hardware Adapter[enabled='true']")['MACAddress'])
|
77
|
-
|
78
|
-
# the architecture is not defined in the ovf file
|
79
|
-
# we try to guess from OSType
|
80
|
-
# see https://www.virtualbox.org/browser/vbox/trunk/src/VBox/Main/include/ovfreader.h
|
81
|
-
@arch = doc.at_css("VirtualSystemIdentifier").
|
82
|
-
content[-2..-1] == '64' ? "x86_64" : "i686"
|
83
77
|
end
|
84
78
|
|
85
|
-
def
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
@network = doc.at_css("devices interface source")["network"]
|
97
|
-
@image_type = doc.at_css("devices disk driver")["type"]
|
98
|
-
end
|
79
|
+
def as_xml
|
80
|
+
if attributes[:qemu_bin]
|
81
|
+
# user specified path of qemu binary
|
82
|
+
qemu_bin_list = [attributes[:qemu_bin]]
|
83
|
+
else
|
84
|
+
# RedHat and Debian-based systems have different executable names
|
85
|
+
# depending on version/architectures
|
86
|
+
qemu_bin_list = ['/usr/bin/qemu-system-x86_64'] if get(:arch).match(/64$/)
|
87
|
+
qemu_bin_list = ['/usr/bin/qemu-system-i386'] if get(:arch).match(/^i.86$/)
|
88
|
+
qemu_bin_list += [ '/usr/bin/qemu-kvm', '/usr/bin/kvm' ]
|
89
|
+
end
|
99
90
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
91
|
+
qemu_bin = qemu_bin_list.detect { |binary| File.exists? binary }
|
92
|
+
if not qemu_bin
|
93
|
+
raise Errors::KvmNoQEMUBinary,
|
94
|
+
:cause => attributes[:qemu_bin] ?
|
95
|
+
"Vagrantfile (specified binary: #{attributes[:qemu_bin]})" : "QEMU installation"
|
96
|
+
end
|
106
97
|
|
107
|
-
xml = KvmTemplateRenderer.render("libvirt_domain",
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
:cpus => @cpus,
|
112
|
-
:arch => @arch,
|
113
|
-
:disk => @disk,
|
114
|
-
:mac => format_mac(@mac),
|
115
|
-
:network => @network,
|
116
|
-
:gui => @gui,
|
117
|
-
:image_type => @image_type,
|
118
|
-
:qemu_bin => qemu_bin.detect { |binary| File.exists? binary }
|
119
|
-
})
|
98
|
+
xml = KvmTemplateRenderer.render("libvirt_domain",
|
99
|
+
attributes.merge!(:memory_size => get_memory("KiB"),
|
100
|
+
:memory_unit => "KiB")
|
101
|
+
)
|
120
102
|
xml
|
121
103
|
end
|
122
104
|
|
123
105
|
def get_memory(unit="bytes")
|
124
|
-
size_from_bytes(
|
106
|
+
size_from_bytes(get(:memory), unit)
|
125
107
|
end
|
126
108
|
|
127
|
-
def
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
109
|
+
def update(args={})
|
110
|
+
args.each {|k,v|
|
111
|
+
case k
|
112
|
+
when :mac
|
113
|
+
args[:mac] = format_mac(args[:mac])
|
114
|
+
end
|
115
|
+
}
|
116
|
+
super(args)
|
133
117
|
end
|
134
118
|
|
135
119
|
# Takes a quantity and a unit
|
@@ -193,6 +177,10 @@ module VagrantPlugins
|
|
193
177
|
end
|
194
178
|
end
|
195
179
|
|
180
|
+
def format_bool(v)
|
181
|
+
v ? "yes" : "no"
|
182
|
+
end
|
183
|
+
|
196
184
|
def format_mac(mac)
|
197
185
|
if mac.length == 12
|
198
186
|
mac = mac[0..1] + ":" + mac[2..3] + ":" +
|