vagrant-libvirt 0.0.36 → 0.0.37
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 +4 -4
- data/.coveralls.yml +1 -0
- data/Gemfile +1 -0
- data/README.md +171 -13
- data/lib/vagrant-libvirt/action/create_domain.rb +44 -19
- data/lib/vagrant-libvirt/action/create_domain_volume.rb +12 -12
- data/lib/vagrant-libvirt/action/create_network_interfaces.rb +37 -39
- data/lib/vagrant-libvirt/action/create_networks.rb +34 -34
- data/lib/vagrant-libvirt/action/destroy_domain.rb +7 -8
- data/lib/vagrant-libvirt/action/destroy_networks.rb +12 -13
- data/lib/vagrant-libvirt/action/forward_ports.rb +21 -23
- data/lib/vagrant-libvirt/action/halt_domain.rb +8 -9
- data/lib/vagrant-libvirt/action/handle_box_image.rb +28 -27
- data/lib/vagrant-libvirt/action/handle_storage_pool.rb +8 -8
- data/lib/vagrant-libvirt/action/is_created.rb +1 -1
- data/lib/vagrant-libvirt/action/is_running.rb +2 -2
- data/lib/vagrant-libvirt/action/is_suspended.rb +4 -4
- data/lib/vagrant-libvirt/action/message_already_created.rb +2 -2
- data/lib/vagrant-libvirt/action/message_not_created.rb +2 -2
- data/lib/vagrant-libvirt/action/message_not_running.rb +2 -2
- data/lib/vagrant-libvirt/action/message_not_suspended.rb +2 -2
- data/lib/vagrant-libvirt/action/package_domain.rb +6 -5
- data/lib/vagrant-libvirt/action/prepare_nfs_settings.rb +7 -6
- data/lib/vagrant-libvirt/action/prepare_nfs_valid_ids.rb +2 -2
- data/lib/vagrant-libvirt/action/prune_nfs_exports.rb +3 -3
- data/lib/vagrant-libvirt/action/read_mac_addresses.rb +8 -10
- data/lib/vagrant-libvirt/action/remove_libvirt_image.rb +4 -4
- data/lib/vagrant-libvirt/action/remove_stale_volume.rb +8 -7
- data/lib/vagrant-libvirt/action/resume_domain.rb +5 -5
- data/lib/vagrant-libvirt/action/set_boot_order.rb +70 -27
- data/lib/vagrant-libvirt/action/set_name_of_domain.rb +10 -12
- data/lib/vagrant-libvirt/action/share_folders.rb +16 -18
- data/lib/vagrant-libvirt/action/start_domain.rb +59 -64
- data/lib/vagrant-libvirt/action/suspend_domain.rb +5 -5
- data/lib/vagrant-libvirt/action/wait_till_up.rb +24 -26
- data/lib/vagrant-libvirt/action.rb +18 -23
- data/lib/vagrant-libvirt/cap/mount_p9.rb +11 -10
- data/lib/vagrant-libvirt/cap/nic_mac_addresses.rb +1 -1
- data/lib/vagrant-libvirt/cap/synced_folder.rb +20 -19
- data/lib/vagrant-libvirt/config.rb +164 -136
- data/lib/vagrant-libvirt/driver.rb +10 -13
- data/lib/vagrant-libvirt/errors.rb +4 -3
- data/lib/vagrant-libvirt/plugin.rb +4 -6
- data/lib/vagrant-libvirt/provider.rb +23 -24
- data/lib/vagrant-libvirt/templates/domain.xml.erb +14 -1
- data/lib/vagrant-libvirt/templates/private_network.xml.erb +4 -0
- data/lib/vagrant-libvirt/util/collection.rb +0 -3
- data/lib/vagrant-libvirt/util/erb_template.rb +6 -10
- data/lib/vagrant-libvirt/util/error_codes.rb +32 -33
- data/lib/vagrant-libvirt/util/network_util.rb +29 -21
- data/lib/vagrant-libvirt/util.rb +3 -4
- data/lib/vagrant-libvirt/version.rb +1 -1
- data/locales/en.yml +3 -0
- data/spec/spec_helper.rb +3 -0
- data/spec/support/environment_helper.rb +5 -7
- data/spec/support/libvirt_context.rb +13 -11
- data/spec/support/sharedcontext.rb +9 -10
- data/spec/unit/action/destroy_domain_spec.rb +38 -37
- data/spec/unit/action/set_name_of_domain_spec.rb +4 -4
- data/spec/unit/action/wait_till_up_spec.rb +45 -46
- data/spec/unit/config_spec.rb +106 -0
- data/spec/unit/templates/domain_all_settings.xml +125 -0
- data/spec/unit/templates/domain_defaults.xml +44 -0
- data/spec/unit/templates/domain_spec.rb +69 -0
- data/tools/create_box.sh +8 -2
- metadata +12 -3
@@ -1,64 +1,107 @@
|
|
1
|
-
require
|
1
|
+
require 'log4r'
|
2
2
|
require 'nokogiri'
|
3
3
|
|
4
4
|
module VagrantPlugins
|
5
5
|
module ProviderLibvirt
|
6
6
|
module Action
|
7
|
+
# boot order useful for pxe in discovery workflow
|
7
8
|
class SetBootOrder
|
8
9
|
def initialize(app, env)
|
9
10
|
@app = app
|
10
|
-
@logger = Log4r::Logger.new(
|
11
|
+
@logger = Log4r::Logger.new('vagrant_libvirt::action::set_boot_order')
|
11
12
|
config = env[:machine].provider_config
|
12
13
|
@boot_order = config.boot_order
|
13
14
|
end
|
14
15
|
|
15
16
|
def call(env)
|
16
|
-
|
17
|
+
# Get domain first
|
17
18
|
begin
|
18
|
-
domain = env[:machine].provider
|
19
|
-
|
19
|
+
domain = env[:machine].provider
|
20
|
+
.driver
|
21
|
+
.connection
|
22
|
+
.client
|
23
|
+
.lookup_domain_by_uuid(
|
24
|
+
env[:machine].id.to_s
|
25
|
+
)
|
20
26
|
rescue => e
|
21
27
|
raise Errors::NoDomainError,
|
22
|
-
|
28
|
+
error_message: e.message
|
23
29
|
end
|
24
30
|
|
25
|
-
# Only execute specific boot ordering if this is defined
|
31
|
+
# Only execute specific boot ordering if this is defined
|
32
|
+
# in the Vagrant file
|
26
33
|
if @boot_order.count >= 1
|
27
|
-
|
28
|
-
# If a domain is initially defined with no box or disk or
|
29
|
-
#
|
30
|
-
#
|
34
|
+
|
35
|
+
# If a domain is initially defined with no box or disk or
|
36
|
+
# with an explicit boot order, libvirt adds <boot dev="foo">
|
37
|
+
# This conflicts with an explicit boot_order configuration,
|
38
|
+
# so we need to remove it from the domain xml and feed it back.
|
39
|
+
# Also see https://bugzilla.redhat.com/show_bug.cgi?id=1248514
|
40
|
+
# as to why we have to do this after all devices have been defined.
|
31
41
|
xml = Nokogiri::XML(domain.xml_desc)
|
32
|
-
xml.search(
|
33
|
-
node.remove
|
34
|
-
end
|
42
|
+
xml.search('/domain/os/boot').each(&:remove)
|
35
43
|
|
36
44
|
# Parse the XML and find each defined drive and network interfacee
|
37
45
|
hd = xml.search("/domain/devices/disk[@device='disk']")
|
38
46
|
cdrom = xml.search("/domain/devices/disk[@device='cdrom']")
|
39
|
-
|
47
|
+
# implemented only for 1 network
|
48
|
+
nets = @boot_order.flat_map do |x|
|
49
|
+
x.class == Hash ? x : nil
|
50
|
+
end.compact
|
51
|
+
raise 'Defined only for 1 network for boot' if nets.size > 1
|
52
|
+
network = search_network(nets, xml)
|
40
53
|
|
41
|
-
# Generate an array per device group and a flattened
|
42
|
-
|
43
|
-
|
54
|
+
# Generate an array per device group and a flattened
|
55
|
+
# array from all of those
|
56
|
+
devices = { 'hd' => hd,
|
57
|
+
'cdrom' => cdrom,
|
58
|
+
'network' => network }
|
44
59
|
|
45
|
-
|
60
|
+
final_boot_order = final_boot_order(@boot_order, devices)
|
61
|
+
# Loop over the entire defined boot order array and
|
62
|
+
# create boot order entries in the domain XML
|
46
63
|
final_boot_order.each_with_index do |node, index|
|
47
|
-
boot = "<boot order='#{index+1}'/>"
|
64
|
+
boot = "<boot order='#{index + 1}'/>"
|
48
65
|
node.add_child(boot)
|
49
|
-
|
50
|
-
@logger.debug "Setting #{node['device']} to boot index #{index+1}"
|
51
|
-
elsif node.name == 'interface'
|
52
|
-
@logger.debug "Setting #{node.name} to boot index #{index+1}"
|
53
|
-
end
|
66
|
+
logger_msg(node, index)
|
54
67
|
end
|
55
68
|
|
56
|
-
# Finally redefine the domain XML through libvirt
|
57
|
-
|
69
|
+
# Finally redefine the domain XML through libvirt
|
70
|
+
# to apply the boot ordering
|
71
|
+
env[:machine].provider
|
72
|
+
.driver
|
73
|
+
.connection
|
74
|
+
.client
|
75
|
+
.define_domain_xml(xml.to_s)
|
58
76
|
end
|
59
77
|
|
60
78
|
@app.call(env)
|
79
|
+
end
|
80
|
+
|
81
|
+
def final_boot_order(boot_order, devices)
|
82
|
+
boot_order.flat_map do |category|
|
83
|
+
devices[category.class == Hash ? category.keys.first : category]
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def search_network(nets, xml)
|
88
|
+
str = '/domain/devices/interface'
|
89
|
+
str += "[(@type='network' or @type='udp' or @type='bridge')"
|
90
|
+
unless nets.empty?
|
91
|
+
str += " and source[@network='#{nets.first['network']}']"
|
92
|
+
end
|
93
|
+
str += ']'
|
94
|
+
@logger.debug(str)
|
95
|
+
xml.search(str)
|
96
|
+
end
|
61
97
|
|
98
|
+
def logger_msg(node, index)
|
99
|
+
name = if node.name == 'disk'
|
100
|
+
node['device']
|
101
|
+
elsif node.name == 'interface'
|
102
|
+
node.name
|
103
|
+
end
|
104
|
+
@logger.debug "Setting #{name} to boot index #{index + 1}"
|
62
105
|
end
|
63
106
|
end
|
64
107
|
end
|
@@ -2,11 +2,10 @@ require 'securerandom'
|
|
2
2
|
module VagrantPlugins
|
3
3
|
module ProviderLibvirt
|
4
4
|
module Action
|
5
|
-
|
6
5
|
# Setup name for domain and domain volumes.
|
7
6
|
class SetNameOfDomain
|
8
|
-
def initialize(app,
|
9
|
-
@logger = Log4r::Logger.new(
|
7
|
+
def initialize(app, _env)
|
8
|
+
@logger = Log4r::Logger.new('vagrant_libvirt::action::set_name_of_domain')
|
10
9
|
@app = app
|
11
10
|
end
|
12
11
|
|
@@ -14,14 +13,15 @@ module VagrantPlugins
|
|
14
13
|
env[:domain_name] = build_domain_name(env)
|
15
14
|
|
16
15
|
begin
|
17
|
-
@logger.info("Looking for domain #{env[:domain_name]} through list "
|
16
|
+
@logger.info("Looking for domain #{env[:domain_name]} through list " \
|
18
17
|
"#{env[:machine].provider.driver.connection.servers.all}")
|
19
18
|
# Check if the domain name is not already taken
|
20
19
|
|
21
20
|
domain = ProviderLibvirt::Util::Collection.find_matching(
|
22
|
-
env[:machine].provider.driver.connection.servers.all, env[:domain_name]
|
21
|
+
env[:machine].provider.driver.connection.servers.all, env[:domain_name]
|
22
|
+
)
|
23
23
|
rescue Fog::Errors::Error => e
|
24
|
-
@logger.info(
|
24
|
+
@logger.info(e.to_s)
|
25
25
|
domain = nil
|
26
26
|
end
|
27
27
|
|
@@ -29,7 +29,7 @@ module VagrantPlugins
|
|
29
29
|
|
30
30
|
unless domain.nil?
|
31
31
|
raise ProviderLibvirt::Errors::DomainNameExists,
|
32
|
-
|
32
|
+
domain_name: env[:domain_name]
|
33
33
|
end
|
34
34
|
|
35
35
|
@app.call(env)
|
@@ -46,21 +46,19 @@ module VagrantPlugins
|
|
46
46
|
config = env[:machine].provider_config
|
47
47
|
domain_name =
|
48
48
|
if config.default_prefix.nil?
|
49
|
-
env[:root_path].basename.to_s.dup.concat(
|
49
|
+
env[:root_path].basename.to_s.dup.concat('_')
|
50
50
|
elsif config.default_prefix.empty?
|
51
51
|
# don't have any prefix, not even "_"
|
52
|
-
|
52
|
+
''
|
53
53
|
else
|
54
|
-
config.default_prefix.to_s.concat(
|
54
|
+
config.default_prefix.to_s.dup.concat('_')
|
55
55
|
end
|
56
56
|
domain_name << env[:machine].name.to_s
|
57
57
|
domain_name.gsub!(/[^-a-z0-9_\.]/i, '')
|
58
58
|
domain_name << "_#{Time.now.utc.to_i}_#{SecureRandom.hex(10)}" if config.random_hostname
|
59
59
|
domain_name
|
60
60
|
end
|
61
|
-
|
62
61
|
end
|
63
|
-
|
64
62
|
end
|
65
63
|
end
|
66
64
|
end
|
@@ -1,13 +1,13 @@
|
|
1
1
|
require 'pathname'
|
2
2
|
|
3
|
-
require
|
3
|
+
require 'log4r'
|
4
4
|
|
5
5
|
module VagrantPlugins
|
6
6
|
module ProviderLibvirt
|
7
7
|
module Action
|
8
8
|
class ShareFolders
|
9
|
-
def initialize(app,
|
10
|
-
@logger = Log4r::Logger.new(
|
9
|
+
def initialize(app, _env)
|
10
|
+
@logger = Log4r::Logger.new('vagrant::action::vm::share_folders')
|
11
11
|
@app = app
|
12
12
|
end
|
13
13
|
|
@@ -37,36 +37,34 @@ module VagrantPlugins
|
|
37
37
|
# Prepares the shared folders by verifying they exist and creating them
|
38
38
|
# if they don't.
|
39
39
|
def prepare_folders
|
40
|
-
shared_folders.each do |
|
40
|
+
shared_folders.each do |_id, options|
|
41
41
|
hostpath = Pathname.new(options[:hostpath]).expand_path(@env[:root_path])
|
42
42
|
|
43
|
-
|
44
|
-
|
45
|
-
|
43
|
+
next unless !hostpath.directory? && options[:create]
|
44
|
+
# Host path doesn't exist, so let's create it.
|
45
|
+
@logger.debug("Host path doesn't exist, creating: #{hostpath}")
|
46
46
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
end
|
47
|
+
begin
|
48
|
+
hostpath.mkpath
|
49
|
+
rescue Errno::EACCES
|
50
|
+
raise Vagrant::Errors::SharedFolderCreateFailed,
|
51
|
+
path: hostpath.to_s
|
53
52
|
end
|
54
53
|
end
|
55
54
|
end
|
56
55
|
|
57
56
|
def create_metadata
|
58
|
-
@env[:ui].info I18n.t(
|
57
|
+
@env[:ui].info I18n.t('vagrant.actions.vm.share_folders.creating')
|
59
58
|
|
60
59
|
folders = []
|
61
60
|
shared_folders.each do |id, data|
|
62
61
|
folders << {
|
63
|
-
:
|
64
|
-
:
|
65
|
-
:
|
62
|
+
name: id,
|
63
|
+
hostpath: File.expand_path(data[:hostpath], @env[:root_path]),
|
64
|
+
transient: data[:transient]
|
66
65
|
}
|
67
66
|
end
|
68
67
|
end
|
69
|
-
|
70
68
|
end
|
71
69
|
end
|
72
70
|
end
|
@@ -6,25 +6,25 @@ module VagrantPlugins
|
|
6
6
|
module Action
|
7
7
|
# Just start the domain.
|
8
8
|
class StartDomain
|
9
|
-
def initialize(app,
|
10
|
-
@logger = Log4r::Logger.new(
|
9
|
+
def initialize(app, _env)
|
10
|
+
@logger = Log4r::Logger.new('vagrant_libvirt::action::start_domain')
|
11
11
|
@app = app
|
12
12
|
end
|
13
13
|
|
14
14
|
def call(env)
|
15
|
-
env[:ui].info(I18n.t(
|
15
|
+
env[:ui].info(I18n.t('vagrant_libvirt.starting_domain'))
|
16
16
|
|
17
17
|
domain = env[:machine].provider.driver.connection.servers.get(env[:machine].id.to_s)
|
18
|
-
raise Errors::NoDomainError if domain
|
18
|
+
raise Errors::NoDomainError if domain.nil?
|
19
19
|
config = env[:machine].provider_config
|
20
20
|
|
21
21
|
begin
|
22
22
|
# update domain settings on change.
|
23
23
|
|
24
|
-
libvirt_domain =
|
24
|
+
libvirt_domain = env[:machine].provider.driver.connection.client.lookup_domain_by_uuid(env[:machine].id)
|
25
25
|
|
26
|
-
if config.memory.to_i*1024 != libvirt_domain.max_memory
|
27
|
-
libvirt_domain.max_memory = config.memory.to_i*1024
|
26
|
+
if config.memory.to_i * 1024 != libvirt_domain.max_memory
|
27
|
+
libvirt_domain.max_memory = config.memory.to_i * 1024
|
28
28
|
libvirt_domain.memory = libvirt_domain.max_memory
|
29
29
|
end
|
30
30
|
begin
|
@@ -34,46 +34,44 @@ module VagrantPlugins
|
|
34
34
|
descr_changed = false
|
35
35
|
|
36
36
|
# additional disk bus
|
37
|
-
config.disks.each
|
37
|
+
config.disks.each do |disk|
|
38
38
|
device = disk[:device]
|
39
39
|
bus = disk[:bus]
|
40
|
-
REXML::XPath.each(xml_descr,'/domain/devices/disk[@device="disk"]/target[@dev="'+device+'"]')
|
41
|
-
|
42
|
-
descr_changed = true
|
43
|
-
disk_target.attributes['bus'] = bus
|
44
|
-
disk_target.parent.delete_element("#{disk_target.parent.xpath}/address")
|
45
|
-
end
|
46
|
-
}
|
47
|
-
}
|
48
|
-
|
49
|
-
# disk_bus
|
50
|
-
REXML::XPath.each(xml_descr,'/domain/devices/disk[@device="disk"]/target[@dev="vda"]') {|disk_target|
|
51
|
-
if disk_target.attributes['bus'] != config.disk_bus
|
40
|
+
REXML::XPath.each(xml_descr, '/domain/devices/disk[@device="disk"]/target[@dev="' + device + '"]') do |disk_target|
|
41
|
+
next unless disk_target.attributes['bus'] != bus
|
52
42
|
descr_changed = true
|
53
|
-
disk_target.attributes['bus'] =
|
43
|
+
disk_target.attributes['bus'] = bus
|
54
44
|
disk_target.parent.delete_element("#{disk_target.parent.xpath}/address")
|
55
45
|
end
|
56
|
-
|
46
|
+
end
|
47
|
+
|
48
|
+
# disk_bus
|
49
|
+
REXML::XPath.each(xml_descr, '/domain/devices/disk[@device="disk"]/target[@dev="vda"]') do |disk_target|
|
50
|
+
next unless disk_target.attributes['bus'] != config.disk_bus
|
51
|
+
descr_changed = true
|
52
|
+
disk_target.attributes['bus'] = config.disk_bus
|
53
|
+
disk_target.parent.delete_element("#{disk_target.parent.xpath}/address")
|
54
|
+
end
|
57
55
|
|
58
56
|
# Iterface type
|
59
|
-
REXML::XPath.each(xml_descr,'/domain/devices/interface/model')
|
57
|
+
REXML::XPath.each(xml_descr, '/domain/devices/interface/model') do |iface_model|
|
60
58
|
if iface_model.attributes['type'] != config.nic_model_type
|
61
59
|
descr_changed = true
|
62
60
|
iface_model.attributes['type'] = config.nic_model_type
|
63
61
|
end
|
64
|
-
|
62
|
+
end
|
65
63
|
|
66
64
|
# vCpu count
|
67
65
|
if config.cpus.to_i != libvirt_domain.vcpus.length
|
68
66
|
descr_changed = true
|
69
|
-
REXML::XPath.first(xml_descr,'/domain/vcpu').text = config.cpus
|
67
|
+
REXML::XPath.first(xml_descr, '/domain/vcpu').text = config.cpus
|
70
68
|
end
|
71
69
|
|
72
70
|
# cpu_mode
|
73
|
-
cpu = REXML::XPath.first(xml_descr,'/domain/cpu')
|
71
|
+
cpu = REXML::XPath.first(xml_descr, '/domain/cpu')
|
74
72
|
if cpu.nil?
|
75
73
|
descr_changed = true
|
76
|
-
cpu = REXML::Element.new('cpu', REXML::XPath.first(xml_descr,'/domain'))
|
74
|
+
cpu = REXML::Element.new('cpu', REXML::XPath.first(xml_descr, '/domain'))
|
77
75
|
cpu.attributes['mode'] = config.cpu_mode
|
78
76
|
else
|
79
77
|
if cpu.attributes['mode'] != config.cpu_mode
|
@@ -83,10 +81,10 @@ module VagrantPlugins
|
|
83
81
|
end
|
84
82
|
|
85
83
|
if config.cpu_mode != 'host-passthrough'
|
86
|
-
cpu_model = REXML::XPath.first(xml_descr,'/domain/cpu/model')
|
84
|
+
cpu_model = REXML::XPath.first(xml_descr, '/domain/cpu/model')
|
87
85
|
if cpu_model.nil?
|
88
86
|
descr_changed = true
|
89
|
-
cpu_model = REXML::Element.new('model', REXML::XPath.first(xml_descr,'/domain/cpu'))
|
87
|
+
cpu_model = REXML::Element.new('model', REXML::XPath.first(xml_descr, '/domain/cpu'))
|
90
88
|
cpu_model.attributes['fallback'] = 'allow'
|
91
89
|
cpu_model.text = config.cpu_model
|
92
90
|
else
|
@@ -99,46 +97,46 @@ module VagrantPlugins
|
|
99
97
|
cpu_model.attributes['fallback'] = config.cpu_fallback
|
100
98
|
end
|
101
99
|
end
|
102
|
-
vmx_feature = REXML::XPath.first(xml_descr,'/domain/cpu/feature[@name="vmx"]')
|
103
|
-
svm_feature = REXML::XPath.first(xml_descr,'/domain/cpu/feature[@name="svm"]')
|
100
|
+
vmx_feature = REXML::XPath.first(xml_descr, '/domain/cpu/feature[@name="vmx"]')
|
101
|
+
svm_feature = REXML::XPath.first(xml_descr, '/domain/cpu/feature[@name="svm"]')
|
104
102
|
if config.nested
|
105
103
|
if vmx_feature.nil?
|
106
104
|
descr_changed = true
|
107
|
-
vmx_feature = REXML::Element.new('feature', REXML::XPath.first(xml_descr,'/domain/cpu'))
|
105
|
+
vmx_feature = REXML::Element.new('feature', REXML::XPath.first(xml_descr, '/domain/cpu'))
|
108
106
|
vmx_feature.attributes['policy'] = 'optional'
|
109
107
|
vmx_feature.attributes['name'] = 'vmx'
|
110
108
|
end
|
111
109
|
if svm_feature.nil?
|
112
110
|
descr_changed = true
|
113
|
-
svm_feature = REXML::Element.new('feature', REXML::XPath.first(xml_descr,'/domain/cpu'))
|
111
|
+
svm_feature = REXML::Element.new('feature', REXML::XPath.first(xml_descr, '/domain/cpu'))
|
114
112
|
svm_feature.attributes['policy'] = 'optional'
|
115
113
|
svm_feature.attributes['name'] = 'svm'
|
116
114
|
end
|
117
115
|
else
|
118
|
-
|
116
|
+
unless vmx_feature.nil?
|
119
117
|
descr_changed = true
|
120
118
|
cpu.delete_element(vmx_feature)
|
121
119
|
end
|
122
|
-
|
120
|
+
unless svm_feature.nil?
|
123
121
|
descr_changed = true
|
124
122
|
cpu.delete_element(svm_feature)
|
125
123
|
end
|
126
124
|
end
|
127
125
|
else
|
128
|
-
|
126
|
+
unless cpu.elements.to_a.empty?
|
129
127
|
descr_changed = true
|
130
|
-
cpu.elements.each
|
128
|
+
cpu.elements.each do |elem|
|
131
129
|
cpu.delete_element(elem)
|
132
|
-
|
130
|
+
end
|
133
131
|
end
|
134
132
|
end
|
135
133
|
|
136
134
|
# Graphics
|
137
|
-
graphics = REXML::XPath.first(xml_descr,'/domain/devices/graphics')
|
135
|
+
graphics = REXML::XPath.first(xml_descr, '/domain/devices/graphics')
|
138
136
|
if config.graphics_type != 'none'
|
139
|
-
if graphics.nil?
|
137
|
+
if graphics.nil?
|
140
138
|
descr_changed = true
|
141
|
-
graphics = REXML::Element.new('graphics', REXML::XPath.first(xml_descr,'/domain/devices'))
|
139
|
+
graphics = REXML::Element.new('graphics', REXML::XPath.first(xml_descr, '/domain/devices'))
|
142
140
|
end
|
143
141
|
if graphics.attributes['type'] != config.graphics_type
|
144
142
|
descr_changed = true
|
@@ -168,21 +166,19 @@ module VagrantPlugins
|
|
168
166
|
graphics.attributes['passwd'] = config.graphics_passwd
|
169
167
|
end
|
170
168
|
end
|
171
|
-
else
|
172
|
-
|
173
|
-
|
174
|
-
graphics.parent.delete_element(graphics)
|
175
|
-
end
|
169
|
+
else
|
170
|
+
# graphics_type = none, remove entire element
|
171
|
+
graphics.parent.delete_element(graphics) unless graphics.nil?
|
176
172
|
end
|
177
173
|
|
178
|
-
#TPM
|
174
|
+
# TPM
|
179
175
|
if config.tpm_path
|
180
|
-
raise Errors::FogCreateServerError,
|
176
|
+
raise Errors::FogCreateServerError, 'The TPM Path must be fully qualified' unless config.tpm_path[0].chr == '/'
|
181
177
|
|
182
|
-
tpm = REXML::XPath.first(xml_descr,'/domain/devices/tpm')
|
178
|
+
tpm = REXML::XPath.first(xml_descr, '/domain/devices/tpm')
|
183
179
|
if tpm.nil?
|
184
180
|
descr_changed = true
|
185
|
-
tpm = REXML::Element.new('tpm', REXML::XPath.first(xml_descr,'/domain/devices/tpm/model'))
|
181
|
+
tpm = REXML::Element.new('tpm', REXML::XPath.first(xml_descr, '/domain/devices/tpm/model'))
|
186
182
|
tpm.attributes['model'] = config.tpm_model
|
187
183
|
tpm_backend_type = tpm.add_element('backend')
|
188
184
|
tpm_backend_type.attributes['type'] = config.tpm_type
|
@@ -205,15 +201,15 @@ module VagrantPlugins
|
|
205
201
|
end
|
206
202
|
|
207
203
|
# Video device
|
208
|
-
video = REXML::XPath.first(xml_descr,'/domain/devices/video')
|
209
|
-
if !video.nil?
|
204
|
+
video = REXML::XPath.first(xml_descr, '/domain/devices/video')
|
205
|
+
if !video.nil? && (config.graphics_type == 'none')
|
210
206
|
# graphics_type = none, video devices are removed since there is no possible output
|
211
207
|
descr_changed = true
|
212
208
|
video.parent.delete_element(video)
|
213
209
|
else
|
214
|
-
video_model = REXML::XPath.first(xml_descr,'/domain/devices/video/model')
|
210
|
+
video_model = REXML::XPath.first(xml_descr, '/domain/devices/video/model')
|
215
211
|
if video_model.nil?
|
216
|
-
video_model = REXML::Element.new('model', REXML::XPath.first(xml_descr,'/domain/devices/video'))
|
212
|
+
video_model = REXML::Element.new('model', REXML::XPath.first(xml_descr, '/domain/devices/video'))
|
217
213
|
video_model.attributes['type'] = config.video_type
|
218
214
|
video_model.attributes['vram'] = config.video_vram
|
219
215
|
else
|
@@ -227,10 +223,10 @@ module VagrantPlugins
|
|
227
223
|
|
228
224
|
# dtb
|
229
225
|
if config.dtb
|
230
|
-
dtb = REXML::XPath.first(xml_descr,'/domain/os/dtb')
|
226
|
+
dtb = REXML::XPath.first(xml_descr, '/domain/os/dtb')
|
231
227
|
if dtb.nil?
|
232
228
|
descr_changed = true
|
233
|
-
dtb = REXML::Element.new('dtb', REXML::XPath.first(xml_descr,'/domain/os'))
|
229
|
+
dtb = REXML::Element.new('dtb', REXML::XPath.first(xml_descr, '/domain/os'))
|
234
230
|
dtb.text = config.dtb
|
235
231
|
else
|
236
232
|
if dtb.text != config.dtb
|
@@ -242,10 +238,10 @@ module VagrantPlugins
|
|
242
238
|
|
243
239
|
# kernel and initrd
|
244
240
|
if config.kernel
|
245
|
-
kernel= REXML::XPath.first(xml_descr,'/domain/os/kernel')
|
241
|
+
kernel = REXML::XPath.first(xml_descr, '/domain/os/kernel')
|
246
242
|
if kernel.nil?
|
247
243
|
descr_changed = true
|
248
|
-
kernel = REXML::Element.new('kernel', REXML::XPath.first(xml_descr,'/domain/os'))
|
244
|
+
kernel = REXML::Element.new('kernel', REXML::XPath.first(xml_descr, '/domain/os'))
|
249
245
|
kernel.text = config.kernel
|
250
246
|
else
|
251
247
|
if kernel.text != config.kernel
|
@@ -255,10 +251,10 @@ module VagrantPlugins
|
|
255
251
|
end
|
256
252
|
end
|
257
253
|
if config.initrd
|
258
|
-
initrd = REXML::XPath.first(xml_descr,'/domain/os/initrd')
|
254
|
+
initrd = REXML::XPath.first(xml_descr, '/domain/os/initrd')
|
259
255
|
if initrd.nil?
|
260
256
|
descr_changed = true
|
261
|
-
initrd = REXML::Element.new('initrd', REXML::XPath.first(xml_descr,'/domain/os'))
|
257
|
+
initrd = REXML::Element.new('initrd', REXML::XPath.first(xml_descr, '/domain/os'))
|
262
258
|
initrd.text = config.initrd
|
263
259
|
else
|
264
260
|
if initrd.text != config.initrd
|
@@ -272,12 +268,12 @@ module VagrantPlugins
|
|
272
268
|
if descr_changed
|
273
269
|
begin
|
274
270
|
libvirt_domain.undefine
|
275
|
-
new_descr =
|
271
|
+
new_descr = ''
|
276
272
|
xml_descr.write new_descr
|
277
273
|
server = env[:machine].provider.driver.connection.servers.create(xml: new_descr)
|
278
274
|
rescue Fog::Errors::Error => e
|
279
275
|
server = env[:machine].provider.driver.connection.servers.create(xml: descr)
|
280
|
-
raise Errors::FogCreateServerError, error_message:
|
276
|
+
raise Errors::FogCreateServerError, error_message: e.message
|
281
277
|
end
|
282
278
|
end
|
283
279
|
rescue => e
|
@@ -288,13 +284,12 @@ module VagrantPlugins
|
|
288
284
|
# Actually start the domain
|
289
285
|
domain.start
|
290
286
|
rescue => e
|
291
|
-
raise Errors::FogError, :
|
287
|
+
raise Errors::FogError, message: e.message
|
292
288
|
end
|
293
289
|
|
294
290
|
@app.call(env)
|
295
291
|
end
|
296
292
|
end
|
297
|
-
|
298
293
|
end
|
299
294
|
end
|
300
295
|
end
|
@@ -5,21 +5,21 @@ module VagrantPlugins
|
|
5
5
|
module Action
|
6
6
|
# Suspend domain.
|
7
7
|
class SuspendDomain
|
8
|
-
def initialize(app,
|
9
|
-
@logger = Log4r::Logger.new(
|
8
|
+
def initialize(app, _env)
|
9
|
+
@logger = Log4r::Logger.new('vagrant_libvirt::action::suspend_domain')
|
10
10
|
@app = app
|
11
11
|
end
|
12
12
|
|
13
13
|
# make pause
|
14
14
|
def call(env)
|
15
|
-
env[:ui].info(I18n.t(
|
15
|
+
env[:ui].info(I18n.t('vagrant_libvirt.suspending_domain'))
|
16
16
|
|
17
17
|
domain = env[:machine].provider.driver.connection.servers.get(env[:machine].id.to_s)
|
18
|
-
raise Errors::NoDomainError if domain
|
18
|
+
raise Errors::NoDomainError if domain.nil?
|
19
19
|
|
20
20
|
config = env[:machine].provider_config
|
21
21
|
if config.suspend_mode == 'managedsave'
|
22
|
-
libvirt_domain =
|
22
|
+
libvirt_domain = env[:machine].provider.driver.connection.client.lookup_domain_by_uuid(env[:machine].id)
|
23
23
|
begin
|
24
24
|
libvirt_domain.managed_save
|
25
25
|
rescue => e
|