lib/vagrant-libvirt/action/start_domain.rb in vagrant-libvirt-0.0.32 vs lib/vagrant-libvirt/action/start_domain.rb in vagrant-libvirt-0.0.33
- old
+ new
@@ -21,12 +21,12 @@
begin
# update domain settings on change.
libvirt_domain = env[:machine].provider.driver.connection.client.lookup_domain_by_uuid(env[:machine].id)
- if config.memory*1024 != libvirt_domain.max_memory
- libvirt_domain.max_memory = config.memory*1024
+ if config.memory.to_i*1024 != libvirt_domain.max_memory
+ libvirt_domain.max_memory = config.memory.to_i*1024
libvirt_domain.memory = libvirt_domain.max_memory
end
begin
# XML definition manipulation
descr = libvirt_domain.xml_desc(1)
@@ -86,11 +86,20 @@
cpu_model = REXML::XPath.first(xml_descr,'/domain/cpu/model')
if cpu_model.nil?
descr_changed = true
cpu_model = REXML::Element.new('model', REXML::XPath.first(xml_descr,'/domain/cpu'))
cpu_model.attributes['fallback'] = 'allow'
- cpu_model.text = 'qemu64'
+ cpu_model.text = config.cpu_model
+ else
+ if cpu_model.text != config.cpu_model
+ descr_changed = true
+ cpu_model.text = config.cpu_model
+ end
+ if cpu_model.attributes['fallback'] != config.cpu_fallback
+ descr_changed = true
+ cpu_model.attributes['fallback'] = config.cpu_fallback
+ end
end
vmx_feature = REXML::XPath.first(xml_descr,'/domain/cpu/feature[@name="vmx"]')
svm_feature = REXML::XPath.first(xml_descr,'/domain/cpu/feature[@name="svm"]')
if config.nested
if vmx_feature.nil?
@@ -124,47 +133,142 @@
end
end
# Graphics
graphics = REXML::XPath.first(xml_descr,'/domain/devices/graphics')
- if graphics.attributes['type'] != config.graphics_type
- descr_changed = true
- graphics.attributes['type'] = config.graphics_type
+ if config.graphics_type != 'none'
+ if graphics.nil?
+ descr_changed = true
+ graphics = REXML::Element.new('graphics', REXML::XPath.first(xml_descr,'/domain/devices'))
+ end
+ if graphics.attributes['type'] != config.graphics_type
+ descr_changed = true
+ graphics.attributes['type'] = config.graphics_type
+ end
+ if graphics.attributes['listen'] != config.graphics_ip
+ descr_changed = true
+ graphics.attributes['listen'] = config.graphics_ip
+ graphics.delete_element('//listen')
+ end
+ if graphics.attributes['autoport'] != config.graphics_autoport
+ descr_changed = true
+ graphics.attributes['autoport'] = config.graphics_autoport
+ if config.graphics_autoport == 'no'
+ graphics.attributes['port'] = config.graphics_port
+ end
+ end
+ if graphics.attributes['keymap'] != config.keymap
+ descr_changed = true
+ graphics.attributes['keymap'] = config.keymap
+ end
+ if graphics.attributes['passwd'] != config.graphics_passwd
+ descr_changed = true
+ if config.graphics_passwd.nil?
+ graphics.attributes.delete 'passwd'
+ else
+ graphics.attributes['passwd'] = config.graphics_passwd
+ end
+ end
+ else
+ # graphics_type = none, remove entire element
+ if !graphics.nil?
+ graphics.parent.delete_element(graphics)
+ end
end
- if graphics.attributes['listen'] != config.graphics_ip
- descr_changed = true
- graphics.attributes['listen'] = config.graphics_ip
- graphics.delete_element('//listen')
+
+ #TPM
+ if config.tpm_path
+ raise Errors::FogCreateServerError, "The TPM Path must be fully qualified" unless config.tpm_path[0].chr == '/'
+
+ tpm = REXML::XPath.first(xml_descr,'/domain/devices/tpm')
+ if tpm.nil?
+ descr_changed = true
+ tpm = REXML::Element.new('tpm', REXML::XPath.first(xml_descr,'/domain/devices/tpm/model'))
+ tpm.attributes['model'] = config.tpm_model
+ tpm_backend_type = tpm.add_element('backend')
+ tpm_backend_type.attributes['type'] = config.tpm_type
+ tpm_device_path = tpm_backend_type.add_element('device')
+ tpm_device_path.attributes['path'] = config.tpm_path
+ else
+ if tpm.attributes['model'] != config.tpm_model
+ descr_changed = true
+ tpm.attributes['model'] = config.tpm_model
+ end
+ if tpm.elements['backend'].attributes['type'] != config.tpm_type
+ descr_changed = true
+ tpm.elements['backend'].attributes['type'] = config.tpm_type
+ end
+ if tpm.elements['backend'].elements['device'].attributes['path'] != config.tpm_path
+ descr_changed = true
+ tpm.elements['backend'].elements['device'].attributes['path'] = config.tpm_path
+ end
+ end
end
- if graphics.attributes['autoport'] != config.graphics_autoport
+
+ # Video device
+ video = REXML::XPath.first(xml_descr,'/domain/devices/video')
+ if !video.nil? and config.graphics_type == 'none'
+ # graphics_type = none, video devices are removed since there is no possible output
descr_changed = true
- graphics.attributes['autoport'] = config.graphics_autoport
- if config.graphics_autoport == 'no'
- graphics.attributes['port'] = config.graphics_port
+ video.parent.delete_element(video)
+ else
+ video_model = REXML::XPath.first(xml_descr,'/domain/devices/video/model')
+ if video_model.nil?
+ video_model = REXML::Element.new('model', REXML::XPath.first(xml_descr,'/domain/devices/video'))
+ video_model.attributes['type'] = config.video_type
+ video_model.attributes['vram'] = config.video_vram
+ else
+ if video_model.attributes['type'] != config.video_type || video_model.attributes['vram'] != config.video_vram
+ descr_changed = true
+ video_model.attributes['type'] = config.video_type
+ video_model.attributes['vram'] = config.video_vram
+ end
end
end
- if graphics.attributes['keymap'] != config.keymap
- descr_changed = true
- graphics.attributes['keymap'] = config.keymap
- end
- if graphics.attributes['passwd'] != config.graphics_passwd
- descr_changed = true
- if config.graphics_passwd.nil?
- graphics.attributes.delete 'passwd'
+
+ # dtb
+ if config.dtb
+ dtb = REXML::XPath.first(xml_descr,'/domain/os/dtb')
+ if dtb.nil?
+ descr_changed = true
+ dtb = REXML::Element.new('dtb', REXML::XPath.first(xml_descr,'/domain/os'))
+ dtb.text = config.dtb
else
- graphics.attributes['passwd'] = config.graphics_passwd
+ if dtb.text != config.dtb
+ descr_changed = true
+ dtb.text = config.dtb
+ end
end
end
- # Video device
- video = REXML::XPath.first(xml_descr,'/domain/devices/video/model')
- if video.attributes['type'] != config.video_type || video.attributes['vram'] != config.video_vram
- descr_changed = true
- video.attributes.each_attribute {|attr| video.attributes.delete attr}
- video.attributes['type'] = config.video_type
- video.attributes['vram'] = config.video_vram
+ # kernel and initrd
+ if config.kernel
+ kernel= REXML::XPath.first(xml_descr,'/domain/os/kernel')
+ if kernel.nil?
+ descr_changed = true
+ kernel = REXML::Element.new('kernel', REXML::XPath.first(xml_descr,'/domain/os'))
+ kernel.text = config.kernel
+ else
+ if kernel.text != config.kernel
+ descr_changed = true
+ kernel.text = config.kernel
+ end
+ end
end
+ if config.initrd
+ initrd = REXML::XPath.first(xml_descr,'/domain/os/initrd')
+ if initrd.nil?
+ descr_changed = true
+ initrd = REXML::Element.new('initrd', REXML::XPath.first(xml_descr,'/domain/os'))
+ initrd.text = config.initrd
+ else
+ if initrd.text != config.initrd
+ descr_changed = true
+ initrd.text = config.initrd
+ end
+ end
+ end
# Apply
if descr_changed
begin
libvirt_domain.undefine
@@ -177,9 +281,11 @@
end
end
rescue => e
env[:ui].error("Error when updating domain settings: #{e.message}")
end
+ # Autostart with host if enabled in Vagrantfile
+ libvirt_domain.autostart = config.autostart
# Actually start the domain
domain.start
rescue => e
raise Errors::FogError, :message => e.message
end