From 1fd789534d050fca7125e17978b351592f96fa46 Mon Sep 17 00:00:00 2001 From: Max Kutsevol Date: Tue, 6 Oct 2015 11:59:36 +0300 Subject: [PATCH] Customising libvirt settings can only be done when creating a box #418 * Fixed regression when using additional disks. Now disk_bus setting applies only to main disk. * Added ability to change additional disk bus on reload. Updated readme. Task-Url: https://github.com/pradels/vagrant-libvirt/issues/418 Signed-off-by: Max Kutsevol --- README.md | 7 +++++++ lib/vagrant-libvirt/action/start_domain.rb | 17 +++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 92679ce..eca281b 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ welcome and can help a lot :-) - [Public Network Options](#public-network-options) - [Management Network](#management-network) - [Additional Disks](#additional-disks) + - [Reload behavior](#reload-behavior-1) - [CDROMs](#cdroms) - [Input](#input) - [No box and PXE boot](#no-box-and-pxe-boot) @@ -455,6 +456,12 @@ Vagrant.configure("2") do |config| end ``` +### Reload behavior + +On vagrant reload the following additional disk attributes are updated in defined domain: + +* `bus` - Updated. Uses `device` as a search marker. It is not required to define `device`, but it's recommended. If `device` is defined then the order of addtitional disk definition becomes irrelevant. + ## CDROMs You can attach up to four (4) CDROMs to a VM via `libvirt.storage :file, :device => :cdrom`. Available options are: diff --git a/lib/vagrant-libvirt/action/start_domain.rb b/lib/vagrant-libvirt/action/start_domain.rb index 3c52018..8f38a8a 100644 --- a/lib/vagrant-libvirt/action/start_domain.rb +++ b/lib/vagrant-libvirt/action/start_domain.rb @@ -33,12 +33,25 @@ module VagrantPlugins xml_descr = REXML::Document.new descr descr_changed = false + # additional disk bus + config.disks.each {|disk| + device = disk[:device] + bus = disk[:bus] + REXML::XPath.each(xml_descr,'/domain/devices/disk[@device="disk"]/target[@dev="'+device+'"]') {|disk_target| + if disk_target.attributes['bus'] != bus + descr_changed = true + disk_target.attributes['bus'] = bus + disk_target.parent.delete_element("#{disk_target.parent.xpath}/address") + end + } + } + # disk_bus - REXML::XPath.each(xml_descr,'/domain/devices/disk[@device="disk"]/target') {|disk_target| + REXML::XPath.each(xml_descr,'/domain/devices/disk[@device="disk"]/target[@dev="vda"]') {|disk_target| if disk_target.attributes['bus'] != config.disk_bus descr_changed = true disk_target.attributes['bus'] = config.disk_bus - disk_target.parent.delete_element('//address') + disk_target.parent.delete_element("#{disk_target.parent.xpath}/address") end }