vagrant-libvirt 0.0.36 → 0.0.37
Sign up to get free protection for your applications and to get access to all the features.
- 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
|