vagrant-libvirt 0.0.40 → 0.0.41

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.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. metadata +13 -103
  3. data/.coveralls.yml +0 -1
  4. data/.github/issue_template.md +0 -37
  5. data/.gitignore +0 -21
  6. data/.travis.yml +0 -28
  7. data/CHANGELOG.md +0 -99
  8. data/Gemfile +0 -27
  9. data/LICENSE +0 -22
  10. data/README.md +0 -1311
  11. data/Rakefile +0 -8
  12. data/example_box/README.md +0 -29
  13. data/example_box/Vagrantfile +0 -60
  14. data/example_box/metadata.json +0 -5
  15. data/lib/vagrant-libvirt.rb +0 -29
  16. data/lib/vagrant-libvirt/action.rb +0 -362
  17. data/lib/vagrant-libvirt/action/create_domain.rb +0 -313
  18. data/lib/vagrant-libvirt/action/create_domain_volume.rb +0 -87
  19. data/lib/vagrant-libvirt/action/create_network_interfaces.rb +0 -294
  20. data/lib/vagrant-libvirt/action/create_networks.rb +0 -353
  21. data/lib/vagrant-libvirt/action/destroy_domain.rb +0 -83
  22. data/lib/vagrant-libvirt/action/destroy_networks.rb +0 -95
  23. data/lib/vagrant-libvirt/action/forward_ports.rb +0 -221
  24. data/lib/vagrant-libvirt/action/halt_domain.rb +0 -35
  25. data/lib/vagrant-libvirt/action/handle_box_image.rb +0 -156
  26. data/lib/vagrant-libvirt/action/handle_storage_pool.rb +0 -57
  27. data/lib/vagrant-libvirt/action/is_created.rb +0 -18
  28. data/lib/vagrant-libvirt/action/is_running.rb +0 -21
  29. data/lib/vagrant-libvirt/action/is_suspended.rb +0 -42
  30. data/lib/vagrant-libvirt/action/message_already_created.rb +0 -16
  31. data/lib/vagrant-libvirt/action/message_not_created.rb +0 -16
  32. data/lib/vagrant-libvirt/action/message_not_running.rb +0 -16
  33. data/lib/vagrant-libvirt/action/message_not_suspended.rb +0 -16
  34. data/lib/vagrant-libvirt/action/package_domain.rb +0 -105
  35. data/lib/vagrant-libvirt/action/prepare_nfs_settings.rb +0 -94
  36. data/lib/vagrant-libvirt/action/prepare_nfs_valid_ids.rb +0 -17
  37. data/lib/vagrant-libvirt/action/prune_nfs_exports.rb +0 -27
  38. data/lib/vagrant-libvirt/action/read_mac_addresses.rb +0 -40
  39. data/lib/vagrant-libvirt/action/remove_libvirt_image.rb +0 -20
  40. data/lib/vagrant-libvirt/action/remove_stale_volume.rb +0 -50
  41. data/lib/vagrant-libvirt/action/resume_domain.rb +0 -34
  42. data/lib/vagrant-libvirt/action/set_boot_order.rb +0 -109
  43. data/lib/vagrant-libvirt/action/set_name_of_domain.rb +0 -64
  44. data/lib/vagrant-libvirt/action/share_folders.rb +0 -71
  45. data/lib/vagrant-libvirt/action/start_domain.rb +0 -303
  46. data/lib/vagrant-libvirt/action/suspend_domain.rb +0 -40
  47. data/lib/vagrant-libvirt/action/wait_till_up.rb +0 -102
  48. data/lib/vagrant-libvirt/cap/mount_p9.rb +0 -42
  49. data/lib/vagrant-libvirt/cap/nic_mac_addresses.rb +0 -17
  50. data/lib/vagrant-libvirt/cap/synced_folder.rb +0 -113
  51. data/lib/vagrant-libvirt/config.rb +0 -698
  52. data/lib/vagrant-libvirt/driver.rb +0 -118
  53. data/lib/vagrant-libvirt/errors.rb +0 -149
  54. data/lib/vagrant-libvirt/plugin.rb +0 -92
  55. data/lib/vagrant-libvirt/provider.rb +0 -130
  56. data/lib/vagrant-libvirt/templates/default_storage_pool.xml.erb +0 -13
  57. data/lib/vagrant-libvirt/templates/domain.xml.erb +0 -229
  58. data/lib/vagrant-libvirt/templates/private_network.xml.erb +0 -34
  59. data/lib/vagrant-libvirt/templates/public_interface.xml.erb +0 -23
  60. data/lib/vagrant-libvirt/util.rb +0 -11
  61. data/lib/vagrant-libvirt/util/collection.rb +0 -19
  62. data/lib/vagrant-libvirt/util/erb_template.rb +0 -22
  63. data/lib/vagrant-libvirt/util/error_codes.rb +0 -100
  64. data/lib/vagrant-libvirt/util/network_util.rb +0 -138
  65. data/lib/vagrant-libvirt/util/timer.rb +0 -17
  66. data/lib/vagrant-libvirt/version.rb +0 -5
  67. data/locales/en.yml +0 -159
  68. data/spec/spec_helper.rb +0 -9
  69. data/spec/support/environment_helper.rb +0 -46
  70. data/spec/support/libvirt_context.rb +0 -30
  71. data/spec/support/sharedcontext.rb +0 -34
  72. data/spec/unit/action/destroy_domain_spec.rb +0 -97
  73. data/spec/unit/action/set_name_of_domain_spec.rb +0 -21
  74. data/spec/unit/action/wait_till_up_spec.rb +0 -127
  75. data/spec/unit/config_spec.rb +0 -106
  76. data/spec/unit/templates/domain_all_settings.xml +0 -133
  77. data/spec/unit/templates/domain_defaults.xml +0 -46
  78. data/spec/unit/templates/domain_spec.rb +0 -75
  79. data/tools/create_box.sh +0 -130
  80. data/tools/prepare_redhat_for_box.sh +0 -119
  81. data/vagrant-libvirt.gemspec +0 -28
@@ -1,50 +0,0 @@
1
- require 'log4r'
2
- # require 'log4r/yamlconfigurator'
3
-
4
- module VagrantPlugins
5
- module ProviderLibvirt
6
- module Action
7
- class RemoveStaleVolume
8
- def initialize(app, _env)
9
- # log4r_config= YAML.load_file(File.join(File.dirname(__FILE__),"log4r.yaml"))
10
- # log_cfg = Log4r::YamlConfigurator
11
- # log_cfg.decode_yaml( log4r_config['log4r_config'] )
12
-
13
- @logger = Log4r::Logger.new('vagrant_libvirt::action::remove_stale_volume')
14
- @app = app
15
- end
16
-
17
- def call(env)
18
- # Remove stale server volume
19
- env[:ui].info(I18n.t('vagrant_libvirt.remove_stale_volume'))
20
-
21
- config = env[:machine].provider_config
22
- # Check for storage pool, where box image should be created
23
- fog_pool = ProviderLibvirt::Util::Collection.find_matching(
24
- env[:machine].provider.driver.connection.pools.all, config.storage_pool_name
25
- )
26
- @logger.debug("**** Pool #{fog_pool.name}")
27
-
28
- # This is name of newly created image for vm.
29
- name = "#{env[:domain_name]}.img"
30
- @logger.debug("**** Volume name #{name}")
31
-
32
- # remove root storage
33
- box_volume = ProviderLibvirt::Util::Collection.find_matching(
34
- env[:machine].provider.driver.connection.volumes.all, name
35
- )
36
- if box_volume && box_volume.pool_name == fog_pool.name
37
- @logger.info("Deleting volume #{box_volume.key}")
38
- box_volume.destroy
39
- env[:result] = box_volume
40
- else
41
- env[:result] = nil
42
- end
43
-
44
- # Continue the middleware chain.
45
- @app.call(env)
46
- end
47
- end
48
- end
49
- end
50
- end
@@ -1,34 +0,0 @@
1
- require 'log4r'
2
-
3
- module VagrantPlugins
4
- module ProviderLibvirt
5
- module Action
6
- # Resume suspended domain.
7
- class ResumeDomain
8
- def initialize(app, _env)
9
- @logger = Log4r::Logger.new('vagrant_libvirt::action::resume_domain')
10
- @app = app
11
- end
12
-
13
- def call(env)
14
- env[:ui].info(I18n.t('vagrant_libvirt.resuming_domain'))
15
-
16
- domain = env[:machine].provider.driver.connection.servers.get(env[:machine].id.to_s)
17
- raise Errors::NoDomainError if domain.nil?
18
-
19
- libvirt_domain = env[:machine].provider.driver.connection.client.lookup_domain_by_uuid(env[:machine].id)
20
- config = env[:machine].provider_config
21
- if config.suspend_mode == 'managedsave'
22
- domain.start
23
- else
24
- domain.resume
25
- end
26
-
27
- @logger.info("Machine #{env[:machine].id} is resumed.")
28
-
29
- @app.call(env)
30
- end
31
- end
32
- end
33
- end
34
- end
@@ -1,109 +0,0 @@
1
- require 'log4r'
2
- require 'nokogiri'
3
-
4
- module VagrantPlugins
5
- module ProviderLibvirt
6
- module Action
7
- # boot order useful for pxe in discovery workflow
8
- class SetBootOrder
9
- def initialize(app, env)
10
- @app = app
11
- @logger = Log4r::Logger.new('vagrant_libvirt::action::set_boot_order')
12
- config = env[:machine].provider_config
13
- @boot_order = config.boot_order
14
- end
15
-
16
- def call(env)
17
- # Get domain first
18
- begin
19
- domain = env[:machine].provider
20
- .driver
21
- .connection
22
- .client
23
- .lookup_domain_by_uuid(
24
- env[:machine].id.to_s
25
- )
26
- rescue => e
27
- raise Errors::NoDomainError,
28
- error_message: e.message
29
- end
30
-
31
- # Only execute specific boot ordering if this is defined
32
- # in the Vagrant file
33
- if @boot_order.count >= 1
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.
41
- xml = Nokogiri::XML(domain.xml_desc)
42
- xml.search('/domain/os/boot').each(&:remove)
43
-
44
- # Parse the XML and find each defined drive and network interfacee
45
- hd = xml.search("/domain/devices/disk[@device='disk']")
46
- cdrom = xml.search("/domain/devices/disk[@device='cdrom']")
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)
53
-
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 }
59
-
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
63
- final_boot_order.each_with_index do |node, index|
64
- boot = "<boot order='#{index + 1}'/>"
65
- node.add_child(boot)
66
- logger_msg(node, index)
67
- end
68
-
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)
76
- end
77
-
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
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}"
105
- end
106
- end
107
- end
108
- end
109
- end
@@ -1,64 +0,0 @@
1
- require 'securerandom'
2
- module VagrantPlugins
3
- module ProviderLibvirt
4
- module Action
5
- # Setup name for domain and domain volumes.
6
- class SetNameOfDomain
7
- def initialize(app, _env)
8
- @logger = Log4r::Logger.new('vagrant_libvirt::action::set_name_of_domain')
9
- @app = app
10
- end
11
-
12
- def call(env)
13
- env[:domain_name] = build_domain_name(env)
14
-
15
- begin
16
- @logger.info("Looking for domain #{env[:domain_name]} through list " \
17
- "#{env[:machine].provider.driver.connection.servers.all}")
18
- # Check if the domain name is not already taken
19
-
20
- domain = ProviderLibvirt::Util::Collection.find_matching(
21
- env[:machine].provider.driver.connection.servers.all, env[:domain_name]
22
- )
23
- rescue Fog::Errors::Error => e
24
- @logger.info(e.to_s)
25
- domain = nil
26
- end
27
-
28
- @logger.info("Looking for domain #{env[:domain_name]}")
29
-
30
- unless domain.nil?
31
- raise ProviderLibvirt::Errors::DomainNameExists,
32
- domain_name: env[:domain_name]
33
- end
34
-
35
- @app.call(env)
36
- end
37
-
38
- # build domain name
39
- # random_hostname option avoids
40
- # `domain about to create is already taken`
41
- # parsable and sortable by epoch time
42
- # @example
43
- # development-centos-6-chef-11_1404488971_3b7a569e2fd7c554b852
44
- # @return [String] libvirt domain name
45
- def build_domain_name(env)
46
- config = env[:machine].provider_config
47
- domain_name =
48
- if config.default_prefix.nil?
49
- env[:root_path].basename.to_s.dup.concat('_')
50
- elsif config.default_prefix.empty?
51
- # don't have any prefix, not even "_"
52
- ''
53
- else
54
- config.default_prefix.to_s.dup.concat('_')
55
- end
56
- domain_name << env[:machine].name.to_s
57
- domain_name.gsub!(/[^-a-z0-9_\.]/i, '')
58
- domain_name << "_#{Time.now.utc.to_i}_#{SecureRandom.hex(10)}" if config.random_hostname
59
- domain_name
60
- end
61
- end
62
- end
63
- end
64
- end
@@ -1,71 +0,0 @@
1
- require 'pathname'
2
-
3
- require 'log4r'
4
-
5
- module VagrantPlugins
6
- module ProviderLibvirt
7
- module Action
8
- class ShareFolders
9
- def initialize(app, _env)
10
- @logger = Log4r::Logger.new('vagrant::action::vm::share_folders')
11
- @app = app
12
- end
13
-
14
- def call(env)
15
- @env = env
16
-
17
- prepare_folders
18
- create_metadata
19
-
20
- @app.call(env)
21
- end
22
-
23
- # This method returns an actual list of shared
24
- # folders to create and their proper path.
25
- def shared_folders
26
- {}.tap do |result|
27
- @env[:machine].config.vm.synced_folders.each do |id, data|
28
- # Ignore NFS shared folders
29
- next if !data[:type] == :nfs
30
-
31
- # This to prevent overwriting the actual shared folders data
32
- result[id] = data.dup
33
- end
34
- end
35
- end
36
-
37
- # Prepares the shared folders by verifying they exist and creating them
38
- # if they don't.
39
- def prepare_folders
40
- shared_folders.each do |_id, options|
41
- hostpath = Pathname.new(options[:hostpath]).expand_path(@env[:root_path])
42
-
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
-
47
- begin
48
- hostpath.mkpath
49
- rescue Errno::EACCES
50
- raise Vagrant::Errors::SharedFolderCreateFailed,
51
- path: hostpath.to_s
52
- end
53
- end
54
- end
55
-
56
- def create_metadata
57
- @env[:ui].info I18n.t('vagrant.actions.vm.share_folders.creating')
58
-
59
- folders = []
60
- shared_folders.each do |id, data|
61
- folders << {
62
- name: id,
63
- hostpath: File.expand_path(data[:hostpath], @env[:root_path]),
64
- transient: data[:transient]
65
- }
66
- end
67
- end
68
- end
69
- end
70
- end
71
- end
@@ -1,303 +0,0 @@
1
- require 'log4r'
2
- require 'rexml/document'
3
-
4
- module VagrantPlugins
5
- module ProviderLibvirt
6
- module Action
7
- # Just start the domain.
8
- class StartDomain
9
- def initialize(app, _env)
10
- @logger = Log4r::Logger.new('vagrant_libvirt::action::start_domain')
11
- @app = app
12
- end
13
-
14
- def call(env)
15
- env[:ui].info(I18n.t('vagrant_libvirt.starting_domain'))
16
-
17
- domain = env[:machine].provider.driver.connection.servers.get(env[:machine].id.to_s)
18
- raise Errors::NoDomainError if domain.nil?
19
- config = env[:machine].provider_config
20
-
21
- begin
22
- # update domain settings on change.
23
-
24
- libvirt_domain = env[:machine].provider.driver.connection.client.lookup_domain_by_uuid(env[:machine].id)
25
-
26
- if config.memory.to_i * 1024 != libvirt_domain.max_memory
27
- libvirt_domain.max_memory = config.memory.to_i * 1024
28
- libvirt_domain.memory = libvirt_domain.max_memory
29
- end
30
- begin
31
- # XML definition manipulation
32
- descr = libvirt_domain.xml_desc(1)
33
- xml_descr = REXML::Document.new descr
34
- descr_changed = false
35
-
36
- # additional disk bus
37
- config.disks.each do |disk|
38
- device = disk[:device]
39
- bus = 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
42
- descr_changed = true
43
- disk_target.attributes['bus'] = bus
44
- disk_target.parent.delete_element("#{disk_target.parent.xpath}/address")
45
- end
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
55
-
56
- # Iterface type
57
- unless config.nic_model_type.nil?
58
- REXML::XPath.each(xml_descr, '/domain/devices/interface/model') do |iface_model|
59
- if iface_model.attributes['type'] != config.nic_model_type
60
- descr_changed = true
61
- iface_model.attributes['type'] = config.nic_model_type
62
- end
63
- end
64
- end
65
-
66
- # vCpu count
67
- if config.cpus.to_i != libvirt_domain.vcpus.length
68
- descr_changed = true
69
- REXML::XPath.first(xml_descr, '/domain/vcpu').text = config.cpus
70
- end
71
-
72
- # cpu_mode
73
- cpu = REXML::XPath.first(xml_descr, '/domain/cpu')
74
- if cpu.nil?
75
- descr_changed = true
76
- cpu = REXML::Element.new('cpu', REXML::XPath.first(xml_descr, '/domain'))
77
- cpu.attributes['mode'] = config.cpu_mode
78
- else
79
- if cpu.attributes['mode'] != config.cpu_mode
80
- descr_changed = true
81
- cpu.attributes['mode'] = config.cpu_mode
82
- end
83
- end
84
-
85
- if config.cpu_mode != 'host-passthrough'
86
- cpu_model = REXML::XPath.first(xml_descr, '/domain/cpu/model')
87
- if cpu_model.nil?
88
- descr_changed = true
89
- cpu_model = REXML::Element.new('model', REXML::XPath.first(xml_descr, '/domain/cpu'))
90
- cpu_model.attributes['fallback'] = 'allow'
91
- cpu_model.text = config.cpu_model
92
- else
93
- if cpu_model.text != config.cpu_model
94
- descr_changed = true
95
- cpu_model.text = config.cpu_model
96
- end
97
- if cpu_model.attributes['fallback'] != config.cpu_fallback
98
- descr_changed = true
99
- cpu_model.attributes['fallback'] = config.cpu_fallback
100
- end
101
- 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"]')
104
- if config.nested
105
- if vmx_feature.nil?
106
- descr_changed = true
107
- vmx_feature = REXML::Element.new('feature', REXML::XPath.first(xml_descr, '/domain/cpu'))
108
- vmx_feature.attributes['policy'] = 'optional'
109
- vmx_feature.attributes['name'] = 'vmx'
110
- end
111
- if svm_feature.nil?
112
- descr_changed = true
113
- svm_feature = REXML::Element.new('feature', REXML::XPath.first(xml_descr, '/domain/cpu'))
114
- svm_feature.attributes['policy'] = 'optional'
115
- svm_feature.attributes['name'] = 'svm'
116
- end
117
- else
118
- unless vmx_feature.nil?
119
- descr_changed = true
120
- cpu.delete_element(vmx_feature)
121
- end
122
- unless svm_feature.nil?
123
- descr_changed = true
124
- cpu.delete_element(svm_feature)
125
- end
126
- end
127
- else
128
- unless cpu.elements.to_a.empty?
129
- descr_changed = true
130
- cpu.elements.each do |elem|
131
- cpu.delete_element(elem)
132
- end
133
- end
134
- end
135
-
136
- # Graphics
137
- graphics = REXML::XPath.first(xml_descr, '/domain/devices/graphics')
138
- if config.graphics_type != 'none'
139
- if graphics.nil?
140
- descr_changed = true
141
- graphics = REXML::Element.new('graphics', REXML::XPath.first(xml_descr, '/domain/devices'))
142
- end
143
- if graphics.attributes['type'] != config.graphics_type
144
- descr_changed = true
145
- graphics.attributes['type'] = config.graphics_type
146
- end
147
- if graphics.attributes['listen'] != config.graphics_ip
148
- descr_changed = true
149
- graphics.attributes['listen'] = config.graphics_ip
150
- graphics.delete_element('//listen')
151
- end
152
- if graphics.attributes['autoport'] != config.graphics_autoport
153
- descr_changed = true
154
- graphics.attributes['autoport'] = config.graphics_autoport
155
- if config.graphics_autoport == 'no'
156
- graphics.attributes['port'] = config.graphics_port
157
- end
158
- end
159
- if graphics.attributes['keymap'] != config.keymap
160
- descr_changed = true
161
- graphics.attributes['keymap'] = config.keymap
162
- end
163
- if graphics.attributes['passwd'] != config.graphics_passwd
164
- descr_changed = true
165
- if config.graphics_passwd.nil?
166
- graphics.attributes.delete 'passwd'
167
- else
168
- graphics.attributes['passwd'] = config.graphics_passwd
169
- end
170
- end
171
- else
172
- # graphics_type = none, remove entire element
173
- graphics.parent.delete_element(graphics) unless graphics.nil?
174
- end
175
-
176
- # TPM
177
- if config.tpm_path
178
- raise Errors::FogCreateServerError, 'The TPM Path must be fully qualified' unless config.tpm_path[0].chr == '/'
179
-
180
- tpm = REXML::XPath.first(xml_descr, '/domain/devices/tpm')
181
- if tpm.nil?
182
- descr_changed = true
183
- tpm = REXML::Element.new('tpm', REXML::XPath.first(xml_descr, '/domain/devices/tpm/model'))
184
- tpm.attributes['model'] = config.tpm_model
185
- tpm_backend_type = tpm.add_element('backend')
186
- tpm_backend_type.attributes['type'] = config.tpm_type
187
- tpm_device_path = tpm_backend_type.add_element('device')
188
- tpm_device_path.attributes['path'] = config.tpm_path
189
- else
190
- if tpm.attributes['model'] != config.tpm_model
191
- descr_changed = true
192
- tpm.attributes['model'] = config.tpm_model
193
- end
194
- if tpm.elements['backend'].attributes['type'] != config.tpm_type
195
- descr_changed = true
196
- tpm.elements['backend'].attributes['type'] = config.tpm_type
197
- end
198
- if tpm.elements['backend'].elements['device'].attributes['path'] != config.tpm_path
199
- descr_changed = true
200
- tpm.elements['backend'].elements['device'].attributes['path'] = config.tpm_path
201
- end
202
- end
203
- end
204
-
205
- # Video device
206
- video = REXML::XPath.first(xml_descr, '/domain/devices/video')
207
- if !video.nil? && (config.graphics_type == 'none')
208
- # graphics_type = none, video devices are removed since there is no possible output
209
- descr_changed = true
210
- video.parent.delete_element(video)
211
- else
212
- video_model = REXML::XPath.first(xml_descr, '/domain/devices/video/model')
213
- if video_model.nil?
214
- video_model = REXML::Element.new('model', REXML::XPath.first(xml_descr, '/domain/devices/video'))
215
- video_model.attributes['type'] = config.video_type
216
- video_model.attributes['vram'] = config.video_vram
217
- else
218
- if video_model.attributes['type'] != config.video_type || video_model.attributes['vram'] != config.video_vram
219
- descr_changed = true
220
- video_model.attributes['type'] = config.video_type
221
- video_model.attributes['vram'] = config.video_vram
222
- end
223
- end
224
- end
225
-
226
- # Sound device
227
- if config.sound_type
228
- sound = REXML::XPath.first(xml_descr,'/domain/devices/sound/model')
229
- end
230
-
231
-
232
- # dtb
233
- if config.dtb
234
- dtb = REXML::XPath.first(xml_descr, '/domain/os/dtb')
235
- if dtb.nil?
236
- descr_changed = true
237
- dtb = REXML::Element.new('dtb', REXML::XPath.first(xml_descr, '/domain/os'))
238
- dtb.text = config.dtb
239
- else
240
- if dtb.text != config.dtb
241
- descr_changed = true
242
- dtb.text = config.dtb
243
- end
244
- end
245
- end
246
-
247
- # kernel and initrd
248
- if config.kernel
249
- kernel = REXML::XPath.first(xml_descr, '/domain/os/kernel')
250
- if kernel.nil?
251
- descr_changed = true
252
- kernel = REXML::Element.new('kernel', REXML::XPath.first(xml_descr, '/domain/os'))
253
- kernel.text = config.kernel
254
- else
255
- if kernel.text != config.kernel
256
- descr_changed = true
257
- kernel.text = config.kernel
258
- end
259
- end
260
- end
261
- if config.initrd
262
- initrd = REXML::XPath.first(xml_descr, '/domain/os/initrd')
263
- if initrd.nil?
264
- descr_changed = true
265
- initrd = REXML::Element.new('initrd', REXML::XPath.first(xml_descr, '/domain/os'))
266
- initrd.text = config.initrd
267
- else
268
- if initrd.text != config.initrd
269
- descr_changed = true
270
- initrd.text = config.initrd
271
- end
272
- end
273
- end
274
-
275
- # Apply
276
- if descr_changed
277
- begin
278
- libvirt_domain.undefine
279
- new_descr = ''
280
- xml_descr.write new_descr
281
- server = env[:machine].provider.driver.connection.servers.create(xml: new_descr)
282
- rescue Fog::Errors::Error => e
283
- server = env[:machine].provider.driver.connection.servers.create(xml: descr)
284
- raise Errors::FogCreateServerError, error_message: e.message
285
- end
286
- end
287
- rescue => e
288
- env[:ui].error("Error when updating domain settings: #{e.message}")
289
- end
290
- # Autostart with host if enabled in Vagrantfile
291
- libvirt_domain.autostart = config.autostart
292
- # Actually start the domain
293
- domain.start
294
- rescue => e
295
- raise Errors::FogError, message: e.message
296
- end
297
-
298
- @app.call(env)
299
- end
300
- end
301
- end
302
- end
303
- end