vagrant-libvirt 0.1.2 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +530 -100
  3. data/lib/vagrant-libvirt/action.rb +7 -1
  4. data/lib/vagrant-libvirt/action/clean_machine_folder.rb +28 -0
  5. data/lib/vagrant-libvirt/action/create_domain.rb +78 -22
  6. data/lib/vagrant-libvirt/action/create_domain_volume.rb +57 -57
  7. data/lib/vagrant-libvirt/action/create_network_interfaces.rb +1 -3
  8. data/lib/vagrant-libvirt/action/create_networks.rb +11 -4
  9. data/lib/vagrant-libvirt/action/destroy_domain.rb +1 -1
  10. data/lib/vagrant-libvirt/action/forward_ports.rb +40 -40
  11. data/lib/vagrant-libvirt/action/halt_domain.rb +25 -9
  12. data/lib/vagrant-libvirt/action/handle_box_image.rb +163 -72
  13. data/lib/vagrant-libvirt/action/is_running.rb +1 -3
  14. data/lib/vagrant-libvirt/action/is_suspended.rb +4 -4
  15. data/lib/vagrant-libvirt/action/package_domain.rb +10 -4
  16. data/lib/vagrant-libvirt/action/start_domain.rb +86 -29
  17. data/lib/vagrant-libvirt/action/wait_till_up.rb +8 -52
  18. data/lib/vagrant-libvirt/cap/{mount_p9.rb → mount_9p.rb} +2 -2
  19. data/lib/vagrant-libvirt/cap/mount_virtiofs.rb +37 -0
  20. data/lib/vagrant-libvirt/cap/public_address.rb +16 -0
  21. data/lib/vagrant-libvirt/cap/{synced_folder.rb → synced_folder_9p.rb} +4 -5
  22. data/lib/vagrant-libvirt/cap/synced_folder_virtiofs.rb +109 -0
  23. data/lib/vagrant-libvirt/config.rb +257 -34
  24. data/lib/vagrant-libvirt/driver.rb +49 -32
  25. data/lib/vagrant-libvirt/errors.rb +24 -1
  26. data/lib/vagrant-libvirt/plugin.rb +19 -5
  27. data/lib/vagrant-libvirt/provider.rb +2 -9
  28. data/lib/vagrant-libvirt/templates/domain.xml.erb +40 -10
  29. data/lib/vagrant-libvirt/templates/private_network.xml.erb +1 -1
  30. data/lib/vagrant-libvirt/templates/public_interface.xml.erb +5 -1
  31. data/lib/vagrant-libvirt/util.rb +1 -0
  32. data/lib/vagrant-libvirt/util/erb_template.rb +6 -7
  33. data/lib/vagrant-libvirt/util/network_util.rb +21 -3
  34. data/lib/vagrant-libvirt/util/ui.rb +23 -0
  35. data/lib/vagrant-libvirt/version +1 -0
  36. data/lib/vagrant-libvirt/version.rb +72 -1
  37. data/locales/en.yml +12 -0
  38. data/spec/spec_helper.rb +37 -3
  39. data/spec/support/binding_proc.rb +24 -0
  40. data/spec/support/libvirt_context.rb +3 -1
  41. data/spec/support/matchers/have_file_content.rb +63 -0
  42. data/spec/support/sharedcontext.rb +7 -3
  43. data/spec/unit/action/clean_machine_folder_spec.rb +48 -0
  44. data/spec/unit/action/create_domain_spec.rb +166 -0
  45. data/spec/unit/action/create_domain_spec/default_system_storage_pool.xml +17 -0
  46. data/spec/unit/action/create_domain_spec/default_user_storage_pool.xml +17 -0
  47. data/spec/unit/action/create_domain_volume_spec.rb +102 -0
  48. data/spec/unit/action/create_domain_volume_spec/one_disk_in_storage.xml +21 -0
  49. data/spec/unit/action/create_domain_volume_spec/three_disks_in_storage_disk_0.xml +21 -0
  50. data/spec/unit/action/create_domain_volume_spec/three_disks_in_storage_disk_1.xml +21 -0
  51. data/spec/unit/action/create_domain_volume_spec/three_disks_in_storage_disk_2.xml +21 -0
  52. data/spec/unit/action/destroy_domain_spec.rb +3 -3
  53. data/spec/unit/action/forward_ports_spec.rb +202 -0
  54. data/spec/unit/action/halt_domain_spec.rb +90 -0
  55. data/spec/unit/action/handle_box_image_spec.rb +363 -0
  56. data/spec/unit/action/set_name_of_domain_spec.rb +2 -2
  57. data/spec/unit/action/start_domain_spec.rb +231 -0
  58. data/spec/unit/action/start_domain_spec/clock_timer_rtc.xml +50 -0
  59. data/spec/unit/action/start_domain_spec/default.xml +48 -0
  60. data/spec/unit/action/start_domain_spec/default_added_tpm_path.xml +48 -0
  61. data/spec/unit/action/start_domain_spec/default_added_tpm_version.xml +48 -0
  62. data/spec/unit/action/wait_till_up_spec.rb +22 -21
  63. data/spec/unit/config_spec.rb +438 -0
  64. data/spec/unit/provider_spec.rb +11 -0
  65. data/spec/unit/templates/domain_all_settings.xml +16 -3
  66. data/spec/unit/templates/domain_custom_cpu_model.xml +4 -1
  67. data/spec/unit/templates/domain_defaults.xml +4 -1
  68. data/spec/unit/templates/domain_spec.rb +102 -3
  69. data/spec/unit/templates/tpm/version_1.2.xml +54 -0
  70. data/spec/unit/templates/tpm/version_2.0.xml +53 -0
  71. metadata +108 -16
  72. data/lib/vagrant-libvirt/action/halt_confirm.rb +0 -20
@@ -49,6 +49,7 @@ module VagrantPlugins
49
49
 
50
50
  b2.use StartDomain
51
51
  b2.use WaitTillUp
52
+ b2.use WaitForCommunicator, [:running]
52
53
 
53
54
  b2.use ForwardPorts
54
55
  b2.use SetHostname
@@ -107,6 +108,7 @@ module VagrantPlugins
107
108
  # Machine should gain IP address when comming up,
108
109
  # so wait for dhcp lease and store IP into machines data_dir.
109
110
  b3.use WaitTillUp
111
+ b3.use WaitForCommunicator, [:running]
110
112
 
111
113
  b3.use ForwardPorts
112
114
  b3.use PrepareNFSSettings
@@ -179,6 +181,7 @@ module VagrantPlugins
179
181
  # Try to remove stale volumes anyway
180
182
  b2.use SetNameOfDomain
181
183
  b2.use RemoveStaleVolume if env[:machine].config.vm.box
184
+ b2.use CleanMachineFolder, quiet: true
182
185
  b2.use MessageNotCreated unless env[:result]
183
186
 
184
187
  next
@@ -186,11 +189,12 @@ module VagrantPlugins
186
189
 
187
190
  b2.use Call, DestroyConfirm do |env2, b3|
188
191
  if env2[:result]
192
+ b3.use ProvisionerCleanup, :before
189
193
  b3.use ClearForwardedPorts
190
194
  b3.use PruneNFSExports
191
195
  b3.use DestroyDomain
192
196
  b3.use DestroyNetworks
193
- b3.use ProvisionerCleanup
197
+ b3.use CleanMachineFolder
194
198
  else
195
199
  b3.use MessageWillNotDestroy
196
200
  end
@@ -324,6 +328,7 @@ module VagrantPlugins
324
328
  autoload :CreateDomainVolume, action_root.join('create_domain_volume')
325
329
  autoload :CreateNetworkInterfaces, action_root.join('create_network_interfaces')
326
330
  autoload :CreateNetworks, action_root.join('create_networks')
331
+ autoload :CleanMachineFolder, action_root.join('clean_machine_folder')
327
332
  autoload :DestroyDomain, action_root.join('destroy_domain')
328
333
  autoload :DestroyNetworks, action_root.join('destroy_networks')
329
334
  autoload :ForwardPorts, action_root.join('forward_ports')
@@ -366,6 +371,7 @@ module VagrantPlugins
366
371
  autoload :SyncedFolders, 'vagrant/action/builtin/synced_folders'
367
372
  autoload :SyncedFolderCleanup, 'vagrant/action/builtin/synced_folder_cleanup'
368
373
  autoload :ProvisionerCleanup, 'vagrant/action/builtin/provisioner_cleanup'
374
+ autoload :WaitForCommunicator, 'vagrant/action/builtin/wait_for_communicator'
369
375
  end
370
376
  end
371
377
  end
@@ -0,0 +1,28 @@
1
+ require 'log4r'
2
+
3
+ module VagrantPlugins
4
+ module ProviderLibvirt
5
+ module Action
6
+ class CleanMachineFolder
7
+
8
+ def initialize(app, env, options=nil)
9
+ @logger = Log4r::Logger.new('vagrant_libvirt::action::create_domain')
10
+ @app = app
11
+ @ui = env[:ui]
12
+ @quiet = (options || {}).fetch(:quiet, false)
13
+ end
14
+
15
+ def call(env)
16
+ machine_folder = env[:machine].data_dir
17
+
18
+ @ui.info("Deleting the machine folder") unless @quiet
19
+
20
+ @logger.debug("Recursively removing: #{machine_folder}")
21
+ FileUtils.rm_rf(machine_folder, :secure => true)
22
+
23
+ @app.call(env)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -5,6 +5,7 @@ module VagrantPlugins
5
5
  module Action
6
6
  class CreateDomain
7
7
  include VagrantPlugins::ProviderLibvirt::Util::ErbTemplate
8
+ include VagrantPlugins::ProviderLibvirt::Util::StorageUtil
8
9
 
9
10
  def initialize(app, _env)
10
11
  @logger = Log4r::Logger.new('vagrant_libvirt::action::create_domain')
@@ -31,6 +32,8 @@ module VagrantPlugins
31
32
 
32
33
  # Gather some info about domain
33
34
  @name = env[:domain_name]
35
+ @title = config.title
36
+ @description = config.description
34
37
  @uuid = config.uuid
35
38
  @cpus = config.cpus.to_i
36
39
  @cpuset = config.cpuset
@@ -39,6 +42,8 @@ module VagrantPlugins
39
42
  @nodeset = config.nodeset
40
43
  @features = config.features
41
44
  @features_hyperv = config.features_hyperv
45
+ @clock_offset = config.clock_offset
46
+ @clock_timers = config.clock_timers
42
47
  @shares = config.shares
43
48
  @cpu_mode = config.cpu_mode
44
49
  @cpu_model = config.cpu_model
@@ -50,11 +55,12 @@ module VagrantPlugins
50
55
  @machine_arch = config.machine_arch
51
56
  @disk_bus = config.disk_bus
52
57
  @disk_device = config.disk_device
58
+ @disk_driver_opts = config.disk_driver_opts
53
59
  @nested = config.nested
54
60
  @memory_size = config.memory.to_i * 1024
55
61
  @memory_backing = config.memory_backing
56
62
  @management_network_mac = config.management_network_mac
57
- @domain_volume_cache = config.volume_cache
63
+ @domain_volume_cache = config.volume_cache || 'default'
58
64
  @kernel = config.kernel
59
65
  @cmd_line = config.cmd_line
60
66
  @emulator_path = config.emulator_path
@@ -78,6 +84,7 @@ module VagrantPlugins
78
84
  @tpm_model = config.tpm_model
79
85
  @tpm_type = config.tpm_type
80
86
  @tpm_path = config.tpm_path
87
+ @tpm_version = config.tpm_version
81
88
 
82
89
  # Boot order
83
90
  @boot_order = config.boot_order
@@ -85,6 +92,7 @@ module VagrantPlugins
85
92
  # Storage
86
93
  @storage_pool_name = config.storage_pool_name
87
94
  @snapshot_pool_name = config.snapshot_pool_name
95
+ @domain_volumes = []
88
96
  @disks = config.disks
89
97
  @cdroms = config.cdroms
90
98
 
@@ -134,26 +142,30 @@ module VagrantPlugins
134
142
  else
135
143
  pool_name = @storage_pool_name
136
144
  end
137
- @logger.debug "Search for volume in pool: #{pool_name}"
138
- domain_volume = env[:machine].provider.driver.connection.volumes.all(
139
- name: "#{@name}.img"
140
- ).find { |x| x.pool_name == pool_name }
141
- raise Errors::DomainVolumeExists if domain_volume.nil?
142
- @domain_volume_path = domain_volume.path
145
+ @logger.debug "Search for volumes in pool: #{pool_name}"
146
+ env[:box_volumes].each_index do |index|
147
+ suffix_index = index > 0 ? "_#{index}" : ''
148
+ domain_volume = env[:machine].provider.driver.connection.volumes.all(
149
+ name: "#{@name}#{suffix_index}.img"
150
+ ).find { |x| x.pool_name == pool_name }
151
+ raise Errors::DomainVolumeExists if domain_volume.nil?
152
+ @domain_volumes.push({
153
+ :dev => (index+1).vdev.to_s,
154
+ :cache => @domain_volume_cache,
155
+ :bus => @disk_bus,
156
+ :path => domain_volume.path,
157
+ :virtual_size => env[:box_volumes][index][:virtual_size]
158
+ })
159
+ end
143
160
  end
144
161
 
145
162
  # If we have a box, take the path from the domain volume and set our storage_prefix.
146
163
  # If not, we dump the storage pool xml to get its defined path.
147
164
  # the default storage prefix is typically: /var/lib/libvirt/images/
148
- if !config.qemu_use_session
149
- if env[:machine].config.vm.box
150
- storage_prefix = File.dirname(@domain_volume_path) + '/' # steal
151
- else
152
- storage_pool = env[:machine].provider.driver.connection.client.lookup_storage_pool_by_name(@storage_pool_name)
153
- raise Errors::NoStoragePool if storage_pool.nil?
154
- xml = Nokogiri::XML(storage_pool.xml_desc)
155
- storage_prefix = xml.xpath('/pool/target/path').inner_text.to_s + '/'
156
- end
165
+ if env[:machine].config.vm.box
166
+ storage_prefix = File.dirname(@domain_volumes[0][:path]) + '/' # steal
167
+ else
168
+ storage_prefix = get_disk_storage_prefix(env, @storage_pool_name)
157
169
  end
158
170
 
159
171
  @disks.each do |disk|
@@ -167,6 +179,16 @@ module VagrantPlugins
167
179
 
168
180
  disk[:absolute_path] = storage_prefix + disk[:path]
169
181
 
182
+ if not disk[:pool].nil?
183
+ disk_pool_name = disk[:pool]
184
+ @logger.debug "Overriding pool name with: #{disk_pool_name}"
185
+ disk_storage_prefix = get_disk_storage_prefix(env, disk_pool_name)
186
+ disk[:absolute_path] = disk_storage_prefix + disk[:path]
187
+ @logger.debug "Overriding disk path with: #{disk[:absolute_path]}"
188
+ else
189
+ disk_pool_name = @storage_pool_name
190
+ end
191
+
170
192
  # make the disk. equivalent to:
171
193
  # qemu-img create -f qcow2 <path> 5g
172
194
  begin
@@ -175,8 +197,10 @@ module VagrantPlugins
175
197
  format_type: disk[:type],
176
198
  path: disk[:absolute_path],
177
199
  capacity: disk[:size],
200
+ owner: storage_uid(env),
201
+ group: storage_gid(env),
178
202
  #:allocation => ?,
179
- pool_name: @storage_pool_name
203
+ pool_name: disk_pool_name
180
204
  )
181
205
  rescue Libvirt::Error => e
182
206
  # It is hard to believe that e contains just a string
@@ -186,7 +210,7 @@ module VagrantPlugins
186
210
  if e.message == msg and disk[:allow_existing]
187
211
  disk[:preexisting] = true
188
212
  else
189
- raise Errors::FogDomainVolumeCreateError,
213
+ raise Errors::FogCreateDomainVolumeError,
190
214
  error_message: e.message
191
215
  end
192
216
  end
@@ -195,6 +219,8 @@ module VagrantPlugins
195
219
  # Output the settings we're going to use to the user
196
220
  env[:ui].info(I18n.t('vagrant_libvirt.creating_domain'))
197
221
  env[:ui].info(" -- Name: #{@name}")
222
+ env[:ui].info(" -- Title: #{@title}") if @title != ''
223
+ env[:ui].info(" -- Description: #{@description}") if @description != ''
198
224
  env[:ui].info(" -- Forced UUID: #{@uuid}") if @uuid != ''
199
225
  env[:ui].info(" -- Domain type: #{@domain_type}")
200
226
  env[:ui].info(" -- Cpus: #{@cpus}")
@@ -211,7 +237,15 @@ module VagrantPlugins
211
237
  env[:ui].info(" -- Feature: #{feature}")
212
238
  end
213
239
  @features_hyperv.each do |feature|
214
- env[:ui].info(" -- Feature (HyperV): name=#{feature[:name]}, state=#{feature[:state]}")
240
+ if feature[:name] == 'spinlocks'
241
+ env[:ui].info(" -- Feature (HyperV): name=#{feature[:name]}, state=#{feature[:state]}, retries=#{feature[:retries]}")
242
+ else
243
+ env[:ui].info(" -- Feature (HyperV): name=#{feature[:name]}, state=#{feature[:state]}")
244
+ end
245
+ end
246
+ env[:ui].info(" -- Clock offset: #{@clock_offset}")
247
+ @clock_timers.each do |timer|
248
+ env[:ui].info(" -- Clock timer: #{timer.map { |k,v| "#{k}=#{v}"}.join(', ')}")
215
249
  end
216
250
  env[:ui].info(" -- Memory: #{@memory_size / 1024}M")
217
251
  unless @nodeset.nil?
@@ -230,8 +264,16 @@ module VagrantPlugins
230
264
  env[:ui].info(" -- Base box: #{env[:machine].box.name}")
231
265
  end
232
266
  env[:ui].info(" -- Storage pool: #{@storage_pool_name}")
233
- env[:ui].info(" -- Image: #{@domain_volume_path} (#{env[:box_virtual_size]}G)")
234
- env[:ui].info(" -- Volume Cache: #{@domain_volume_cache}")
267
+ @domain_volumes.each do |volume|
268
+ env[:ui].info(" -- Image(#{volume[:device]}): #{volume[:path]}, #{volume[:virtual_size]}G")
269
+ end
270
+
271
+ if not @disk_driver_opts.empty?
272
+ env[:ui].info(" -- Disk driver opts: #{@disk_driver_opts.reject { |k,v| v.nil? }.map { |k,v| "#{k}='#{v}'"}.join(' ')}")
273
+ else
274
+ env[:ui].info(" -- Disk driver opts: cache='#{@domain_volume_cache}'")
275
+ end
276
+
235
277
  env[:ui].info(" -- Kernel: #{@kernel}")
236
278
  env[:ui].info(" -- Initrd: #{@initrd}")
237
279
  env[:ui].info(" -- Graphics Type: #{@graphics_type}")
@@ -242,7 +284,13 @@ module VagrantPlugins
242
284
  env[:ui].info(" -- Video VRAM: #{@video_vram}")
243
285
  env[:ui].info(" -- Sound Type: #{@sound_type}")
244
286
  env[:ui].info(" -- Keymap: #{@keymap}")
245
- env[:ui].info(" -- TPM Path: #{@tpm_path}")
287
+ env[:ui].info(" -- TPM Backend: #{@tpm_type}")
288
+ if @tpm_type == 'emulator'
289
+ env[:ui].info(" -- TPM Model: #{@tpm_model}")
290
+ env[:ui].info(" -- TPM Version: #{@tpm_version}")
291
+ else
292
+ env[:ui].info(" -- TPM Path: #{@tpm_path}")
293
+ end
246
294
 
247
295
  @boot_order.each do |device|
248
296
  env[:ui].info(" -- Boot device: #{device}")
@@ -362,6 +410,14 @@ module VagrantPlugins
362
410
 
363
411
  @app.call(env)
364
412
  end
413
+
414
+ private
415
+ def get_disk_storage_prefix(env, disk_pool_name)
416
+ disk_storage_pool = env[:machine].provider.driver.connection.client.lookup_storage_pool_by_name(disk_pool_name)
417
+ raise Errors::NoStoragePool if disk_storage_pool.nil?
418
+ xml = Nokogiri::XML(disk_storage_pool.xml_desc)
419
+ disk_storage_prefix = xml.xpath('/pool/target/path').inner_text.to_s + '/'
420
+ end
365
421
  end
366
422
  end
367
423
  end
@@ -18,74 +18,74 @@ module VagrantPlugins
18
18
  def call(env)
19
19
  env[:ui].info(I18n.t('vagrant_libvirt.creating_domain_volume'))
20
20
 
21
- # Get config options.
22
- config = env[:machine].provider_config
21
+ env[:box_volumes].each_index do |index|
22
+ suffix_index = index > 0 ? "_#{index}" : ''
23
+ # Get config options.
24
+ config = env[:machine].provider_config
23
25
 
24
- # This is name of newly created image for vm.
25
- @name = "#{env[:domain_name]}.img"
26
+ # This is name of newly created image for vm.
27
+ @name = "#{env[:domain_name]}#{suffix_index}.img"
26
28
 
27
- # Verify the volume doesn't exist already.
28
- domain_volume = env[:machine].provider.driver.connection.volumes.all(
29
- name: @name
30
- ).first
31
- raise Errors::DomainVolumeExists if domain_volume && domain_volume.id
29
+ # Verify the volume doesn't exist already.
30
+ domain_volume = env[:machine].provider.driver.connection.volumes.all(
31
+ name: @name
32
+ ).first
33
+ raise Errors::DomainVolumeExists if domain_volume && domain_volume.id
32
34
 
33
- # Get path to backing image - box volume.
34
- box_volume = env[:machine].provider.driver.connection.volumes.all(
35
- name: env[:box_volume_name]
36
- ).first
37
- @backing_file = box_volume.path
35
+ # Get path to backing image - box volume.
36
+ box_volume = env[:machine].provider.driver.connection.volumes.all(
37
+ name: env[:box_volumes][index][:name]
38
+ ).first
39
+ @backing_file = box_volume.path
38
40
 
39
- # Virtual size of image. Take value worked out by HandleBoxImage
40
- @capacity = env[:box_virtual_size] # G
41
+ # Virtual size of image. Take value worked out by HandleBoxImage
42
+ @capacity = env[:box_volumes][index][:virtual_size] # G
41
43
 
42
- # Create new volume from xml template. Fog currently doesn't support
43
- # volume snapshots directly.
44
- begin
45
- xml = Nokogiri::XML::Builder.new do |xml|
46
- xml.volume do
47
- xml.name(@name)
48
- xml.capacity(@capacity, unit: 'G')
49
- xml.target do
50
- xml.format(type: 'qcow2')
51
- xml.permissions do
52
- xml.owner storage_uid(env)
53
- xml.group storage_gid(env)
54
- xml.mode '0600'
55
- xml.label 'virt_image_t'
44
+ # Create new volume from xml template. Fog currently doesn't support
45
+ # volume snapshots directly.
46
+ begin
47
+ xml = Nokogiri::XML::Builder.new do |xml|
48
+ xml.volume do
49
+ xml.name(@name)
50
+ xml.capacity(@capacity, unit: 'G')
51
+ xml.target do
52
+ xml.format(type: 'qcow2')
53
+ xml.permissions do
54
+ xml.owner storage_uid(env)
55
+ xml.group storage_gid(env)
56
+ xml.label 'virt_image_t'
57
+ end
56
58
  end
57
- end
58
- xml.backingStore do
59
- xml.path(@backing_file)
60
- xml.format(type: 'qcow2')
61
- xml.permissions do
62
- xml.owner storage_uid(env)
63
- xml.group storage_gid(env)
64
- xml.mode '0600'
65
- xml.label 'virt_image_t'
59
+ xml.backingStore do
60
+ xml.path(@backing_file)
61
+ xml.format(type: 'qcow2')
62
+ xml.permissions do
63
+ xml.owner storage_uid(env)
64
+ xml.group storage_gid(env)
65
+ xml.label 'virt_image_t'
66
+ end
66
67
  end
67
68
  end
69
+ end.to_xml(
70
+ save_with: Nokogiri::XML::Node::SaveOptions::NO_DECLARATION |
71
+ Nokogiri::XML::Node::SaveOptions::NO_EMPTY_TAGS |
72
+ Nokogiri::XML::Node::SaveOptions::FORMAT
73
+ )
74
+ if config.snapshot_pool_name != config.storage_pool_name
75
+ pool_name = config.snapshot_pool_name
76
+ else
77
+ pool_name = config.storage_pool_name
68
78
  end
69
- end.to_xml(
70
- save_with: Nokogiri::XML::Node::SaveOptions::NO_DECLARATION |
71
- Nokogiri::XML::Node::SaveOptions::NO_EMPTY_TAGS |
72
- Nokogiri::XML::Node::SaveOptions::FORMAT
73
- )
74
- if config.snapshot_pool_name != config.storage_pool_name
75
- pool_name = config.snapshot_pool_name
76
- else
77
- pool_name = config.storage_pool_name
79
+ @logger.debug "Using pool #{pool_name} for base box snapshot"
80
+ domain_volume = env[:machine].provider.driver.connection.volumes.create(
81
+ xml: xml,
82
+ pool_name: pool_name
83
+ )
84
+ rescue Fog::Errors::Error => e
85
+ raise Errors::FogDomainVolumeCreateError,
86
+ error_message: e.message
78
87
  end
79
- @logger.debug "Using pool #{pool_name} for base box snapshot"
80
- domain_volume = env[:machine].provider.driver.connection.volumes.create(
81
- xml: xml,
82
- pool_name: pool_name
83
- )
84
- rescue Fog::Errors::Error => e
85
- raise Errors::FogDomainVolumeCreateError,
86
- error_message: e.message
87
88
  end
88
-
89
89
  @app.call(env)
90
90
  end
91
91
  end
@@ -95,6 +95,7 @@ module VagrantPlugins
95
95
  template_name = 'public_interface'
96
96
  @logger.info("Setting up public interface using device #{@device} in mode #{@mode}")
97
97
  @ovs = iface_configuration.fetch(:ovs, false)
98
+ @ovs_interfaceid = iface_configuration.fetch(:ovs_interfaceid, false)
98
99
  @trust_guest_rx_filters = iface_configuration.fetch(:trust_guest_rx_filters, false)
99
100
  # configuration for udp or tcp tunnel interfaces (p2p conn btwn guest OSes)
100
101
  elsif iface_configuration.fetch(:tunnel_type, nil)
@@ -213,9 +214,6 @@ module VagrantPlugins
213
214
  network[:type] = :dhcp
214
215
  end
215
216
 
216
- # do not run configure_networks for tcp tunnel interfaces
217
- next if options.fetch(:tunnel_type, nil)
218
-
219
217
  networks_to_configure << network
220
218
  end
221
219
 
@@ -54,6 +54,8 @@ module VagrantPlugins
54
54
  env[:machine].provider.driver.connection.client
55
55
  )
56
56
 
57
+ current_network = @available_networks.detect { |network| network[:name] == @options[:network_name] }
58
+
57
59
  # Prepare a hash describing network for this specific interface.
58
60
  @interface_network = {
59
61
  name: nil,
@@ -64,11 +66,11 @@ module VagrantPlugins
64
66
  domain_name: nil,
65
67
  ipv6_address: options[:ipv6_address] || nil,
66
68
  ipv6_prefix: options[:ipv6_prefix] || nil,
67
- created: false,
68
- active: false,
69
+ created: current_network.nil? ? false : true,
70
+ active: current_network.nil? ? false : current_network[:active],
69
71
  autostart: options[:autostart] || false,
70
72
  guest_ipv6: @options[:guest_ipv6] || 'yes',
71
- libvirt_network: nil
73
+ libvirt_network: current_network.nil? ? nil : current_network[:libvirt_network]
72
74
  }
73
75
 
74
76
  if @options[:ip]
@@ -255,7 +257,9 @@ module VagrantPlugins
255
257
 
256
258
  # Do we need to create new network?
257
259
  unless @interface_network[:created]
258
- @interface_network[:name] = 'vagrant-private-dhcp'
260
+ @interface_network[:name] = @options[:network_name] ?
261
+ @options[:network_name] :
262
+ 'vagrant-private-dhcp'
259
263
  @interface_network[:network_address] = net_address
260
264
 
261
265
  # Set IP address of network (actually bridge). It will be used as
@@ -297,6 +301,9 @@ module VagrantPlugins
297
301
 
298
302
  @network_ipv6_address = @interface_network[:ipv6_address]
299
303
  @network_ipv6_prefix = @interface_network[:ipv6_prefix]
304
+
305
+ @network_bridge_stp = @options[:bridge_stp].nil? || @options[:bridge_stp] ? 'on' : 'off'
306
+ @network_bridge_delay = @options[:bridge_delay] ? @options[:bridge_delay] : 0
300
307
 
301
308
  @network_forward_mode = @options[:forward_mode]
302
309
  if @options[:forward_device]