vagrant-libvirt 0.12.1 → 0.12.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8ea176b68227366ddb6ac763a2e66c55cffaa58e9d4cc188f3f8b6c62bb3cd06
4
- data.tar.gz: a8cfb80de7f57fbcd2e4bec2fdf7f7043a81f410da00606a5f88897374535baf
3
+ metadata.gz: '0825408b8026061a93791df6756ce840683b4ac6a314cfec9ac1254b5ebb35d7'
4
+ data.tar.gz: 6c933dfb97f1e8cf9c5ce3e14ecdef59abbdd6dac4d9822e712571634b0d3d3a
5
5
  SHA512:
6
- metadata.gz: 9b005c6323cee5bfe5facbe14d5b3f7acddd9076b428d126acd220080b5946107795eee6726893bdfc7e9e67b08534a8c475b9f1d6c8de79f79dcf8c125564e8
7
- data.tar.gz: 257c7b4bf7c7390c0013101eb6541d43e2d60d871309053201376b5cfff5439610f5aacb05775b24b37ddc374b2d8dff4deab0a8163c4821a5f34c7c5d76ed35
6
+ metadata.gz: 0b73ba987dd3e61e77062c36f995da22d4b934ccd78ba0cc6b3a083f6623bf99198c523bf38a9f6152c4fc958a36eb89afdd521c9b50af7dce819fdd1aa400a8
7
+ data.tar.gz: 174c59f4549f98b73987e5b308c3d52161ec54e2265838c143834ca7e90bfe4646c90e495520b660b201d094ef2634b082daeec2d4ed47c9948b8a4899d7102e
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'stackprof-flamegraph.pl' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../../../../../SynologyDrive/git/github.com/vagrant-libvirt/vagrant-libvirt/Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("vagrant-libvirt", "stackprof-flamegraph.pl")
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'stackprof-gprof2dot.py' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../../../../../SynologyDrive/git/github.com/vagrant-libvirt/vagrant-libvirt/Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("vagrant-libvirt", "stackprof-gprof2dot.py")
@@ -1,8 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'log4r'
4
- require 'vagrant/util/network_ip'
5
- require 'vagrant/util/scoped_hash_override'
6
4
 
7
5
  require 'vagrant-libvirt/util/erb_template'
8
6
  require 'vagrant-libvirt/util/network_util'
@@ -15,15 +13,12 @@ module VagrantPlugins
15
13
  class CreateNetworkInterfaces
16
14
  include VagrantPlugins::ProviderLibvirt::Util::ErbTemplate
17
15
  include VagrantPlugins::ProviderLibvirt::Util::NetworkUtil
18
- include Vagrant::Util::NetworkIP
19
- include Vagrant::Util::ScopedHashOverride
20
16
 
21
17
  def initialize(app, env)
22
18
  @logger = Log4r::Logger.new('vagrant_libvirt::action::create_network_interfaces')
23
19
  @management_network_name = env[:machine].provider_config.management_network_name
24
20
  config = env[:machine].provider_config
25
- @nic_model_type = config.nic_model_type || 'virtio'
26
- @nic_adapter_count = config.nic_adapter_count
21
+ @nic_model_type = config.nic_model_type
27
22
  @app = app
28
23
  end
29
24
 
@@ -39,34 +34,7 @@ module VagrantPlugins
39
34
  end
40
35
 
41
36
  # Setup list of interfaces before creating them.
42
- adapters = []
43
-
44
- # Vagrant gives you adapter 0 by default
45
- # Assign interfaces to slots.
46
- configured_networks(env[:machine], @logger).each do |options|
47
- # don't need to create interface for this type
48
- next if options[:iface_type] == :forwarded_port
49
-
50
- # TODO: fill first ifaces with adapter option specified.
51
- if options[:adapter]
52
- if adapters[options[:adapter]]
53
- raise Errors::InterfaceSlotNotAvailable
54
- end
55
-
56
- free_slot = options[:adapter].to_i
57
- @logger.debug "Using specified adapter slot #{free_slot}"
58
- else
59
- free_slot = find_empty(adapters)
60
- @logger.debug "Adapter not specified so found slot #{free_slot}"
61
- raise Errors::InterfaceSlotExhausted if free_slot.nil?
62
- end
63
-
64
- # We have slot for interface, fill it with interface configuration.
65
- adapters[free_slot] = options
66
- adapters[free_slot][:network_name] = interface_network(
67
- env[:machine].provider.driver, adapters[free_slot]
68
- )
69
- end
37
+ adapters = network_interfaces(env[:machine], @logger)
70
38
 
71
39
  # Create each interface as new domain device.
72
40
  @macs_per_network = Hash.new(0)
@@ -286,41 +254,6 @@ module VagrantPlugins
286
254
  Nokogiri::XML::Node::SaveOptions::FORMAT
287
255
  )
288
256
  end
289
-
290
- def find_empty(array, start = 0, stop = @nic_adapter_count)
291
- (start..stop).each do |i|
292
- return i unless array[i]
293
- end
294
- nil
295
- end
296
-
297
- # Return network name according to interface options.
298
- def interface_network(driver, options)
299
- # no need to get interface network for tcp tunnel config
300
- return 'tunnel_interface' if options.fetch(:tunnel_type, nil)
301
-
302
- if options[:network_name]
303
- @logger.debug 'Found network by name'
304
- return options[:network_name]
305
- end
306
-
307
- # Get list of all (active and inactive) Libvirt networks.
308
- available_networks = libvirt_networks(driver)
309
-
310
- return 'public' if options[:iface_type] == :public_network
311
-
312
- if options[:ip]
313
- address = network_address(options[:ip], options[:netmask])
314
- available_networks.each do |network|
315
- if address == network[:network_address]
316
- @logger.debug 'Found network by ip'
317
- return network[:name]
318
- end
319
- end
320
- end
321
-
322
- raise Errors::NetworkNotAvailableError, network_name: options[:ip]
323
- end
324
257
  end
325
258
  end
326
259
  end
@@ -6,6 +6,7 @@ require 'rexml/document'
6
6
  require 'rexml/formatters/pretty'
7
7
  require 'rexml/xpath'
8
8
 
9
+ require 'vagrant-libvirt/util/network_util'
9
10
  require 'vagrant-libvirt/util/xml'
10
11
 
11
12
  module VagrantPlugins
@@ -13,9 +14,11 @@ module VagrantPlugins
13
14
  module Action
14
15
  # Just start the domain.
15
16
  class StartDomain
17
+ include VagrantPlugins::ProviderLibvirt::Util::NetworkUtil
16
18
 
17
- def initialize(app, _env)
19
+ def initialize(app, env)
18
20
  @logger = Log4r::Logger.new('vagrant_libvirt::action::start_domain')
21
+ config = env[:machine].provider_config
19
22
  @app = app
20
23
  end
21
24
 
@@ -68,14 +71,44 @@ module VagrantPlugins
68
71
  end
69
72
 
70
73
  # Interface type
71
- unless config.nic_model_type.nil?
72
- REXML::XPath.each(xml_descr, '/domain/devices/interface/model') do |iface_model|
73
- if iface_model.attributes['type'] != config.nic_model_type
74
- @logger.debug "network type updated from '#{iface_model.attributes['type']}' to '#{config.nic_model_type}'"
74
+ adapters = network_interfaces(env[:machine], @logger)
75
+ index = 0
76
+ REXML::XPath.each(xml_descr, '/domain/devices/interface') do |iface|
77
+ # initial config defaults
78
+ nic_model_type = index == 0 && config.mgmt_attach ? config.management_network_model_type : config.nic_model_type
79
+ driver_iommu = index == 0 && config.mgmt_attach ? config.management_network_driver_iommu : false
80
+ # resolve per adapter option
81
+ if index < adapters.length
82
+ nic_model_type = adapters[index].fetch(:model_type, nic_model_type)
83
+ driver_iommu = adapters[index].fetch(:driver_iommu, driver_iommu )
84
+ end
85
+
86
+ iface_model = iface.elements['model']
87
+ if iface_model.attributes['type'] != nic_model_type
88
+ @logger.debug "network type updated from '#{iface_model.attributes['type']}' to '#{nic_model_type}'"
89
+ descr_changed = true
90
+ iface_model.attributes['type'] = nic_model_type
91
+ end
92
+
93
+ iface_driver = iface.elements['driver'] || REXML::Element.new('driver', iface)
94
+
95
+ if nic_model_type == 'virtio'
96
+ iommu = driver_iommu ? 'on': 'off'
97
+ if !iface_driver.attributes['iommu'].nil? && !driver_iommu.nil? && iface_driver.attributes['iommu'] != iommu
75
98
  descr_changed = true
76
- iface_model.attributes['type'] = config.nic_model_type
99
+ iface_driver.attributes['iommu'] = iommu
100
+ end
101
+ else
102
+ if !iface_driver.nil?
103
+ descr_changed = true if iface_driver.attributes['iommu']
104
+ iface_driver.attributes.delete('iommu')
77
105
  end
78
106
  end
107
+ iface.delete_element(iface_driver) if iface_driver.attributes.empty?
108
+ index += 1
109
+ end
110
+ if adapters.length != index
111
+ env[:ui].warn("number of network adapters in current config (#{adapters.length}) is different to attached interfaces (#{index}), may have incorrectly updated")
79
112
  end
80
113
 
81
114
  # vCpu count
@@ -962,21 +962,6 @@ module VagrantPlugins
962
962
  @snapshot_pool_name = @storage_pool_name if @snapshot_pool_name == UNSET_VALUE
963
963
  @storage_pool_path = nil if @storage_pool_path == UNSET_VALUE
964
964
  @random_hostname = false if @random_hostname == UNSET_VALUE
965
- @management_network_device = 'virbr0' if @management_network_device == UNSET_VALUE
966
- @management_network_name = 'vagrant-libvirt' if @management_network_name == UNSET_VALUE
967
- @management_network_address = '192.168.121.0/24' if @management_network_address == UNSET_VALUE
968
- @management_network_mode = 'nat' if @management_network_mode == UNSET_VALUE
969
- @management_network_mac = nil if @management_network_mac == UNSET_VALUE
970
- @management_network_guest_ipv6 = 'yes' if @management_network_guest_ipv6 == UNSET_VALUE
971
- @management_network_autostart = false if @management_network_autostart == UNSET_VALUE
972
- @management_network_pci_bus = nil if @management_network_pci_bus == UNSET_VALUE
973
- @management_network_pci_slot = nil if @management_network_pci_slot == UNSET_VALUE
974
- @management_network_domain = nil if @management_network_domain == UNSET_VALUE
975
- @management_network_mtu = nil if @management_network_mtu == UNSET_VALUE
976
- @management_network_keep = false if @management_network_keep == UNSET_VALUE
977
- @management_network_driver_iommu = false if @management_network_driver_iommu == UNSET_VALUE
978
- @management_network_iface_name = nil if @management_network_iface_name == UNSET_VALUE
979
- @management_network_model_type = 'virtio' if @management_network_model_type == UNSET_VALUE
980
965
 
981
966
  # Domain specific settings.
982
967
  @title = '' if @title == UNSET_VALUE
@@ -1035,7 +1020,7 @@ module VagrantPlugins
1035
1020
  end
1036
1021
  @disk_address_type = nil if @disk_address_type == UNSET_VALUE
1037
1022
  @disk_driver_opts = {} if @disk_driver_opts == UNSET_VALUE
1038
- @nic_model_type = nil if @nic_model_type == UNSET_VALUE
1023
+ @nic_model_type = 'virtio' if @nic_model_type == UNSET_VALUE
1039
1024
  @nested = false if @nested == UNSET_VALUE
1040
1025
  @volume_cache = nil if @volume_cache == UNSET_VALUE
1041
1026
  @kernel = nil if @kernel == UNSET_VALUE
@@ -1150,6 +1135,23 @@ module VagrantPlugins
1150
1135
 
1151
1136
  @serials = [{:type => 'pty', :source => nil}] if @serials == UNSET_VALUE
1152
1137
 
1138
+ # management network options
1139
+ @management_network_device = 'virbr0' if @management_network_device == UNSET_VALUE
1140
+ @management_network_name = 'vagrant-libvirt' if @management_network_name == UNSET_VALUE
1141
+ @management_network_address = '192.168.121.0/24' if @management_network_address == UNSET_VALUE
1142
+ @management_network_mode = 'nat' if @management_network_mode == UNSET_VALUE
1143
+ @management_network_mac = nil if @management_network_mac == UNSET_VALUE
1144
+ @management_network_guest_ipv6 = 'yes' if @management_network_guest_ipv6 == UNSET_VALUE
1145
+ @management_network_autostart = false if @management_network_autostart == UNSET_VALUE
1146
+ @management_network_pci_bus = nil if @management_network_pci_bus == UNSET_VALUE
1147
+ @management_network_pci_slot = nil if @management_network_pci_slot == UNSET_VALUE
1148
+ @management_network_domain = nil if @management_network_domain == UNSET_VALUE
1149
+ @management_network_mtu = nil if @management_network_mtu == UNSET_VALUE
1150
+ @management_network_keep = false if @management_network_keep == UNSET_VALUE
1151
+ @management_network_driver_iommu = false if @management_network_driver_iommu == UNSET_VALUE
1152
+ @management_network_iface_name = nil if @management_network_iface_name == UNSET_VALUE
1153
+ @management_network_model_type = @nic_model_type if @management_network_model_type == UNSET_VALUE
1154
+
1153
1155
  @host_device_exclude_prefixes = ['docker', 'macvtap', 'virbr', 'vnet'] if @host_device_exclude_prefixes == UNSET_VALUE
1154
1156
  end
1155
1157
 
@@ -0,0 +1,22 @@
1
+ require 'vagrant/util/hash_with_indifferent_access'
2
+
3
+ module VagrantPlugins
4
+ module VagrantLibvirt
5
+ module Util
6
+ class HashWithCompactBlank < ::Vagrant::Util::HashWithIndifferentAccess
7
+ def compact_blank
8
+ copy = self.dup
9
+ copy.each do |k, _v|
10
+ if copy[k].respond_to(:compact_blank)
11
+ copy[k].compact_blank
12
+ elsif copy[k].respond_to(:each_pair)
13
+ copy[k].delete_if { |_k, v| v.to_s.empty? }
14
+ else
15
+ copy[k].reject! { |e| e.to_s.empty? }
16
+ end
17
+ end.delete_if { |_k, v| v.empty? }
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -3,6 +3,7 @@
3
3
  require 'ipaddr'
4
4
  require 'nokogiri'
5
5
  require 'vagrant/util/network_ip'
6
+ require 'vagrant/util/scoped_hash_override'
6
7
 
7
8
  class IPAddr
8
9
  def get_mask
@@ -17,6 +18,39 @@ module VagrantPlugins
17
18
  module Util
18
19
  module NetworkUtil
19
20
  include Vagrant::Util::NetworkIP
21
+ include Vagrant::Util::ScopedHashOverride
22
+
23
+ def network_interfaces(machine, logger)
24
+ # Setup list of interfaces before creating them.
25
+ adapters = []
26
+
27
+ # Vagrant gives you adapter 0 by default
28
+ # Assign interfaces to slots.
29
+ configured_networks(machine, logger).each do |options|
30
+ # don't need to create interface for this type
31
+ next if options[:iface_type] == :forwarded_port
32
+
33
+ # TODO: fill first ifaces with adapter option specified.
34
+ if options[:adapter]
35
+ if adapters[options[:adapter]]
36
+ raise Errors::InterfaceSlotNotAvailable
37
+ end
38
+
39
+ free_slot = options[:adapter].to_i
40
+ @logger.debug "Using specified adapter slot #{free_slot}"
41
+ else
42
+ free_slot = find_empty(adapters, 0, machine.provider_config.nic_adapter_count)
43
+ @logger.debug "Adapter not specified so found slot #{free_slot}"
44
+ raise Errors::InterfaceSlotExhausted if free_slot.nil?
45
+ end
46
+
47
+ # We have slot for interface, fill it with interface configuration.
48
+ adapters[free_slot] = options
49
+ adapters[free_slot][:network_name] = interface_network(machine.provider.driver, adapters[free_slot])
50
+ end
51
+
52
+ adapters
53
+ end
20
54
 
21
55
  def configured_networks(machine, logger)
22
56
  qemu_use_session = machine.provider_config.qemu_use_session
@@ -198,6 +232,41 @@ module VagrantPlugins
198
232
 
199
233
  libvirt_networks
200
234
  end
235
+
236
+ def find_empty(array, start, stop)
237
+ (start..stop).each do |i|
238
+ return i unless array[i]
239
+ end
240
+ nil
241
+ end
242
+
243
+ # Return network name according to interface options.
244
+ def interface_network(driver, options)
245
+ # no need to get interface network for tcp tunnel config
246
+ return 'tunnel_interface' if options.fetch(:tunnel_type, nil)
247
+
248
+ if options[:network_name]
249
+ @logger.debug 'Found network by name'
250
+ return options[:network_name]
251
+ end
252
+
253
+ # Get list of all (active and inactive) Libvirt networks.
254
+ available_networks = libvirt_networks(driver)
255
+
256
+ return 'public' if options[:iface_type] == :public_network
257
+
258
+ if options[:ip]
259
+ address = network_address(options[:ip], options[:netmask])
260
+ available_networks.each do |network|
261
+ if address == network[:network_address]
262
+ @logger.debug 'Found network by ip'
263
+ return network[:name]
264
+ end
265
+ end
266
+ end
267
+
268
+ raise Errors::NetworkNotAvailableError, network_name: options[:ip]
269
+ end
201
270
  end
202
271
  end
203
272
  end
@@ -1 +1 @@
1
- 0.12.1
1
+ 0.12.2
@@ -23,6 +23,12 @@
23
23
 
24
24
  </clock>
25
25
  <devices>
26
+ <interface type='network'>
27
+ <alias name='ua-net-0'/>
28
+ <source network='vagrant-libvirt'/>
29
+ <model type='virtio'/>
30
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
31
+ </interface>
26
32
  <serial type='pty'>
27
33
  <target port='0'/>
28
34
  </serial>
@@ -23,6 +23,12 @@
23
23
  <timer name='rtc'/>
24
24
  </clock>
25
25
  <devices>
26
+ <interface type='network'>
27
+ <alias name='ua-net-0'/>
28
+ <source network='vagrant-libvirt'/>
29
+ <model type='virtio'/>
30
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
31
+ </interface>
26
32
  <serial type='pty'>
27
33
  <target port='0'/>
28
34
  </serial>
@@ -24,6 +24,12 @@
24
24
  <timer name='tsc'/>
25
25
  </clock>
26
26
  <devices>
27
+ <interface type='network'>
28
+ <alias name='ua-net-0'/>
29
+ <source network='vagrant-libvirt'/>
30
+ <model type='virtio'/>
31
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
32
+ </interface>
27
33
  <serial type='pty'>
28
34
  <target port='0'/>
29
35
  </serial>
@@ -21,6 +21,12 @@
21
21
  </features>
22
22
  <clock offset='utc'/>
23
23
  <devices>
24
+ <interface type='network'>
25
+ <alias name='ua-net-0'/>
26
+ <source network='vagrant-libvirt'/>
27
+ <model type='virtio'/>
28
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
29
+ </interface>
24
30
  <serial type='pty'>
25
31
  <target port='0'/>
26
32
  </serial>
@@ -21,6 +21,12 @@
21
21
  </features>
22
22
  <clock offset='utc'/>
23
23
  <devices>
24
+ <interface type='network'>
25
+ <alias name='ua-net-0'/>
26
+ <source network='vagrant-libvirt'/>
27
+ <model type='virtio'/>
28
+ <address bus='0x00' domain='0x0000' function='0x0' slot='0x05' type='pci'/>
29
+ </interface>
24
30
  <serial type='pty'>
25
31
  <target port='0'/>
26
32
  </serial>
@@ -21,6 +21,12 @@
21
21
  </features>
22
22
  <clock offset='utc'/>
23
23
  <devices>
24
+ <interface type='network'>
25
+ <alias name='ua-net-0'/>
26
+ <source network='vagrant-libvirt'/>
27
+ <model type='virtio'/>
28
+ <address bus='0x00' domain='0x0000' function='0x0' slot='0x05' type='pci'/>
29
+ </interface>
24
30
  <serial type='pty'>
25
31
  <target port='0'/>
26
32
  </serial>
@@ -22,6 +22,12 @@
22
22
  </features>
23
23
  <clock offset='utc'/>
24
24
  <devices>
25
+ <interface type='network'>
26
+ <alias name='ua-net-0'/>
27
+ <source network='vagrant-libvirt'/>
28
+ <model type='virtio'/>
29
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
30
+ </interface>
25
31
  <serial type='pty'>
26
32
  <target port='0'/>
27
33
  </serial>
@@ -0,0 +1,64 @@
1
+ <domain type='qemu'>
2
+ <name>vagrant-libvirt_default</name>
3
+ <uuid>881a931b-0110-4d10-81aa-47a1a19f5726</uuid>
4
+ <description>Source: /home/test/vagrant-libvirt/Vagrantfile</description>
5
+ <memory unit='KiB'>2097152</memory>
6
+ <currentMemory unit='KiB'>2097152</currentMemory>
7
+ <vcpu placement='static'>2</vcpu>
8
+ <os>
9
+ <type arch='x86_64' machine='pc-i440fx-6.0'>hvm</type>
10
+ <bootmenu enable='no'/>
11
+ <boot dev='hd'/>
12
+ </os>
13
+ <features>
14
+ <acpi/>
15
+ <apic/>
16
+ <pae/>
17
+ </features>
18
+ <cpu mode='host-model' check='partial'/>
19
+ <clock offset='utc'/>
20
+ <on_poweroff>destroy</on_poweroff>
21
+ <on_reboot>restart</on_reboot>
22
+ <on_crash>destroy</on_crash>
23
+ <devices>
24
+ <emulator>/usr/bin/qemu-system-x86_64</emulator>
25
+ <disk type='file' device='disk'>
26
+ <driver name='qemu' type='qcow2'/>
27
+ <source file='/var/lib/libvirt/images/vagrant-libvirt_default.img'/>
28
+ <target dev='vda' bus='virtio'/>
29
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
30
+ </disk>
31
+ <controller type='usb' index='0' model='piix3-uhci'>
32
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
33
+ </controller>
34
+ <controller type='pci' index='0' model='pci-root'/>
35
+ <interface type='network'>
36
+ <alias name='ua-net-0'/>
37
+ <source network='vagrant-libvirt'/>
38
+ <model type='virtio'/>
39
+ <driver iommu='on'/>
40
+ <address bus='0x00' domain='0x0000' function='0x0' slot='0x05' type='pci'/>
41
+ </interface>
42
+ <serial type='pty'>
43
+ <target type='isa-serial' port='0'>
44
+ <model name='isa-serial'/>
45
+ </target>
46
+ </serial>
47
+ <console type='pty'>
48
+ <target type='serial' port='0'/>
49
+ </console>
50
+ <input type='mouse' bus='ps2'/>
51
+ <input type='keyboard' bus='ps2'/>
52
+ <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1' keymap='en-us' websocket='-1'>
53
+ <listen type='address' address='127.0.0.1'/>
54
+ </graphics>
55
+ <audio id='1' type='none'/>
56
+ <video>
57
+ <model type='cirrus' vram='16384' heads='1' primary='yes'/>
58
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
59
+ </video>
60
+ <memballoon model='virtio'>
61
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
62
+ </memballoon>
63
+ </devices>
64
+ </domain>
@@ -0,0 +1,71 @@
1
+ <domain type='qemu'>
2
+ <name>vagrant-libvirt_default</name>
3
+ <uuid>881a931b-0110-4d10-81aa-47a1a19f5726</uuid>
4
+ <description>Source: /home/test/vagrant-libvirt/Vagrantfile</description>
5
+ <memory unit='KiB'>2097152</memory>
6
+ <currentMemory unit='KiB'>2097152</currentMemory>
7
+ <vcpu placement='static'>2</vcpu>
8
+ <os>
9
+ <type arch='x86_64' machine='pc-i440fx-6.0'>hvm</type>
10
+ <bootmenu enable='no'/>
11
+ <boot dev='hd'/>
12
+ </os>
13
+ <features>
14
+ <acpi/>
15
+ <apic/>
16
+ <pae/>
17
+ </features>
18
+ <cpu mode='host-model' check='partial'/>
19
+ <clock offset='utc'/>
20
+ <on_poweroff>destroy</on_poweroff>
21
+ <on_reboot>restart</on_reboot>
22
+ <on_crash>destroy</on_crash>
23
+ <devices>
24
+ <emulator>/usr/bin/qemu-system-x86_64</emulator>
25
+ <disk type='file' device='disk'>
26
+ <driver name='qemu' type='qcow2'/>
27
+ <source file='/var/lib/libvirt/images/vagrant-libvirt_default.img'/>
28
+ <target dev='vda' bus='virtio'/>
29
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
30
+ </disk>
31
+ <controller type='usb' index='0' model='piix3-uhci'>
32
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
33
+ </controller>
34
+ <controller type='pci' index='0' model='pci-root'/>
35
+ <interface type='network'>
36
+ <alias name='ua-net-0'/>
37
+ <source network='vagrant-libvirt'/>
38
+ <model type='virtio'/>
39
+ <driver iommu='on'/>
40
+ <address bus='0x00' domain='0x0000' function='0x0' slot='0x05' type='pci'/>
41
+ </interface>
42
+ <interface type='network'>
43
+ <alias name='ua-net-1'/>
44
+ <source network='private'/>
45
+ <model type='virtio'/>
46
+ <driver iommu='on'/>
47
+ <address bus='0x00' domain='0x0000' function='0x0' slot='0x06' type='pci'/>
48
+ </interface>
49
+ <serial type='pty'>
50
+ <target type='isa-serial' port='0'>
51
+ <model name='isa-serial'/>
52
+ </target>
53
+ </serial>
54
+ <console type='pty'>
55
+ <target type='serial' port='0'/>
56
+ </console>
57
+ <input type='mouse' bus='ps2'/>
58
+ <input type='keyboard' bus='ps2'/>
59
+ <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1' keymap='en-us' websocket='-1'>
60
+ <listen type='address' address='127.0.0.1'/>
61
+ </graphics>
62
+ <audio id='1' type='none'/>
63
+ <video>
64
+ <model type='cirrus' vram='16384' heads='1' primary='yes'/>
65
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
66
+ </video>
67
+ <memballoon model='virtio'>
68
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
69
+ </memballoon>
70
+ </devices>
71
+ </domain>
@@ -162,6 +162,109 @@ describe VagrantPlugins::ProviderLibvirt::Action::StartDomain do
162
162
  end
163
163
  end
164
164
 
165
+ context 'interface' do
166
+ let(:test_file) { 'existing_with_iommu.xml' }
167
+ let(:updated_domain_xml) {
168
+ new_xml = domain_xml.dup
169
+ new_xml.sub!(
170
+ /<model type='virtio'\/>\s+<driver iommu='on'\/>/m,
171
+ <<-EOF
172
+ <model type='e1000'/>
173
+ EOF
174
+ )
175
+ new_xml
176
+ }
177
+ let(:vagrantfile_providerconfig) {
178
+ <<-EOF
179
+ libvirt.management_network_model_type = 'e1000'
180
+ EOF
181
+ }
182
+
183
+ it 'should remove iommu if not interface model not virtio' do
184
+ expect(ui).to_not receive(:warn)
185
+ expect(connection).to receive(:define_domain).and_return(libvirt_domain)
186
+ expect(libvirt_domain).to receive(:xml_desc).and_return(domain_xml, updated_domain_xml)
187
+ expect(libvirt_domain).to receive(:autostart=)
188
+ expect(domain).to receive(:start)
189
+
190
+ expect(subject.call(env)).to be_nil
191
+ end
192
+
193
+ context 'iommu mismatch' do
194
+ let(:updated_domain_xml) {
195
+ new_xml = domain_xml.dup
196
+ new_xml.sub!(/(<model type='virtio'\/>\s+)<driver iommu='on'\/>/m) { |_|
197
+ match = Regexp.last_match
198
+
199
+ "#{match[1]}<driver iommu='off'/>"
200
+ }
201
+ new_xml
202
+ }
203
+ let(:vagrantfile_providerconfig) {
204
+ <<-EOF
205
+ libvirt.management_network_driver_iommu = false
206
+ EOF
207
+ }
208
+
209
+
210
+ it 'should update iommu to off' do
211
+ expect(ui).to_not receive(:warn)
212
+ expect(connection).to receive(:define_domain).and_return(libvirt_domain)
213
+ expect(libvirt_domain).to receive(:xml_desc).and_return(domain_xml, updated_domain_xml)
214
+ expect(libvirt_domain).to receive(:autostart=)
215
+ expect(domain).to receive(:start)
216
+
217
+ expect(subject.call(env)).to be_nil
218
+ end
219
+ end
220
+
221
+ context 'with additional interface' do
222
+ let(:test_file) { 'existing_with_two_interfaces_iommu.xml' }
223
+ let(:adapters) {
224
+ [
225
+ {:iface_type => :private_network, :model_type => "e1000", :network_name => "vagrant-libvirt", :driver_iommu => false},
226
+ {:iface_type => :private_network, :model_type => "virtio", :network_name => "vagrant-libvirt-1", :driver_iommu => true},
227
+ ]
228
+ }
229
+ before do
230
+ allow(subject).to receive(:network_interfaces).and_return(adapters)
231
+ end
232
+
233
+ it 'should only update the management interface' do
234
+ expect(updated_domain_xml).to match(/<source network='vagrant-libvirt'\/>\s+<model type='e1000'\/>/m)
235
+ expect(updated_domain_xml).to match(/<source network='private'\/>\s+<model type='virtio'\/>/m)
236
+
237
+ expect(ui).to_not receive(:warn)
238
+ expect(connection).to receive(:define_domain).and_return(libvirt_domain)
239
+ expect(libvirt_domain).to receive(:xml_desc).and_return(domain_xml, updated_domain_xml)
240
+ expect(libvirt_domain).to receive(:autostart=)
241
+ expect(domain).to receive(:start)
242
+
243
+ expect(subject.call(env)).to be_nil
244
+ end
245
+
246
+ context 'with more adapters configured than attached' do
247
+ let(:adapters) {
248
+ [
249
+ {:iface_type => :private_network, :model_type => "e1000", :network_name => "vagrant-libvirt", :driver_iommu => false},
250
+ {:iface_type => :private_network, :model_type => "virtio", :network_name => "vagrant-libvirt-1", :driver_iommu => true},
251
+ {:iface_type => :private_network, :model_type => "virtio", :network_name => "vagrant-libvirt-2", :driver_iommu => true},
252
+ ]
253
+ }
254
+
255
+ it 'should update and trigger a warning about mismatched adapters' do
256
+ expect(ui).to receive(:warn).with(/number of network adapters in current config \(3\) is different to attached interfaces \(2\)/)
257
+ expect(connection).to receive(:define_domain).and_return(libvirt_domain)
258
+ expect(libvirt_domain).to receive(:xml_desc).and_return(domain_xml, updated_domain_xml)
259
+ expect(libvirt_domain).to receive(:autostart=)
260
+ expect(domain).to receive(:start)
261
+
262
+ expect(subject.call(env)).to be_nil
263
+ end
264
+ end
265
+ end
266
+ end
267
+
165
268
  context 'cpu' do
166
269
  let(:test_file) { 'existing.xml' }
167
270
  let(:updated_domain_xml) {
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+ require 'support/sharedcontext'
3
+
4
+ describe 'VagrantPlugins::ProviderLibvirt::Provider' do
5
+ require 'vagrant-libvirt/provider'
6
+
7
+ include_context 'unit'
8
+
9
+ describe '#ssh_info' do
10
+ end
11
+ end
@@ -8,28 +8,29 @@ describe 'VagrantPlugins::ProviderLibvirt::Util::NetworkUtil' do
8
8
  include_context 'libvirt'
9
9
 
10
10
  subject do
11
- Class.new {
11
+ Class.new do
12
12
  include VagrantPlugins::ProviderLibvirt::Util::NetworkUtil
13
13
 
14
14
  def initialize
15
15
  @logger = Log4r::Logger.new('test-logger')
16
16
  end
17
- }.new
17
+ end.new
18
18
  end
19
19
 
20
- def create_libvirt_network(name, attrs={})
20
+ def create_libvirt_network(name, attrs = {})
21
21
  default_attrs = {
22
- :active? => true,
23
- :autostart? => true,
22
+ active?: true,
23
+ autostart?: true
24
24
  }
25
- network_xml = File.read(File.join(File.dirname(__FILE__), File.basename(__FILE__, '.rb'), name + '.xml'))
25
+ network_xml = File.read(File.join(File.dirname(__FILE__), File.basename(__FILE__, '.rb'), "#{name}.xml"))
26
26
  double = instance_double(::Libvirt::Network)
27
27
  allow(double).to receive(:xml_desc).and_return(network_xml)
28
28
  allow(double).to receive(:name).and_return(name)
29
29
 
30
30
  xml = REXML::Document.new(network_xml)
31
31
  bridge = REXML::XPath.first(xml, '/network/bridge')
32
- default_attrs[:bridge_name] = !bridge.nil? ? bridge.attributes['name'] : Libvirt::Error.new("network #{name} does not have attribute bridge_name")
32
+ default_attrs[:bridge_name] =
33
+ !bridge.nil? ? bridge.attributes['name'] : Libvirt::Error.new("network #{name} does not have attribute bridge_name")
33
34
 
34
35
  default_attrs.merge(attrs).each do |aname, avalue|
35
36
  if avalue.is_a?(Exception)
@@ -50,10 +51,133 @@ describe 'VagrantPlugins::ProviderLibvirt::Util::NetworkUtil' do
50
51
  expect(logger).to_not receive(:debug)
51
52
  expect(driver).to receive(:list_all_networks).and_return([default_network, additional_network])
52
53
 
53
- expect(subject.libvirt_networks(driver)).to match_array([
54
- hash_including(:name => 'default'),
55
- hash_including(:name => 'vagrant-libvirt'),
56
- ])
54
+ expect(subject.libvirt_networks(driver)).to match_array(
55
+ [
56
+ hash_including(name: 'default'),
57
+ hash_including(name: 'vagrant-libvirt')
58
+ ]
59
+ )
60
+ end
61
+ end
62
+
63
+ describe '#network_interfaces' do
64
+ let(:configured_networks_all) do
65
+ [
66
+ {
67
+ iface_type: :private_network,
68
+ ip: '192.168.121.0',
69
+ netmask: '255.255.255.0',
70
+ network_name: 'vagrant-libvirt',
71
+ },
72
+ {
73
+ auto_correct: true,
74
+ iface_type: :forwarded_port,
75
+ },
76
+ {
77
+ iface_type: :private_network,
78
+ ip: '192.168.123.0',
79
+ netmask: '255.255.255.0',
80
+ network_name: 'vagrant-libvirt-1',
81
+ },
82
+ {
83
+ iface_type: :private_network,
84
+ ip: '192.168.124.0',
85
+ netmask: '255.255.255.0',
86
+ network_name: 'vagrant-libvirt-2',
87
+ },
88
+ ]
89
+ end
90
+ let(:configured_networks) do
91
+ [
92
+ configured_networks_all[0]
93
+ ]
94
+ end
95
+
96
+ before do
97
+ expect(subject).to receive(:configured_networks).with(machine, logger).and_return(configured_networks)
98
+ end
99
+
100
+ it 'should return a list of default adapters configured' do
101
+ expect(logger).to receive(:debug).with('Adapter not specified so found slot 0')
102
+ expect(logger).to receive(:debug).with('Found network by name')
103
+
104
+ expect(subject.network_interfaces(machine, logger)).to match_array([configured_networks[0]])
105
+ end
106
+
107
+ context 'with forwarded ports' do
108
+ let(:configured_networks) do
109
+ [
110
+ configured_networks_all[0],
111
+ configured_networks_all[1]
112
+ ]
113
+ end
114
+
115
+ it 'should skip the forwarded port' do
116
+ expect(logger).to receive(:debug).with('Adapter not specified so found slot 0')
117
+ expect(logger).to receive(:debug).with('Found network by name')
118
+
119
+ expect(subject.network_interfaces(machine, logger)).to match_array([configured_networks[0]])
120
+ end
121
+ end
122
+
123
+ context 'with 2 additional private networks with adapter set' do
124
+ let(:configured_networks) do
125
+ [
126
+ configured_networks_all[0],
127
+ configured_networks_all[2].merge(:adapter => 2),
128
+ configured_networks_all[3],
129
+ ]
130
+ end
131
+
132
+ it 'should return the first private network last' do
133
+ expect(logger).to receive(:debug).with('Adapter not specified so found slot 0')
134
+ expect(logger).to receive(:debug).with('Found network by name').exactly(3).times
135
+ expect(logger).to receive(:debug).with('Using specified adapter slot 2')
136
+ expect(logger).to receive(:debug).with('Adapter not specified so found slot 1')
137
+
138
+ expect(subject.network_interfaces(machine, logger)).to match_array(
139
+ [
140
+ configured_networks[0],
141
+ configured_networks[2],
142
+ configured_networks[1]
143
+ ]
144
+ )
145
+ end
146
+ end
147
+ end
148
+
149
+ describe '#configured_networks' do
150
+ it 'should return a list of default adapters configured' do
151
+ expect(logger).to receive(:info).with('Using vagrant-libvirt at 192.168.121.0/24 as the management network nat is the mode')
152
+ expect(logger).to receive(:debug).with(/In config found network type forwarded_port options/)
153
+
154
+ expect(subject.configured_networks(machine, logger)).to match_array(
155
+ [
156
+ hash_including(
157
+ {
158
+ forward_mode: 'nat',
159
+ iface_type: :private_network,
160
+ ip: '192.168.121.0',
161
+ model_type: 'virtio',
162
+ netmask: '255.255.255.0',
163
+ network_name: 'vagrant-libvirt',
164
+ }
165
+ ),
166
+ hash_including(
167
+ {
168
+ auto_correct: true,
169
+ forward_mode: 'nat',
170
+ guest: 22,
171
+ host: 2222,
172
+ host_ip: '127.0.0.1',
173
+ id: 'ssh',
174
+ iface_type: :forwarded_port,
175
+ netmask: '255.255.255.0',
176
+ protocol: 'tcp',
177
+ }
178
+ )
179
+ ]
180
+ )
57
181
  end
58
182
  end
59
183
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-libvirt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.1
4
+ version: 0.12.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lukas Stanek
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2023-05-19 00:00:00.000000000 Z
14
+ date: 2023-06-24 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: fog-libvirt
@@ -159,12 +159,16 @@ email:
159
159
  - pronix.service@gmail.com
160
160
  - brian@polibyte.com
161
161
  - daragh.bailey@gmail.com
162
- executables: []
162
+ executables:
163
+ - stackprof-flamegraph.pl
164
+ - stackprof-gprof2dot.py
163
165
  extensions: []
164
166
  extra_rdoc_files: []
165
167
  files:
166
168
  - LICENSE
167
169
  - README.md
170
+ - bin/stackprof-flamegraph.pl
171
+ - bin/stackprof-gprof2dot.py
168
172
  - lib/vagrant-libvirt.rb
169
173
  - lib/vagrant-libvirt/action.rb
170
174
  - lib/vagrant-libvirt/action/clean_machine_folder.rb
@@ -174,7 +178,6 @@ files:
174
178
  - lib/vagrant-libvirt/action/create_network_interfaces.rb
175
179
  - lib/vagrant-libvirt/action/create_networks.rb
176
180
  - lib/vagrant-libvirt/action/destroy_domain.rb
177
- - lib/vagrant-libvirt/action/destroy_domain_confirm.rb
178
181
  - lib/vagrant-libvirt/action/destroy_networks.rb
179
182
  - lib/vagrant-libvirt/action/forward_ports.rb
180
183
  - lib/vagrant-libvirt/action/halt_domain.rb
@@ -230,6 +233,7 @@ files:
230
233
  - lib/vagrant-libvirt/util/domain_flags.rb
231
234
  - lib/vagrant-libvirt/util/erb_template.rb
232
235
  - lib/vagrant-libvirt/util/error_codes.rb
236
+ - lib/vagrant-libvirt/util/hash_with_blank_filter.rb
233
237
  - lib/vagrant-libvirt/util/network_util.rb
234
238
  - lib/vagrant-libvirt/util/nfs.rb
235
239
  - lib/vagrant-libvirt/util/resolvers.rb
@@ -316,6 +320,8 @@ files:
316
320
  - spec/unit/action/start_domain_spec/existing.xml
317
321
  - spec/unit/action/start_domain_spec/existing_added_nvram.xml
318
322
  - spec/unit/action/start_domain_spec/existing_reordered.xml
323
+ - spec/unit/action/start_domain_spec/existing_with_iommu.xml
324
+ - spec/unit/action/start_domain_spec/existing_with_two_interfaces_iommu.xml
319
325
  - spec/unit/action/start_domain_spec/nvram_domain.xml
320
326
  - spec/unit/action/start_domain_spec/nvram_domain_other_setting.xml
321
327
  - spec/unit/action/start_domain_spec/nvram_domain_removed.xml
@@ -327,6 +333,7 @@ files:
327
333
  - spec/unit/config_spec.rb
328
334
  - spec/unit/driver_spec.rb
329
335
  - spec/unit/plugin_spec.rb
336
+ - spec/unit/provider_spec.rb
330
337
  - spec/unit/templates/domain_all_settings.xml
331
338
  - spec/unit/templates/domain_cpu_mode_passthrough.xml
332
339
  - spec/unit/templates/domain_custom_cpu_model.xml
@@ -442,6 +449,8 @@ test_files:
442
449
  - spec/unit/action/start_domain_spec/existing.xml
443
450
  - spec/unit/action/start_domain_spec/existing_added_nvram.xml
444
451
  - spec/unit/action/start_domain_spec/existing_reordered.xml
452
+ - spec/unit/action/start_domain_spec/existing_with_iommu.xml
453
+ - spec/unit/action/start_domain_spec/existing_with_two_interfaces_iommu.xml
445
454
  - spec/unit/action/start_domain_spec/nvram_domain.xml
446
455
  - spec/unit/action/start_domain_spec/nvram_domain_other_setting.xml
447
456
  - spec/unit/action/start_domain_spec/nvram_domain_removed.xml
@@ -454,6 +463,7 @@ test_files:
454
463
  - spec/unit/config_spec.rb
455
464
  - spec/unit/driver_spec.rb
456
465
  - spec/unit/plugin_spec.rb
466
+ - spec/unit/provider_spec.rb
457
467
  - spec/unit/templates/domain_all_settings.xml
458
468
  - spec/unit/templates/domain_cpu_mode_passthrough.xml
459
469
  - spec/unit/templates/domain_custom_cpu_model.xml
@@ -1,22 +0,0 @@
1
-
2
- require "vagrant/action/builtin/confirm"
3
-
4
- module VagrantPlugins
5
- module VagrantLibvirt
6
- module Action
7
- class DestroyDomainConfirm < Vagrant::Action::Builtin::Confirm
8
- def initialize(app, env)
9
- force_key = :force_confirm_destroy
10
- message = I18n.t("vagrant_libvirt.destroy_domain.confirmation",
11
- name: env[:machine].name)
12
-
13
- super(app, env, message, force_key, allowed: ["y", "n", "Y", "N"])
14
- end
15
-
16
- def call(env)
17
-
18
- end
19
- end
20
- end
21
- end
22
- end